add email signup flow
This commit is contained in:
parent
9945163a2f
commit
3dc9204979
27 changed files with 629 additions and 24 deletions
|
|
@ -10,7 +10,12 @@ use App\Exceptions\BadRequestException;
|
|||
use App\Exceptions\UnauthorizedException;
|
||||
use App\Http\Middleware\AuthMiddleware;
|
||||
use App\Shared\Http\RequestInput;
|
||||
use App\User\UseCases\ConfirmUserEmail\ConfirmUserEmail;
|
||||
use App\User\UseCases\ConfirmUserEmail\ConfirmUserEmailRequest;
|
||||
use App\User\UseCases\SignupUser\SignupUser;
|
||||
use App\User\UseCases\SignupUser\SignupUserRequest;
|
||||
use App\User\User;
|
||||
use DomainException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Cookie;
|
||||
|
|
@ -18,11 +23,62 @@ use Symfony\Component\HttpFoundation\Cookie;
|
|||
class AuthController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private SignupUser $signupUser,
|
||||
private ConfirmUserEmail $confirmUserEmail,
|
||||
private AuthenticateUser $authenticateUser,
|
||||
private CreateSession $createSession,
|
||||
private Logout $logout,
|
||||
) {}
|
||||
|
||||
public function signup(Request $request): JsonResponse
|
||||
{
|
||||
$input = new RequestInput($request);
|
||||
|
||||
try {
|
||||
$this->signupUser->execute(new SignupUserRequest(
|
||||
email: $input->string('email'),
|
||||
));
|
||||
} catch (BadRequestException $exception) {
|
||||
return new JsonResponse(
|
||||
['error' => $exception->getMessage()],
|
||||
400,
|
||||
);
|
||||
} catch (DomainException $exception) {
|
||||
return new JsonResponse(
|
||||
['error' => $exception->getMessage()],
|
||||
409,
|
||||
);
|
||||
}
|
||||
|
||||
return new JsonResponse(null, 201);
|
||||
}
|
||||
|
||||
public function confirmEmail(Request $request): JsonResponse
|
||||
{
|
||||
$input = new RequestInput($request);
|
||||
|
||||
try {
|
||||
$user = $this->confirmUserEmail->execute(
|
||||
new ConfirmUserEmailRequest(
|
||||
token: $input->string('token'),
|
||||
password: $input->string('password'),
|
||||
),
|
||||
);
|
||||
} catch (BadRequestException $exception) {
|
||||
return new JsonResponse(
|
||||
['error' => $exception->getMessage()],
|
||||
400,
|
||||
);
|
||||
} catch (DomainException $exception) {
|
||||
return new JsonResponse(
|
||||
['error' => $exception->getMessage()],
|
||||
409,
|
||||
);
|
||||
}
|
||||
|
||||
return $this->authenticatedResponse($user);
|
||||
}
|
||||
|
||||
public function login(Request $request): JsonResponse
|
||||
{
|
||||
$input = new RequestInput($request);
|
||||
|
|
@ -44,23 +100,7 @@ class AuthController extends Controller
|
|||
);
|
||||
}
|
||||
|
||||
$session = $this->createSession->execute($user);
|
||||
|
||||
$response = new JsonResponse([
|
||||
'user' => $this->userPayload($user),
|
||||
], 200);
|
||||
|
||||
return $response->withCookie(Cookie::create(
|
||||
name: AuthMiddleware::COOKIE_NAME,
|
||||
value: $session->getToken(),
|
||||
expire: $session->getExpiresAt()->getTimestamp(),
|
||||
path: '/',
|
||||
domain: null,
|
||||
secure: false,
|
||||
httpOnly: true,
|
||||
raw: false,
|
||||
sameSite: Cookie::SAMESITE_LAX,
|
||||
));
|
||||
return $this->authenticatedResponse($user);
|
||||
}
|
||||
|
||||
public function me(Request $request): JsonResponse
|
||||
|
|
@ -105,4 +145,24 @@ class AuthController extends Controller
|
|||
'email' => $user->getEmail()->value(),
|
||||
];
|
||||
}
|
||||
|
||||
private function authenticatedResponse(User $user): JsonResponse
|
||||
{
|
||||
$session = $this->createSession->execute($user);
|
||||
$response = new JsonResponse([
|
||||
'user' => $this->userPayload($user),
|
||||
]);
|
||||
|
||||
return $response->withCookie(Cookie::create(
|
||||
name: AuthMiddleware::COOKIE_NAME,
|
||||
value: $session->getToken(),
|
||||
expire: $session->getExpiresAt()->getTimestamp(),
|
||||
path: '/',
|
||||
domain: null,
|
||||
secure: false,
|
||||
httpOnly: true,
|
||||
raw: false,
|
||||
sameSite: Cookie::SAMESITE_LAX,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue