Introdução
O Easy PocketBase Manager (v1.0-2) é uma biblioteca JavaScript robusta projetada para simplificar a interação com o PocketBase. Ele fornece uma interface unificada para realizar operações de autenticação, gerenciamento de dados, manipulação de arquivos, controle de roles e muito mais. Além disso, o Easy PocketBase Manager incorpora funcionalidades avançadas como gerenciamento de eventos personalizados, análise de operações realizadas, cache de dados utilizando o IndexedDB e persistência de dados, restauração automática de sessão via cookies do navegador, verificação de saúde do servidor PocketBase, mecanismo de repetição (retry) para operações de rede e opções avançadas de requisição.
Principais funcionalidades do Easy PocketBase Manager:
- Gerenciamento de autenticação de usuários (login, signup, logout, logoutAndClear, verificação de email, recuperação de senha, restauração automática de sessão via cookie).
- Operações CRUD (Create, Read, Update, Delete) simplificadas para coleções do PocketBase.
- Operações em lote para criação, atualização e exclusão de múltiplos registros.
- Manipulação de arquivos, incluindo upload de um ou múltiplos arquivos e download.
- Gerenciamento de roles e permissões de usuários.
- Emissão e escuta de eventos personalizados para monitorar ações específicas.
- Análise detalhada das operações realizadas e uso de recursos.
- Exportação e importação de dados em formato JSON, CSV e XML para facilitar migrações e backups.
- Sincronização de dados entre diferentes instâncias do PocketBaseManager.
- Cache de dados utilizando IndexedDB para melhorar o desempenho e reduzir a necessidade de requisições ao servidor.
- Persistência de dados como logs de auditoria, sessões e análises utilizando IndexedDB.
- Verificação de saúde do servidor PocketBase.
- Facilidade de integração com projetos existentes graças a uma API intuitiva e documentação detalhada.
- Mecanismo de repetição (retry) para operações de rede, aumentando a robustez.
- Opções avançadas de requisição por método (
methodRequestOptions
) e globais (defaultRequestOptions
,disableAutoCancellation
). - Leitura de registros e listas com atualização automática em tempo real.
Características Principais
- Gerenciamento de Autenticação: Facilita o processo de login, signup, logout, logoutAndClear, verificação de email e recuperação de senha. Inclui restauração automática de sessão.
- Operações CRUD Simplificadas: Métodos intuitivos para criar, ler, atualizar e deletar registros em coleções do PocketBase.
- Operações em Lote: Suporte para criação, atualização e exclusão de múltiplos registros de uma só vez, otimizando o desempenho.
- Manipulação de Arquivos: Upload de um ou múltiplos arquivos e download de arquivos associados a registros, com gerenciamento eficiente de armazenamento.
- Gerenciamento de Roles: Atribuição e recuperação de roles para usuários, permitindo controle granular de permissões.
- Eventos Personalizados: Emissão de eventos como 'auth', 'signup', 'create', 'update', 'delete', 'list', 'batchCreate', 'batchUpdate', 'batchDelete', 'fileUploaded', 'roleAssigned', 'rolesFetched', 'import', 'syncCompleted', entre outros, permitindo integração com outras partes da aplicação.
- Análise de Operações: Monitoramento de operações realizadas, incluindo contagem de operações e uso de bytes.
- Exportação e Importação de Dados: Métodos para exportar dados para JSON, CSV e XML e importar dados a partir desses formatos, facilitando backups e migrações.
- Sincronização de Dados: Sincronização de dados entre diferentes instâncias do PocketBaseManager e sincronização periódica do cache com o servidor.
- Cache de Dados: Utiliza o IndexedDB para armazenar registros em cache, melhorando o desempenho e reduzindo a necessidade de requisições frequentes ao servidor.
- Persistência de Dados: Armazena logs de auditoria, sessões e análises utilizando IndexedDB para garantir a persistência dos dados.
- Verificação de Saúde: Método para verificar rapidamente a disponibilidade e o status do servidor PocketBase.
- Robustez Aprimorada: Inclui mecanismo de repetição (retry) para operações de rede.
- Controle Avançado de Requisições: Permite configurar opções de requisição globais e por método.
- Leitura com Atualização Automática: Métodos para ler registros e listas com atualização automática de dados via eventos em tempo real.
- Facilidade de Integração: API intuitiva e documentação detalhada que facilitam a integração com projetos existentes.
Instalação
Para instalar o Easy PocketBase Manager, siga os passos abaixo:
Passo a Passo
- Inclua o Script do PocketBase: Adicione o script do PocketBase no seu HTML antes do fechamento da tag
</body>
:
<script src="https://cdnjs.cloudflare.com/ajax/libs/pocketbase/0.25.0/pocketbase.umd.js"></script>
- Inclua o Script do PocketBase Manager: Adicione o script do PocketBase Manager após o script do PocketBase:
<script src="https://cdn.alphasystem.dev/plugins/easy-pocketbase-manager/latest/script-min.js"></script>
- Inicialização Básica: Inicialize o PocketBase Manager com as configurações padrão:
// Inicializa o PocketBase Manager com as configurações padrão
// Certifique-se de que 'PocketBase' foi carregado antes (via script do PocketBase)
const pbManager = new PocketBaseManager({
baseUrl: 'http://127.0.0.1:8090', // URL base do PocketBase
collection: 'users' // Coleção padrão a ser utilizada (opcional, default: null)
});
- Configuração Avançada (Opcional): Personalize as opções conforme necessário:
// Exemplo de configuração avançada
// A classe PocketBaseManager se encarrega de instanciar o PocketBase internamente.
const pbManager = new PocketBaseManager({
baseUrl: 'https://meuservidor.com',
collection: 'clientes',
cacheEnabled: true, // Habilita o cache de dados (IndexedDB)
cacheExpirationMinutes: 120, // Define a expiração do cache para 120 minutos
syncIntervalMinutes: 15, // Define o intervalo de sincronização para 15 minutos
persistenceEnabled: true, // Habilita a persistência de dados
maxAuditLogs: 500, // Define o número máximo de logs de auditoria
disableAutoCancellation: true, // Desabilita o cancelamento automático de requisições
defaultRequestOptions: { wichtigenough: true } // Opções padrão para todas as requisições
// Outras opções de configuração podem ser adicionadas conforme necessário
});
Configuração
O Easy PocketBase Manager oferece várias opções de configuração para personalizar seu comportamento e funcionalidades. As configurações padrão podem ser sobrescritas pelo usuário através do objeto de opções passado na inicialização do PocketBaseManager. A seguir, detalhamos as principais opções disponíveis:
- baseUrl: (String) URL base do servidor PocketBase. Padrão:
'http://127.0.0.1:8090'
. - collection: (String) Nome da coleção padrão a ser utilizada nas operações CRUD. Padrão:
null
. - cacheEnabled: (Boolean) Habilita ou desabilita o cache de dados utilizando IndexedDB. Padrão:
true
. - cacheExpirationMinutes: (Number) Define o tempo de expiração do cache em minutos. Padrão:
60
. - syncIntervalMinutes: (Number) Define o intervalo de sincronização de dados em minutos. Padrão:
10
. - persistenceEnabled: (Boolean) Habilita ou desabilita a persistência de dados (logs de auditoria, sessões e análises) utilizando IndexedDB. Padrão:
true
. - disableAutoCancellation: (Boolean) Se
true
, desabilita o cancelamento automático de requisições do PocketBase (útil para requisições de longa duração, definindo$autoCancel
comofalse
nas requisições). Padrão:false
(auto-cancelamento habilitado por padrão pelo PocketBase SDK). - defaultRequestOptions: (Object) Opções padrão a serem passadas para todas as requisições ao PocketBase SDK. Padrão:
{}
. - maxAuditLogs: (Number) Número máximo de logs de auditoria a serem mantidos. Padrão:
1000
.
Nota: Certifique-se de que o servidor PocketBase está corretamente configurado e acessível através da baseUrl
fornecida. Também verifique se o script do PocketBase (pocketbase.umd.js) foi incluído antes do Easy PocketBase Manager.
Exemplo de configuração personalizada:
// Exemplo de configuração personalizada
const pbManager = new PocketBaseManager({
baseUrl: 'https://meuservidor.com',
collection: 'clientes',
cacheEnabled: true, // Habilita o cache
cacheExpirationMinutes: 120, // Expira o cache após 120 minutos
syncIntervalMinutes: 15, // Sincronização periódica de 15 em 15 minutos
persistenceEnabled: true, // Habilita persistência de logs, sessões e análises via IndexedDB
maxAuditLogs: 500,
disableAutoCancellation: false
});
Uso e Integração
Após a instalação e configuração, o Easy PocketBase Manager estará pronto para uso. A seguir, descrevemos como interagir com o sistema e integrar as funcionalidades do PocketBase no fluxo da sua aplicação:
- Autenticação de Usuários: Utilize os métodos
login
,signup
,logout
,logoutAndClear
,sendPasswordResetEmail
everifyEmail
para gerenciar a autenticação de usuários. O gerenciador também tentará restaurar automaticamente uma sessão existente via cookies na inicialização. O método 'login' é usado para autenticação explícita com email/senha. - Operações CRUD: Utilize os métodos
create
,read
,update
,delete
para gerenciar registros nas coleções do PocketBase. - Operações em Lote: Utilize os métodos
batchCreate
,batchUpdate
,batchDelete
para realizar operações em múltiplos registros simultaneamente. - Manipulação de Arquivos: Utilize os métodos
uploadFile
,uploadMultipleFiles
,downloadFile
,deleteFile
,getFileUrl
egetMultipleFileUrls
para gerenciar arquivos associados a registros. - Gerenciamento de Roles: Utilize os métodos
assignRole
egetRoles
para controlar as permissões de usuários. - Eventos: Escute eventos como 'auth', 'signup', 'passwordResetRequested', 'emailVerified', 'create', 'read', 'update', 'delete', 'list', 'batchCreate', 'batchUpdate', 'batchDelete', 'fileUploaded', 'fileDeleted', 'increment', 'decrement', 'roleAssigned', 'rolesFetched', 'import', 'syncCompleted', entre outros, para reagir a ações específicas na aplicação. Você pode utilizar
on
,once
,removeListener
eemit
para manipular eventos locais. - Exportação e Importação de Dados: Utilize os métodos
exportToJSON
,importFromJSON
,exportToCSV
,importFromCSV
,exportToXML
,importFromXML
para exportar e importar dados em formatos JSON, CSV e XML. - Sincronização de Dados: Utilize o método
sync
para sincronizar dados entre diferentes instâncias do PocketBaseManager. Você também pode iniciar e parar a sincronização periódica comstartSync
estopSync
. - Cache de Dados: Utilize os métodos
clearCache
,invalidateRecord
para gerenciar o cache de dados. - Leitura com Atualização Automática: Utilize os métodos
readWithAutoUpdate
elistWithAutoUpdate
para ler registros com atualização automática de dados (assinando eventos em tempo real). - Análise de Operações: Utilize os métodos
getAnalytics
,resetAnalytics
,exportAnalytics
para obter e gerenciar estatísticas sobre as operações realizadas. - Gerenciamento de Sessões: Utilize os métodos
getSessions
,endSession
,updateSessionActivity
,deleteSession
,clearSessions
,exportSessions
para gerenciar sessões de usuários. - Gerenciamento de Logs de Auditoria: Utilize os métodos
getAuditLogs
,deleteAuditLog
,clearAuditLogs
,exportAuditLogs
para gerenciar logs de auditoria. - Métodos Adicionais: Utilize os métodos
cloneRecord
,countRecords
,searchRecords
,increment
,decrement
,downloadAsJSON
,downloadAsCSV
edownloadAsXML
para funcionalidades avançadas de manipulação de dados. - Configuração da Coleção Padrão: Utilize o método
setDefaultCollection
para definir a coleção padrão para as operações. - Opções de Requisição: Muitos métodos aceitam um parâmetro
methodRequestOptions
para passar opções específicas para a requisição do PocketBase SDK (ex:{ $autoCancel: false }
).
Exemplo de uso básico:
Autenticação de Usuário
// Realiza login de um usuário
pbManager.login('usuario@exemplo.com', 'senha_segura')
.then((authData) => {
console.log('Usuário autenticado:', authData);
})
.catch((error) => {
console.error('Erro ao autenticar usuário:', error);
});
Criação de um Registro
// Cria um novo registro na coleção padrão
pbManager.create({ nome: 'João', idade: 30 })
.then((registro) => {
console.log('Registro criado:', registro);
})
.catch((error) => {
console.error('Erro ao criar registro:', error);
});
Leitura de um Registro
// Lê um registro pelo ID na coleção padrão
pbManager.read('registroId123')
.then((registro) => {
console.log('Registro encontrado:', registro);
})
.catch((error) => {
console.error('Erro ao ler registro:', error);
});
Leitura com Atualização Automática
// Lê um registro e atualiza automaticamente quando há novas informações
pbManager.readWithAutoUpdate('registroId123', 'clientes', (registroAtualizado) => {
console.log('Registro atualizado automaticamente:', registroAtualizado);
})
.then(({ initialData, unsubscribe }) => {
console.log('Dados iniciais:', initialData);
// Guarde a função unsubscribe para usá-la depois, se necessário
// ex: setTimeout(() => unsubscribe(), 60000);
})
.catch(error => console.error('Erro em readWithAutoUpdate:', error));
Leitura de Lista com Atualização Automática
// Lê uma lista de registros e atualiza automaticamente quando há novas informações
pbManager.listWithAutoUpdate({ page: 1, perPage: 10, filter: 'idade > 25' }, 'clientes', (registrosAtualizados) => {
console.log('Lista de registros atualizada automaticamente:', registrosAtualizados);
})
.then(({ initialRecords, unsubscribe }) => {
console.log('Registros iniciais:', initialRecords);
// Guarde a função unsubscribe para usá-la depois, se necessário
})
.catch(error => console.error('Erro em listWithAutoUpdate:', error));
Atualização de um Registro
// Atualiza um registro pelo ID na coleção padrão
pbManager.update('registroId123', { idade: 31 })
.then((registroAtualizado) => {
console.log('Registro atualizado:', registroAtualizado);
})
.catch((error) => {
console.error('Erro ao atualizar registro:', error);
});
Deleção de um Registro
// Deleta um registro pelo ID na coleção padrão
pbManager.delete('registroId123')
.then((response) => {
console.log('Registro deletado:', response);
})
.catch((error) => {
console.error('Erro ao deletar registro:', error);
});
Logout e Limpeza de Dados
// Realiza logout e limpa todos os dados persistidos
pbManager.logoutAndClear()
.then(() => {
console.log('Usuário desautenticado e dados limpos com sucesso!');
})
.catch((error) => {
console.error('Erro ao desautenticar e limpar dados:', error);
});
Operações em Lote
// Cria múltiplos registros em lote
const novosRegistros = [
{ nome: 'Mariana', email: 'mariana@exemplo.com', idade: 22 },
{ nome: 'Felipe', email: 'felipe@exemplo.com', idade: 29 }
];
pbManager.batchCreate(novosRegistros)
.then((registrosCriados) => {
console.log('Registros criados em lote:', registrosCriados);
})
.catch((error) => {
console.error('Erro ao criar registros em lote:', error);
});
// Atualiza múltiplos registros em lote
const atualizacoes = {
'registroId1': { idade: 23 },
'registroId2': { idade: 30 }
};
pbManager.batchUpdate(atualizacoes)
.then((registrosAtualizados) => {
console.log('Registros atualizados em lote:', registrosAtualizados);
})
.catch((error) => {
console.error('Erro ao atualizar registros em lote:', error);
});
// Deleta múltiplos registros em lote
const idsParaDeletar = ['registroId1', 'registroId2'];
pbManager.batchDelete(idsParaDeletar)
.then((respostas) => {
console.log('Registros deletados em lote:', respostas);
})
.catch((error) => {
console.error('Erro ao deletar registros em lote:', error);
});
Manipulação de Arquivos
// Faz upload de um arquivo para um registro específico
const arquivo = document.querySelector('#inputArquivo').files[0];
const recordId = 'registroId123';
const campoArquivo = 'documento';
pbManager.uploadFile(arquivo, 'clientes', recordId, campoArquivo)
.then(({ record, fileUrl }) => {
console.log('Arquivo enviado:', record);
console.log('URL do arquivo:', fileUrl);
})
.catch((error) => {
console.error('Erro ao enviar arquivo:', error);
});
// Faz upload de múltiplos arquivos para um registro específico
const arquivos = document.querySelector('#inputArquivos').files;
const recordIdMulti = 'registroId456';
const campoArquivoMulti = 'documentos';
pbManager.uploadMultipleFiles(arquivos, 'clientes', recordIdMulti, campoArquivoMulti)
.then((resultados) => {
console.log('Arquivos enviados (resultados):', resultados);
})
.catch((error) => {
console.error('Erro ao enviar arquivos:', error);
});
// Faz download de um arquivo a partir de uma URL
const fileUrl = 'https://meuservidor.com/files/documento.pdf';
pbManager.downloadFile(fileUrl)
.then((blob) => {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'documento.pdf';
document.body.appendChild(a);
a.click();
a.remove();
})
.catch((error) => {
console.error('Erro ao baixar arquivo:', error);
});
// Exclui um arquivo de um registro (campo "documento")
pbManager.deleteFile('registroId123', 'documento', 'clientes')
.then(() => {
console.log('Arquivo excluído do registro com sucesso!');
})
.catch((error) => {
console.error('Erro ao excluir arquivo:', error);
});
// Obtém a URL de um arquivo específico
pbManager.getFileUrl('registroId123', 'documento', 'clientes')
.then((urlDoArquivo) => {
console.log('URL do arquivo:', urlDoArquivo);
})
.catch((error) => {
console.error('Erro ao obter URL do arquivo:', error);
});
// Obtém as URLs de múltiplos arquivos armazenados em um array de strings
pbManager.getMultipleFileUrls('registroId789', 'documentos', 'clientes')
.then((urlsDosArquivos) => {
console.log('URLs dos arquivos:', urlsDosArquivos);
})
.catch((error) => {
console.error('Erro ao obter múltiplas URLs de arquivos:', error);
});
Gerenciamento de Roles
// Atribui um role a um usuário
const userId = 'usuarioId123';
const roleId = 'roleId456'; // Pode ser o ID de um registro na coleção de roles, ou um valor de string/enum
pbManager.assignRole(userId, roleId) // Por padrão, atualiza a coleção 'users'
.then((registroAtualizado) => {
console.log('Role atribuída:', registroAtualizado);
})
.catch((error) => {
console.error('Erro ao atribuir role:', error);
});
// Recupera todos os roles (ou usuários, dependendo da implementação) disponíveis
pbManager.getRoles() // Por padrão, lista da coleção 'users'
.then((roles) => {
console.log('Roles (usuários) disponíveis:', roles);
})
.catch((error) => {
console.error('Erro ao obter roles:', error);
});
Exportação e Importação de Dados
// Exporta todos os registros da coleção 'clientes' para JSON
pbManager.exportToJSON('clientes')
.then((jsonData) => {
console.log('Dados exportados:', jsonData);
})
.catch((error) => {
console.error('Erro ao exportar dados:', error);
});
// Importa dados a partir de uma string JSON para a coleção 'clientes'
const dadosImportados = '[{"nome":"Laura","email":"laura@exemplo.com","idade":27}]';
pbManager.importFromJSON(dadosImportados, true, 'clientes')
.then(() => {
console.log('Dados importados com sucesso!');
})
.catch((error) => {
console.error('Erro ao importar dados:', error);
});
// Exporta todos os registros da coleção 'clientes' para CSV
pbManager.exportToCSV('clientes')
.then((csvData) => {
console.log('Dados exportados para CSV:', csvData);
})
.catch((error) => {
console.error('Erro ao exportar dados para CSV:', error);
});
// Importa dados a partir de uma string CSV para a coleção 'clientes'
const dadosCSV = 'nome,email,idade\nLaura,laura@exemplo.com,27\nPedro,pedro@exemplo.com,28';
pbManager.importFromCSV(dadosCSV, true, 'clientes')
.then(() => {
console.log('Dados importados a partir de CSV com sucesso!');
})
.catch((error) => {
console.error('Erro ao importar dados de CSV:', error);
});
// Exporta todos os registros da coleção 'clientes' para XML
pbManager.exportToXML('clientes')
.then((xmlData) => {
console.log('Dados exportados para XML:', xmlData);
})
.catch((error) => {
console.error('Erro ao exportar dados para XML:', error);
});
// Importa dados a partir de uma string XML para a coleção 'clientes'
const dadosXML = '<?xml version="1.0" encoding="UTF-8"?><records><record><nome>Laura</nome><email>laura@exemplo.com</email><idade>27</idade></record></records>';
pbManager.importFromXML(dadosXML, true, 'clientes')
.then(() => {
console.log('Dados importados a partir de XML com sucesso!');
})
.catch((error) => {
console.error('Erro ao importar dados de XML:', error);
});
Além de exportar os dados para variáveis, você também pode fazer o download imediato dos arquivos gerados pelos métodos de exportação. Veja abaixo exemplos para JSON, CSV e XML:
// Download do arquivo JSON exportado da coleção padrão
pbManager.downloadAsJSON('clientes_export.json')
.then(() => {
console.log('Download de JSON concluído!');
})
.catch((error) => {
console.error('Erro ao fazer download de JSON:', error);
});
// Download do arquivo CSV exportado da coleção 'produtos'
pbManager.downloadAsCSV('produtos_export.csv', 'produtos')
.then(() => {
console.log('Download de CSV concluído!');
})
.catch((error) => {
console.error('Erro ao fazer download de CSV:', error);
});
// Download do arquivo XML exportado
pbManager.downloadAsXML('dados_export.xml')
.then(() => {
console.log('Download de XML concluído!');
})
.catch((error) => {
console.error('Erro ao fazer download de XML:', error);
});
Incrementos e Decrementos
// Incrementa o valor de um campo numérico em um registro
pbManager.increment('registroId123', 'quantidade', 5, 'estoque')
.then((registroAtualizado) => {
console.log('Valor incrementado:', registroAtualizado);
})
.catch((error) => {
console.error('Erro ao incrementar valor:', error);
});
// Decrementa o valor de um campo numérico em um registro
pbManager.decrement('registroId123', 'quantidade', 2, 'estoque')
.then((registroAtualizado) => {
console.log('Valor decrementado:', registroAtualizado);
})
.catch((error) => {
console.error('Erro ao decrementar valor:', error);
});
Eventos Locais (EventEmitter)
// Exemplo de uso do sistema de eventos locais do PocketBaseManager
// Adiciona um listener para o evento 'create'
pbManager.on('create', (novoRegistro) => {
console.log('Registro criado (evento local):', novoRegistro);
});
// Adiciona um listener de uso único para o evento 'update'
pbManager.once('update', (registroAtualizado) => {
console.log('Registro atualizado (evento local - once):', registroAtualizado);
});
// Remove um listener (se necessário, passando a mesma função de callback usada em 'on' ou 'once')
// const minhaFuncaoCallback = (data) => { console.log(data); };
// pbManager.on('create', minhaFuncaoCallback);
// pbManager.removeListener('create', minhaFuncaoCallback);
// Dispara manualmente um evento local
pbManager.emit('create', { id: 'teste', data: { exemplo: true } });
Verificação de Saúde do Servidor
// Verifica se o servidor PocketBase está respondendo
pbManager.healthCheck()
.then((healthInfo) => {
console.log('Servidor PocketBase está saudável:', healthInfo);
// Ex: { code: 200, message: 'API is healthy.' }
})
.catch((error) => {
console.error('Falha na verificação de saúde:', error.message);
});
Referência da API
Métodos Principais
- constructor(options): Cria uma nova instância do PocketBaseManager.
Parâmetros:
-options
(Object): Configurações iniciais, comobaseUrl
,collection
,cacheEnabled
,cacheExpirationMinutes
,syncIntervalMinutes
,persistenceEnabled
,disableAutoCancellation
,defaultRequestOptions
,maxAuditLogs
. - isAuthenticated(): Verifica se o usuário está autenticado.
Retorna:true
se autenticado,false
caso contrário. - login(email, password, methodRequestOptions): Realiza o login de um usuário.
Parâmetros:
-email
(String): Email do usuário.
-password
(String): Senha do usuário.
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com os dados de autenticação. - getUserId(): Retorna o ID do usuário atualmente autenticado (se houver).
Retorna: String (ID do usuário) ouundefined
se não estiver autenticado. - signup(email, password, data, methodRequestOptions): Registra um novo usuário.
Parâmetros:
-email
(String): Email do usuário.
-password
(String): Senha do usuário.
-data
(Object, opcional): Dados adicionais do usuário.
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com o registro criado. - sendPasswordResetEmail(email, methodRequestOptions): Envia um email para redefinição de senha.
Parâmetros:
-email
(String): Email do usuário.
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve quando o email for enviado. - verifyEmail(token, methodRequestOptions): Verifica o email do usuário com um token.
Parâmetros:
-token
(String): Token de verificação.
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com os dados de verificação. - logout(): Realiza o logout do usuário.
Retorna: Promise que resolve quando o logout for concluído. - logoutAndClear(): Realiza o logout do usuário e limpa todos os dados persistidos (logs de auditoria, sessões, análises e cache).
Retorna: Promise que resolve quando o logout e a limpeza forem concluídos. - create(data, collection, methodRequestOptions): Cria um novo registro em uma coleção.
Parâmetros:
-data
(Object): Dados do registro.
-collection
(String, opcional): Nome da coleção. Se não especificado, usa a coleção padrão (this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com o registro criado. - read(id, collection, methodRequestOptions): Lê um registro pelo ID.
Parâmetros:
-id
(String): ID do registro.
-collection
(String, opcional): Nome da coleção. Se não especificado, usa a coleção padrão (this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com o registro. - readWithAutoUpdate(id, collection, updateCallback, methodRequestOptions): Lê um registro pelo ID e atualiza automaticamente quando há novas informações (através de eventos em tempo real).
Parâmetros:
-id
(String): ID do registro.
-collection
(String): Nome da coleção (obrigatório).
-updateCallback
(Function): Função a ser chamada com o registro atualizado.
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição inicial.
Retorna: Promise que resolve com um objeto contendoinitialData
(os dados do registro inicial) eunsubscribe
(uma função para cancelar a assinatura). - list(params, collection, methodRequestOptions): Lista registros com parâmetros de consulta.
Parâmetros:
-params
(Object): Parâmetros de listagem, comopage
,perPage
,filter
,sort
,expand
.
-collection
(String, opcional): Nome da coleção. Se não especificado, usa a coleção padrão (this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com a lista de registros. - listWithAutoUpdate(params, collection, updateCallback, methodRequestOptions): Lista registros com parâmetros de consulta e atualiza automaticamente quando há novas informações (assinatura em tempo real).
Parâmetros:
-params
(Object): Parâmetros de listagem, comopage
,perPage
,filter
.
-collection
(String): Nome da coleção (obrigatório).
-updateCallback
(Function): Função a ser chamada com a lista atualizada.
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição inicial.
Retorna: Promise que resolve com um objeto contendoinitialRecords
(a lista inicial de registros) eunsubscribe
(uma função para cancelar a assinatura). - update(id, data, collection, methodRequestOptions): Atualiza um registro existente.
Parâmetros:
-id
(String): ID do registro.
-data
(Object): Dados a serem atualizados.
-collection
(String, opcional): Nome da coleção. Se não especificado, usa a coleção padrão (this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com o registro atualizado. - delete(id, collection, methodRequestOptions): Deleta um registro pelo ID.
Parâmetros:
-id
(String): ID do registro.
-collection
(String, opcional): Nome da coleção. Se não especificado, usa a coleção padrão (this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com a resposta da deleção (geralmentetrue
ou um objeto vazio em sucesso). - batchCreate(dataArray, collection, methodRequestOptions): Cria múltiplos registros em lote.
Parâmetros:
-dataArray
(Array): Array de objetos de dados.
-collection
(String, opcional): Nome da coleção. Se não especificado, usa a coleção padrão (this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com os registros criados. - batchUpdate(idDataMap, collection, methodRequestOptions): Atualiza múltiplos registros em lote.
Parâmetros:
-idDataMap
(Object): Mapa de IDs para dados de atualização (ex:{ 'id1': { field: value }, 'id2': { field: value } }
).
-collection
(String, opcional): Nome da coleção. Se não especificado, usa a coleção padrão (this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com os registros atualizados. - batchDelete(ids, collection, methodRequestOptions): Deleta múltiplos registros em lote.
Parâmetros:
-ids
(Array): Array de IDs dos registros.
-collection
(String, opcional): Nome da coleção. Se não especificado, usa a coleção padrão (this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com as respostas das deleções. - subscribe(event, collection, callback): Assina um evento específico em uma coleção no PocketBase (tempo real).
Parâmetros:
-event
(String): Nome do evento (ex.: 'create', 'update', 'delete', '*').
-collection
(String): Nome da coleção (obrigatório).
-callback
(Function): Função a ser chamada quando o evento ocorrer, recebendo o objeto do evento do PocketBase.
Retorna: Promise que resolve com a função de desinscrição. - unsubscribe(unsubscribeFn): Desinscreve de um evento de tempo real.
Parâmetros:
-unsubscribeFn
(Function): Função de desinscrição retornada pelo métodosubscribe
ou um objeto com um métodounsubscribe
.
Retorna: Promise que resolve quando a desinscrição for concluída. - uploadFile(file, collection, recordId, field, methodRequestOptions): Faz upload de um arquivo para uma coleção ou registro específico.
Parâmetros:
-file
(File): Arquivo a ser enviado.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-recordId
(String, opcional): ID do registro para associar o arquivo (cria um novo registro se não fornecido). Padrão:null
.
-field
(String, opcional): Nome do campo onde o arquivo será armazenado. Padrão:'file'
.
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com um objeto contendo o registro atualizado (record
) e a URL do arquivo (fileUrl
). - uploadMultipleFiles(files, collection, recordId, field, methodRequestOptions): Faz upload de múltiplos arquivos para uma coleção ou registro específico.
Parâmetros:
-files
(FileList ou Array): Arquivos a serem enviados.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-recordId
(String, opcional): ID do registro para associar os arquivos (cria novos registros se não fornecido). Padrão:null
.
-field
(String, opcional): Nome do campo onde os arquivos serão armazenados. Padrão:'file'
.
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com um array de resultados, cada um contendo{ record, fileUrl }
ou{ error, file }
. - downloadFile(fileUrl): Faz download de um arquivo a partir de uma URL (fetch + blob).
Parâmetros:
-fileUrl
(String): URL do arquivo.
Retorna: Promise que resolve com o Blob do arquivo. - deleteFile(recordId, fieldName, collection, methodRequestOptions): Remove um arquivo específico de um registro, definindo o campo para
null
.
Parâmetros:
-recordId
(String): ID do registro.
-fieldName
(String): Nome do campo que armazena o arquivo.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve quando o arquivo for removido do registro. - getFileUrl(recordId, fieldName, collection, methodRequestOptions): Retorna a URL de um arquivo específico armazenado em um registro.
Parâmetros:
-recordId
(String): ID do registro.
-fieldName
(String): Nome do campo que armazena o arquivo.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com a URL do arquivo. - getMultipleFileUrls(recordId, fieldName, collection, methodRequestOptions): Retorna um array de URLs para arquivos armazenados em um campo do tipo array.
Parâmetros:
-recordId
(String): ID do registro.
-fieldName
(String): Nome do campo que armazena um array de nomes de arquivos.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com um array de URLs. - assignRole(userId, roleId, collection, methodRequestOptions): Atribui um role a um usuário (geralmente atualizando um campo 'role' no registro do usuário).
Parâmetros:
-userId
(String): ID do usuário.
-roleId
(String): ID ou identificador do role.
-collection
(String, opcional): Nome da coleção de usuários (padrão:'users'
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com o registro atualizado. - getRoles(collection, methodRequestOptions): Recupera todos os roles (ou registros de usuários) de uma coleção.
Parâmetros:
-collection
(String, opcional): Nome da coleção (padrão:'users'
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com a lista de roles (ou registros). - exportToJSON(collection, methodRequestOptions): Exporta todos os registros de uma coleção para uma string JSON.
Parâmetros:
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com a string JSON. - importFromJSON(jsonData, overwrite, collection, methodRequestOptions): Importa registros a partir de uma string JSON.
Parâmetros:
-jsonData
(String): String JSON contendo os dados a serem importados.
-overwrite
(Boolean, opcional): Setrue
, sobrescreve registros existentes com o mesmo ID. Padrão:false
.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com os registros importados/atualizados. - downloadAsJSON(filename, collection, methodRequestOptions): Exporta todos os registros da coleção especificada (ou padrão) e inicia o download do arquivo JSON resultante.
Parâmetros:
-filename
(String, opcional): Nome do arquivo a ser baixado (padrão:export_TIMESTAMP.json
).
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição de exportação.
Retorna: Promise que se resolve quando o download é acionado. - exportToCSV(collection, methodRequestOptions): Exporta todos os registros de uma coleção para uma string CSV.
Parâmetros:
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com a string CSV. - importFromCSV(csvData, overwrite, collection, methodRequestOptions): Importa registros a partir de uma string CSV.
Parâmetros:
-csvData
(String): String CSV contendo os dados a serem importados.
-overwrite
(Boolean, opcional): Setrue
, sobrescreve registros existentes com o mesmo ID. Padrão:false
.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com os registros importados/atualizados. - downloadAsCSV(filename, collection, methodRequestOptions): Exporta todos os registros da coleção especificada (ou padrão) para CSV e inicia o download do arquivo.
Parâmetros:
-filename
(String, opcional): Nome do arquivo a ser baixado (padrão:export_TIMESTAMP.csv
).
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição de exportação.
Retorna: Promise que se resolve quando o download é acionado. - exportToXML(collection, methodRequestOptions): Exporta todos os registros de uma coleção para uma string XML.
Parâmetros:
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com a string XML. - importFromXML(xmlData, overwrite, collection, methodRequestOptions): Importa registros a partir de uma string XML.
Parâmetros:
-xmlData
(String): String XML contendo os dados a serem importados.
-overwrite
(Boolean, opcional): Setrue
, sobrescreve registros existentes com o mesmo ID. Padrão:false
.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com os registros importados/atualizados. - downloadAsXML(filename, collection, methodRequestOptions): Exporta todos os registros da coleção especificada (ou padrão) para XML e inicia o download do arquivo.
Parâmetros:
-filename
(String, opcional): Nome do arquivo a ser baixado (padrão:export_TIMESTAMP.xml
).
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição de exportação.
Retorna: Promise que se resolve quando o download é acionado. - cloneRecord(id, collection, methodRequestOptions): Clona um registro existente.
Parâmetros:
-id
(String): ID do registro a ser clonado.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com o novo registro clonado. - countRecords(filter, collection, methodRequestOptions): Conta o número de registros que correspondem a um filtro específico.
Parâmetros:
-filter
(String, opcional): Filtro para contagem. Padrão:""
(sem filtro).
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com o total de registros que correspondem ao filtro. - searchRecords(filter, collection, perPage, methodRequestOptions): Busca registros que correspondem a um filtro específico, retornando todos os resultados (paginando internamente).
Parâmetros:
-filter
(String, opcional): Filtro para busca. Padrão:""
(sem filtro).
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-perPage
(Number, opcional): Número de registros por página para a busca interna. Padrão:200
.
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com um array dos registros encontrados. - sync(otherPocketBaseManagerInstance): Sincroniza dados com outra instância do PocketBaseManager (importa dados da outra instância para a atual).
Parâmetros:
-otherPocketBaseManagerInstance
(PocketBaseManager): Outra instância do PocketBaseManager para sincronizar.
Retorna: Promise que resolve quando a sincronização (importação) for concluída. - clearCache(): Limpa todo o cache de dados da coleção atual.
Retorna: Promise que resolve quando o cache for limpo. - invalidateRecord(id): Invalida um registro específico no cache da coleção atual.
Parâmetros:
-id
(String): ID do registro a ser invalidado.
Retorna: Promise que resolve quando o registro for invalidado. - increment(id, field, amount, collection, methodRequestOptions): Incrementa o valor numérico de um campo em um registro.
Parâmetros:
-id
(String): ID do registro.
-field
(String): Nome do campo a ser incrementado.
-amount
(Number, opcional): Valor a ser adicionado. Padrão:1
.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com o registro atualizado. - decrement(id, field, amount, collection, methodRequestOptions): Decrementa o valor numérico de um campo em um registro.
Parâmetros:
-id
(String): ID do registro.
-field
(String): Nome do campo a ser decrementado.
-amount
(Number, opcional): Valor a ser subtraído. Padrão:1
.
-collection
(String, opcional): Nome da coleção (padrão:this.collection
).
-methodRequestOptions
(Object, opcional): Opções adicionais para a requisição.
Retorna: Promise que resolve com o registro atualizado. - startSync(): Inicia o processo de sincronização periódica de dados do cache da coleção atual com o servidor (baseado em
syncIntervalMinutes
).
Retorna: void. - stopSync(): Interrompe o processo de sincronização periódica de dados.
Retorna: void. - getAnalytics(): Obtém os dados de análise das operações realizadas.
Retorna: Objeto contendo contagens de operações e uso de bytes. - resetAnalytics(): Reseta os dados de análise das operações realizadas.
Retorna: void. - exportAnalytics(): Exporta os dados de análise das operações para uma string JSON.
Retorna: String JSON contendo os dados de análise. - setDefaultCollection(collection): Define a coleção padrão para as operações e reinicia o cache e a sincronização para essa coleção.
Parâmetros:
-collection
(String): Nome da coleção.
Retorna: void. - getAuditLogs(options): Obtém os logs de auditoria com opções de filtro, ordenação e busca.
Parâmetros:
-options
(Object, opcional): Objeto de opções para filtrar e ordenar os logs.
-filter
(String, opcional): Filtra logs pelaoperation
. Padrão:null
.
-sortBy
(String, opcional): Campo pelo qual ordenar os logs (ex: 'timestamp', 'operation'). Padrão:null
.
-searchTerm
(String, opcional): Termo para buscar nos detalhes ou operação do log. Padrão:null
.
-sortOrder
(String, opcional): Ordem da ordenação ('asc' ou 'desc'). Padrão: 'asc'.
Retorna: Array de logs de auditoria. - deleteAuditLog(index): Deleta um log de auditoria específico pelo índice.
Parâmetros:
-index
(Number): Índice do log a ser deletado.
Retorna: void. - clearAuditLogs(): Limpa todos os logs de auditoria.
Retorna: void. - exportAuditLogs(): Exporta todos os logs de auditoria para uma string JSON.
Retorna: String JSON contendo os logs de auditoria. - getSessions(): Obtém todas as sessões atuais.
Retorna: Array de sessões. - endSession(sessionId): Encerra uma sessão específica.
Parâmetros:
-sessionId
(String): ID da sessão a ser encerrada.
Retorna: void. - updateSessionActivity(sessionId, activity): Atualiza a atividade de uma sessão específica.
Parâmetros:
-sessionId
(String): ID da sessão.
-activity
(String): Descrição da atividade.
Retorna: void. - deleteSession(sessionId): Deleta uma sessão específica (sem disparar log de auditoria de encerramento, mas loga a deleção).
Parâmetros:
-sessionId
(String): ID da sessão a ser deletada.
Retorna: void. - clearSessions(): Limpa todas as sessões.
Retorna: void. - exportSessions(): Exporta todas as sessões para uma string JSON.
Retorna: String JSON contendo as sessões. - healthCheck(): Verifica a saúde do servidor PocketBase.
Retorna: Promise que resolve com o objeto de status de saúde do servidor (ex:{ code: 200, message: "API is healthy." }
) ou rejeita com um erro se a verificação falhar. - on(event, callback): Adiciona um listener para um evento local específico (emitido internamente pelo gerenciador).
Parâmetros:
-event
(String): Nome do evento.
-callback
(Function): Função a ser executada quando o evento ocorrer. - once(event, callback): Adiciona um listener para um evento local que dispara apenas uma vez.
Parâmetros:
-event
(String): Nome do evento.
-callback
(Function): Função a ser executada quando o evento ocorrer pela primeira vez. - removeListener(event, callback): Remove um listener previamente adicionado para um evento local.
Parâmetros:
-event
(String): Nome do evento.
-callback
(Function): A mesma função que foi usada emon
ouonce
. - emit(event, ...args): Emite manualmente um evento local, disparando todos os callbacks registrados para ele.
Parâmetros:
-event
(String): Nome do evento.
-...args
(qualquer): Argumentos adicionais passados aos callbacks.
Eventos Disponíveis
- auth: Disparado quando o status de autenticação muda (seja por 'login()', 'logout()', ou restauração via cookie).
- signup: Disparado quando um novo usuário se registra.
- passwordResetRequested: Disparado quando um pedido de redefinição de senha é feito.
- emailVerified: Disparado quando o email de um usuário é verificado.
- create: Disparado quando um novo registro é criado.
- read: Disparado quando um registro é lido.
- update: Disparado quando um registro é atualizado.
- delete: Disparado quando um registro é deletado.
- list: Disparado quando uma lista de registros é recuperada.
- batchCreate: Disparado quando múltiplos registros são criados em lote.
- batchUpdate: Disparado quando múltiplos registros são atualizados em lote.
- batchDelete: Disparado quando múltiplos registros são deletados em lote.
- fileUploaded: Disparado quando um arquivo é enviado com sucesso.
- fileDeleted: Disparado quando um arquivo é removido de um registro.
- getFileUrl: Disparado quando a URL de um arquivo é obtida.
- getMultipleFileUrls: Disparado quando múltiplas URLs de arquivos são obtidas.
- increment: Disparado quando um valor numérico de um registro é incrementado.
- decrement: Disparado quando um valor numérico de um registro é decrementado.
- roleAssigned: Disparado quando um role é atribuído a um usuário.
- rolesFetched: Disparado quando os roles são recuperados.
- import: Disparado quando dados são importados via JSON, CSV ou XML.
- syncCompleted: Disparado quando a sincronização periódica de dados do cache com o servidor é concluída.
Configurações de Inicialização
- baseUrl (String): URL base do servidor PocketBase. Padrão:
'http://127.0.0.1:8090'
. - collection (String): Nome da coleção padrão a ser utilizada nas operações CRUD. Padrão:
null
. - cacheEnabled (Boolean): Habilita ou desabilita o cache de dados utilizando IndexedDB. Padrão:
true
. - cacheExpirationMinutes (Number): Define o tempo de expiração do cache em minutos. Padrão:
60
. - syncIntervalMinutes (Number): Define o intervalo de sincronização de dados em minutos. Padrão:
10
. - persistenceEnabled (Boolean): Habilita ou desabilita a persistência de dados (logs de auditoria, sessões e análises) utilizando IndexedDB. Padrão:
true
. - disableAutoCancellation (Boolean): Se
true
, desabilita o cancelamento automático de requisições do PocketBase. Padrão:false
. - defaultRequestOptions (Object): Opções padrão a serem passadas para todas as requisições ao PocketBase SDK. Padrão:
{}
. - maxAuditLogs (Number): Número máximo de logs de auditoria a serem mantidos. Padrão:
1000
.
Resolução de Problemas
Enfrentando problemas com o Easy PocketBase Manager? Aqui estão algumas soluções para problemas comuns:
- PocketBaseManager Não Inicializa: Verifique se o script do PocketBase está sendo carregado corretamente antes do script do PocketBase Manager. Verifique o console do navegador por erros.
- Erro de Conexão com o PocketBase: Assegure-se de que a
baseUrl
está correta e que o servidor PocketBase está em execução e acessível. Utilize o métodohealthCheck()
para diagnosticar. - Falha na Autenticação: Verifique se as credenciais fornecidas estão corretas e se o usuário existe na coleção de usuários (padrão: 'users').
- Operações CRUD Não Funcionam: Certifique-se de que a coleção especificada existe no PocketBase e que o usuário possui as permissões necessárias para realizar as operações. Verifique se
this.collection
está definido ou se você está passando o nome da coleção para o método. - Operações em Lote Não Funcionam: Verifique se os dados fornecidos estão no formato correto (array para
batchCreate
, objeto parabatchUpdate
, array de IDs parabatchDelete
). - Falha na Manipulação de Arquivos: Verifique se o campo especificado para o upload de arquivo existe na coleção e se o arquivo está no formato correto. Certifique-se de que o
recordId
é válido se estiver atualizando um registro existente. - Eventos Não São Disparados: Assegure-se de que os listeners de eventos estão corretamente configurados utilizando os métodos
on
,once
e que os eventos estão sendo emitidos conforme esperado. Lembre-se que eventos de tempo real do PocketBase (viasubscribe
) são diferentes dos eventos locais emitidos pelo manager. - Falha na Importação/Exportação de Dados: Confirme se o formato do JSON, CSV ou XML está correto e se os dados correspondem à estrutura esperada pela coleção.
- Sincronização de Dados Não Funciona: Para
sync()
, verifique se ambas as instâncias do PocketBaseManager estão configuradas corretamente. Para sincronização periódica (startSync()
), verifique secacheEnabled
étrue
e sethis.collection
está definido. - Problemas de Permissões: Assegure-se de que as permissões das coleções no PocketBase estão configuradas para permitir as operações desejadas para o usuário autenticado (ou acesso público, se aplicável).
- Erro ao Atribuir Roles: Verifique se os IDs de usuário e role fornecidos estão corretos e se a coleção de usuários (padrão 'users') possui um campo para armazenar roles (ex: 'role').
- Problemas com o Cache: Utilize os métodos
clearCache
,invalidateRecord
para gerenciar e resolver problemas relacionados ao cache. Lembre-se que o cache é por coleção. - Falha na Leitura com Atualização Automática: Verifique se os callbacks estão corretamente implementados e se a coleção especificada é válida. A função
unsubscribe
retornada deve ser chamada para parar de ouvir as atualizações. - Falha ao Gerenciar Sessões/Logs de Auditoria: Certifique-se de que
persistenceEnabled
estátrue
(padrão). Verifique o console por erros relacionados ao IndexedDB. - Opções de Requisição (
methodRequestOptions
,defaultRequestOptions
): Se estiver usando essas opções, certifique-se de que são válidas para o PocketBase SDK. Por exemplo,$autoCancel: false
para desabilitar o cancelamento automático.
Exemplos de Código
Abaixo, alguns exemplos de como integrar e utilizar o Easy PocketBase Manager:
Exemplo Básico de Integração
<!-- Inclusão do Script do PocketBase -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/pocketbase/0.25.0/pocketbase.umd.js"></script>
<!-- Inclusão do Script do PocketBase Manager -->
<script src="https://cdn.alphasystem.dev/plugins/easy-pocketbase-manager/latest/script-min.js"></script>
<!-- Script de Configuração e Inicialização -->
<script>
const pbManager = new PocketBaseManager({
baseUrl: 'https://meuservidor.com', // Substitua pela URL do seu PocketBase
collection: 'clientes', // Coleção padrão opcional
cacheEnabled: true,
cacheExpirationMinutes: 120,
syncIntervalMinutes: 15,
persistenceEnabled: true
});
// Exemplo de uso após inicialização
pbManager.initPromise.then(() => {
console.log('PocketBaseManager inicializado e pronto para uso.');
if (pbManager.isAuthenticated()) {
console.log('Usuário já está autenticado:', pbManager.getUserId());
}
}).catch(error => {
console.error('Falha na inicialização do PocketBaseManager:', error);
});
</script>
Autenticação de Usuário
// Realiza signup de um novo usuário
pbManager.signup('novo@usuario.com', 'senha_segura', { nome: 'Ana', idade: 28 })
.then((registro) => {
console.log('Usuário registrado:', registro);
})
.catch((error) => {
console.error('Erro ao registrar usuário:', error);
});
// Realiza login de um usuário existente
pbManager.login('usuario@exemplo.com', 'senha_segura')
.then((authData) => {
console.log('Usuário autenticado:', authData);
// authData.record contém os dados do usuário
// authData.token contém o token JWT
})
.catch((error) => {
console.error('Erro ao autenticar usuário:', error);
});
Gerenciamento de Registros
// Define a coleção padrão se não foi definida no construtor
// pbManager.setDefaultCollection('produtos');
// Cria um novo registro na coleção 'clientes' (ou na padrão)
pbManager.create({ nome: 'Carlos', email: 'carlos@exemplo.com', idade: 35 }, 'clientes')
.then((registro) => {
console.log('Registro criado:', registro);
})
.catch((error) => {
console.error('Erro ao criar registro:', error);
});
// Lê um registro pelo ID da coleção 'clientes'
pbManager.read('registroId123', 'clientes')
.then((registro) => {
console.log('Registro encontrado:', registro);
})
.catch((error) => {
console.error('Erro ao ler registro:', error);
});
// Atualiza um registro existente na coleção 'clientes'
pbManager.update('registroId123', { idade: 36 }, 'clientes')
.then((registroAtualizado) => {
console.log('Registro atualizado:', registroAtualizado);
})
.catch((error) => {
console.error('Erro ao atualizar registro:', error);
});
// Deleta um registro pelo ID da coleção 'clientes'
pbManager.delete('registroId123', 'clientes')
.then((response) => {
console.log('Registro deletado:', response); // true em sucesso
})
.catch((error) => {
console.error('Erro ao deletar registro:', error);
});
Operações em Lote
// Cria múltiplos registros em lote na coleção 'pedidos'
const novosRegistros = [
{ produto: 'Produto A', quantidade: 2 },
{ produto: 'Produto B', quantidade: 5 }
];
pbManager.batchCreate(novosRegistros, 'pedidos')
.then((registrosCriados) => {
console.log('Registros criados em lote:', registrosCriados);
})
.catch((error) => {
console.error('Erro ao criar registros em lote:', error);
});
// Atualiza múltiplos registros em lote na coleção 'pedidos'
const atualizacoes = {
'registroId1': { quantidade: 3 },
'registroId2': { status: 'enviado' }
};
pbManager.batchUpdate(atualizacoes, 'pedidos')
.then((registrosAtualizados) => {
console.log('Registros atualizados em lote:', registrosAtualizados);
})
.catch((error) => {
console.error('Erro ao atualizar registros em lote:', error);
});
// Deleta múltiplos registros em lote da coleção 'pedidos'
const idsParaDeletar = ['registroId1', 'registroId2'];
pbManager.batchDelete(idsParaDeletar, 'pedidos')
.then((respostas) => {
console.log('Registros deletados em lote:', respostas);
})
.catch((error) => {
console.error('Erro ao deletar registros em lote:', error);
});
Manipulação de Arquivos
// Supondo que você tenha um input de arquivo: <input type="file" id="inputArquivo">
const arquivoInput = document.querySelector('#inputArquivo');
if (arquivoInput) {
arquivoInput.onchange = (event) => {
const arquivo = event.target.files[0];
if (arquivo) {
const recordId = 'ID_DO_REGISTRO_CLIENTE'; // ID do registro ao qual o arquivo será associado
const campoArquivo = 'avatar'; // Nome do campo de arquivo na coleção 'clientes'
pbManager.uploadFile(arquivo, 'clientes', recordId, campoArquivo)
.then(({ record, fileUrl }) => {
console.log('Arquivo enviado com sucesso! Registro atualizado:', record);
console.log('URL do arquivo:', fileUrl);
})
.catch((error) => {
console.error('Erro ao enviar arquivo:', error);
});
}
};
}
// Supondo input para múltiplos arquivos: <input type="file" id="inputArquivos" multiple>
const arquivosInput = document.querySelector('#inputArquivos');
if (arquivosInput) {
arquivosInput.onchange = (event) => {
const arquivos = event.target.files;
if (arquivos.length > 0) {
const recordIdMulti = 'ID_DO_REGISTRO_PROJETO';
const campoArquivoMulti = 'anexos'; // Campo que aceita múltiplos arquivos
pbManager.uploadMultipleFiles(arquivos, 'projetos', recordIdMulti, campoArquivoMulti)
.then((resultados) => {
console.log('Arquivos enviados (resultados):', resultados);
resultados.forEach(res => {
if (res.error) console.error('Erro ao enviar:', res.file.name, res.error);
else console.log('Enviado:', res.record, res.fileUrl);
});
})
.catch((error) => {
console.error('Erro geral ao enviar múltiplos arquivos:', error);
});
}
};
}
// Faz download de um arquivo a partir de uma URL (gerada pelo PocketBase ou getFileUrl)
const urlDoArquivoParaBaixar = 'URL_COMPLETA_DO_ARQUIVO_NO_POCKETBASE';
pbManager.downloadFile(urlDoArquivoParaBaixar)
.then((blob) => {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'nome_do_arquivo.extensao'; // Defina o nome do arquivo para download
document.body.appendChild(a);
a.click();
a.remove();
URL.revokeObjectURL(url);
console.log('Download iniciado.');
})
.catch((error) => {
console.error('Erro ao baixar arquivo:', error);
});
// Exclui um arquivo de um registro (define o campo como null)
const recordIdComArquivo = 'ID_DO_REGISTRO_CLIENTE';
const campoDoArquivo = 'avatar';
pbManager.deleteFile(recordIdComArquivo, campoDoArquivo, 'clientes')
.then(() => {
console.log('Arquivo excluído do registro com sucesso!');
})
.catch((error) => {
console.error('Erro ao excluir arquivo do registro:', error);
});
// Obtém a URL de um arquivo específico
pbManager.getFileUrl(recordIdComArquivo, campoDoArquivo, 'clientes')
.then((urlDoArquivo) => {
console.log('URL do arquivo:', urlDoArquivo);
// Ex: https://meuservidor.com/api/files/COLECAO_ID/REGISTRO_ID/NOME_ARQUIVO.jpg
})
.catch((error) => {
console.error('Erro ao obter URL do arquivo:', error);
});
// Obtém as URLs de vários arquivos (se o campo 'documentos' for um array de nomes de arquivos)
const recordIdComMultiplosArquivos = 'ID_DO_REGISTRO_PROJETO';
const campoComMultiplosArquivos = 'anexos';
pbManager.getMultipleFileUrls(recordIdComMultiplosArquivos, campoComMultiplosArquivos, 'projetos')
.then((urlsDosArquivos) => {
console.log('URLs dos arquivos:', urlsDosArquivos); // Array de URLs
})
.catch((error) => {
console.error('Erro ao obter URLs dos arquivos:', error);
});
Gerenciamento de Roles
// Atribui um role (valor no campo 'role') a um usuário na coleção 'users'
const userId = 'ID_DO_USUARIO';
const novoRole = 'admin'; // Ou pode ser um ID de outra coleção, dependendo da sua lógica
pbManager.assignRole(userId, novoRole) // Por padrão, atualiza o campo 'role' na coleção 'users'
.then((registroAtualizado) => {
console.log('Role atribuída ao usuário:', registroAtualizado);
})
.catch((error) => {
console.error('Erro ao atribuir role:', error);
});
// Recupera todos os usuários (que podem ter roles) da coleção 'users'
pbManager.getRoles() // Por padrão, lista da coleção 'users'
.then((usuarios) => {
console.log('Usuários (com seus roles):', usuarios.items);
})
.catch((error) => {
console.error('Erro ao obter usuários/roles:', error);
});
Exportação e Importação de Dados
// Exporta todos os registros da coleção 'clientes' para JSON
pbManager.exportToJSON('clientes')
.then((jsonData) => {
// console.log('Dados JSON exportados:', jsonData);
// Para download direto:
pbManager.downloadAsJSON('clientes_export.json', 'clientes');
})
.catch((error) => {
console.error('Erro ao exportar dados para JSON:', error);
});
// Importa dados a partir de uma string JSON para a coleção 'clientes', sobrescrevendo existentes
const dadosJsonParaImportar = '[{"id":"id_existente","nome":"Laura Atualizada","idade":28},{"nome":"Novo Usuário","idade":30}]';
pbManager.importFromJSON(dadosJsonParaImportar, true, 'clientes')
.then((registrosImportados) => {
console.log('Dados JSON importados com sucesso!', registrosImportados);
})
.catch((error) => {
console.error('Erro ao importar dados JSON:', error);
});
// Exporta para CSV e faz download
pbManager.exportToCSV('produtos')
.then((csvData) => {
// console.log('Dados CSV exportados:', csvData);
pbManager.downloadAsCSV('produtos_export.csv', 'produtos');
})
.catch((error) => {
console.error('Erro ao exportar dados para CSV:', error);
});
// Importa de CSV
const dadosCSVParaImportar = 'id,nome,preco\nprod001,Produto Alfa,19.99\n,Produto Beta,29.50';
pbManager.importFromCSV(dadosCSVParaImportar, false, 'produtos') // false = não sobrescrever
.then((registrosImportados) => {
console.log('Dados CSV importados com sucesso!', registrosImportados);
})
.catch((error) => {
console.error('Erro ao importar dados CSV:', error);
});
Incrementos e Decrementos
// Incrementa o campo 'estoque' do registro 'produtoId123' na coleção 'produtos' em 5 unidades
pbManager.increment('produtoId123', 'estoque', 5, 'produtos')
.then((registroAtualizado) => {
console.log('Estoque incrementado:', registroAtualizado.estoque);
})
.catch((error) => {
console.error('Erro ao incrementar estoque:', error);
});
// Decrementa o campo 'pontos' do registro 'usuarioXyz' na coleção 'users' em 10 unidades
pbManager.decrement('usuarioXyz', 'pontos', 10, 'users')
.then((registroAtualizado) => {
console.log('Pontos decrementados:', registroAtualizado.pontos);
})
.catch((error) => {
console.error('Erro ao decrementar pontos:', error);
});
Eventos Locais
// Exemplo de uso dos eventos locais do PocketBaseManager
// Evento disparado após um login bem-sucedido
pbManager.on('auth', (isAuthenticated) => {
if (isAuthenticated) {
console.log('Evento local "auth": Usuário autenticado!', pbManager.getUserId());
} else {
console.log('Evento local "auth": Usuário desautenticado.');
}
});
// Evento disparado após a criação de um registro
pbManager.on('create', (novoRegistro) => {
console.log('Evento local "create": Novo registro criado:', novoRegistro);
// Ex: atualizar UI com o novo registro
});
// Evento disparado uma única vez após a primeira atualização de um registro
pbManager.once('update', (registroAtualizado) => {
console.log('Evento local "update" (disparado uma vez): Registro atualizado:', registroAtualizado);
});
// Para remover um listener específico:
// const meuListenerCreate = (data) => { console.log('Meu listener:', data); };
// pbManager.on('create', meuListenerCreate);
// pbManager.removeListener('create', meuListenerCreate); // Remove o listener específico
// Disparar um evento personalizado (se você estender a classe ou para testes)
// pbManager.emit('eventoCustomizado', { info: 'dados do evento' });