Endpoint de sincronização
POST https://agroecologia.grupoekos.com.br/router/action.php
Headers
X-APP-KEY: <APP_KEY_FIXA_DO_APP_PRODUTOR>
X-DEVICE-TOKEN: <DEVICE_TOKEN_SALVO_NO_APARELHO>
Body base
action=apiG10bio_produtor
f=sincronizacao_offline
app_version=<VERSAO_INSTALADA>
last_sync_at=<YYYY-MM-DD HH:MM:SS>
Os dados exatos retornados por esse endpoint serão ampliados conforme os módulos do G10 Bio Produtor forem documentados.
Idempotência
Todo endpoint que grava uma ação deve receber um client_event_id. Esse identificador evita
registros duplicados quando o aplicativo reenviar o mesmo evento após timeout ou perda de conexão.
Resposta para evento já registrado
{
"success": true,
"msg": "Evento já registrado (idempotente).",
"data": {
"already_registered": true,
"client_event_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
success=true ou already_registered=true significa que o item pode ser removido
da fila de envio.
Tabela local recomendada
CREATE TABLE app_eventos_sync (
id INTEGER PRIMARY KEY AUTOINCREMENT,
client_event_id TEXT NOT NULL UNIQUE,
tipo_evento TEXT NOT NULL,
endpoint TEXT NOT NULL,
payload_json TEXT NOT NULL,
arquivo_local TEXT NULL,
status_sync TEXT NOT NULL DEFAULT 'pendente',
tentativas_envio INTEGER NOT NULL DEFAULT 0,
ultimo_erro TEXT NULL,
criado_em TEXT NOT NULL,
ultima_tentativa_em TEXT NULL,
enviado_em TEXT NULL
);
id: identificador interno do SQLite.client_event_id: UUID único do evento.tipo_evento: identifica a operação realizada.endpoint: função da API que receberá o evento.payload_json: dados que serão enviados ao ERP.arquivo_local: caminho de foto ou arquivo pendente, quando existir.status_sync:pendente,erroouenviado.
Geração do client_event_id
Usar uma biblioteca confiável de UUID compatível com React Native. Não gerar identificadores com
Math.random().
// Exemplo conceitual com biblioteca UUID
import { v4 as uuidv4 } from 'uuid';
const clientEventId = uuidv4();
Regra: um evento local deve possuir um único client_event_id.
Armazenamento local
- SQLite: fila de eventos, cache e dados necessários para operação offline.
- FileSystem: fotos e arquivos aguardando envio.
- SecureStore:
device_token. - AsyncStorage: configurações simples, versão e
ultima_validacao_em.