Consideraciones para la Migración
Situación actual
La app envía las requests pendientes una por una desde el cliente. El servidor las procesa como requests HTTP individuales normales.
Objetivo
Enviar la cola completa (o un batch) al servidor en un solo request, y que el servidor itere sobre las operaciones pendientes.
Datos que el servidor necesita por operación
Cada item del batch debe contener:
{
id: number; // ID de transacción (para reportar resultado por operación)
api: string; // endpoint destino (ej: "/scouting/scout")
method: string; // "POST" | "PUT" | "PATCH" | "DELETE"
body: string | object; // payload de la operación
params: object; // query params (ej: { uuid: "..." })
headers: { // solo Content-Type y X-Version (Authorization la pone el server)
"Content-Type": string;
"X-Version": string;
};
userId: string; // para multi-user / workspace
date: number; // timestamp de creación (para ordenamiento y TTL)
sender: string; // dominio de origen (para que el server respete orden)
}
Puntos críticos a resolver
1. Orden de ejecución
El servidor debe respetar el orden FIFO por sender y la jerarquía entre senders (field primero, luego el resto). Opciones:
- Enviar ya ordenado desde el cliente (más simple).
- Enviar con metadata de jerarquía y que el server ordene.
2. PUTF (upload de archivos)
Las operaciones PUTF leen un archivo del filesystem local del dispositivo. No se pueden enviar como JSON plano. Opciones:
- Excluir PUTF del batch y seguir enviándolas individualmente.
- Convertir a base64 e incluir en el payload (costoso en tamaño).
- Enviar como multipart con las imágenes adjuntas.
3. Respuesta parcial
Si el batch tiene 20 operaciones y la #5 falla con 400, ¿qué pasa con las siguientes? El servidor debe devolver un resultado por operación:
{
"results": [
{ "id": 1, "status": "ok" },
{ "id": 2, "status": "ok" },
{ "id": 5, "status": "error", "code": 400, "error": { "code": -6, "info": "..." } },
{ "id": 6, "status": "ok" },
...
]
}
4. Idempotencia
Muchas operaciones usan UUIDs generados en el cliente (v1). Si el batch se reenvía por timeout, el servidor debe manejar duplicados (ya existe lógica para DUPLICATED_KEY = -6).
5. Authorization
Actualmente el token se inyecta al momento de enviar. En el batch, el servidor debería usar el token del request principal (el POST del batch) para autenticar todas las operaciones internas.
6. Requests con tokens de apps externas
Algunas requests (SDK tracking, marketplace storage) usan tokens de apps (headerService.jsonToken(token)). Estas necesitan un campo extra appToken o deben excluirse del batch.
7. Endpoint existente: /sync_pending
Ya existe un endpoint que recibe el snapshot completo de las colas. Se podría extender este endpoint o crear uno nuevo para el batch de ejecución.
Propuesta de interface para el batch
interface SyncBatchRequest {
operations: Array<SyncOperation>;
userId: string;
timestamp: number;
}
interface SyncOperation {
id: number; // transactionId
sender: string; // dominio
senderHierarchy: number; // jerarquía del sender
api: string; // endpoint
method: 'POST' | 'PUT' | 'PATCH' | 'DELETE';
contentType: string; // "application/json" | "application/x-www-form-urlencoded"
body: string; // payload serializado
params: { [key: string]: any };
date: number; // timestamp de creación
appToken?: string; // solo para requests de apps externas
}
interface SyncBatchResponse {
results: Array<{
id: number;
status: 'ok' | 'error' | 'skipped';
httpStatus?: number;
error?: { code: number; info: string };
}>;
}
Qué queda en el cliente
- Formatear la cola al formato
SyncBatchRequest. - Enviar un solo POST.
- Procesar la respuesta: eliminar las exitosas, marcar errores, mover a removedQueue las que correspondan.
- Mantener la UI de sync (progreso, errores, eliminados) adaptada al nuevo flujo.