## Galeria-ALPR Server

### Configuração

1. Copie `.env.example` para `.env` e ajuste (mantemos SQLite local por padrão; se quiser Postgres, edite `prisma/schema.prisma` e troque `provider = "sqlite"` para `postgresql`, além de ajustar `DATABASE_URL`).
2. Instale dependências `npm install`.
3. Sincronize o schema local: `npx prisma db push`.
4. (Opcional) Preencha `GALERIA_PUBLIC_DNS` no `.env` para que os instaladores/clientes saibam qual domínio usar fora da rede local.

### CORS e hosts permitidos

Você pode controlar quais origens (domínios ou IPs) têm permissão para acessar a API usando o textarea **Hosts/IPs permitidos (CORS)** em **Configurações > Configurações avançadas** do painel admin. O backend armazena essa lista em `InstallerSetting.allowedOrigins` como texto e atualiza o middleware CORS automaticamente. Quando puxar esta branch em produção, rode:

```bash
npx prisma migrate dev --name allow-origins-text
npx prisma generate
```

para criar o novo campo textual sem perder os dados existentes.

### Scripts úteis

| Script | Descrição |
| --- | --- |
| `npm run dev` | Inicia API com reload via `tsx`. |
| `npm run build` + `npm start` | Compila para `dist/` e executa. |
| `npm run test` | Roda testes Vitest (endpoints activate/update). |
| `npm run prisma:*` | Comandos Prisma (migrate, generate, studio). |

### Gestão de atualizações

- Publicações feitas pelo painel ficam guardadas em `updates/backups`. O endpoint `POST /api/update/activate` permite promover qualquer build anterior (por canal) sem reenviar o ZIP: basta informar `versionId` e o backend reprovisiona `updates/current` a partir do arquivo guardado.
- A página de Instalação usa `/api/installer/releases/:id/download` (autenticado) para expor todos os arquivos históricos. Mesmo versões inativas permanecem disponíveis porque o arquivo original é mantido na pasta de backups.
- O instalador reusa os arquivos `.zip` de `updates/backups` quando tenta aplicar builds do canal beta que já foram rotacionados, evitando o `404` que ocorria nos 10% durante a atualização.

### Exemplos cURL

```bash
# Login admin
curl -X POST http://localhost:5188/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{ "email": "admin@galleria.local", "password": "admin" }'

# Criar licença (substitua TOKEN pelo JWT retornado no login)
curl -X POST http://localhost:5188/api/license/register \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "email": "cliente@galeria.art", "level": "premium", "type": "annual" }'

# Validar update disponível
curl "http://localhost:5188/api/update/check?version=1.0.0&channel=stable&key=LICENSE_KEY"
```
