feat: Fase 1 — Auth JWT+MFA, portales CRUD, UI completa
API: - AuthModule: register, login, refresh, logout, MFA/TOTP setup+verify - JwtStrategy + JwtAuthGuard + RolesGuard + CurrentUser decorator - PackagesModule: CRUD paquetes + historial de estados - PreAlertsModule: pre-alertas por usuario - UsersModule: gestión de usuarios + roles + activación - B2BModule: solicitudes de carga pesada/cotización - ValidationPipe global + CORS configurado Web (Next.js 15): - globals.css completo (design system + utility classes) - Layout raíz con WhatsApp flotante - /login + /registro funcionales con JWT y redirección por rol - /portal: dashboard, mi-casillero, mis-paquetes, pre-alerta, calculadora, perfil - /admin: dashboard, usuarios (gestión roles/activación), tarifas, reportes, auditoría - /bodega: dashboard, paquetes (crear+actualizar estado), verificación, despacho - /tracking: tracking real con progreso visual + historial - /calculadora: calculadora interactiva real (API SENAE §15) - /como-funciona, /tarifas, /quienes-somos, /casillero - /carga-pesada + /carga-pesada/cotizacion (formulario B2B) - lib/api.ts: cliente HTTP con auto-refresh de token Roles sincronizados con schema: SUPER_ADMIN, ADMIN_EMPRESA, OPERADOR_BODEGA, AGENTE_ADUANERO, CLIENTE, SOPORTE
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import {
|
||||
Controller, Post, Get, Body, Req, UseGuards, HttpCode, HttpStatus,
|
||||
} from "@nestjs/common";
|
||||
import { AuthService } from "./auth.service";
|
||||
import { RegisterDto, LoginDto, RefreshDto, SetupMfaDto } from "./dto/auth.dto";
|
||||
import { JwtAuthGuard } from "./guards/auth.guard";
|
||||
import { CurrentUser } from "./decorators/current-user.decorator";
|
||||
|
||||
@Controller("auth")
|
||||
export class AuthController {
|
||||
constructor(private auth: AuthService) {}
|
||||
|
||||
/** POST /api/auth/register — Registro público (doc §09 paso 1) */
|
||||
@Post("register")
|
||||
register(@Body() dto: RegisterDto) {
|
||||
return this.auth.register(dto);
|
||||
}
|
||||
|
||||
/** POST /api/auth/login — Login con JWT + MFA opcional */
|
||||
@Post("login")
|
||||
@HttpCode(HttpStatus.OK)
|
||||
login(@Body() dto: LoginDto, @Req() req: any) {
|
||||
return this.auth.login(dto, req.ip);
|
||||
}
|
||||
|
||||
/** POST /api/auth/refresh — Rotar refresh token */
|
||||
@Post("refresh")
|
||||
@HttpCode(HttpStatus.OK)
|
||||
refresh(@Body() dto: RefreshDto) {
|
||||
return this.auth.refresh(dto.refreshToken);
|
||||
}
|
||||
|
||||
/** POST /api/auth/logout */
|
||||
@Post("logout")
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@HttpCode(HttpStatus.OK)
|
||||
logout(@Body() dto: RefreshDto, @CurrentUser() user: any) {
|
||||
return this.auth.logout(dto.refreshToken, user.id);
|
||||
}
|
||||
|
||||
/** GET /api/auth/me — Perfil del usuario autenticado */
|
||||
@Get("me")
|
||||
@UseGuards(JwtAuthGuard)
|
||||
me(@CurrentUser() user: any) {
|
||||
return this.auth.getProfile(user.id);
|
||||
}
|
||||
|
||||
/** POST /api/auth/mfa/setup — Genera QR para TOTP */
|
||||
@Post("mfa/setup")
|
||||
@UseGuards(JwtAuthGuard)
|
||||
setupMfa(@CurrentUser() user: any) {
|
||||
return this.auth.setupMfa(user.id);
|
||||
}
|
||||
|
||||
/** POST /api/auth/mfa/verify — Activa MFA con primer código TOTP */
|
||||
@Post("mfa/verify")
|
||||
@UseGuards(JwtAuthGuard)
|
||||
verifyMfa(@Body() dto: SetupMfaDto, @CurrentUser() user: any) {
|
||||
return this.auth.verifyMfa(user.id, dto.totpCode);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user