Files
voltcerto/docs/API.md
Luis Medon e488ae3342 Add feature tests, unit tests, and configuration for Laravel application
- Created ExampleTest and RoutesTest for basic application response and route testing.
- Implemented IsolatedDatabaseTestCase for isolated database testing.
- Added unit tests for various models and services including Contract, CPE, and LeadDetail.
- Developed request validation tests for CreateClientRequest, UpdateClientRequest, and ContractRequest.
- Introduced Vite configuration for asset management in the Laravel application.
2026-10-29 11:30:06 +00:00

132 lines
7.0 KiB
Markdown

# API da aplicacao
## Arquitetura
Web e API usam os mesmos servicos em `app/Services`, com as mesmas regras de
negocio e acesso aos dados. A web mantem as vistas Blade e os redirecionamentos.
A API devolve JSON, exceto a exportacao Excel e o diagnostico HTML `phpinfo`.
Os controllers nao fazem chamadas HTTP a propria aplicacao. `APP_API_URL` ou
`app.api_url` deixam de ser necessarios para o login e a sessao web.
O bootstrap Laravel regista `routes/api.php` com o prefixo `/api`.
## Autenticacao
`POST /api/login` recebe `email` e `password` e devolve `token` e `user`.
Os tokens Sanctum expiram apos 20 minutos. Use estes cabecalhos nos pedidos:
```http
Authorization: Bearer <token>
Accept: application/json
Content-Type: application/json
```
`POST /api/refresh` prolonga um token ainda valido por 20 minutos.
`POST /api/logout` revoga o token atual. A recuperacao de senha revoga todos
os tokens do utilizador. Contas com `can_login=false` nao podem autenticar-se
nem usar tokens existentes. O login web usa o mesmo servico, regenera a sessao
e valida/renova o token localmente em cada pedido autenticado.
Login e verificacao de PIN permitem 10 tentativas por minuto; pedidos publicos
de recuperacao de senha e envio de email de teste permitem 5 por minuto.
## Endpoints
Todos os caminhos abaixo sao relativos a `/api`.
`CRUD /recurso` significa `GET /recurso`, `POST /recurso`,
`GET /recurso/{id}`, `PUT` ou `PATCH /recurso/{id}` e `DELETE /recurso/{id}`.
As rotas `/resources` aceitam `PUT`, nao `PATCH`.
| Operacao | Endpoint | Acesso |
| --- | --- | --- |
| Login | `POST /login` | Publico |
| Pedir recuperacao de senha | `POST /password/email` | Publico |
| Redefinir senha | `POST /password/reset` | Publico |
| Sair / renovar / verificar token | `POST /logout`, `POST /refresh`, `GET /check-token` | Autenticado |
| Utilizador atual e permissoes | `GET /me` | Autenticado |
| Dashboard | `GET /dashboard` | Autenticado |
| Analises | `GET /analytics` | Role `administracao` |
| Guardar / verificar PIN | `POST /user/pin`, `POST /user/check-pin` | Autenticado |
| Clientes | CRUD `/clients` | Autenticado |
| Opcoes de clientes | `GET /clients/options?type={client_type_id}` | Autenticado |
| Detalhe e contratos de cliente | `GET /clients/{id}/detail` | Autenticado |
| Pesquisa por nome | `GET /clients/search/name?term=...` | Autenticado |
| Pesquisa por ID | `POST /clients/search/id`, corpo `{"id":1}` | Autenticado |
| Leads | CRUD `/leads` | Autenticado |
| Estados de leads | `GET /leads/options` | Autenticado |
| Converter lead | `PUT /leads/{id}/convert` | Autenticado |
| Contratos | CRUD `/contracts` | Autenticado |
| Opcoes de contratos | `GET /contracts/options?client_id=...` | Autenticado |
| Dados de edicao | `GET /contracts/{id}/edit` | Autenticado |
| Opcoes / executar renovacao | `GET /contracts/{id}/renew`, `POST /contracts/{id}/renew` | Autenticado |
| Historico | `GET /contracts/{id}/history` | Autenticado |
| Ler / editar / eliminar historico | `GET`, `PUT`, `DELETE /contracts/{id}/history/{historyId}` | Autenticado |
| Eliminar contratos em lote | `DELETE /contracts/bulk`, corpo `{"ids":[1,2]}` | Autenticado |
| Exportar contratos | `GET /contracts/export` | Permissao `view_contract_summary` |
| Utilizadores | CRUD `/users` | Role `admin` |
| Roles para criar utilizador | `GET /users/options` | Role `admin` |
| Enviar recuperacao de senha a utilizador | `POST /users/{user}/password-reset` | Role `admin` |
| Roles e permissoes | `GET /admin/access/roles-permissions` | Role `admin` |
| Atualizar permissoes de role | `POST /admin/access/roles/{role}/permissions` | Role `admin` |
| Utilizadores e roles | `GET /admin/access/users` | Role `admin` |
| Atualizar roles de utilizador | `POST /admin/access/users/{user}/roles` | Role `admin` |
| Recursos auxiliares | CRUD `/resources/{resource}` | Permissao `manage_resources` |
| Informacao do sistema | `GET /admin/info` | Role `admin` |
| Diagnostico PHP (HTML) | `GET /admin/phpinfo` | Role `admin` |
| Executar migrations | `POST /admin/runMigrations` | Role `admin` |
| Email de teste | `POST /admin/testEmail`, corpo `{"email":"destino@example.com"}` | Role `admin` |
Recursos permitidos: `power_tiers`, `contract_types`, `payment_methods`,
`typologies`, `cui_tiers`, `suppliers`, `contract-statuses`.
Roles e permissoes sao enviadas como listas de nomes nos campos `roles` e
`permissions`. Os campos de negocio e datas seguem os FormRequests existentes,
incluindo o formato `d/m/Y` nos formularios de contratos. As operacoes de
senha recebem `email`; a redefinicao tambem recebe `token`, `password` e
`password_confirmation`.
## Respostas e compatibilidade
Criacao: `201`; operacao concluida: `200`; nao autenticado: `401`;
acesso negado: `403`; registo inexistente: `404`; validacao: `422`;
limite de tentativas: `429`. Erros de validacao incluem `message` e `errors`.
Os erros API sao JSON mesmo sem o cabecalho `Accept`.
Clientes mantem a listagem antiga `{"clients":[...]}` quando `per_page` nao e
enviado. Com `per_page`, devolvem um paginador em `clients`, com `data`,
`current_page`, `last_page`, `per_page`, `total` e links. Clientes e contratos
limitam `per_page` ao intervalo 1-100. A listagem paginada de clientes filtra
`type=client`, tal como a web; a listagem antiga conserva o comportamento
anterior de devolver os registos ativos. Filtros de nome, NIF, email, tipo e
codigo de contrato sao partilhados. Contratos incluem os totais da pagina atual.
IDs de clientes passam a ser incluidos nas respostas. Passwords, hashes de PIN
e remember tokens nao sao serializados. Dados financeiros e snapshots de
contratos sao omitidos das respostas de negocio sem `view_contract_summary`.
Atualizacoes sem essa permissao preservam os valores financeiros e parcelas.
Exportacoes exigem essa permissao, tambem na web.
As antigas operacoes administrativas `GET /admin/runMigrations` e
`GET /admin/testEmail` passam a `POST`, exigem a role `admin`, e o email de
destino passa a ser obrigatorio. Nenhuma migration foi executada durante esta
refatoracao. Estes endpoints devem ser restritos tambem ao nivel de rede em
producao, especialmente `phpinfo` e a execucao de migrations.
## Verificacao
Os testes unitarios de regras ficam em `tests/Unit`. Os testes HTTP da API ficam
em `tests/Api`, e os fluxos web destinados ao browser ficam em `tests/Browser`.
Ambos usam uma base SQLite em memoria, com o esquema oficial de permissoes do
Spatie e tabelas minimas; nao usam nem alteram a base de dados da aplicacao.
Os testes Browser verificam a resposta HTTP, vistas, CSRF, redirecionamentos e
sessoes Laravel; nao executam JavaScript num Chromium real.
```bash
APP_ENV=testing DB_CONNECTION=sqlite DB_DATABASE=:memory: CACHE_STORE=array SESSION_DRIVER=array \
vendor/bin/phpunit tests/Unit tests/Api tests/Browser
```
Cada grupo tambem pode ser executado isoladamente com `vendor/bin/phpunit
--testsuite API` ou `vendor/bin/phpunit --testsuite Browser`. O PHP CLI necessita
da extensao `pdo_sqlite`. Os testes Feature legados que dependem de dados
preexistentes nao estao incluidos no comando acima.