# Segnalazioni di problemi

> Come un'automazione elenca i rapporti aperti inviati da pagine TradeCatalog con accesso.

I dipendenti dei fornitori e gli acquirenti autenticati possono inviare un bug o un commento da qualsiasi pagina nell'app. Ogni rapporto è archiviato con stato aperto e inviato via email a Happy Webs.

Questa pagina è per l'automazione che raccoglie questi rapporti. Non è una chiave API dello spazio di lavoro, né è inclusa nel documento OpenAPI.

## Autenticazione

La richiesta utilizza un token Bearer. Il token è il segreto Worker `FEEDBACK_REPORTS_TOKEN`.

Impostalo una volta, fuori da git:

```bash
wrangler secret put FEEDBACK_REPORTS_TOKEN
```

Per lo sviluppo locale, inserisci lo stesso nome in `.dev.vars`. Non committare il valore.

Inviatolo su ogni richiesta:

```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 il segreto è assente, o l'intestazione è assente o errata, la risposta è `401` con `WWW-Authenticate: Bearer realm="feedback-reports"`. Non esiste alcun cookie, alcuna chiave API dello spazio di lavoro e nessun CORS.

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

## Elenco dei rapporti aperti

`since` è richiesto. È un orario ISO-8601 o un orario Unix in millisecondi. L'elenco è i rapporti aperti creati **dopo** quel tempo, dal più vecchio al più recente, fino a 100.

| Nome    | Tipo    | Obbligatorio | Descrizione                                                                                                                                                    |
| ------- | ------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `since` | stringa | sì           | Limite inferiore esclusivo su `createdAt`.                                                                                                                     |
| `after` | stringa | no           | ID del rapporto. Con `since`, restituisce anche i rapporti che condividono quel tempo esatto e vengono dopo questo ID. Usali entrambi quando `hasMore` è vero. |

Un rapporto chiuso non è incluso in questa lista, anche se è stato creato dopo `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
}
```

Memorizza `createdAt` e `id` dell'ultimo rapporto che hai conservato. La prossima richiesta utilizza quel tempo come `since`. Se la pagina era piena (`hasMore` è vero), passa anche quell'ID come `after` e mantieni lo stesso `since`, in modo che un rapporto salvato nello stesso millisecondo non venga saltato.

## Schermata

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

Lo stesso token Bearer. La risposta è l'immagine, o `404` quando quel rapporto non ha uno screenshot. L'ID è l'ID del rapporto dall'elenco. Non è una chiave dell'oggetto.

Gli amministratori della piattaforma possono aprire la schermata mentre sono connessi su `/admin/feedback-reports/{id}` e risolvere un rapporto su **Supporto → Report**.

## Risposta automatica

Salvare un rapporto invia un breve messaggio all'indirizzo email della persona connessa. Risolverlo invia un altro messaggio per indicare che è stato risolto e reso disponibile. Ogni invio avviene al massimo una volta per rapporto.

`autoReplyText` e `autoReplySentAt` sono quel primo messaggio. `resolvedReplyText` e `resolvedReplySentAt` sono il messaggio risolto. Rimangono nulli fino a quando l'email non è stata inviata.

Impostare la variabile Worker `FEEDBACK_AUTO_REPLY` su `off` per fermarli entrambi. `AUTO_REPLY_BCC` è un segreto: l'indirizzo copiato su quelle email. Lasciarlo non impostato significa che nulla viene copiato. Il testo è stato redatto con Workers AI. Se quel bozzo non supera un controllo, viene inviato un messaggio fisso al posto suo.

Ogni rapporto diventa anche un ticket numerato. Risolvere quel ticket invia la stessa email fissa e disponibile una volta. La posta a support@ o info@tradecatalog.app viene inoltrata a `SUPPORT_FORWARD_TO` prima di essere letta, quindi archiviata nello stesso modo. Se quell'indirizzo è assente o l'inoltro fallisce, il messaggio viene rifiutato in modo che l'inviatore possa riprovare. Viene collegato a un account esistente solo quando `Authentication-Results` mostra un passaggio DMARC, o entrambi DKIM e SPF quando DMARC è assente. Altrimenti, il ticket rimane non collegato e non viene inviata alcuna conferma.
