ActionEmailService.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. };
  41. }
  42. protected function container(Container $container)
  43. {
  44. $this->dispatch($container->mailto, new ContainerAction($container, $this->objectAction, $this->actions));
  45. }
  46. protected function requirement(Requirement $requirement)
  47. {
  48. $this->dispatch($requirement->mailto, new RequirementAction($requirement, $this->objectAction, $this->actions));
  49. }
  50. protected function task(Task $task)
  51. {
  52. $userIds = array_filter([$task->assign, ...$task->mailto]);
  53. $this->dispatch($userIds, new TaskAction($task, $this->objectAction, $this->actions));
  54. }
  55. protected function dispatch(array $userIds, Mailable $mailable)
  56. {
  57. $users = User::query()->whereIn("id", $userIds)->get();
  58. if ($users->isEmpty()) {
  59. return;
  60. }
  61. foreach ($users as $user) {
  62. Mail::to($user)->send($mailable);
  63. }
  64. }
  65. }