objectAction = ObjectAction::tryFrom($this->action->action); } public function handle() { if ($this->objectAction->isApproval()) { $this->handleByApprovalAction(); } else { $this->handleByObjectAction($this->userIDs()); } } abstract protected function userIDs(): array; protected function handleByApprovalAction() { $approval = Approval::query()->find($this->action->additional_id); if (! $approval) { return; } match ($this->objectAction) { ObjectAction::APPROVAL_REQUEST => $this->notificationNextApprovalUsers($approval), ObjectAction::APPROVED_TO_NEXT_NODE => $this->handleByApprovedToNextNode($approval), ObjectAction::APPROVAL_APPROVED, ObjectAction::APPROVAL_REJECTED => $this->handleByObjectAction([$approval->created_by]), default => '', }; } protected function handleByApprovedToNextNode(Approval $approval) { $this->notificationNextApprovalUsers($approval); $this->handleByObjectAction([$approval->created_by]); } protected function handleByObjectAction(array $userIDs) { $this->storeNotification($userIDs); } protected function storeNotification(array $userIds, array $extraFields = []) { if (! $userIds) { return; } $notification = Notification::query()->create([ 'object_type' => NotificationObjectType::ACTION->value, 'object_id' => $this->action->id, 'extra_fields' => $extraFields ?: null, ]); foreach ($userIds as $userId) { NotificationRecord::query()->create([ 'notification_id' => $notification->id, 'user_id' => $userId, ]); } } protected function notificationNextApprovalUsers(Approval $approval) { $approvalFlow = $approval->approvalFlow()->first(); if (! $approvalFlow) { return; } $userIds = $approvalFlow->nodes[$this->action->extra_fields['next']]['approval_users'] ?? []; $this->storeNotification($userIds, [ 'action' => 'waitingForMyApproval' ]); } }