feat(feedback): separater Gitea-Bot-Account fuer Feedback-Issues

Bisher wurden Issues aus dem Feedback-Widget unter Tobias' Identitaet
angelegt (GITEA_TOKEN ist sein persoenlicher Token). Folge: echte
Tobias-Issues und User-Feedback waren in der Authoren-Spalte nicht
mehr unterscheidbar.

Neuer Gitea-Account 'gwoe-feedback' (Display: Gast-Feedback) bekommt
seinen eigenen Token mit Scope write:issue+write:repository, ist
Collaborator mit write-Perm auf das Repo. Code nimmt diesen Token
bevorzugt; wenn er leer ist, faellt er auf gitea_token zurueck
(Rueckwaerts-Kompat fuer noch-nicht-konfigurierte Umgebungen).

ENV: GITEA_FEEDBACK_TOKEN — in beide Compose-Files reingereicht,
in beide .env-Files eingetragen.
This commit is contained in:
Dotty Dotter 2026-05-10 22:14:41 +02:00
parent 468d7d508f
commit 238f99023c
4 changed files with 21 additions and 4 deletions

View File

@ -54,10 +54,18 @@ class Settings(BaseSettings):
# Token für Unsubscribe-Links (HMAC-Secret)
unsubscribe_secret: str = "change-me-in-prod"
# Gitea-API-Token für Feedback-Issues (Issue #feedback-widget)
# Gitea-API-Token (Tobias' persoenlicher Token) — fuer alle internen
# Operationen ausser User-Feedback (siehe gitea_feedback_token).
# Wert in .env: GITEA_TOKEN=<token>
# Token-Quelle: cat ~/.claude/.gitea-token
gitea_token: str = ""
# Separater Token fuer das Feedback-Widget. Authentisiert sich als
# eigener Account (z.B. `gwoe-feedback`), damit User-Feedback-Issues
# nicht unter Tobias' Identitaet erscheinen — saubere Trennung
# zwischen Owner und externen Eingaben.
# Wert in .env: GITEA_FEEDBACK_TOKEN=<token>
# Fallback: wenn leer, wird gitea_token verwendet (Rueckwaerts-Kompat).
gitea_feedback_token: str = ""
gitea_api_url: str = "https://repo.toppyr.de/api/v1"
gitea_repo_owner: str = "tobias"
gitea_repo_name: str = "gwoe-antragspruefer"

View File

@ -4336,8 +4336,13 @@ async def submit_feedback(
issue_body = "\n".join(body_parts)
if not settings.gitea_token:
logger.warning("GITEA_TOKEN nicht gesetzt — Feedback-Issue kann nicht angelegt werden")
# Bevorzugt den Feedback-Bot-Token (Account gwoe-feedback), faellt
# auf Tobias' persoenlichen Token nur zurueck, wenn der Bot-Token
# leer ist (Migrations-Phase). Damit erscheinen Feedback-Issues unter
# einer eigenen Identitaet, statt unter Tobias' Namen.
token = settings.gitea_feedback_token or settings.gitea_token
if not token:
logger.warning("GITEA_FEEDBACK_TOKEN/GITEA_TOKEN nicht gesetzt — Feedback-Issue kann nicht angelegt werden")
raise HTTPException(
status_code=503,
detail="Feedback-Funktion ist derzeit nicht konfiguriert (kein Gitea-Token)."
@ -4346,7 +4351,6 @@ async def submit_feedback(
base_url = settings.gitea_api_url
owner = settings.gitea_repo_owner
repo = settings.gitea_repo_name
token = settings.gitea_token
headers = {"Authorization": f"token {token}", "Content-Type": "application/json"}
async with httpx.AsyncClient(timeout=15.0) as session:

View File

@ -21,6 +21,7 @@ services:
- EMBEDDING_MODEL_READ=${EMBEDDING_MODEL_READ:-text-embedding-v3}
- BASE_URL=${BASE_URL:-https://gwoe-dev.toppyr.de}
- GITEA_TOKEN=${GITEA_TOKEN}
- GITEA_FEEDBACK_TOKEN=${GITEA_FEEDBACK_TOKEN}
- GITEA_API_URL=${GITEA_API_URL:-https://repo.toppyr.de/api/v1}
- GITEA_REPO_OWNER=${GITEA_REPO_OWNER:-tobias}
- GITEA_REPO_NAME=${GITEA_REPO_NAME:-gwoe-antragspruefer}

View File

@ -24,7 +24,11 @@ services:
- UNSUBSCRIBE_SECRET=${UNSUBSCRIBE_SECRET}
- BASE_URL=${BASE_URL:-https://gwoe.toppyr.de}
# Gitea-Anbindung fuer Feedback-Widget (#149-Folge)
# GITEA_TOKEN: Tobias' Token fuer interne Ops (Issue-Aggregat etc.)
# GITEA_FEEDBACK_TOKEN: separater Token vom Bot-Account 'gwoe-feedback',
# damit User-Feedback-Issues nicht als Tobias erscheinen.
- GITEA_TOKEN=${GITEA_TOKEN}
- GITEA_FEEDBACK_TOKEN=${GITEA_FEEDBACK_TOKEN}
- GITEA_API_URL=${GITEA_API_URL:-https://repo.toppyr.de/api/v1}
- GITEA_REPO_OWNER=${GITEA_REPO_OWNER:-tobias}
- GITEA_REPO_NAME=${GITEA_REPO_NAME:-gwoe-antragspruefer}