From f1ef19d644c93de4bb546e91b6c2a7a2d4aeffa4 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:12:52 -0300 Subject: [PATCH 01/32] refactor: remove unnecessary imports --- .../auth_api/application/usecases/ClientRegisterUseCase.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/dev/idinaldo/auth_api/application/usecases/ClientRegisterUseCase.java b/src/main/java/dev/idinaldo/auth_api/application/usecases/ClientRegisterUseCase.java index c6d3a09..c926359 100644 --- a/src/main/java/dev/idinaldo/auth_api/application/usecases/ClientRegisterUseCase.java +++ b/src/main/java/dev/idinaldo/auth_api/application/usecases/ClientRegisterUseCase.java @@ -1,6 +1,5 @@ package dev.idinaldo.auth_api.application.usecases; -import dev.idinaldo.auth_api.adapters.in.dtos.ClientIdentityRegisterDTO; import dev.idinaldo.auth_api.domain.models.Identity; import java.util.UUID; From 52d5ac05ef6f69a2fe049c15bc2cdf0b1839ac8c Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:13:29 -0300 Subject: [PATCH 02/32] feat: add Sign In Use Case to abstract application use case --- .../auth_api/application/usecases/SignInUseCase.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java diff --git a/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java b/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java new file mode 100644 index 0000000..ca78168 --- /dev/null +++ b/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java @@ -0,0 +1,7 @@ +package dev.idinaldo.auth_api.application.usecases; + +import dev.idinaldo.auth_api.domain.models.Identity; + +public interface SignInUseCase { + String signIn(Identity identity); +} From 4c0139e0089f959dfea099779306dc920f1f28b5 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:14:03 -0300 Subject: [PATCH 03/32] feat: add JwtGenerator port to implement JWT-based authentication --- .../java/dev/idinaldo/auth_api/ports/JwtGenerator.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/dev/idinaldo/auth_api/ports/JwtGenerator.java diff --git a/src/main/java/dev/idinaldo/auth_api/ports/JwtGenerator.java b/src/main/java/dev/idinaldo/auth_api/ports/JwtGenerator.java new file mode 100644 index 0000000..74bc28f --- /dev/null +++ b/src/main/java/dev/idinaldo/auth_api/ports/JwtGenerator.java @@ -0,0 +1,9 @@ +package dev.idinaldo.auth_api.ports; + +import dev.idinaldo.auth_api.domain.models.Identity; +import org.springframework.stereotype.Component; + +@Component +public interface JwtGenerator { + String generateToken(Identity identity); +} From 4b61ae6d18a750082d6310f23a8ba9b4b3154160 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:16:01 -0300 Subject: [PATCH 04/32] refactor: rename file This was necessary since this same DTO can be used in more than one situation --- .../{ClientIdentityRegisterDTO.java => IdentityRequestDTO.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/{ClientIdentityRegisterDTO.java => IdentityRequestDTO.java} (58%) diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/ClientIdentityRegisterDTO.java b/src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/IdentityRequestDTO.java similarity index 58% rename from src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/ClientIdentityRegisterDTO.java rename to src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/IdentityRequestDTO.java index 98d33fa..11580dd 100644 --- a/src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/ClientIdentityRegisterDTO.java +++ b/src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/IdentityRequestDTO.java @@ -2,5 +2,5 @@ import dev.idinaldo.auth_api.domain.valueObject.Username; -public record ClientIdentityRegisterDTO(Username username, String password) { +public record IdentityRequestDTO(Username username, String password) { } From c468ac9907e3a370c2bef97cbb899532a1e53327 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:16:40 -0300 Subject: [PATCH 05/32] feat: add initial structure for JwtGenerator implementation --- .../auth_api/adapters/out/JwtGeneratorImpl.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/dev/idinaldo/auth_api/adapters/out/JwtGeneratorImpl.java diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/out/JwtGeneratorImpl.java b/src/main/java/dev/idinaldo/auth_api/adapters/out/JwtGeneratorImpl.java new file mode 100644 index 0000000..f358dc4 --- /dev/null +++ b/src/main/java/dev/idinaldo/auth_api/adapters/out/JwtGeneratorImpl.java @@ -0,0 +1,14 @@ +package dev.idinaldo.auth_api.adapters.out; + +import dev.idinaldo.auth_api.domain.models.Identity; +import dev.idinaldo.auth_api.ports.JwtGenerator; +import org.springframework.stereotype.Component; + +@Component +public class JwtGeneratorImpl implements JwtGenerator { + + @Override + public String generateToken(Identity identity) { + return "token"; + } +} From 10cc0fa8f8962c9e1b0a2236b11e808f586fe6aa Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:18:46 -0300 Subject: [PATCH 06/32] refactor: rename references of ClientRegisterDTO to IdentityRequestDTO --- .../adapters/in/controllers/IdentityController.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java b/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java index b86d396..28259ca 100644 --- a/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java +++ b/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java @@ -1,6 +1,6 @@ package dev.idinaldo.auth_api.adapters.in.controllers; -import dev.idinaldo.auth_api.adapters.in.dtos.ClientIdentityRegisterDTO; +import dev.idinaldo.auth_api.adapters.in.dtos.IdentityRequestDTO; import dev.idinaldo.auth_api.application.services.IdentityService; import dev.idinaldo.auth_api.domain.models.Identity; import dev.idinaldo.auth_api.infrastructure.mappers.IdentityMapper; @@ -28,9 +28,16 @@ public IdentityController(IdentityService identityService, IdentityMapper identi } @PostMapping("/register") - public ResponseEntity registerClient(@RequestBody @Valid ClientIdentityRegisterDTO identityRegisterDTO) { - Identity identity = this.identityMapper.registerDtoToDomain(identityRegisterDTO); + public ResponseEntity registerClient(@RequestBody @Valid IdentityRequestDTO identityRegisterDTO) { + Identity identity = this.identityMapper.requestDtoToDomain(identityRegisterDTO); UUID id = this.identityService.registerClient(identity); return ResponseEntity.status(HttpStatus.CREATED).body("Credentials registered successfully with ID: " + id); } + + @PostMapping("/signin") + public ResponseEntity signIn(@RequestBody @Valid IdentityRequestDTO identityRequestDTO) { + Identity identity = this.identityMapper.requestDtoToDomain(identityRequestDTO); + String token = this.identityService.signIn(identity); + return ResponseEntity.ok(token); + } } From 6fdcbe029abb5d8a4704d6c73b527407817b7db4 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:20:04 -0300 Subject: [PATCH 07/32] feat: add findByUsername method --- .../adapters/out/persistence/IdentityJpaRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityJpaRepository.java b/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityJpaRepository.java index 0318ece..804076b 100644 --- a/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityJpaRepository.java +++ b/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityJpaRepository.java @@ -1,5 +1,6 @@ package dev.idinaldo.auth_api.adapters.out.persistence; +import dev.idinaldo.auth_api.domain.models.Identity; import dev.idinaldo.auth_api.infrastructure.entities.JpaIdentity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,4 +9,5 @@ @Repository public interface IdentityJpaRepository extends JpaRepository { + JpaIdentity findByUsername(String username); } From c1e0463717d7c6c251840943502e6e95c12a3e2c Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:20:42 -0300 Subject: [PATCH 08/32] feat: add initial implementation of findByUsername method --- .../adapters/out/persistence/IdentityRepositoryImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityRepositoryImpl.java b/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityRepositoryImpl.java index 0e1038a..23e066a 100644 --- a/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityRepositoryImpl.java +++ b/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityRepositoryImpl.java @@ -24,4 +24,10 @@ public UUID save(Identity identity) { JpaIdentity jpaIdentity = this.identityMapper.domainToEntity(identity); return this.identityJpaRepository.save(jpaIdentity).getId(); } + + @Override + public Identity findByUsername(String username) { + JpaIdentity jpaIdentity = this.identityJpaRepository.findByUsername(username); + return this.identityMapper.entityToDomain(jpaIdentity); + } } From bdc2d5c1757e4655f6f4fc774d365d5cb770cec4 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:21:31 -0300 Subject: [PATCH 09/32] feat: add initial structure of Sign In method --- .../application/services/IdentityService.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java b/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java index 437ee7d..ab9c784 100644 --- a/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java +++ b/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java @@ -1,24 +1,38 @@ package dev.idinaldo.auth_api.application.services; -import dev.idinaldo.auth_api.adapters.in.dtos.ClientIdentityRegisterDTO; import dev.idinaldo.auth_api.application.usecases.ClientRegisterUseCase; +import dev.idinaldo.auth_api.application.usecases.SignInUseCase; import dev.idinaldo.auth_api.domain.models.Identity; +import dev.idinaldo.auth_api.infrastructure.entities.JpaIdentity; import dev.idinaldo.auth_api.ports.IdentityRepository; +import dev.idinaldo.auth_api.ports.JwtGenerator; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import java.util.UUID; @Service -public class IdentityService implements ClientRegisterUseCase { +public class IdentityService implements ClientRegisterUseCase, SignInUseCase { private final IdentityRepository identityRepository; + private final JwtGenerator jwtGenerator; + private final PasswordEncoder passwordEncoder; - public IdentityService(IdentityRepository identityRepository) { + public IdentityService(IdentityRepository identityRepository, JwtGenerator jwtGenerator, PasswordEncoder passwordEncoder) { this.identityRepository = identityRepository; + this.jwtGenerator = jwtGenerator; + this.passwordEncoder = passwordEncoder; } @Override public UUID registerClient(Identity identity) { return this.identityRepository.save(identity); } + + @Override + public String signIn(Identity identity) { + + if (passwordEncoder.matches(identity.getPassword(), userCredentials.getPassword())) + return ""; + } } From dd0ab29698e9327306d62a97b1ee56f1f7986607 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:23:01 -0300 Subject: [PATCH 10/32] refactor: remove passwordHash and add password to handle password validation and verification --- .../auth_api/domain/models/Identity.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/domain/models/Identity.java b/src/main/java/dev/idinaldo/auth_api/domain/models/Identity.java index 6d16389..f13690e 100644 --- a/src/main/java/dev/idinaldo/auth_api/domain/models/Identity.java +++ b/src/main/java/dev/idinaldo/auth_api/domain/models/Identity.java @@ -8,17 +8,17 @@ public class Identity { private UUID id; private Username username; - private String passwordHash; + private String password; - public Identity(UUID id, Username username, String passwordHash) { + public Identity(UUID id, Username username, String password) { this.id = id; this.username = username; - this.passwordHash = passwordHash; + this.password = password; } - public Identity(Username username, String passwordHash) { + public Identity(Username username, String password) { this.username = username; - this.passwordHash = passwordHash; + this.password = password; } public Identity() { @@ -36,16 +36,20 @@ public Username getUsername() { return username; } + public void setUsernameFromString(String username) { + this.username = new Username(username); + } + public void setUsername(Username username) { this.username = username; } - public String getPasswordHash() { - return passwordHash; + public String getPassword() { + return password; } - public void setPasswordHash(String passwordHash) { - this.passwordHash = passwordHash; + public void setPassword(String password) { + this.password = password; } public String toString() { From 8466cec1926ae979e2b894519a135ea2b50be686 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:24:35 -0300 Subject: [PATCH 11/32] refactor: remove unnecessary info printing --- .../auth_api/domain/valueObject/Username.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/domain/valueObject/Username.java b/src/main/java/dev/idinaldo/auth_api/domain/valueObject/Username.java index ac5138f..6708426 100644 --- a/src/main/java/dev/idinaldo/auth_api/domain/valueObject/Username.java +++ b/src/main/java/dev/idinaldo/auth_api/domain/valueObject/Username.java @@ -4,25 +4,24 @@ import com.fasterxml.jackson.annotation.JsonValue; import dev.idinaldo.auth_api.infrastructure.exceptions.InvalidUsernameException; -public record Username(String username) { +public record Username(String value) { + @JsonCreator - public Username(String username) { - if (this.isValid(username)) { - this.username = username; + public Username(String value) { + if (this.isValid(value)) { + this.value = value; } else { throw new InvalidUsernameException(); } } private boolean isValid(String value) { - System.out.println("[" + value + "]"); - System.out.println(value.matches("\\w{6,16}")); return value.matches("\\w{6,16}"); } @JsonValue public String getValue() { - return this.username; + return this.value; } } From 333bd1ce0292b051437aebab0a4d4fad6ffa4de2 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:25:25 -0300 Subject: [PATCH 12/32] feat: add initial implementation of entityToDomain mapping --- .../infrastructure/mappers/IdentityMapper.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapper.java b/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapper.java index cba87c0..10897c5 100644 --- a/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapper.java +++ b/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapper.java @@ -1,6 +1,6 @@ package dev.idinaldo.auth_api.infrastructure.mappers; -import dev.idinaldo.auth_api.adapters.in.dtos.ClientIdentityRegisterDTO; +import dev.idinaldo.auth_api.adapters.in.dtos.IdentityRequestDTO; import dev.idinaldo.auth_api.domain.models.Identity; import dev.idinaldo.auth_api.infrastructure.entities.JpaIdentity; import org.springframework.security.crypto.password.PasswordEncoder; @@ -15,21 +15,26 @@ public IdentityMapper(PasswordEncoder passwordEncoder) { this.passwordEncoder = passwordEncoder; } + public Identity requestDtoToDomain(IdentityRequestDTO identityRegisterDTO) { + return new Identity(identityRegisterDTO.username(), identityRegisterDTO.password()); + } + public JpaIdentity domainToEntity(Identity identity) { JpaIdentity jpaIdentity = new JpaIdentity(); jpaIdentity.setUsername(identity.getUsername().getValue()); - jpaIdentity.setPasswordHash(identity.getPasswordHash()); + jpaIdentity.setPasswordHash(this.passwordEncoder.encode(identity.getPassword())); return jpaIdentity; } - public Identity registerDtoToDomain(ClientIdentityRegisterDTO identityRegisterDTO) { + public Identity entityToDomain(JpaIdentity jpaIdentity) { Identity identity = new Identity(); - identity.setUsername(identityRegisterDTO.username()); - identity.setPasswordHash(passwordEncoder.encode(identityRegisterDTO.password())); + identity.setId(jpaIdentity.getId()); + identity.setUsernameFromString(jpaIdentity.getUsername()); return identity; } + } From ecc0a9d04b0e35941699e600f4846c83d4f1a835 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Wed, 25 Feb 2026 00:26:05 -0300 Subject: [PATCH 13/32] feat: add findByUsername method --- .../java/dev/idinaldo/auth_api/ports/IdentityRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java b/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java index 1b0c375..dfbe2c0 100644 --- a/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java +++ b/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java @@ -8,4 +8,5 @@ @Repository public interface IdentityRepository { UUID save(Identity identity); + Identity findByUsername(String username); } From 0fe708c779bead70b64784243c10c358e6b14582 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 04:06:31 -0300 Subject: [PATCH 14/32] feat: add BadRequestException and remove unecessary variable --- .../adapters/in/controllers/IdentityController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java b/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java index 28259ca..14cb2e5 100644 --- a/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java +++ b/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java @@ -5,6 +5,7 @@ import dev.idinaldo.auth_api.domain.models.Identity; import dev.idinaldo.auth_api.infrastructure.mappers.IdentityMapper; import jakarta.validation.Valid; +import org.apache.coyote.BadRequestException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -35,9 +36,8 @@ public ResponseEntity registerClient(@RequestBody @Valid IdentityRequest } @PostMapping("/signin") - public ResponseEntity signIn(@RequestBody @Valid IdentityRequestDTO identityRequestDTO) { + public ResponseEntity signIn(@RequestBody @Valid IdentityRequestDTO identityRequestDTO) throws BadRequestException { Identity identity = this.identityMapper.requestDtoToDomain(identityRequestDTO); - String token = this.identityService.signIn(identity); - return ResponseEntity.ok(token); + return ResponseEntity.ok(this.identityService.signIn(identity)); } } From 5ec8549e02b4d23beb4eac70ffd054abbd3ca2ab Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 04:07:32 -0300 Subject: [PATCH 15/32] feat: add BadRequestException --- .../idinaldo/auth_api/application/usecases/SignInUseCase.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java b/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java index ca78168..1f8758f 100644 --- a/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java +++ b/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java @@ -1,7 +1,8 @@ package dev.idinaldo.auth_api.application.usecases; import dev.idinaldo.auth_api.domain.models.Identity; +import org.apache.coyote.BadRequestException; public interface SignInUseCase { - String signIn(Identity identity); + String signIn(Identity identity) throws BadRequestException; } From bfd3537b97d553f0b5279c6161298ee98d797de8 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 04:09:12 -0300 Subject: [PATCH 16/32] feat: add findByUsername method to handle sign in and compare persisted data and input --- .../java/dev/idinaldo/auth_api/ports/IdentityRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java b/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java index dfbe2c0..f7d784d 100644 --- a/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java +++ b/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java @@ -3,10 +3,11 @@ import dev.idinaldo.auth_api.domain.models.Identity; import org.springframework.stereotype.Repository; +import java.util.Optional; import java.util.UUID; @Repository public interface IdentityRepository { UUID save(Identity identity); - Identity findByUsername(String username); + Optional findByUsername(String username); } From 6b17206e6c7eb21dcee923d9fff43bc2a25b05e3 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 04:10:21 -0300 Subject: [PATCH 17/32] feat: add signIn method implementation with main error handling and initial structure of JWT generation --- .../application/services/IdentityService.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java b/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java index ab9c784..eee29d2 100644 --- a/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java +++ b/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java @@ -6,9 +6,12 @@ import dev.idinaldo.auth_api.infrastructure.entities.JpaIdentity; import dev.idinaldo.auth_api.ports.IdentityRepository; import dev.idinaldo.auth_api.ports.JwtGenerator; +import org.apache.coyote.BadRequestException; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.Optional; import java.util.UUID; @Service @@ -17,6 +20,7 @@ public class IdentityService implements ClientRegisterUseCase, SignInUseCase { private final IdentityRepository identityRepository; private final JwtGenerator jwtGenerator; private final PasswordEncoder passwordEncoder; + private final String SIGN_IN_ERROR_MESSAGE = "Please verify your request."; public IdentityService(IdentityRepository identityRepository, JwtGenerator jwtGenerator, PasswordEncoder passwordEncoder) { this.identityRepository = identityRepository; @@ -30,9 +34,17 @@ public UUID registerClient(Identity identity) { } @Override - public String signIn(Identity identity) { - - if (passwordEncoder.matches(identity.getPassword(), userCredentials.getPassword())) - return ""; + public String signIn(Identity identity) throws BadRequestException { + + // verificar se o usuário está cadastrado + Identity persistedIdentity = identityRepository.findByUsername(identity.getUsername().getValue()) + .orElseThrow(() -> new BadRequestException(SIGN_IN_ERROR_MESSAGE)); + // verificar se a senha está correta + if (passwordEncoder.matches(identity.getPassword(), persistedIdentity.getPassword())) { + // gerar e retornar JWT + return this.jwtGenerator.generateToken(persistedIdentity); + } else { + throw new BadRequestException(SIGN_IN_ERROR_MESSAGE); + } } } From 50feac2273fff703924aea14abc7335c66ca6a65 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:12:44 -0300 Subject: [PATCH 18/32] feat: add WeakPasswordException to warn and disallow users' from having easy-to-break passwords --- .../infrastructure/exceptions/WeakPasswordException.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java diff --git a/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java b/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java new file mode 100644 index 0000000..b9b73e8 --- /dev/null +++ b/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java @@ -0,0 +1,4 @@ +package dev.idinaldo.auth_api.infrastructure.exceptions; + +public class WeakPasswordException extends Throwable { +} From bcb590c15874308f56a8145f3fb14be55a4ad92e Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:13:00 -0300 Subject: [PATCH 19/32] feat: add mapstruct dependency --- pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pom.xml b/pom.xml index 6e61d8e..9b710b1 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,11 @@ spring-boot-starter-validation-test test + + org.mapstruct + mapstruct + 1.6.3 + org.springframework.boot spring-boot-starter-webmvc-test @@ -109,6 +114,11 @@ org.projectlombok lombok + + org.mapstruct + mapstruct-processor + 1.5.5.Final + From 13b9d656d14e2e0264ad0083d37eb59e73c8732b Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:13:46 -0300 Subject: [PATCH 20/32] feat: add intial implementation of IdentityMapper with mapStruct --- .../infrastructure/mappers/SimpleIdentityMapper.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/SimpleIdentityMapper.java diff --git a/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/SimpleIdentityMapper.java b/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/SimpleIdentityMapper.java new file mode 100644 index 0000000..1232c20 --- /dev/null +++ b/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/SimpleIdentityMapper.java @@ -0,0 +1,12 @@ +package dev.idinaldo.auth_api.infrastructure.mappers; + +import dev.idinaldo.auth_api.domain.models.Identity; +import dev.idinaldo.auth_api.infrastructure.entities.JpaIdentity; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "spring") +public interface SimpleIdentityMapper { + + Identity entityToDomain(JpaIdentity jpaIdentity); + JpaIdentity domainToEntity(Identity identity); +} From ffeade54ca9b29ff9b64fd36af1798953c7848c1 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:15:15 -0300 Subject: [PATCH 21/32] feat: add IdentityMapperFacade to facilitate and simplify access to IdentityMapper (complex mapping) and SimpleIdentityMapper (mapStruct) --- .../mappers/IdentityMapperFacade.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapperFacade.java diff --git a/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapperFacade.java b/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapperFacade.java new file mode 100644 index 0000000..eb9474a --- /dev/null +++ b/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapperFacade.java @@ -0,0 +1,31 @@ +package dev.idinaldo.auth_api.infrastructure.mappers; + +import dev.idinaldo.auth_api.adapters.in.dtos.IdentityRequestDTO; +import dev.idinaldo.auth_api.domain.models.Identity; +import dev.idinaldo.auth_api.infrastructure.entities.JpaIdentity; +import org.springframework.stereotype.Component; + +@Component +public class IdentityMapperFacade { + + private final SimpleIdentityMapper simpleMapper; + private final IdentityMapper complexMapper; + + public IdentityMapperFacade(SimpleIdentityMapper simpleMapper, IdentityMapper complexMapper) { + this.simpleMapper = simpleMapper; + this.complexMapper = complexMapper; + } + + public Identity requestDtoToDomain(IdentityRequestDTO requestDTO) { + return this.complexMapper.requestDtoToDomain(requestDTO); + } + + public Identity entityToDomain(JpaIdentity jpaIdentity) { + return this.simpleMapper.entityToDomain(jpaIdentity); + } + + public JpaIdentity domainToEntity(Identity identity) { + return this.simpleMapper.domainToEntity(identity); + } + +} From 9d806c24e86aac9c05737ea3010da2021914b0e3 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:16:30 -0300 Subject: [PATCH 22/32] refactor: remove optional from findByUsername since its nullability is now handled inside this method --- .../java/dev/idinaldo/auth_api/ports/IdentityRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java b/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java index f7d784d..6552cdd 100644 --- a/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java +++ b/src/main/java/dev/idinaldo/auth_api/ports/IdentityRepository.java @@ -1,6 +1,7 @@ package dev.idinaldo.auth_api.ports; import dev.idinaldo.auth_api.domain.models.Identity; +import org.apache.coyote.BadRequestException; import org.springframework.stereotype.Repository; import java.util.Optional; @@ -9,5 +10,5 @@ @Repository public interface IdentityRepository { UUID save(Identity identity); - Optional findByUsername(String username); + Identity findByUsername(String username) throws BadRequestException; } From 1650a6b899b54ffc4697a0bde962ee84a32fbc15 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:18:03 -0300 Subject: [PATCH 23/32] refactor: remove unnecessary methods and update requestDtoToDomain method --- .../mappers/IdentityMapper.java | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapper.java b/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapper.java index 10897c5..db1fec7 100644 --- a/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapper.java +++ b/src/main/java/dev/idinaldo/auth_api/infrastructure/mappers/IdentityMapper.java @@ -2,7 +2,6 @@ import dev.idinaldo.auth_api.adapters.in.dtos.IdentityRequestDTO; import dev.idinaldo.auth_api.domain.models.Identity; -import dev.idinaldo.auth_api.infrastructure.entities.JpaIdentity; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; @@ -16,25 +15,10 @@ public IdentityMapper(PasswordEncoder passwordEncoder) { } public Identity requestDtoToDomain(IdentityRequestDTO identityRegisterDTO) { - return new Identity(identityRegisterDTO.username(), identityRegisterDTO.password()); - } - - public JpaIdentity domainToEntity(Identity identity) { - JpaIdentity jpaIdentity = new JpaIdentity(); - - jpaIdentity.setUsername(identity.getUsername().getValue()); - jpaIdentity.setPasswordHash(this.passwordEncoder.encode(identity.getPassword())); - - return jpaIdentity; - } - - public Identity entityToDomain(JpaIdentity jpaIdentity) { - Identity identity = new Identity(); - - identity.setId(jpaIdentity.getId()); - identity.setUsernameFromString(jpaIdentity.getUsername()); - - return identity; + return new Identity( + identityRegisterDTO.username(), + this.passwordEncoder.encode(identityRegisterDTO.password()) + ); } } From 2e4f2de5e5e4c273017e33ed4e3f2a1a29581d67 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:20:16 -0300 Subject: [PATCH 24/32] refactor: replace IdentityMapper (complex mapper) with IdentityMapperFacade and update signIn method sign in method now sends requestDTO to service instead of mapping it to domain --- .../adapters/in/controllers/IdentityController.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java b/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java index 14cb2e5..c1798bd 100644 --- a/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java +++ b/src/main/java/dev/idinaldo/auth_api/adapters/in/controllers/IdentityController.java @@ -3,7 +3,7 @@ import dev.idinaldo.auth_api.adapters.in.dtos.IdentityRequestDTO; import dev.idinaldo.auth_api.application.services.IdentityService; import dev.idinaldo.auth_api.domain.models.Identity; -import dev.idinaldo.auth_api.infrastructure.mappers.IdentityMapper; +import dev.idinaldo.auth_api.infrastructure.mappers.IdentityMapperFacade; import jakarta.validation.Valid; import org.apache.coyote.BadRequestException; import org.springframework.http.HttpStatus; @@ -21,9 +21,9 @@ public class IdentityController { private final IdentityService identityService; - private final IdentityMapper identityMapper; + private final IdentityMapperFacade identityMapper; - public IdentityController(IdentityService identityService, IdentityMapper identityMapper) { + public IdentityController(IdentityService identityService, IdentityMapperFacade identityMapper) { this.identityService = identityService; this.identityMapper = identityMapper; } @@ -37,7 +37,6 @@ public ResponseEntity registerClient(@RequestBody @Valid IdentityRequest @PostMapping("/signin") public ResponseEntity signIn(@RequestBody @Valid IdentityRequestDTO identityRequestDTO) throws BadRequestException { - Identity identity = this.identityMapper.requestDtoToDomain(identityRequestDTO); - return ResponseEntity.ok(this.identityService.signIn(identity)); + return ResponseEntity.ok(this.identityService.signIn(identityRequestDTO)); } } From 8b93b4e1f840d92c0bfbbbd3599d5c6e4ea787a2 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:21:30 -0300 Subject: [PATCH 25/32] feat: add exception constructors --- .../exceptions/WeakPasswordException.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java b/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java index b9b73e8..e30a138 100644 --- a/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java +++ b/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java @@ -1,4 +1,14 @@ package dev.idinaldo.auth_api.infrastructure.exceptions; -public class WeakPasswordException extends Throwable { +import org.springframework.stereotype.Component; + +@Component +public class WeakPasswordException extends RuntimeException { + public WeakPasswordException() { + super("Please make sure your password is at least 6-characters long and contains letters, numbers and special symbols."); + } + + public WeakPasswordException(String message) { + super(message); + } } From 31748c79eb6c0a223a4109428e37f8410eda67a0 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:25:45 -0300 Subject: [PATCH 26/32] refactor: remove unnecessary annotation at exception class --- .../infrastructure/exceptions/WeakPasswordException.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java b/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java index e30a138..b885fbd 100644 --- a/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java +++ b/src/main/java/dev/idinaldo/auth_api/infrastructure/exceptions/WeakPasswordException.java @@ -1,9 +1,7 @@ package dev.idinaldo.auth_api.infrastructure.exceptions; -import org.springframework.stereotype.Component; - -@Component public class WeakPasswordException extends RuntimeException { + public WeakPasswordException() { super("Please make sure your password is at least 6-characters long and contains letters, numbers and special symbols."); } From 5dba413752b2fcc3e6c9dcabdfce2b370f1551ef Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:27:24 -0300 Subject: [PATCH 27/32] refactor: replace value object "Username" with String data type This was done since validation is now placed at DTO --- .../auth_api/domain/models/Identity.java | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/domain/models/Identity.java b/src/main/java/dev/idinaldo/auth_api/domain/models/Identity.java index f13690e..3960f7b 100644 --- a/src/main/java/dev/idinaldo/auth_api/domain/models/Identity.java +++ b/src/main/java/dev/idinaldo/auth_api/domain/models/Identity.java @@ -1,24 +1,22 @@ package dev.idinaldo.auth_api.domain.models; -import dev.idinaldo.auth_api.domain.valueObject.Username; - import java.util.UUID; public class Identity { private UUID id; - private Username username; - private String password; + private String username; + private String passwordHash; - public Identity(UUID id, Username username, String password) { + public Identity(UUID id, String username, String passwordHash) { this.id = id; this.username = username; - this.password = password; + this.passwordHash = passwordHash; } - public Identity(Username username, String password) { + public Identity(String username, String passwordHash) { this.username = username; - this.password = password; + this.passwordHash = passwordHash; } public Identity() { @@ -32,24 +30,20 @@ public void setId(UUID id) { this.id = id; } - public Username getUsername() { + public String getUsername() { return username; } - public void setUsernameFromString(String username) { - this.username = new Username(username); - } - - public void setUsername(Username username) { + public void setUsername(String username) { this.username = username; } - public String getPassword() { - return password; + public String getPasswordHash() { + return passwordHash; } - public void setPassword(String password) { - this.password = password; + public void setPasswordHash(String passwordHash) { + this.passwordHash = passwordHash; } public String toString() { From 542fedd0b3e1e5db6b7ef52ff6a2ebbebbb397f5 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:28:44 -0300 Subject: [PATCH 28/32] feat: add initial structure of Username and Password regEx validation --- .../adapters/in/dtos/IdentityRequestDTO.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/IdentityRequestDTO.java b/src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/IdentityRequestDTO.java index 11580dd..2ad87df 100644 --- a/src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/IdentityRequestDTO.java +++ b/src/main/java/dev/idinaldo/auth_api/adapters/in/dtos/IdentityRequestDTO.java @@ -1,6 +1,25 @@ package dev.idinaldo.auth_api.adapters.in.dtos; -import dev.idinaldo.auth_api.domain.valueObject.Username; -public record IdentityRequestDTO(Username username, String password) { +import dev.idinaldo.auth_api.infrastructure.exceptions.InvalidUsernameException; +import dev.idinaldo.auth_api.infrastructure.exceptions.WeakPasswordException; + +public record IdentityRequestDTO(String username, String password) { + + public IdentityRequestDTO(String username, String password) { + if (this.isUsernameValid(username)) { + if (this.isPasswordValid(password)) { + this.username = username; + this.password = password; + } else throw new WeakPasswordException(); + } else throw new InvalidUsernameException(); + } + + public boolean isUsernameValid(String username) { + return true; + } + + public boolean isPasswordValid(String password) { + return true; + } } From 17349c112c6afda2b9ac20492f94dd687978de8b Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:34:12 -0300 Subject: [PATCH 29/32] refactor: replace Identity with IdentityRequestDTO to facilitate password validation --- .../idinaldo/auth_api/application/usecases/SignInUseCase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java b/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java index 1f8758f..3dd774a 100644 --- a/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java +++ b/src/main/java/dev/idinaldo/auth_api/application/usecases/SignInUseCase.java @@ -1,8 +1,8 @@ package dev.idinaldo.auth_api.application.usecases; -import dev.idinaldo.auth_api.domain.models.Identity; +import dev.idinaldo.auth_api.adapters.in.dtos.IdentityRequestDTO; import org.apache.coyote.BadRequestException; public interface SignInUseCase { - String signIn(Identity identity) throws BadRequestException; + String signIn(IdentityRequestDTO identityRequestDTO) throws BadRequestException; } From 6b188203d9d971baf9f6df4d5de14d22e620146b Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:36:30 -0300 Subject: [PATCH 30/32] refactor: align service with usecase specification by replacing Identity with its request DTO minor changes: add logger and remove comments --- .../application/services/IdentityService.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java b/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java index eee29d2..d770dc3 100644 --- a/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java +++ b/src/main/java/dev/idinaldo/auth_api/application/services/IdentityService.java @@ -1,17 +1,17 @@ package dev.idinaldo.auth_api.application.services; +import dev.idinaldo.auth_api.adapters.in.dtos.IdentityRequestDTO; import dev.idinaldo.auth_api.application.usecases.ClientRegisterUseCase; import dev.idinaldo.auth_api.application.usecases.SignInUseCase; import dev.idinaldo.auth_api.domain.models.Identity; -import dev.idinaldo.auth_api.infrastructure.entities.JpaIdentity; import dev.idinaldo.auth_api.ports.IdentityRepository; import dev.idinaldo.auth_api.ports.JwtGenerator; import org.apache.coyote.BadRequestException; -import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; -import java.util.Optional; import java.util.UUID; @Service @@ -21,6 +21,7 @@ public class IdentityService implements ClientRegisterUseCase, SignInUseCase { private final JwtGenerator jwtGenerator; private final PasswordEncoder passwordEncoder; private final String SIGN_IN_ERROR_MESSAGE = "Please verify your request."; + private final Logger logger = LoggerFactory.getLogger(IdentityService.class); public IdentityService(IdentityRepository identityRepository, JwtGenerator jwtGenerator, PasswordEncoder passwordEncoder) { this.identityRepository = identityRepository; @@ -34,17 +35,10 @@ public UUID registerClient(Identity identity) { } @Override - public String signIn(Identity identity) throws BadRequestException { - - // verificar se o usuário está cadastrado - Identity persistedIdentity = identityRepository.findByUsername(identity.getUsername().getValue()) - .orElseThrow(() -> new BadRequestException(SIGN_IN_ERROR_MESSAGE)); - // verificar se a senha está correta - if (passwordEncoder.matches(identity.getPassword(), persistedIdentity.getPassword())) { - // gerar e retornar JWT + public String signIn(IdentityRequestDTO identityRequestDTO) throws BadRequestException { + Identity persistedIdentity = identityRepository.findByUsername(identityRequestDTO.username()); + if (passwordEncoder.matches(identityRequestDTO.password(), persistedIdentity.getPasswordHash())) { return this.jwtGenerator.generateToken(persistedIdentity); - } else { - throw new BadRequestException(SIGN_IN_ERROR_MESSAGE); - } + } else throw new BadRequestException(SIGN_IN_ERROR_MESSAGE); } } From c3a10a516919d485808bfdc39fd1b3282844da47 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:37:36 -0300 Subject: [PATCH 31/32] feat: update findByUsername method to return Optional JpaIdentity --- .../adapters/out/persistence/IdentityJpaRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityJpaRepository.java b/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityJpaRepository.java index 804076b..0bd1ab5 100644 --- a/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityJpaRepository.java +++ b/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityJpaRepository.java @@ -5,9 +5,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; import java.util.UUID; @Repository public interface IdentityJpaRepository extends JpaRepository { - JpaIdentity findByUsername(String username); + Optional findByUsername(String username); } From c880ead7a676b325fbcf474694a14655d9e1b267 Mon Sep 17 00:00:00 2001 From: Idinaldo Date: Sat, 7 Mar 2026 15:38:50 -0300 Subject: [PATCH 32/32] feat: add nullability handling and IdentityMapperFacade --- .../out/persistence/IdentityRepositoryImpl.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityRepositoryImpl.java b/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityRepositoryImpl.java index 23e066a..1a4e316 100644 --- a/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityRepositoryImpl.java +++ b/src/main/java/dev/idinaldo/auth_api/adapters/out/persistence/IdentityRepositoryImpl.java @@ -2,19 +2,22 @@ import dev.idinaldo.auth_api.domain.models.Identity; import dev.idinaldo.auth_api.infrastructure.entities.JpaIdentity; -import dev.idinaldo.auth_api.infrastructure.mappers.IdentityMapper; +import dev.idinaldo.auth_api.infrastructure.mappers.IdentityMapperFacade; import dev.idinaldo.auth_api.ports.IdentityRepository; +import org.apache.coyote.BadRequestException; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Component; +import java.util.Optional; import java.util.UUID; @Component public class IdentityRepositoryImpl implements IdentityRepository { private final IdentityJpaRepository identityJpaRepository; - private final IdentityMapper identityMapper; + private final IdentityMapperFacade identityMapper; - public IdentityRepositoryImpl(IdentityJpaRepository identityJpaRepository, IdentityMapper identityMapper) { + public IdentityRepositoryImpl(IdentityJpaRepository identityJpaRepository, IdentityMapperFacade identityMapper) { this.identityJpaRepository = identityJpaRepository; this.identityMapper = identityMapper; } @@ -26,8 +29,8 @@ public UUID save(Identity identity) { } @Override - public Identity findByUsername(String username) { - JpaIdentity jpaIdentity = this.identityJpaRepository.findByUsername(username); + public Identity findByUsername(String username) throws BadRequestException { + JpaIdentity jpaIdentity = this.identityJpaRepository.findByUsername(username).orElseThrow(BadRequestException::new); return this.identityMapper.entityToDomain(jpaIdentity); } }