Introdução
O Easy Firebase Manager é uma biblioteca JavaScript que gerencia os serviços do Firebase – incluindo Autenticação, Firestore, Realtime Database e Storage – utilizando os módulos Compat do Firebase v9+. A biblioteca incorpora recursos avançados como:
- Cache local (via IndexedDB) com expiração configurável.
- Sistema de eventos personalizados para monitorar operações.
- Logs de auditoria para rastreamento e análise das operações realizadas.
- Retry logic para lidar com erros transitórios (como falhas de rede).
- Refatoração e correções, incluindo melhorias de serialização no IndexedDB e refinamento do RTDB increment logging.
Esta versão foi corrigida, refatorada e aprimorada com base no feedback dos usuários.
Principais Funcionalidades
- Gerenciamento de Autenticação: Métodos para login, signup, envio de email de redefinição e confirmação.
- FireStore: Criação, leitura, atualização e deleção de documentos; listagem com filtros, ordenação e paginação; operações em lote e clonagem de registros.
- Realtime Database: Operações de set, get, update e remove; suporte a transações com operações atômicas (incremento e decremento).
- Firebase Storage: Upload, download e deleção de arquivos.
- Caching Local: Uso de IndexedDB para armazenar dados lidos do Firestore e RTDB para melhorar a performance.
- Eventos Personalizados: Permite escutar eventos como
auth
,fsCreate
,fsRead
,fsRealtimeUpdate
,rtdbSet
,uploadProgress
e muitos outros. - Logs de Auditoria: Cada operação crítica é registrada com detalhes e timestamp, ideal para depuração e monitoramento.
- Retry Logic: Operações falhas são automaticamente reexecutadas (com backoff exponencial) caso se trate de erros do tipo rede ou indisponibilidade.
- Persistência de Dados de Analytics: As estatísticas e os logs podem ser salvos em IndexedDB para persistência entre sessões.
Requisitos
Para usar o Easy Firebase Manager, é necessário:
- Ter os scripts do Firebase Compat (v9+) carregados previamente:
- firebase-app-compat.js
- firebase-auth-compat.js
- firebase-firestore-compat.js
- firebase-database-compat.js
- firebase-storage-compat.js
- Um projeto Firebase configurado com as credenciais apropriadas.
Instalação e Download
Inclua os scripts do Firebase:
Por exemplo, no seu HTML (antes do fechamento da tag
</body>
), insira:
<script src="https://www.gstatic.com/firebasejs/9.6.1/firebase-app-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.6.1/firebase-auth-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.6.1/firebase-firestore-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.6.1/firebase-database-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.6.1/firebase-storage-compat.js"></script>
Inclua o script do Easy Firebase Manager:
Adicione a linha abaixo (ou utilize o link para fazer o download):
<script src="https://cdn.alphasystem.dev/plugins/easy-firebase-manager/latest/script-min.js"></script>
Configuração
Para iniciar, configure a instância passando seu objeto de configuração do Firebase e as opções desejadas. Por exemplo:
// Exemplo de inicialização básica:
const firebaseConfig = {
apiKey: "YOUR_API_KEY",
authDomain: "YOUR_AUTH_DOMAIN",
projectId: "YOUR_PROJECT_ID",
databaseURL: "YOUR_RTDB_URL",
storageBucket: "YOUR_STORAGE_BUCKET",
messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
appId: "YOUR_APP_ID"
};
const firebaseManager = new FirebaseManager(firebaseConfig, {
defaultCollectionPath: "users", // Coleção padrão para Firestore
defaultRtdbPath: "appData", // Caminho padrão para Realtime Database
cacheEnabled: true, // Habilita o cache para Firestore e RTDB
cacheExpirationMinutes: 60, // Cache expira após 60 minutos
persistenceEnabled: true, // Persiste logs de auditoria e analytics
retryAttempts: 3, // Número de tentativas de retry
retryBackoff: 300 // Backoff inicial em milissegundos
});
Uso e Integração
Autenticação
Utilize os métodos de autenticação para gerenciar o login, o signup e outras funcionalidades:
// Fazer login com email e senha:
firebaseManager.login("user@example.com", "password123")
.then(userCredential => {
console.log("Usuário autenticado:", userCredential.user);
})
.catch(error => {
console.error("Erro no login:", error);
});
// Realizar signup e criar opcionalmente um documento de perfil:
firebaseManager.signup("newuser@example.com", "password123", { name: "New User" }, "users")
.then(userCredential => {
console.log("Usuário registrado:", userCredential.user);
})
.catch(error => {
console.error("Erro no signup:", error);
});
Operações no Firestore
Criar, Ler, Atualizar e Deletar Documentos
// Criar um documento na coleção "users":
firebaseManager.create({ name: "Alice", age: 30 }, "users")
.then(doc => {
console.log("Documento criado:", doc);
})
.catch(err => {
console.error("Erro ao criar documento:", err);
});
// Ler um documento específico:
firebaseManager.read("DOCUMENT_ID", "users")
.then(doc => {
console.log("Documento lido:", doc);
})
.catch(err => {
console.error("Erro na leitura:", err);
});
// Atualizar um documento:
firebaseManager.update("DOCUMENT_ID", { age: 31 }, "users")
.then(() => {
console.log("Documento atualizado com sucesso.");
})
.catch(err => {
console.error("Erro ao atualizar documento:", err);
});
// Deletar um documento:
firebaseManager.delete("DOCUMENT_ID", "users")
.then(() => {
console.log("Documento deletado.");
})
.catch(err => {
console.error("Erro ao deletar documento:", err);
});
Operações em Lote e Clonagem
// Executar operações em lote:
const operations = [
{ type: "set", path: "users/user1", data: { name: "User One" } },
{ type: "update", path: "users/user2", data: { age: 25 } },
{ type: "delete", path: "users/user3" }
];
firebaseManager.batchWrite(operations)
.then(() => {
console.log("Batch write realizado com sucesso.");
})
.catch(err => {
console.error("Erro no batch write:", err);
});
// Clonar um documento:
firebaseManager.cloneRecord("DOCUMENT_ID", "users")
.then(newDoc => {
console.log("Documento clonado:", newDoc);
})
.catch(err => {
console.error("Erro ao clonar documento:", err);
});
Listar e Acompanhar Atualizações em Tempo Real
// Listar documentos com filtros, ordenação e limite:
firebaseManager.list({
filter: [["age", ">", 25]],
sort: [["name", "asc"]],
limit: 10
}, "users")
.then(docs => {
console.log("Documentos listados:", docs);
})
.catch(err => {
console.error("Erro na listagem:", err);
});
// Assinar atualizações em tempo real para um documento:
firebaseManager.readWithAutoUpdate("DOCUMENT_ID", "users", (updatedDoc) => {
console.log("Atualização em tempo real:", updatedDoc);
});
// Assinar atualizações em tempo real para uma query (recupere uma função de desinscrição):
const unsubscribe = await firebaseManager.listWithAutoUpdate({
filter: [["age", "<", 30]],
sort: [["name", "desc"]],
limit: 5
}, "users", (docs) => {
console.log("Atualização da lista em tempo real:", docs);
});
// Para cancelar a assinatura, execute:
unsubscribe();
Realtime Database (RTDB) Operations
Set, Get, Update, Remove e Transações
// Definir dados em um caminho do RTDB:
firebaseManager.rtdbSet("users/user1/profile", { name: "Alice" }, "rtdb")
.then(() => {
console.log("Dados gravados no RTDB.");
})
.catch(err => {
console.error("Erro no RTDB set:", err);
});
// Obter dados de um caminho do RTDB:
firebaseManager.rtdbGet("users/user1/profile", "rtdb")
.then(data => {
console.log("Dados do RTDB:", data);
})
.catch(err => {
console.error("Erro no RTDB get:", err);
});
// Atualizar dados no RTDB:
firebaseManager.rtdbUpdate("users/user1/profile", { age: 28 }, "rtdb")
.then(() => {
console.log("Dados atualizados no RTDB.");
})
.catch(err => {
console.error("Erro no RTDB update:", err);
});
// Remover dados do RTDB:
firebaseManager.rtdbRemove("users/user1/profile", "rtdb")
.then(() => {
console.log("Dados removidos do RTDB.");
})
.catch(err => {
console.error("Erro no RTDB remove:", err);
});
// Incrementar um valor numericamente (transação atômica):
firebaseManager.rtdbIncrement("counters/likes", 1, "rtdb")
.then(result => {
console.log("Resultado do incremento:", result);
})
.catch(err => {
console.error("Erro no RTDB increment:", err);
});
Firebase Storage Operations
// Fazer upload de um arquivo:
const fileInput = document.querySelector("#fileInput");
fileInput.addEventListener("change", async (event) => {
const file = event.target.files[0];
try {
const uploadResult = await firebaseManager.uploadFile(file, "uploads/profile.jpg");
console.log("File uploaded. Download URL:", uploadResult.downloadURL);
} catch (err) {
console.error("Erro no upload de arquivo:", err);
}
});
// Obter download URL de um arquivo:
firebaseManager.getDownloadURL("uploads/profile.jpg")
.then(url => {
console.log("Download URL:", url);
})
.catch(err => {
console.error("Erro ao obter download URL:", err);
});
// Deletar um arquivo do Storage:
firebaseManager.deleteFileFromStorage("uploads/profile.jpg")
.then(() => {
console.log("Arquivo deletado do Storage.");
})
.catch(err => {
console.error("Erro ao deletar arquivo do Storage:", err);
});
Exportação e Importação de Dados
Firestore
// Exportar documentos do Firestore para JSON, CSV ou XML:
firebaseManager.downloadAsJSON("users")
.then(() => {
console.log("Exportação JSON iniciada.");
})
.catch(err => {
console.error("Erro na exportação JSON:", err);
});
firebaseManager.downloadAsCSV("users")
.then(() => {
console.log("Exportação CSV iniciada.");
})
.catch(err => {
console.error("Erro na exportação CSV:", err);
});
firebaseManager.downloadAsXML("users")
.then(() => {
console.log("Exportação XML iniciada.");
})
.catch(err => {
console.error("Erro na exportação XML:", err);
});
// Importar documentos a partir de uma string JSON:
const jsonData = '[{"id":"user1","name":"Alice","age":30},{"id":"user2","name":"Bob","age":25}]';
firebaseManager.importFromJSON(jsonData, "users")
.then(() => {
console.log("Importação JSON concluída.");
})
.catch(err => {
console.error("Erro na importação JSON:", err);
});
Realtime Database
// Exportar dados do RTDB para JSON:
firebaseManager.exportRtdbToJSON("users/user1", "rtdb")
.then(jsonString => {
console.log("Dados RTDB exportados:", jsonString);
})
.catch(err => {
console.error("Erro na exportação RTDB:", err);
});
// Importar dados para o RTDB a partir de JSON:
const rtdbJsonData = '{"name": "Alice", "age": 30}';
firebaseManager.importRtdbFromJSON("users/user1", rtdbJsonData, "rtdb")
.then(() => {
console.log("Importação RTDB concluída.");
})
.catch(err => {
console.error("Erro na importação RTDB:", err);
});
Cache, Analytics e Logs de Auditoria
// Limpar o cache de dados (Firestore e RTDB)
firebaseManager.clearCache()
.then(() => {
console.log("Cache limpo.");
})
.catch(err => {
console.error("Erro ao limpar cache:", err);
});
// Obter dados de analytics e logs de auditoria
console.log("Analytics:", firebaseManager.getAnalytics());
console.log("Audit Logs:", firebaseManager.getAuditLogs());
Resolução de Problemas
- Firebase SDK não carregado: Certifique-se de que os scripts do Firebase Compat sejam incluídos antes do Easy Firebase Manager.
- Serviço Indisponível: Se um serviço (por exemplo, Firestore, RTDB, Storage) não estiver disponível, verifique se o respectivo módulo foi carregado.
- Erros de Retentativa: O sistema utiliza retries com backoff exponencial para erros de rede. Se uma operação falhar repetidamente, revise sua conexão e as credenciais.
- Cache e Persistência: Caso os dados em cache não estejam sendo atualizados, verifique se a opção
cacheEnabled
está ativada e se o IndexedDB está funcionando corretamente. - Formato dos Dados: Em operações de importação/exportação (JSON, CSV, XML), confirme que os dados estejam no formato esperado.
- Realtime Subscriptions: Certifique-se de passar callbacks válidos para métodos como
readWithAutoUpdate
elistWithAutoUpdate
. - Logs de Auditoria: Examine os logs de auditoria (via
getAuditLogs()
) para entender melhor as operações realizadas e eventuais falhas.