UNPKG

zdata-client

Version:

TypeScript client library for zdata backend API with authentication and full CRUD operations

394 lines (306 loc) 9.09 kB
# ZData Client v2.0.0 Uma biblioteca TypeScript client simplificada para acesso à API do ZData backend com autenticação e operações CRUD completas. ## 🚀 Nova Arquitetura Simplificada A versão 2.0 foi completamente refatorada para uma API mais simples e direta: - ✅ **Funções de autenticação standalone** (não classes) - ✅ **ResourceRepository** aceita access_token diretamente - ✅ **Sem gerenciamento de localStorage** - ✅ **Foco apenas em acesso à API** - ✅ **Controle total do usuário sobre tokens** ## 📦 Instalação ```bash npm install zdata-client ``` ## 🔑 Autenticação ### Login ```typescript import { login } from 'zdata-client'; const authResponse = await login( 'https://api.example.com', // baseUrl 'workspace-id', // workspaceId { email: 'user@example.com', password: 'password123' } ); console.log(authResponse.access_token); console.log(authResponse.user); ``` ### Registro ```typescript import { register } from 'zdata-client'; const authResponse = await register( 'https://api.example.com', // baseUrl 'workspace-id', // workspaceId { name: 'João Silva', email: 'joao@example.com', password: 'password123' } ); console.log(authResponse.access_token); ``` ## 🗄️ Operações CRUD ### Usando ResourceRepository ```typescript import { ResourceRepository } from 'zdata-client'; // Criar repositório com token de autenticação const repository = new ResourceRepository( 'https://api.example.com', // baseUrl 'workspace-id', // workspaceId 'your-access-token', // accessToken 5000 // timeout (opcional) ); // Criar registro const newUser = await repository.createRecord('users', { name: 'Maria Silva', email: 'maria@example.com' }); // Buscar por ID const user = await repository.findRecordById('users', 'user-id'); // Buscar com paginação const users = await repository.findRecords({ resourceName: 'users', page: 1, limit: 10, search: 'maria' }); // Atualizar const updatedUser = await repository.updateRecord('users', 'user-id', { name: 'Maria Santos' }); // Deletar await repository.deleteRecord('users', 'user-id'); ``` ### Usando Factory Function ```typescript import { createRepository } from 'zdata-client'; const repository = createRepository( 'https://api.example.com', 'workspace-id', 'access-token' ); const users = await repository.findRecords({ resourceName: 'users', page: 1 }); ``` ## 👤 Operações do Usuário Logado A biblioteca fornece o `LoggedUserClient` para operações específicas do usuário autenticado: ```typescript import { LoggedUserClient } from 'zdata-client'; // Criar cliente com token de autenticação const userClient = new LoggedUserClient( 'https://api.example.com', // baseUrl 'workspace-id', // workspaceId 'your-access-token', // accessToken 5000 // timeout (opcional) ); // Obter perfil do usuário const profile = await userClient.getProfile(); console.log(profile); // Output: // { // id: "ef4c8d10-582c-4bd6-bf56-7409efac7617", // name: "Adriano Delvoux SubUser", // email: "adrianodelvoux+teste001@gmail.com", // settings: { // themeMode: "light" // } // } // Atualizar nome do usuário const updated = await userClient.updateProfile({ name: 'Novo Nome' }); // Alterar tema para modo escuro const darkMode = await userClient.updateProfile({ themeMode: 'dark' }); // Atualizar múltiplos campos const multiUpdate = await userClient.updateProfile({ name: 'João Silva', themeMode: 'light' }); // Limpar campos (definir como null) const cleared = await userClient.updateProfile({ name: null, themeMode: 'dark' }); ``` ### Tipos do LoggedUserClient ```typescript import type { LoggedUser, UpdateLoggedUser } from 'zdata-client'; // Tipo de resposta do perfil const profile: LoggedUser = { id: string; name: string; email: string; settings: { themeMode: 'light' | 'dark'; }; }; // Tipo para atualização (todos os campos são opcionais) const updateData: UpdateLoggedUser = { name?: string | null; themeMode?: 'light' | 'dark' | null; }; ``` ## 🎯 Uso Completo (Login + CRUD + Perfil) ```typescript import { login, ResourceRepository, LoggedUserClient } from 'zdata-client'; const baseUrl = 'https://api.example.com'; const workspaceId = 'my-workspace'; // 1. Fazer login const authResponse = await login(baseUrl, workspaceId, { email: 'user@example.com', password: 'password123' }); // 2. Criar repositório com token const repository = new ResourceRepository( baseUrl, workspaceId, authResponse.access_token ); // 3. Criar cliente do usuário logado const userClient = new LoggedUserClient( baseUrl, workspaceId, authResponse.access_token ); // 4. Obter perfil do usuário const profile = await userClient.getProfile(); console.log(`Olá, ${profile.name}! Tema atual: ${profile.settings.themeMode}`); // 5. Usar o repositório para operações CRUD const users = await repository.findRecords({ resourceName: 'users', page: 1, limit: 10 }); console.log(`Found ${users.meta.totalRecords} users`); // 6. Atualizar perfil se necessário if (profile.settings.themeMode === 'light') { await userClient.updateProfile({ themeMode: 'dark' }); console.log('Tema alterado para escuro!'); } ``` ## 🏗️ Classes de Repositório Tipadas Para casos mais avançados, você pode criar classes tipadas que herdam de `BaseDataSourceClient`: ```typescript import { BaseDataSourceClient, type CreateEntity, type EntityWithBase } from 'zdata-client'; interface User { name: string; email: string; role: string; } class UserRepository extends BaseDataSourceClient<User> { constructor(baseUrl: string, workspaceId: string, accessToken: string) { super(baseUrl, workspaceId, accessToken, 'users'); } // Métodos customizados async findByRole(role: string) { return this.find({ search: `role:${role}` }); } async createAdmin(userData: CreateEntity<User>) { return this.create({ ...userData, role: 'admin' }); } } // Uso const userRepo = new UserRepository(baseUrl, workspaceId, accessToken); const admins = await userRepo.findByRole('admin'); ``` ## 📝 Tipos TypeScript A biblioteca fornece tipos completos para TypeScript: ```typescript import type { LoginRequest, RegisterRequest, AuthResponse, FindRecordsParams, PaginatedResponse, BaseEntity, LoggedUser, UpdateLoggedUser } from 'zdata-client'; // Exemplo de uso com tipos const params: FindRecordsParams = { resourceName: 'products', page: 1, limit: 20, search: 'electronics' }; const response: PaginatedResponse<Product> = await repository.findRecords(params); ``` ## 🔄 Migração da v1.x ### Antes (v1.x): ```typescript const client = new ZDataClient({ baseUrl: 'https://api.example.com', workspaceId: 'workspace-id', enableCache: true }); await client.login({ email: 'user@example.com', password: 'pass' }); const users = await client.findRecords({ resourceName: 'users' }); ``` ### Agora (v2.0): ```typescript // 1. Login separado const auth = await login('https://api.example.com', 'workspace-id', { email: 'user@example.com', password: 'pass' }); // 2. Repositório com token const repository = new ResourceRepository( 'https://api.example.com', 'workspace-id', auth.access_token ); const users = await repository.findRecords({ resourceName: 'users' }); ``` ## 🛠️ Recursos Removidos na v2.0 - ❌ Classe `ZDataClient` (substituída por funções e repositório) - ❌ Classe `AuthService` (substituída por funções `login`/`register`) - ❌ Cache interno automático (usuário implementa externamente se necessário) - ❌ Gerenciamento de localStorage/sessionStorage - ❌ Configuração complexa com múltiplas opções ## 🎯 Benefícios da v2.0 - ✅ **API mais simples**: Funções diretas em vez de classes complexas - ✅ **Controle total**: Usuário gerencia tokens como preferir - ✅ **Menor acoplamento**: Cada peça funciona independentemente - ✅ **Mais testável**: Funções puras são mais fáceis de testar - ✅ **Biblioteca mais leve**: Menos código interno - ✅ **Uso flexível**: Use apenas o que precisa ## 🚨 Tratamento de Erros A biblioteca fornece classes de erro customizadas: ```typescript import { InvalidCredentialsError, ValidationError, ApiClientError, } from 'zdata-client'; try { const auth = await login(baseUrl, workspaceId, credentials); } catch (error) { if (error instanceof InvalidCredentialsError) { console.error('Credenciais inválidas'); } else if (error instanceof ApiClientError) { console.error(`Erro da API (${error.statusCode}):`, error.message); } } ``` ## 🔧 Desenvolvimento ```bash # Instalar dependências npm install # Executar testes npm test # Build npm run build # Lint npm run lint # Type check npm run type-check ``` ## 📄 Licença MIT --- **ZData Client v2.0** - Uma biblioteca client de API TypeScript simples e poderosa. 🚀