Pular para o conteúdo principal

Sincronização de Vídeos

Última atualização: 30 de julho de 2024

Visão Geral

Este documento descreve o processo de sincronização de vídeos entre o aplicativo Promoter e o servidor.

Serviço de Sincronização

Localização: src/services/syncService/index.ts

O serviço de sincronização é responsável por enviar vídeos armazenados localmente para o servidor quando há conexão disponível.

// Trecho do código de sincronização
export const syncVideos = async (record: RecordData) => {
try {
const { NUPRM, VIDEOSANTES, VIDEOSDEPOIS } = record;

if (!NUPRM || (!VIDEOSANTES?.length && !VIDEOSDEPOIS?.length)) {
return;
}

// Sincronizar vídeos do "antes"
if (VIDEOSANTES?.length) {
for (const video of VIDEOSANTES) {
const attachment = realm.objectForPrimaryKey('attachmentImage', video.id);
if (!attachment) continue;

const formData = await convertVideoToSend(
attachment.BASE64,
video.id,
'before'
);

await sendVideoAttachment(NUPRM, formData);

// Atualizar status de sincronização
realm.write(() => {
video.synced = true;
});
}
}

// Sincronizar vídeos do "depois" (código similar)

return true;
} catch (error) {
console.log('❌ Erro ao sincronizar vídeos:', error);
return false;
}
};

Fluxo de Sincronização

  1. Verificação de Conexão: O serviço verifica se há conexão com a internet
  2. Identificação de Vídeos Pendentes: Identifica vídeos que ainda não foram sincronizados
  3. Preparação para Envio: Converte vídeos de Base64 para arquivos temporários
  4. Envio: Envia os vídeos para o servidor
  5. Atualização de Status: Atualiza o status de sincronização dos vídeos

Estratégias de Sincronização

Sincronização em Segundo Plano

O aplicativo implementa sincronização em segundo plano para garantir que os vídeos sejam enviados mesmo quando o aplicativo não está em primeiro plano.

// Registro de tarefa em segundo plano
BackgroundFetch.registerTaskAsync('syncVideos', {
minimumInterval: 15 * 60, // 15 minutos
stopOnTerminate: false,
startOnBoot: true,
});

// Execução da tarefa em segundo plano
TaskManager.defineTask('syncVideos', async () => {
try {
const pendingRecords = getPendingRecordsWithVideos();

for (const record of pendingRecords) {
await syncVideos(record);
}

return BackgroundFetch.Result.NewData;
} catch (error) {
console.log('❌ Erro na tarefa de sincronização:', error);
return BackgroundFetch.Result.Failed;
}
});

Sincronização Manual

O usuário pode iniciar manualmente a sincronização através da interface do aplicativo.

// Função para sincronização manual
const handleManualSync = async () => {
try {
setIsSyncing(true);

const pendingRecords = getPendingRecordsWithVideos();

for (const record of pendingRecords) {
await syncVideos(record);
}

setIsSyncing(false);
showSuccessMessage('Sincronização concluída com sucesso!');
} catch (error) {
setIsSyncing(false);
showErrorMessage('Erro ao sincronizar. Tente novamente.');
}
};

Tratamento de Falhas

Retry Mechanism

O serviço implementa um mecanismo de retry para lidar com falhas temporárias de rede.

// Função com retry
const syncWithRetry = async (record: RecordData, maxRetries = 3) => {
let retries = 0;

while (retries < maxRetries) {
try {
const result = await syncVideos(record);
if (result) return true;

retries++;
await new Promise(resolve => setTimeout(resolve, 5000)); // Esperar 5 segundos
} catch (error) {
retries++;
await new Promise(resolve => setTimeout(resolve, 5000)); // Esperar 5 segundos
}
}

return false;
};

Monitoramento de Conexão

O aplicativo monitora o estado da conexão para iniciar a sincronização quando a conexão estiver disponível.

// Monitoramento de conexão
NetInfo.addEventListener(state => {
if (state.isConnected && state.isInternetReachable) {
syncPendingVideos();
}
});

Considerações de Performance

  • Bateria: A sincronização em segundo plano pode consumir bateria
  • Dados Móveis: O envio de vídeos pode consumir muitos dados móveis
  • Armazenamento: Vídeos não sincronizados ocupam espaço no dispositivo

Boas Práticas

  1. Priorização: Sincronizar primeiro os vídeos mais antigos
  2. Limitação: Limitar o número de tentativas de sincronização
  3. Notificação: Informar o usuário sobre o status da sincronização
  4. Configuração: Permitir que o usuário configure quando a sincronização deve ocorrer (apenas em Wi-Fi, por exemplo)