From a108b29d199d7f5025bb3bb475f2270bb3380fd8 Mon Sep 17 00:00:00 2001 From: yisroel Date: Wed, 6 May 2026 15:13:26 +0300 Subject: [PATCH] implement SignupUser use case validates email present + format (wraps EmailAddress vo's InvalidArgumentException as BadRequest), password present + >= 8 chars, then ensures email not already registered. hashes password through injected PasswordHasher and persists via UserRepository->create with isAdmin=false (admins are seeder- only per plan). throws DomainException on duplicate email so the controller layer can map it to 409. all 18 tests pass. --- .../User/UseCases/SignupUser/SignupUser.php | 57 +++++++++++++++++++ .../UseCases/SignupUser/SignupUserRequest.php | 11 ++++ 2 files changed, 68 insertions(+) create mode 100644 backend/app/User/UseCases/SignupUser/SignupUser.php create mode 100644 backend/app/User/UseCases/SignupUser/SignupUserRequest.php diff --git a/backend/app/User/UseCases/SignupUser/SignupUser.php b/backend/app/User/UseCases/SignupUser/SignupUser.php new file mode 100644 index 0000000..7f2c78e --- /dev/null +++ b/backend/app/User/UseCases/SignupUser/SignupUser.php @@ -0,0 +1,57 @@ +email === null || $request->email === '') { + throw new BadRequestException('email is required'); + } + if ($request->password === null || $request->password === '') { + throw new BadRequestException('password is required'); + } + if (strlen($request->password) < self::MIN_PASSWORD_LENGTH) { + throw new BadRequestException( + 'password must be at least '.self::MIN_PASSWORD_LENGTH.' characters' + ); + } + + try { + $email = new EmailAddress($request->email); + } catch (InvalidArgumentException $exception) { + throw new BadRequestException($exception->getMessage()); + } + + if ($this->userRepo->findByEmail($email) !== null) { + throw new DomainException('email already registered'); + } + + return $this->userRepo->create(new CreateUserDto( + email: $email, + passwordHash: $this->hasher->hash($request->password), + isAdmin: false, + )); + } +} diff --git a/backend/app/User/UseCases/SignupUser/SignupUserRequest.php b/backend/app/User/UseCases/SignupUser/SignupUserRequest.php new file mode 100644 index 0000000..b6f809f --- /dev/null +++ b/backend/app/User/UseCases/SignupUser/SignupUserRequest.php @@ -0,0 +1,11 @@ +