Skip to content

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

TipoConvençãoExemplo
GET (lista)get[Entidade]sServicegetContractsService
GET (único)get[Entidade]ByIdServicegetContractByIdService
POSTcreate[Entidade]ServicecreateContractService
PUTupdate[Entidade]ServiceupdateContractService
DELETEdelete[Entidade]ServicedeleteContractService

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 para useHttpErrors().handle, que exibe o toast a partir de resolveHttpErrorMessage (src/utils/http-error.ts).
  • resolveHttpErrorMessage traduz 429 para global.rateLimit.* usando o header Retry-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 usam useCountdown para a contagem regressiva que desabilita o botão.