ActionBrowserNotificationAbstract.php 2.7 KB

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