Estructura del Proyecto
El proyecto sigue una arquitectura limpia y modular, organizando el código por funcionalidades (módulos) y capas.
Organización de Módulos
src/
├── auth/ # Módulo de autenticación
│ ├── controllers/ # Controladores y DTOs
│ └── service/ # Servicios de autenticación y JWT
├── config/ # Configuración global
│ ├── exceptions/ # Manejo centralizado de errores
│ └── models/ # Modelos base (ej: AuditEntity)
├── privilege/ # Módulo de privilegios
│ └── repositories/ # Acceso a datos de privilegios
├── role/ # Módulo de roles
│ └── repositories/ # Acceso a datos de roles
└── user/ # Módulo de usuarios
├── controllers/ # API REST de usuarios
├── mappers/ # Convertidores de entidades
├── repositories/ # Acceso a datos
└── services/ # Lógica de negocio
Módulos Principales
1. Autenticación (auth/)
- controllers/: Endpoints de autenticación
AuthController
: Login, registro y refresh tokendtos/
: Objetos de transferencia para auth
- service/: Lógica de autenticación
JwtTokenService
: Generación y validación de tokensCustomUserDetailsService
: Implementación de UserDetailsService
2. Configuración (config/)
- exceptions/: Sistema de manejo de errores
GlobalExceptionHandler
: Manejo centralizado de excepcionesErrorResponse
: Formato estándar de errores
- SecurityConfig: Configuración de Spring Security
- SwaggerConfig: Configuración de OpenAPI
- JpaConfig: Configuración de JPA y auditoría
3. Privilegios (privilege/)
- repositories/:
Privilege
: Entidad de privilegiosPrivilegeRepository
: Acceso a datos
4. Roles (role/)
- repositories/:
Role
: Entidad de rolesRoleRepository
: Acceso a datos
5. Usuarios (user/)
- controllers/: API REST
UserController
: Endpoints de usuariodtos/
: DTOs para requests/responses
- services/: Lógica de negocio
UserService
: Interface del servicioDefaultUserService
: Implementación
- repositories/: Acceso a datos
User
: Entidad principalUserRepository
: Operaciones de BD
- mappers/:
UserMapper
: Conversión entre Entity y DTO
Patrones de Diseño
Capa de Presentación (Controllers)
@RestController
@RequestMapping("/v1/users")
public class UserController {
private final UserService userService;
// Endpoints REST
}
Capa de Servicio
public interface UserService {
UserDTO getCurrentUser();
UserDTO updateUser(UserUpdateDTO updateDTO);
}
Capa de Repositorio
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
Mejores Prácticas
-
Separación de Responsabilidades:
- Controllers: Solo manejo de HTTP y validación
- Services: Lógica de negocio
- Repositories: Acceso a datos
-
DTOs:
- Request/Response separados
- Validación en DTOs
- Mappers dedicados
-
Interfaces:
- Servicios definidos por interfaces
- Implementaciones intercambiables
- Facilita testing
-
Nomenclatura:
- Controllers: Sufijo
Controller
- Services: Sufijo
Service
- Repositories: Sufijo
Repository
- DTOs: Sufijos
Request
/Response
- Controllers: Sufijo
-
Paquetes:
- Organización por función
- Subpaquetes por capa
- Modelos próximos a su uso