- Archived historical documents for DTO design and naming conventions. - Added normative documentation for HTTP request flow and module boundaries. - Introduced testing guidelines for backend layers. - Updated onboarding module documentation and clarified onboarding requirements. - Deprecated backend prompt base and prompt auth documents. - Adjusted paths in testing documentation for consistency.
3.1 KiB
3.1 KiB
HISTÓRICO/AUXILIAR — Prompt Auth
Este prompt no establece reglas transversales. Para arquitectura vigente, consultar arquitectura normativa.
Base comun reutilizada: backend-prompt-base.md
Este prompt añade solo las reglas especificas de autenticacion sobre esa base.
Contexto especifico
La API maneja autenticacion con PassportJS, soporte para JWT y LocalStrategy, gestion segura de contrasenas con bcrypt y transformacion de respuestas con DTOs.
Gestion de dependencias
AuthServicedebe crearse con un factory comocreateAuthService()AuthServicedepende deIAuthenticatedUserRepository,ITransactionManageryIAuthProvider
Autenticacion con PassportJS
PassportAuthProvidermanejaJWTStrategyyLocalStrategyvalidateUser()verifica credenciales conLocalStrategy- usar
bcryptpara cifrar contrasenas antes de almacenarlas PasswordHash.create()valida la fuerza de la contrasena antes de cifrarlabcrypt.compare()valida la contrasena al hacer login- las contrasenas nunca deben almacenarse en texto plano
Gestion de errores
ExpressControllerdebe devolver errores conApiErrorRegisterControlleryLoginControllerdeben mapear errores a409,401o500segun contrato- capturar errores de Sequelize relevantes en repositorios
- personalizar errores de unicidad mediante
errorMapper
Flujo de /register
- Request llega a
RegisterController - valida
email,usernameypasswordcomo Value Objects - llama a
AuthService.registerUser() AuthServiceevita usuarios duplicados convalidateUser()- si el usuario es nuevo, cifra la contrasena con
bcrypt.hash() - persiste con
AuthenticatedUserRepository.create() - genera
accessTokenyrefreshToken - responde con tokens y
userId
Flujo de /login
- Request llega a
LoginController - llama a
AuthService.loginUser()conemailypassword - busca el usuario en
AuthenticatedUserRepository.findUserByEmail() - compara contrasenas con
bcrypt.compare() - si la contrasena es correcta, genera tokens
- devuelve los tokens en la response
Transformacion de respuestas
- los controladores transforman antes de responder
- usar
AuthResponsePresenterpara mapear dominio aAuthResponseDTO - inyectar presenters en controllers cuando ayude a desacoplar
Seguridad y mejores practicas
- usar
TransactionManager.complete()para manejar transacciones - evitar acoplamientos directos entre servicios y repositorios
- usar
bcryptconSALT_ROUNDS=12configurable en.env - si ocurre un error en BD,
rollback()debe ejecutarse automaticamente
Solicitudes tipicas
- generar codigo cumpliendo estas reglas
- revisar codigo y detectar violaciones de SOLID o DDD
- optimizar
AuthServicepara seguridad y escalabilidad - implementar
/refresh - escribir pruebas unitarias y de integracion para
registerUser()yloginUser()
Restricciones
- no acoplar dependencias directamente
- no usar Sequelize directamente en servicios
- usar interfaces como
IAuthProvidereITransactionManager