-
-
Notifications
You must be signed in to change notification settings - Fork 682
Expand file tree
/
Copy pathCreateAccountAction.php
More file actions
104 lines (97 loc) · 4.44 KB
/
Copy pathCreateAccountAction.php
File metadata and controls
104 lines (97 loc) · 4.44 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
declare(strict_types=1);
namespace HiEvents\Http\Actions\Accounts;
use HiEvents\Exceptions\EmailAlreadyExists;
use HiEvents\Exceptions\UnauthorizedException;
use HiEvents\Http\Actions\Auth\BaseAuthAction;
use HiEvents\Http\Request\Account\CreateAccountRequest;
use HiEvents\Http\ResponseCodes;
use HiEvents\Resources\Account\AccountResource;
use HiEvents\Services\Application\Handlers\Account\CreateAccountHandler;
use HiEvents\Services\Application\Handlers\Account\DTO\CreateAccountDTO;
use HiEvents\Services\Application\Handlers\Account\Exceptions\AccountConfigurationDoesNotExist;
use HiEvents\Services\Application\Handlers\Account\Exceptions\AccountRegistrationDisabledException;
use HiEvents\Services\Application\Handlers\Auth\DTO\LoginCredentialsDTO;
use HiEvents\Services\Application\Handlers\Auth\LoginHandler;
use HiEvents\Services\Application\Locale\LocaleService;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;
use Throwable;
class CreateAccountAction extends BaseAuthAction
{
public function __construct(
private readonly CreateAccountHandler $createAccountHandler,
private readonly LoginHandler $loginHandler,
private readonly LocaleService $localeService,
)
{
}
/**
* @throws Throwable
* @throws ValidationException
*/
public function __invoke(CreateAccountRequest $request): JsonResponse
{
try {
$accountData = $this->createAccountHandler->handle(CreateAccountDTO::fromArray([
'first_name' => $request->validated('first_name'),
'last_name' => $request->validated('last_name'),
'email' => $request->validated('email'),
'password' => $request->validated('password'),
'timezone' => $request->validated('timezone'),
'currency_code' => $request->validated('currency_code'),
'locale' => $request->has('locale')
? $request->validated('locale')
: $this->localeService->getLocaleOrDefault($request->getPreferredLanguage()),
'invite_token' => $request->validated('invite_token'),
'marketing_opt_in' => (bool) $request->validated('marketing_opt_in'),
'utm_source' => $request->validated('utm_source'),
'utm_medium' => $request->validated('utm_medium'),
'utm_campaign' => $request->validated('utm_campaign'),
'utm_term' => $request->validated('utm_term'),
'utm_content' => $request->validated('utm_content'),
'referrer_url' => $request->validated('referrer_url'),
'landing_page' => $request->validated('landing_page'),
'gclid' => $request->validated('gclid'),
'fbclid' => $request->validated('fbclid'),
'utm_raw' => $request->validated('utm_raw'),
]));
} catch (EmailAlreadyExists $e) {
throw ValidationException::withMessages([
'email' => $e->getMessage(),
]);
} catch (DecryptException $e) {
throw ValidationException::withMessages([
'invite_token' => __('Invalid invite token'),
]);
} catch (AccountRegistrationDisabledException) {
return $this->errorResponse(
message: __('Account registration is disabled'),
statusCode: ResponseCodes::HTTP_FORBIDDEN,
);
} catch (AccountConfigurationDoesNotExist $e) {
return $this->errorResponse(
message: $e->getMessage(),
statusCode: ResponseCodes::HTTP_INTERNAL_SERVER_ERROR,
);
}
try {
$loginResponse = $this->loginHandler->handle(new LoginCredentialsDTO(
email: $accountData->getEmail(),
password: $request->validated('password'),
accountId: $accountData->getId(),
));
} catch (UnauthorizedException $e) {
return $this->errorResponse(
message: $e->getMessage(),
statusCode: ResponseCodes::HTTP_UNAUTHORIZED,
);
}
return $this->addTokenToResponse($this->resourceResponse(
resource: AccountResource::class,
data: $accountData,
statusCode: ResponseCodes::HTTP_CREATED,
), $loginResponse->token);
}
}