|
|
3d598faffc
|
feat(api): UDT-003 registro de usuarios — backend completo (Phases 1-6)
- Domain: Usuario.ForCreation factory, UsernameAlreadyExistsException, IUsuarioRepository extendido
- Application: CreateUsuarioCommand/Validator/Handler, UsuarioCreatedDto, AuthOptions password policy
- Infrastructure: UsuarioRepository.ExistsByUsernameAsync + AddAsync (INSERT OUTPUT INSERTED.Id), RoleClaimType="rol" en TokenValidationParameters
- Api: UsuariosController POST api/v1/users [Authorize(Roles="admin")], ExceptionFilter mapea UsernameAlreadyExistsException + SqlException 2627 → 409
- Tests (unit): 43 tests — 33 validator + 10 handler (107 total, green)
- Tests (integration): 7 tests CreateUsuarioEndpoint — 401/403/400/201/409/race/e2e (green)
- Fix: TestWebAppFactory.ConfigureTestServices reemplaza SqlConnectionFactory singleton con CS de test correcto
|
2026-04-15 10:47:48 -03:00 |
|
|
|
fd2ff8a802
|
feat(api): map InvalidRefreshTokenException and TokenReuseDetectedException to generic 401
|
2026-04-14 13:28:45 -03:00 |
|
|
|
8768067fdd
|
feat(api): add /refresh [AllowAnonymous] and /logout [Authorize] endpoints to AuthController
|
2026-04-14 13:28:45 -03:00 |
|
|
|
aed26e3de9
|
feat(infra): register RefreshTokenRepository, RefreshTokenGenerator, ClientContext and handlers in DI
|
2026-04-14 13:28:36 -03:00 |
|
|
|
cb4250f7b3
|
feat(infra): implement ClientContext for IP and UserAgent from IHttpContextAccessor
|
2026-04-14 13:28:35 -03:00 |
|
|
|
19ac807500
|
feat(infra): add RefreshTokenDays to JwtOptions and AuthOptions config
|
2026-04-14 13:28:35 -03:00 |
|
|
|
0c809da633
|
feat(infra): implement RefreshTokenRepository with Dapper and add GetByIdAsync to UsuarioRepository
|
2026-04-14 13:28:29 -03:00 |
|
|
|
d326dd87e0
|
feat(infra): implement RefreshTokenGenerator with cryptographic random bytes
|
2026-04-14 13:28:24 -03:00 |
|
|
|
c910ff2fc5
|
feat(infra): implement GetPrincipalFromExpiredToken in JwtService
|
2026-04-14 13:28:20 -03:00 |
|
|
|
8bbd2b6f2a
|
feat(app): update LoginCommandHandler to persist hashed refresh token on login
|
2026-04-14 13:28:16 -03:00 |
|
|
|
6c02197369
|
feat(app): implement LogoutCommand handler with idempotent revocation
|
2026-04-14 13:28:10 -03:00 |
|
|
|
f5e67b78a5
|
feat(app): implement RefreshCommand handler with token rotation and chain revocation
|
2026-04-14 13:28:06 -03:00 |
|
|
|
971f6f572f
|
feat(app): add IClientContext abstraction for IP and UserAgent
|
2026-04-14 13:17:12 -03:00 |
|
|
|
84006776b6
|
feat(app): add IRefreshTokenGenerator abstraction
|
2026-04-14 13:17:12 -03:00 |
|
|
|
802c89ffe5
|
feat(app): add IRefreshTokenRepository abstraction
|
2026-04-14 13:17:11 -03:00 |
|
|
|
ba6dffb137
|
feat(app): extend IJwtService with GetPrincipalFromExpiredToken
|
2026-04-14 13:17:11 -03:00 |
|
|
|
83c6a95ee2
|
feat(domain): add InvalidRefreshTokenException and TokenReuseDetectedException
|
2026-04-14 13:16:44 -03:00 |
|
|
|
aacfd29673
|
feat(domain): add TokenHasher SHA-256 base64url helper
|
2026-04-14 13:16:43 -03:00 |
|
|
|
99bb3364c3
|
feat(domain): add RefreshToken entity with factory methods and IsActive logic
|
2026-04-14 13:16:38 -03:00 |
|
|
|
9891f96618
|
feat(udt-001): api layer with AuthController, Program.cs and Serilog
|
2026-04-13 21:36:08 -03:00 |
|
|
|
ca57ce33b5
|
feat(udt-001): infrastructure (Dapper, BCrypt, JWT RS256, dispatcher)
|
2026-04-13 21:36:02 -03:00 |
|
|
|
8c26cd3ac5
|
feat(udt-001): application layer with LoginCommandHandler and ports
|
2026-04-13 21:36:01 -03:00 |
|
|
|
2111070c77
|
feat(udt-001): domain layer with Usuario entity
|
2026-04-13 21:36:00 -03:00 |
|
|
|
88ecaa2c7f
|
chore(udt-001): RSA key generation script
|
2026-04-13 21:35:56 -03:00 |
|