40 lines
2.6 KiB
Markdown
40 lines
2.6 KiB
Markdown
# Disponibilidade das demos de projetos
|
|
|
|
A homepage seleciona projetos pelo campo `featured` de `public/portfolio-data.json`. O snapshot de health nunca decide se um card existe; ele serve somente para apresentar o estado do CTA da demo.
|
|
|
|
## Estados
|
|
|
|
`lib/project-health.ts` deriva quatro estados:
|
|
|
|
| Estado | Condição | Comportamento do CTA |
|
|
| --- | --- | --- |
|
|
| `available` | A demo tem URL e a última resposta conhecida foi `200` com `Content-Type: text/html`. | Exibe “Abrir projeto”. |
|
|
| `unavailable` | A demo tem URL e a última resposta conhecida foi conclusiva, mas não atende ao contrato `200` + HTML. | Exibe “Demo indisponível na última verificação” sem link. |
|
|
| `unknown` | A demo tem URL, mas não existe observação ou a tentativa terminou em erro/status nulo. | Mantém “Abrir projeto” com aviso acessível de disponibilidade não verificada. |
|
|
| `none` | O projeto não tem `demoUrl`. | Não exibe CTA de demo. |
|
|
|
|
Links de código e os demais dados do card independem desses estados.
|
|
|
|
## Leitura durante a renderização
|
|
|
|
`loadFeaturedProjects()` lê `data/project-health.json` quando a homepage é renderizada.
|
|
|
|
- **Produção:** usa a última observação disponível, mesmo antiga. Não faz fetch externo durante render e continua exibindo todos os projetos `featured` se o arquivo estiver ausente ou inválido.
|
|
- **Desenvolvimento:** usa imediatamente um snapshot com até 15 minutos. Se o snapshot estiver ausente ou antigo, consulta as demos em memória. Uma falha conserva a última observação conclusiva daquele projeto quando ela existe; caso contrário, o estado fica `unknown`. Esse refresh não grava o arquivo.
|
|
|
|
## Atualização manual opcional
|
|
|
|
Para atualizar a observação versionada:
|
|
|
|
```bash
|
|
pnpm check:projects
|
|
```
|
|
|
|
`scripts/check-projects.mjs` lê as demos de `public/portfolio-data.json`, segue redirecionamentos, aplica timeout de 10 segundos e registra status, content type, URL final, latência, horário e eventual erro. A escrita é atômica: o processo grava `data/project-health.json.<pid>.tmp` e só então renomeia o arquivo para `data/project-health.json`.
|
|
|
|
O comando consulta serviços externos e altera `data/project-health.json`; execute-o apenas quando uma nova observação deva ser revisada e versionada.
|
|
|
|
## Papel do snapshot
|
|
|
|
`data/project-health.json` é a última observação conhecida, não um gate de build, deploy ou conteúdo. Ele pode estar antigo, ausente ou conter falhas sem esconder os cards selecionados. Nenhum cron é necessário para a aplicação funcionar; uma automação externa pode executar a atualização manual, mas não faz parte deste repositório nem da renderização de produção.
|