SwaplyAR

SwaplyAR

EmpresaStartup — Fintech P2P
Año2026
TipoPlataforma Fintech · Full Stack
RolBackend Dev · Frontend Contributor
Volver
01

SwaplyAR es una plataforma fintech argentina de pagos P2P en produccion con tres repositorios activos — backend NestJS, panel admin y frontend de usuario. El equipo necesitaba escalar la API de usuarios, construir un sistema de gestion admin alineado a Figma, implementar flujos sensibles de eliminacion de cuenta con seguridad legal y trazabilidad completa, y establecer un sistema RBAC robusto para controlar el acceso al panel administrativo.

02

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
03
NestJS 11
TypeORM 0.3
PostgreSQL
TypeScript
JWT + Passport
Redis (Keyv)
Socket.io
SendGrid / Brevo
Swagger / OpenAPI
Jest + Supertest
Next.js 16
React 19
Tailwind CSS v4
Zustand
React Hook Form
Zod
NextAuth v5
Radix UI
GitFlow
Husky
Commitlint
TypeORM Migrations
04
15 PRsMergeados en 10 semanas
35Permisos RBAC en 9 modulos
13/13Endpoints auditados vs Figma
5Endpoints de eliminacion segura
4 rolesSistema RBAC jerarquico
3 reposBackend + Admin + Frontend
05
Ver proyecto en vivo
Siguiente proyectoLabResults