From 238f99023cac674d8a998272ec7ee97996ebf3ff Mon Sep 17 00:00:00 2001 From: Dotty Dotter Date: Sun, 10 May 2026 22:14:41 +0200 Subject: [PATCH] feat(feedback): separater Gitea-Bot-Account fuer Feedback-Issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- app/config.py | 10 +++++++++- app/main.py | 10 +++++++--- docker-compose.dev.yml | 1 + docker-compose.yml | 4 ++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/config.py b/app/config.py index 7dc4078..a98a510 100644 --- a/app/config.py +++ b/app/config.py @@ -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-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= + # 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" diff --git a/app/main.py b/app/main.py index 93d6970..4a33748 100644 --- a/app/main.py +++ b/app/main.py @@ -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: diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 290c7b1..56f5639 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -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} diff --git a/docker-compose.yml b/docker-compose.yml index 93423a8..e0e6ebb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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}