Saltar al contenido principal

Business Services - Servicios de Negocio

Los Business Services implementan la lógica de negocio específica de SwapBits: trading, verificación de identidad y administración.


📈 Exchange Service

Trading de Criptomonedas

Puerto: 3008
Responsabilidad: Integración con exchanges para trading
Tecnología: NestJS + Bybit API

Propósito

El Exchange Service permite a los usuarios hacer trading de criptomonedas mediante integración con exchanges externos (principalmente Bybit).

¿Qué hace exactamente?

1. Obtener Market Data en Tiempo Real

Datos que proporciona:

  • Precio actual (last price)
  • Bid/Ask (mejor oferta compra/venta)
  • Volumen 24h
  • Cambio 24h (%)
  • Máximo/Mínimo 24h

2. Crear Órdenes de Trading

Orden Market (compra/venta inmediata):

Orden Limit (precio específico):

3. Order Book (Libro de Órdenes)

Estructura del Order Book:

{
"symbol": "BTCUSDT",
"bids": [
{"price": "45000.00", "quantity": "1.5"},
{"price": "44999.50", "quantity": "2.3"},
...
],
"asks": [
{"price": "45001.00", "quantity": "0.8"},
{"price": "45002.50", "quantity": "1.2"},
...
]
}

4. Gestión de Órdenes Activas

Responsabilidades Detalladas

AcciónDescripción
Market DataPrecios, volúmenes, tickers en tiempo real
Order PlacementCrear órdenes market, limit, stop-loss
Order ManagementListar, cancelar, modificar órdenes
Order BookObtener libro de órdenes actual
Trade HistoryHistorial de trades ejecutados
Balance ManagementSincronizar balances con exchange
WebhooksRecibir eventos de Bybit

Endpoints Principales

GET    /exchange/tickers             - Listar todos los tickers
GET /exchange/ticker/:symbol - Obtener ticker específico
GET /exchange/orderbook/:symbol - Order book
POST /exchange/order/market - Crear orden market
POST /exchange/order/limit - Crear orden limit
POST /exchange/order/stop - Crear stop-loss
GET /exchange/orders - Listar órdenes activas
GET /exchange/orders/:id - Obtener orden específica
DELETE /exchange/orders/:id - Cancelar orden
GET /exchange/trades - Historial de trades
GET /exchange/balance - Balance en exchange

Integración con Bybit

class BybitAdapter {
private ws: WebSocket;

async subscribeMarketData(symbols: string[]) {
this.ws.send({
op: 'subscribe',
args: symbols.map(s => `tickers.${s}`)
});
}

async placeOrder(order: CreateOrderDto) {
return await this.http.post('/v5/order/create', {
category: 'spot',
symbol: order.symbol,
side: order.side,
orderType: order.type,
qty: order.quantity,
price: order.price
});
}
}

Consideraciones Importantes

Rate Limiting de Bybit:

  • 10 requests/segundo para market data
  • 5 requests/segundo para órdenes
  • Exchange Service maneja el throttling

Sincronización de Balances:

  • Los balances del exchange NO son los mismos que las wallets propias
  • Usuario debe transferir crypto a exchange para tradear
  • Proceso: Wallet → Exchange (deposit) → Trade → Exchange → Wallet (withdraw)

🆔 KYC Service

Verificación de Identidad

Puerto: 3006
Responsabilidad: Know Your Customer (KYC/AML)
Tecnología: NestJS + Proveedores KYC

Propósito

El KYC Service maneja todo el proceso de verificación de identidad para cumplir con regulaciones y prevenir fraude.

¿Qué hace exactamente?

1. Flujo Completo de Verificación

Estados posibles:

  • not_started: Usuario no ha iniciado KYC
  • in_progress: Usuario está llenando formulario
  • under_review: Documentos siendo revisados
  • approved: Verificación aprobada
  • rejected: Verificación rechazada (con razón)

2. Iniciar Sesión KYC

3. Documentos Requeridos

Nivel 1 (Básico):

  • ✅ Nombre completo
  • ✅ Fecha de nacimiento
  • ✅ País de residencia
  • ✅ Selfie

