# Relatos de problemas

> Como uma automação lista os relatórios de problemas abertos enviados de páginas TradeCatalog conectadas.

Funcionários de fornecedores autenticados e compradores podem enviar um bug ou um comentário de qualquer página do aplicativo. Cada relato é armazenado com o status aberto e enviado por e-mail para Happy Webs.

Esta página é para a automação que coleta esses relatos. Não é uma chave de workspace API, e não está no documento OpenAPI.

## Autenticar

A solicitação usa um token de portador. O token é o segredo do Worker `FEEDBACK_REPORTS_TOKEN`.

Defina-o uma vez, fora do git:

```bash
wrangler secret put FEEDBACK_REPORTS_TOKEN
```

Para desenvolvimento local, coloque o mesmo nome em `.dev.vars`. Não comite o valor.

Envie-o em cada solicitação:

```http
GET /api/feedback-reports?since=2026-10-15T00:00:00.000Z HTTP/1.1
Host: tradecatalog.app
Authorization: Bearer <FEEDBACK_REPORTS_TOKEN>
```

```bash
curl "https://tradecatalog.app/api/feedback-reports?since=2026-10-15T00:00:00.000Z" \
  -H "Authorization: Bearer $FEEDBACK_REPORTS_TOKEN"
```

Se o segredo estiver ausente, ou o cabeçalho estiver ausente ou incorreto, a resposta será `401` com `WWW-Authenticate: Bearer realm="feedback-reports"`. Não há cookie, nenhuma chave de API de workspace e nenhuma CORS.

**GET** `/api/feedback-reports`

## Listar relatos abertos

`since` é necessário. É uma data no formato ISO-8601 ou um tempo Unix em milissegundos. A lista é relatos abertos criados **após** esse tempo, do mais antigo para o mais recente, até 100.

| Nome    | Tipo   | Obrigatório | Descrição                                                                                                                                             |
| ------- | ------ | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `since` | string | sim         | Limite inferior exclusivo em `createdAt`.                                                                                                             |
| `after` | string | não         | ID do relato. Com `since`, também retorna relatos que compartilham esse tempo exato e ordena após esse ID. Use ambos quando `hasMore` for verdadeiro. |

Um relato que foi fechado não está nessa lista, mesmo que tenha sido criado após `since`.

```json
{
  "reports": [
    {
      "id": "…",
      "kind": "bug",
      "status": "open",
      "message": "The price shows as zero.",
      "pageUrl": "https://tradecatalog.app/s/northgate/products",
      "tenantSlug": "northgate",
      "userId": "…",
      "role": "Owner",
      "email": "owner@example.com",
      "userAgent": "…",
      "viewport": "1440x900",
      "createdAt": "2026-10-15T12:00:00.000Z",
      "hasScreenshot": true,
      "screenshotUrl": "https://tradecatalog.app/api/feedback-reports/…/screenshot",
      "autoReplyText": null,
      "autoReplySentAt": null,
      "resolvedReplyText": null,
      "resolvedReplySentAt": null,
      "adminUrl": "https://tradecatalog.app/admin?section=reports&report=…"
    }
  ],
  "hasMore": false
}
```

Armazene o `createdAt` e `id` do último relato que você salvou. A próxima verificação usa esse tempo como `since`. Se a página estiver cheia (`hasMore` for verdadeiro), também passe esse ID como `after` e mantenha o mesmo `since`, para que um relato salvo no mesmo milissegundo não seja pulado.

## Captura de tela

**GET** `/api/feedback-reports/{id}/screenshot`

O mesmo token de portador. A resposta é a imagem, ou `404` quando esse relato não tem captura de tela. O ID é o ID do relato da lista. Não é uma chave de objeto.

Os administradores da plataforma também podem abrir a captura de tela enquanto estão conectados em `/admin/feedback-reports/{id}` e resolver um relatório em **Suporte → Relatórios**.

## Resposta automática

Salvar um relatório envia uma nota curta para a pessoa conectada no seu endereço próprio. Resolver o relatório envia novamente, para informar que foi corrigido e está ativo. Cada um desses é enviado no máximo uma vez por relatório.

`autoReplyText` e `autoReplySentAt` são essa primeira nota. `resolvedReplyText` e `resolvedReplySentAt` são a nota resolvida. Eles permanecem nulos até que o e-mail tenha sido enviado.

Defina a variável Worker `FEEDBACK_AUTO_REPLY` como `off` para parar ambos. `AUTO_REPLY_BCC` é um segredo: o endereço copiado nos e-mails. Deixe-o não definido e nada será copiado. A redação é feita com o AI do Worker. Se esse rascunho falhar em uma verificação, um aviso fixo será enviado em vez disso.

Cada relatório também se torna um ticket numerado. Resolver esse ticket envia o mesmo e-mail fixo e ativo uma vez. E-mails para support@ ou info@tradecatalog.app são encaminhados para `SUPPORT_FORWARD_TO` antes de serem lidos, depois arquivados da mesma forma. Se esse endereço estiver ausente, ou o encaminhamento falhar, a mensagem será rejeitada para que o remetente possa tentar novamente. Ela é anexada a uma conta existente somente quando `Authentication-Results` mostra um passo DMARC, ou ambos DKIM e SPF quando o DMARC estiver ausente. Caso contrário, o ticket permanece sem ligação e nenhuma confirmação é enviada.
