> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nextmed.med.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Arquitetura

> Organizacao do codigo, fluxos de dados e integracoes.

## Arquitetura

## Camadas do projeto

* `src/app`: App Router do Next.js, com layouts, paginas e route handlers em `src/app/api`.
* `src/components`: componentes de produto compartilhados, incluindo chat, referrals, navbar, video call e dialogs.
* `src/lib`: hooks, providers, stores, queries de backend, IA, Firebase e utilitarios de dominio.
* `src/package`: pacote interno com HTTP client, themes, helpers, Firebase, modelos e componentes base.
* `src/@core`: camada de casos de uso, entidades/gateways e adaptadores para alguns fluxos de instituicao, unidade e autenticacao.
* `public`: assets, manifest, service worker publico e imagens.

## Fluxo HTTP

O cliente HTTP principal esta em `src/package/http/http.ts`.

* `baseURL`: `NEXT_PUBLIC_GATEWAY_HOST_WEB`.
* Header padrao: `app-name: nextmed-web`.
* Autenticacao: `Authorization: Bearer <token>`, recuperado dos cookies pelo helper `auth-token-handler`.
* Em `401` ou `500` com `errorCode: TOKEN_EXPIRED`, a aplicacao remove tokens, redireciona para `/` e mostra toast de sessao expirada.
* Erros `4xx` e `5xx` sao enviados ao Sentry, exceto `401` e `403` no grupo de client errors.

## Cookies de autenticacao

Os cookies seguem o prefixo do ambiente:

```ts theme={"system"}
{
  TOKEN: `${NODE_ENV}@nextauth.token`,
  USER_ID: `${NODE_ENV}@nextauth.userid`,
  REFRESH_TOKEN: `${NODE_ENV}@nextauth.refreshToken`
}
```

## Padrao BFF

Alguns endpoints em `src/app/api` funcionam como BFF:

* escondem tokens de Dyte e OpenAI no servidor.
* fazem proxy ou composicao com o gateway NextMed.
* leem cookies de sessao no servidor.
* retornam contratos simplificados para o frontend.

## PWA

O PWA e configurado no `next.config.js` com Serwist:

* `swSrc`: `src/lib/sw.ts`.
* `swDest`: `public/sw.js`.
* cache em navegacao frontend habilitado.
* reload automatico quando volta online.
* desabilitado em `NODE_ENV=development`.
* tamanho maximo de arquivo em cache: 5 MB.

## Observabilidade

* Sentry configurado para o projeto `web-nextmed-pwa`.
* PostHog em provider dedicado.
* Google Analytics com `NEXT_PUBLIC_GA_TRACKING_ID`, default `G-T7JQ0S30PX`.

## Pontos de atencao

* Alguns arquivos usam `OPEN_API_KEY` para OpenAI, enquanto o schema de ambiente declara `OPENAI_API_KEY`. O endpoint `POST /api/anamnesis-chat/evaluate` aceita ambos, mas os demais endpoints de IA usam principalmente `OPEN_API_KEY`.
* `POST /api/dyte/webhook` chama diretamente `https://api-dev.nextmed.med.br`, em vez de usar `GATEWAY_HOST_WEB`.
* `src/lib/queries/referrals/get-referral-details.ts` monta objetos usando `res.data` dentro de `res.data.referrals.map`, o que parece suspeito para mapeamento por item.