Límites: $1,000 / día

Nivel 2 (Intermedio):

  • ✅ Todo de Nivel 1
  • ✅ Documento de identidad (ID/Pasaporte)
  • ✅ Prueba de dirección (recibo de servicios)

Límites: $10,000 / día

Nivel 3 (Avanzado):

  • ✅ Todo de Nivel 2
  • ✅ Información financiera
  • ✅ Fuente de fondos
  • ✅ Video verificación

Límites: Ilimitado

4. Validaciones Automáticas

async validateKYC(userId: string): Promise<boolean> {
const kyc = await this.getKYCStatus(userId);

// Verificar estado
if (kyc.status !== 'approved') return false;

// Verificar que no haya expirado (algunos países requieren renovación anual)
if (kyc.expiresAt && new Date() > kyc.expiresAt) return false;

// Verificar que no esté en lista negra
if (await this.isBlacklisted(kyc.documentNumber)) return false;

return true;
}

5. Integración con Guards

// En otros servicios
@UseGuards(JwtAuthGuard, KycGuard)
@Post('withdraw')
async withdraw(@User() user, @Body() dto: WithdrawDto) {
// Solo llega aquí si KYC está aprobado
}

Responsabilidades Detalladas

AcciónDescripción
Start KYCIniciar sesión de verificación
Submit DocumentsSubir documentos requeridos
Check StatusConsultar estado de verificación
Webhook ProcessingRecibir resultados de proveedores
Level ManagementGestionar niveles de verificación
AML ScreeningVerificar contra listas negras
Document StorageAlmacenar documentos de forma segura

Endpoints Principales

POST   /kyc/start              - Iniciar proceso KYC
GET /kyc/status - Consultar estado
POST /kyc/documents - Subir documento
GET /kyc/documents - Listar documentos subidos
POST /kyc/webhooks/:provider - Webhook de proveedor
GET /kyc/levels - Información de niveles
POST /kyc/resend-link - Reenviar link de verificación

Proveedores Soportados

Onfido (Principal):

  • Verificación de identidad automática
  • Detección de vida (liveness)
  • Verificación de documentos

Sumsub (Alternativo):

  • Verificación de identidad
  • AML screening
  • Monitoreo continuo

Consideraciones de Seguridad

// Los documentos se almacenan encriptados
const encryptedDocument = await this.encrypt(documentBuffer);
await this.s3.upload({
Bucket: 'swapbits-kyc-docs',
Key: `${userId}/${documentId}`,
Body: encryptedDocument,
ServerSideEncryption: 'AES256'
});

// Los documentos se auto-eliminan después de 7 años (requisito legal)
const expirationDate = new Date();
expirationDate.setFullYear(expirationDate.getFullYear() + 7);

🛡️ Admin Service

Panel de Administración

Puerto: 3001 (Backend), 3000 (Frontend)
Responsabilidad: Administración completa del sistema
Tecnología: NestJS (Backend) + React (Frontend)

Propósito

El Admin Service es el centro de control de SwapBits. Permite a administradores gestionar usuarios, revisar transacciones, moderar chat y ver analytics.

Arquitectura

¿Qué hace exactamente?

1. Dashboard Analytics en Tiempo Real

Datos mostrados:

  • Total de usuarios registrados
  • Usuarios activos (últimos 30 días)
  • Wallets creadas por blockchain
  • Transacciones (pending/confirmed/failed)
  • Volumen de trading (USD)
  • Depósitos/Retiros pendientes
  • Tickets de soporte abiertos

Actualización: Vía WebSocket cada 10 segundos

2. Gestión de Usuarios

Acciones disponibles:

  • Buscar usuarios por email, username, ID
  • Ver perfil completo (datos personales, KYC, wallets)
  • Suspender cuenta (con razón)
  • Activar cuenta suspendida
  • Aprobar/Rechazar KYC manualmente
  • Ver historial de transacciones
  • Ver log de auditoría del usuario
  • Cerrar sesiones remotamente

