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
- Verificação de Conexão: O serviço verifica se há conexão com a internet
- Identificação de Vídeos Pendentes: Identifica vídeos que ainda não foram sincronizados
- Preparação para Envio: Converte vídeos de Base64 para arquivos temporários
- Envio: Envia os vídeos para o servidor
- 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
- Priorização: Sincronizar primeiro os vídeos mais antigos
- Limitação: Limitar o número de tentativas de sincronização
- Notificação: Informar o usuário sobre o status da sincronização
- Configuração: Permitir que o usuário configure quando a sincronização deve ocorrer (apenas em Wi-Fi, por exemplo)