Vas a construir MobileFix, una aplicación para gestionar órdenes de reparación de dispositivos móviles. Debe permitir inicio de sesión con tres roles: USER, TECH (técnico) y ADMIN. Cada rol verá y ejecutará acciones acordes a sus permisos. El objetivo es practicar flujo completo por capas: Vistas (JSP) → Controller → Service → Repository → H2, con tests, trazabilidad y disciplina de commits.
- Lenguaje: Java 21
- Framework: Spring Boot (Web, Validation)
- Persistencia: H2 (memoria o file), Spring Data JPA
- Vistas: JSP (opcional Thymeleaf)
- Seguridad: autenticación en memoria (3 roles) o almacenamiento en H2
- Pruebas: JUnit 5 + Spring Boot Test (unitarias)
- Convenciones: ResponseEntity en todos los controladores REST
- Trazabilidad: Azure Boards
- Commits: Conventional Commits (ej.:
feat: add repair order creation) - Naming: todo en inglés (clases, endpoints, variables, vistas)
- USER: crear solicitud de reparación, ver sus órdenes, cancelar si está en PENDING.
- TECH: ver órdenes asignadas, cambiar estado (IN_PROGRESS, READY, DELIVERED), añadir notas técnicas.
- ADMIN: ver todas las órdenes, asignar técnico, actualizar catálogo de dispositivos, administrar usuarios.
- User:
id,username(único),password(hash),role∈ {USER, TECH, ADMIN},fullName,email,enabled. - Device:
id,brand,model,serialNumber(único opcional). - RepairOrder:
id,customer(User),device(Device),issueDescription,status∈ {PENDING, IN_PROGRESS, READY, DELIVERED, CANCELED},assignedTech(User? null si no asignado),createdAt,updatedAt,techNotes(opcional).
Auditoría:
createdAtyupdatedAtse actualizan automáticamente a nivel de entidad o servicio.
-
Auth (opcional si usas Security con formLogin):
POST /api/auth/login,POST /api/auth/logout. -
Repair Orders
-
GET /api/orders- ADMIN: todas. TECH: solo asignadas. USER: solo propias.
- Query opcional:
status,page,size,sort.
-
POST /api/orders(USER)- Body:
{ "deviceId": number, "issueDescription": "string>=10" }
- Body:
-
PUT /api/orders/{id}/assign/{techId}(ADMIN) -
PUT /api/orders/{id}/status(TECH/ADMIN)- Body:
{ "status": "IN_PROGRESS|READY|DELIVERED|CANCELED", "techNotes": "string?" }
- Body:
-
DELETE /api/orders/{id}(USER/ADMIN)- Reglas: USER sólo si
PENDINGy propia; ADMIN siempre.
- Reglas: USER sólo si
-
-
Devices
GET /api/devices(todos los roles)POST /api/devices(ADMIN)PUT /api/devices/{id}(ADMIN)DELETE /api/devices/{id}(ADMIN)
-
Users (solo ADMIN básico)
GET /api/usersPOST /api/users(crear técnico/usuario/admin)
-
Login (
/login): formulario de acceso. -
Dashboard:
- USER: formulario “New Repair”, listado de mis órdenes con acciones permitidas.
- TECH: listado de órdenes asignadas, acción “Change status”, agregar notas.
- ADMIN: todas las órdenes, asignación a técnico, ABM de Devices y Users.
-
Orders list/detail: JSPs que consumen los endpoints (fetch) o
ModelAndViewsegún prefieras.
- 400 →
{ "error": "Validation failed", "fields": { "issueDescription": "min 10" } } - 401/403 según autenticación/rol.
- 404 →
{ "error": "Not found" } - 409 →
{ "error": "Username already exists" }o conflictos de estado.
- view/ (JSP o Thymeleaf).
- controller/.
- service/.
- repository/.
- model/.
- config/.
-
OrderService
create: válido → crea conPENDING; inválido → excepción/400 (título/issue corto, device inexistente).assignTech: ADMIN asigna técnico válido; no-ADMIN → prohibido.changeStatus: transición válida (PENDING→IN_PROGRESS→READY→DELIVERED); inválida → error.delete: USER dueño conPENDING→ ok; status distinto o ajena → prohibido.
-
DeviceService
- ABM básico con validaciones de campos.
- Tests de controlador con
@WebMvcTestpara validar ResponseEntity (códigos y payloads).
-
Spring Security con:
-
In-memory o H2 para usuarios de prueba:
user/user123→ ROLE_USERtech/tech123→ ROLE_TECHadmin/admin123→ ROLE_ADMIN
-
Rutas protegidas por rol según endpoints.
-
/login form-login y /logout habilitados.
-
H2 console accesible solo en desarrollo.
-
-
Crea Work Items: Auth, Orders CRUD, Status Flow, Devices CRUD, Users admin, Views.
-
Enlaza cada commit/PR con su Work Item ID (ej.:
feat(order): create endpoint for new order #123). -
Convencional Commits (obligatorio):
feat:,fix:,test:,docs:,refactor:,chore:,style:- Ej.:
feat(order): allow TECH to change status to IN_PROGRESS #127
- Proyecto ejecutable (H2 con datos de ejemplo).
- Vistas JSP funcionales (o Thymeleaf) según rol.
- API REST con ResponseEntity (códigos correctos y payloads claros).
- Modelos (
User,Device,RepairOrder) y repositorios. - Servicios con reglas de negocio y validaciones.
- Pruebas unitarias con JUnit 5 (Service, y opcional Web layer).
- Trazabilidad en Azure Boards.
- README (cómo correr, usuarios de prueba, rutas principales).
- Login operativo por rol y acceso diferenciado a vistas/acciones.
- USER puede crear y ver sus órdenes; borrar solo si
PENDING. - ADMIN puede listar todas, asignar técnico y administrar catálogo de devices/users.
- TECH puede ver asignadas y cambiar estado con reglas válidas.
- Endpoints devuelven ResponseEntity con códigos y errores coherentes.
- Tests unitarios clave del OrderService pasando.