Appearance
Services - Camada de Serviços (API)
Configuração do Axios
typescript
// src/config/api.ts
const instance = axios.create({
baseURL: import.meta.env.VITE_API_URL
})
export { instance }Padrão de Service
typescript
// src/modules/contracts/services/contracts.ts
export const getContractsService = (params?: Partial<FilterContract>) =>
instance.get<Contract[]>('contracts', { params })
export const createContractService = (data: CreateContract) =>
instance.post<Contract>('contracts', data)Padrão de Service com Filtros
typescript
import { instance } from '@/config/api'
import type { Item, ItemFilter } from '@/domain/item'
type ItemsResponse = {
data: Item[]
total: number
}
export const getItemsService = (params?: Partial<ItemFilter>) =>
instance.get<ItemsResponse>('items', { params })Nomenclatura
| Tipo | Convenção | Exemplo |
|---|---|---|
| GET (lista) | get[Entidade]sService | getContractsService |
| GET (único) | get[Entidade]ByIdService | getContractByIdService |
| POST | create[Entidade]Service | createContractService |
| PUT | update[Entidade]Service | updateContractService |
| DELETE | delete[Entidade]Service | deleteContractService |
Organização
- Cada módulo tem seus services em
src/modules/[modulo]/services/ - Services devem ser funções puras que retornam Promises
- Não incluir lógica de negócio nos services
Tratamento de erro HTTP
- O interceptor de resposta (
src/config/api.ts) delega parauseHttpErrors().handle, que exibe o toast a partir deresolveHttpErrorMessage(src/utils/http-error.ts). resolveHttpErrorMessagetraduz429paraglobal.rateLimit.*usando o headerRetry-After(fallback de 60s) e, nos demais status, devolve a mensagem do backend.- Fluxos que precisam reagir ao bloqueio (ex.: login) marcam a request com
_silent: true, tratam o erro no hook e usamuseCountdownpara a contagem regressiva que desabilita o botão.