ActionEmailService.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace App\Services\Notification\ActionEmail;
  3. use App\Mail\ContainerAction;
  4. use App\Mail\RequirementAction;
  5. use App\Mail\TaskAction;
  6. use App\Models\Action;
  7. use App\Models\Container;
  8. use App\Models\Enums\ActionObjectType;
  9. use App\Models\Enums\ObjectAction;
  10. use App\Models\Requirement;
  11. use App\Models\Task;
  12. use App\Models\User;
  13. use App\Repositories\ActionRepository;
  14. use App\Repositories\ConfigRepository;
  15. use Illuminate\Contracts\Mail\Mailable;
  16. use Illuminate\Support\Facades\Mail;
  17. class ActionEmailService
  18. {
  19. protected ObjectAction $objectAction;
  20. protected array $actions = [];
  21. public function __construct(
  22. protected Action $action
  23. )
  24. {
  25. $this->objectAction = ObjectAction::tryFrom($this->action->action);
  26. }
  27. public function send()
  28. {
  29. if (! ConfigRepository::openEmailNotification()) {
  30. return;
  31. }
  32. ConfigRepository::emailDynamicSetting();
  33. $actionObjectType = ActionObjectType::tryFrom($this->action->object_type);
  34. $actionObjectModel = $actionObjectType->modelBuilder()->find($this->action->object_id);
  35. $this->actions = ActionRepository::objectEmailActions($actionObjectType, $actionObjectModel->id, $this->action->id);
  36. match ($actionObjectType) {
  37. ActionObjectType::REQUIREMENT => $this->requirement($actionObjectModel),
  38. ActionObjectType::TASK => $this->task($actionObjectModel),
  39. ActionObjectType::CONTAINER => $this->container($actionObjectModel),
  40. default => null,
  41. };
  42. }
  43. protected function container(Container $container)
  44. {
  45. $this->dispatch($container->mailto, new ContainerAction($container, $this->objectAction, $this->actions));
  46. }
  47. protected function requirement(Requirement $requirement)
  48. {
  49. $this->dispatch($requirement->mailto, new RequirementAction($requirement, $this->objectAction, $this->actions));
  50. }
  51. protected function task(Task $task)
  52. {
  53. $userIds = array_filter([$task->assign, ...$task->mailto]);
  54. $this->dispatch($userIds, new TaskAction($task, $this->objectAction, $this->actions));
  55. }
  56. protected function dispatch(array $userIds, Mailable $mailable)
  57. {
  58. $users = User::query()->whereIn("id", $userIds)->get();
  59. if ($users->isEmpty()) {
  60. return;
  61. }
  62. foreach ($users as $user) {
  63. Mail::to($user)->send($mailable);
  64. }
  65. }
  66. }