-
Notifications
You must be signed in to change notification settings - Fork 0
/
UserSubmissionService.php
79 lines (64 loc) · 3.01 KB
/
UserSubmissionService.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
namespace EscolaLms\AssignWithoutAccount\Services;
use EscolaLms\AssignWithoutAccount\Dto\UserSubmissionDto;
use EscolaLms\AssignWithoutAccount\Dto\UserSubmissionSearchDto;
use EscolaLms\AssignWithoutAccount\Enums\UserSubmissionStatusEnum;
use EscolaLms\AssignWithoutAccount\Events\UnassignProduct;
use EscolaLms\AssignWithoutAccount\Events\UnassignProductable;
use EscolaLms\AssignWithoutAccount\Models\UserSubmission;
use EscolaLms\AssignWithoutAccount\Repositories\Contracts\UserSubmissionRepositoryContract;
use EscolaLms\AssignWithoutAccount\Services\Contracts\UserSubmissionServiceContract;
use EscolaLms\AssignWithoutAccount\Strategies\Contracts\AssignStrategy;
use EscolaLms\AssignWithoutAccount\Strategies\StrategyContext;
use EscolaLms\Cart\Contracts\Productable;
use EscolaLms\Cart\Models\Product;
use EscolaLms\Core\Dtos\PaginationDto;
use EscolaLms\Core\Models\User;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
class UserSubmissionService implements UserSubmissionServiceContract
{
private UserSubmissionRepositoryContract $userSubmissionRepository;
public function __construct(
UserSubmissionRepositoryContract $userSubmissionRepository
) {
$this->userSubmissionRepository = $userSubmissionRepository;
}
public function create(UserSubmissionDto $dto): UserSubmission
{
$strategy = $this->getStrategy($dto->getMorphableType());
$model = $strategy->getModelInstance($dto->getMorphableType(), $dto->getMorphableId());
$dto->setStatus(UserSubmissionStatusEnum::SENT);
$submission = $this->userSubmissionRepository->create($dto->toArray());
$strategy->dispatch($dto->getEmail(), $model);
return $submission;
}
public function update(UserSubmissionDto $dto, int $id): UserSubmission
{
return $this->userSubmissionRepository->update($dto->toArray(), $id);
}
public function delete(int $id): bool
{
/** @var UserSubmission $submission */
$submission = $this->userSubmissionRepository->find($id);
$this->dispatchUnassignEvent($submission);
return $this->userSubmissionRepository->delete($id);
}
public function searchAndPaginate(UserSubmissionSearchDto $searchDto, ?PaginationDto $paginationDto): LengthAwarePaginator
{
return $this->userSubmissionRepository->searchAndPaginateByCriteria($searchDto, $paginationDto);
}
private function getStrategy(string $morphType): ?AssignStrategy
{
return (new StrategyContext($morphType))->getAssignStrategy();
}
private function dispatchUnassignEvent(UserSubmission $userSubmission): void
{
$user = new User();
$user->email = $userSubmission->email;
if (is_a($userSubmission->morphable_type, Productable::class, true)) {
UnassignProductable::dispatch($user, $userSubmission->morphable);
} elseif (is_a($userSubmission->morphable_type, Product::class, true)) {
UnassignProduct::dispatch($user, $userSubmission->morphable);
}
}
}