- Updated general requirements document to clarify its historical context and remove outdated technical details. - Revised template documentation to serve as a base for writing prompts, emphasizing its auxiliary nature. - Enhanced architecture documentation with clear distinctions between canonical and complementary documents. - Added a new document for backend prompt base to centralize common context for backend prompts. - Created a dedicated README for customer invoices, organizing current contracts, operational support, and historical context. - Improved clarity and structure in various customer invoice documents, consolidating operational semantics and referencing canonical sources.
2.9 KiB
2.9 KiB
Prompt Auth
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