add email signup flow

This commit is contained in:
Yisroel Baum 2026-08-03 20:26:08 +03:00
parent 9945163a2f
commit 3dc9204979
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
27 changed files with 629 additions and 24 deletions

View file

@ -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,
));
}
}