3. Sistema de Chat Bidireccional

Características del chat:

  • Threads: Conversaciones organizadas por usuario
  • Estados: open, assigned, resolved
  • Asignación: Asignar conversación a admin específico
  • Typing indicators: "Admin está escribiendo..."
  • Historial: Ver toda la conversación
  • Notificaciones: Sonido cuando llega mensaje nuevo

4. Sistema de Logs en Tiempo Real

// Los logs se muestran en tiempo real vía WebSocket
interface LogEntry {
timestamp: Date;
level: 'info' | 'warn' | 'error';
service: 'auth' | 'user' | 'wallet' | 'bank' | 'exchange';
userId?: string;
action: string;
message: string;
metadata?: any;
}

Filtros disponibles:

  • Por servicio
  • Por nivel (info/warn/error)
  • Por usuario
  • Por acción
  • Por rango de fechas

5. Gestión de Transacciones

Vista de admin sobre transacciones:

Transacciones que requieren revisión:

  • Montos muy altos (> $10,000)
  • Múltiples transacciones en poco tiempo
  • Transacciones a addresses en blacklist
  • Transacciones desde IPs sospechosas

Responsabilidades Detalladas

AcciónDescripción
AnalyticsDashboard con métricas en tiempo real
User ManagementCRUD y gestión de usuarios
Chat SupportChat bidireccional con usuarios
Logs ViewingVer logs de todos los servicios
Transaction ReviewRevisar y aprobar transacciones
KYC ReviewRevisar verificaciones manualmente
System ConfigurationConfigurar parámetros del sistema
Audit TrailVer historial de acciones admin

Endpoints Backend

GET    /admin/dashboard           - Métricas del dashboard
GET /admin/users - Listar usuarios
GET /admin/users/:id - Ver usuario específico
PUT /admin/users/:id/suspend - Suspender usuario
PUT /admin/users/:id/activate - Activar usuario
GET /admin/transactions - Listar transacciones
PUT /admin/transactions/:id - Actualizar transacción
GET /admin/kyc-pending - KYCs pendientes
PUT /admin/kyc/:id/approve - Aprobar KYC
PUT /admin/kyc/:id/reject - Rechazar KYC
GET /admin/logs - Ver logs
WS /admin/ws - WebSocket admin

Seguridad del Admin

// Todos los endpoints requieren rol ADMIN
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('ADMIN', 'SUPER_ADMIN')
export class AdminController {
// ...
}

// Autenticación Multi-Factor obligatoria
@UseGuards(WebAuthnGuard, TotpGuard)
async sensitiveAction() {
// Acciones críticas requieren 2FA
}

// Todas las acciones se auditan
@UseInterceptors(AdminAuditInterceptor)
async suspendUser(@Param('id') userId: string) {
// Se registra: quién, cuándo, qué, por qué
}

Frontend (React)

Componentes principales:

  • <Dashboard />: Métricas y gráficas
  • <UsersTable />: Lista de usuarios con búsqueda
  • <UserDetails />: Perfil completo de usuario
  • <ChatPanel />: Sistema de chat
  • <LogsViewer />: Visor de logs en tiempo real
  • <TransactionsReview />: Revisión de transacciones
  • <KycQueue />: Cola de KYCs pendientes

Tecnologías:

  • React + TypeScript
  • Redux para estado global
  • Socket.io-client para WebSocket
  • Recharts para gráficas
  • Ant Design para UI

Comunicación Entre Business Services


Resumen

ServicioPuertoFunción Principal
Exchange Service3008Trading con Bybit
KYC Service3006Verificación de identidad
Admin Service3001/3000Panel de administración

Para Desarrolladores

Business Services implementan la lógica de negocio específica. A diferencia de Core Services (que son genéricos), estos servicios son únicos de SwapBits.

Si necesitas agregar una nueva feature de negocio, probablemente va en uno de estos servicios o necesitas crear un nuevo Business Service.

Patrón común: Business Services orquestan Core Services. Ejemplo: Exchange Service usa Wallet Service para verificar balances.