# Problemmeldungen

> Wie eine Automatisierung offene Problemberichte anzeigt, die von angemeldeten TradeCatalog-Seiten gesendet wurden.

Angemeldetes Lieferantenteam und Käufer können einen Fehler oder eine Rückmeldung von jeder Seite in der App senden. Jede Meldung wird mit dem Status „Offen“ gespeichert und an Happy Webs per E-Mail gesendet.

Diese Seite ist für die Automatisierung, die diese Meldungen abgreift. Es ist kein Workspace-API-Schlüssel und nicht in der OpenAPI-Dokumentation.

## Authentifizieren

Die Anfrage verwendet ein Bearer-Token. Das Token ist der Worker-Geheimnis `FEEDBACK_REPORTS_TOKEN`.

Setzen Sie es einmal außerhalb von Git:

```bash
wrangler secret put FEEDBACK_REPORTS_TOKEN
```

Für die lokale Entwicklung geben Sie denselben Namen in `.dev.vars` ein. Committen Sie den Wert nicht.

Senden Sie es mit jeder Anfrage:

```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"
```

Wenn der Geheimnis fehlt, oder der Header fehlt oder falsch ist, ist die Antwort `401` mit `WWW-Authenticate: Bearer realm="feedback-reports"`. Es gibt kein Cookie, keinen Workspace-API-Schlüssel und keine CORS.

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

## Offene Meldungen auflisten

`since` ist erforderlich. Es ist ein ISO-8601-Format oder eine Unix-Zeit in Millisekunden. Die Liste enthält offene Meldungen, die **nach** diesem Zeitpunkt erstellt wurden, ältesten zuerst, bis zu 100.

| Name    | Typ    | Erforderlich | Beschreibung                                                                                                                                  |
| ------- | ------ | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `since` | string | ja           | Exklusives unteres Limit für `createdAt`.                                                                                                     |
| `after` | string | nein         | Bericht-ID. Mit `since` gibt es auch Berichte, die diese exakte Zeit und nach dieser ID sortieren. Nutzen Sie beide, wenn `hasMore` wahr ist. |

Ein Bericht, der geschlossen wurde, ist in dieser Liste nicht enthalten, auch wenn er nach `since` erstellt wurde.

```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
}
```

Speichern Sie die `createdAt` und `id` des letzten Berichts, den Sie behalten haben. Die nächste Abfrage verwendet diese Zeit als `since`. Wenn die Seite voll war (`hasMore` ist wahr), geben Sie auch diese ID als `after` weiter und behalten Sie denselben `since`, damit ein Bericht, der in derselben Millisekunde gespeichert wurde, nicht übersprungen wird.

## Screenshot

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

Das gleiche Bearer-Token. Die Antwort ist das Bild oder `404`, wenn dieser Bericht keinen Screenshot hat. Die ID ist die Bericht-ID aus der Liste. Es ist kein Objektschlüssel.

Plattform-Administratoren können auch ein Screenshot öffnen, während sie bei `/admin/feedback-reports/{id}` angemeldet sind, und einen Bericht unter **Support → Berichte** beheben.

## Automatische Antwort

Das Speichern eines Berichts sendet der angemeldeten Person eine kurze Nachricht an ihre eigene Adresse. Das Beheben sendet eine weitere Nachricht, um zu sagen, dass es behoben und live ist. Jede dieser Nachrichten wird maximal einmal pro Bericht gesendet.

`autoReplyText` und `autoReplySentAt` sind diese erste Nachricht. `resolvedReplyText` und `resolvedReplySentAt` sind die behebte Nachricht. Sie bleiben bis zur Versendung der E-Mail auf null.

Setzen Sie die Worker-Variable `FEEDBACK_AUTO_REPLY` auf `off`, um beide zu deaktivieren. `AUTO_REPLY_BCC` ist ein Geheimnis: die Adresse, die in diesen E-Mails kopiert wird. Lassen Sie sie ungesetzt, und nichts wird kopiert. Der Text wurde mit Workers AI verfasst. Wenn dieser Entwurf eine Prüfung nicht besteht, wird stattdessen eine feste Nachricht gesendet.

Jeder Bericht wird auch zu einer nummerierten Ticket. Das Beheben dieses Tickets sendet die gleiche feste und live E-Mail einmal. E-Mails an support@ oder info@tradecatalog.app werden vor der Lektüre an `SUPPORT_FORWARD_TO` weitergeleitet, dann auf die gleiche Weise archiviert. Wenn diese Adresse fehlt oder die Weiterleitung fehlschlägt, wird die Nachricht abgelehnt, damit der Absender es erneut versuchen kann. Sie wird nur an ein vorhandenes Konto angehängt, wenn `Authentication-Results` einen DMARC-Test besteht oder beide DKIM und SPF, wenn DMARC fehlt. Andernfalls bleibt das Ticket unverknüpft und es wird keine Bestätigung gesendet.
