ActionBrowserNotificationAbstract.php 2.8 KB

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