Trabaje como backend developer y contributor de frontend, mergeando 15 PRs en 10 semanas sobre el repo principal en NestJS y contribuyendo al panel admin en Next.js 16. Mis aportes abarcaron desde auditoria y normalizacion de endpoints hasta la implementacion completa de modulos de seguridad, eliminacion de cuentas, sistema RBAC y vistas del panel admin.
Sistema RBAC completo — 4 roles (super_admin, admin, user, sin_asignar) con 35 permisos distribuidos en 9 modulos: usuarios, roles, transacciones, pagos, KYC, descuentos, sistema, analytics y archivos
SuperAdmin hereda todos los permisos via Object.values(Permission). Migracion AddSinAsignarRole, enum UserRole con mapeo a nombres legibles y estilos para badges en frontend
Scripts de validacion y auditoria automatizada en bash (validate-rbac.sh, audit-migration.sh)
Modulo account-deletion de cero con 5 endpoints: request, confirm, cancel, status y resend — flujo completo de soft-delete seguro
Validacion de estado (bloqueo si BANNED), validacion de transacciones activas via query builder sobre 7 estados (Pending, ReviewPayment, Approved, InTransit, RefundInTransit, Discrepancy, Modified)
OTP de 6 digitos con expiracion de 15 minutos, email con plantilla HTML propia (account_deletion_code.hbs) via Brevo/SendGrid
Anonimizacion del email a deleted_<uuid>@deleted.local con preservacion del original para recuperacion via soporte. Cuestionario de motivos con enum DeletionReason (7 opciones)
Guard DeletedAccountGuard para bloquear acciones post-eliminacion y bloqueo de login en OtpService para cuentas eliminadas
Auditoria completa de endpoints — 13/13 (100%) del modulo de usuarios contra disenos de Figma para vistas de gestion admin
Normalizacion de enums reutilizados, actualizacion de AdminProfileResultDto con roles, memberCode, accountStatus, profilePictureUrl, lastActivity y verificationStatus
Calculo de accountStatus (active/suspended/inactive/deleted) basado en isActive y bans activos. Mapeo de rejected a deleted en verificationStatus
UserFilterService con busqueda global que cubre email, nombre, apellido, memberCode, telefono, codigo de rol y nombre de rol
Filtro por accountStatus calculado dinamicamente en SQL con subqueries de bans. Ordenamiento jerarquico por rol con CASE WHEN. Filtrado de soft-deleted via deletedAt IS NULL por defecto
Endpoint DELETE /admin/users/:userId con DeleteUserDto (razon obligatoria, max 500 chars), campos deletedAt, deletedBy, deletionReason en entidad User
UserBanService con banUser, unbanUser y getBanHistory. Entidad UserBan extendida con bannedBy, createdAt, updatedAt. Permisos RBAC con @RequirePermission() en cada endpoint
AdminStatsController con GET /admin/stats/dashboard: contadores en tiempo real de usuarios admin, verificados, no verificados, blacklist y whitelist
UserStatisticsService con GET /users/me/summary: transacciones completadas, activas, recompensas acumuladas, flag canDeleteAccount y deletionBlockReason
Entidad UserAlternativePhone con enum PhoneType. UserAlternativeEmail con EmailType, isVerified, isPrimary. Entidad EmployeeInfo con enum EmploymentType (full_time/part_time/contractor/intern)
Configuracion de privacidad en UserProfile: isProfilePublic, showEmailPublic, showPhonePublic, showLocationPublic. Endpoint GET /admin/profiles/:userId/complete
Panel admin en Next.js 16 + React 19: tabla de roles con badge de estilo, descripcion, tipo y acciones. Toggle activo/inactivo en linea, modal de confirmacion de eliminacion
Pagina de detalle de rol con acordeones de admins asignados y privilegios por grupo con checkboxes. Breadcrumbs y boton de copiar codigo de rol con feedback visual
FLUJO — Sistema RBAC con 35 permisos: [Request] POST /admin/users/{id}/block → [JWT Guard] extrae token → [RolesGuard] lee @Roles(Permission.BLOCK_USER) del endpoint → carga rol del admin desde DB → verifica que el rol tiene el permiso BLOCK_USER en su array de privileges → si no tiene: 403 Forbidden → si tiene: ejecuta handler → [UserService] cambia status del usuario a blocked → response 200
FLUJO — Eliminacion segura de cuenta: [Usuario] POST /users/me/delete-request → [UserService] verifica canDeleteAccount: chequea transacciones activas (no completadas), saldo pendiente, disputas abiertas → si alguna condicion bloquea: response {canDelete: false, reason: "Tenes 2 transacciones activas"} → si todo limpio: genera token de confirmacion → envia email via SendGrid con link de confirmacion → [Usuario] click en link → POST /users/me/confirm-deletion {token} → [UserService] valida token → soft delete: anonymiza datos personales, mantiene transacciones historicas para auditoria → response 200
FLUJO — Auditoria de endpoints vs Figma: [Sprint] recibo diseño Figma del panel admin → comparo cada pantalla con los endpoints existentes en Swagger → documento los 13 endpoints necesarios → implemento los faltantes: GET /admin/stats/dashboard, GET /admin/users con filtros, GET /admin/profiles/:id/complete, PATCH /admin/users/:id/role, POST /admin/users/:id/block, etc. → cada endpoint validado contra el diseño → 13/13 endpoints auditados y funcionales
FLUJO — Workflow de desarrollo GitFlow: [Ticket] tomo tarea del backlog → git checkout -b feature/SWAP-123-rbac-permissions desde develop → desarrollo + tests → git commit (Husky + Commitlint validan formato "feat(rbac): add permission guard") → push a origin → abro PR a develop → code review del tech lead → aprobado → squash merge a develop → al final del sprint: merge develop → main → deploy a produccion