ActionBrowserNotificationAbstract.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace App\Services\Notification\Abstracts;
  3. use App\Models\Action;
  4. use App\Models\Approval;
  5. use App\Models\Enums\ApprovalMode;
  6. use App\Models\Enums\NotificationObjectType;
  7. use App\Models\Enums\ObjectAction;
  8. use App\Models\Notification;
  9. use App\Models\NotificationRecord;
  10. use App\Services\Notification\Contacts\ActionBrowserNotificationContacts;
  11. use Illuminate\Database\Eloquent\Model;
  12. abstract class ActionBrowserNotificationAbstract implements ActionBrowserNotificationContacts
  13. {
  14. protected ObjectAction $objectAction;
  15. public function __construct(protected Action $action, protected Model $object)
  16. {
  17. $this->objectAction = ObjectAction::tryFrom($this->action->action);
  18. }
  19. public function handle()
  20. {
  21. if ($this->objectAction->isApproval()) {
  22. $this->handleByApprovalAction();
  23. } else {
  24. $this->handleByObjectAction($this->userIDs());
  25. }
  26. }
  27. abstract protected function userIDs(): array;
  28. protected function handleByApprovalAction()
  29. {
  30. $approval = Approval::query()->find($this->action->additional_id);
  31. if (! $approval) {
  32. return;
  33. }
  34. match ($this->objectAction) {
  35. ObjectAction::APPROVAL_REQUEST => $this->notificationNextApprovalUsers($approval),
  36. ObjectAction::APPROVED_TO_NEXT_NODE => $this->handleByApprovedToNextNode($approval),
  37. ObjectAction::APPROVAL_APPROVED, ObjectAction::APPROVAL_REJECTED => $this->handleByObjectAction([$approval->created_by]),
  38. default => '',
  39. };
  40. }
  41. protected function handleByApprovedToNextNode(Approval $approval)
  42. {
  43. $this->notificationNextApprovalUsers($approval);
  44. $this->handleByObjectAction([$approval->created_by]);
  45. }
  46. protected function handleByObjectAction(array $userIDs)
  47. {
  48. $this->storeNotification($userIDs);
  49. }
  50. protected function storeNotification(array $userIds, array $extraFields = [])
  51. {
  52. if (! $userIds) {
  53. return;
  54. }
  55. $notification = Notification::query()->create([
  56. 'object_type' => NotificationObjectType::ACTION->value,
  57. 'object_id' => $this->action->id,
  58. 'extra_fields' => $extraFields ?: null,
  59. ]);
  60. foreach ($userIds as $userId) {
  61. NotificationRecord::query()->create([
  62. 'notification_id' => $notification->id,
  63. 'user_id' => $userId,
  64. ]);
  65. }
  66. }
  67. protected function notificationNextApprovalUsers(Approval $approval)
  68. {
  69. $approvalFlow = $approval->approvalFlow()->first();
  70. if (! $approvalFlow) {
  71. return;
  72. }
  73. $nextNode = $approvalFlow->nodes[$this->action->extra_fields['next']];
  74. $approvalObjectUsers = array_values(array_filter(explode(',', $approval->users)));
  75. $userIds = match (ApprovalMode::tryFrom($nextNode['approval_mode'])) {
  76. ApprovalMode::ALTERNATIVE_APPROVAL, ApprovalMode::COUNTERSIGNATURE => $nextNode['approval_users'] ?? [],
  77. ApprovalMode::SEQUENTIAL_APPROVAL => isset($approvalObjectUsers[0]) ? [$approvalObjectUsers[0]] : [],
  78. default => [],
  79. };
  80. $this->storeNotification($userIds, [
  81. 'action' => 'waitingForMyApproval'
  82. ]);
  83. }
  84. }