feat: shared feedback FastAPI router — extract common feedback endpoint from kiwi/snipe/peregrine #23

Closed
opened 2026-04-04 17:38:57 -07:00 by pyr0ball · 0 comments
Owner

Summary

Kiwi, Snipe, and Peregrine all independently implemented the same feedback endpoint pattern:

  • GET /feedback/status{"enabled": bool} based on FORGEJO_API_TOKEN presence
  • POST /feedback/submit → creates a Forgejo issue

Extract to circuitforge_core.api.feedback as a reusable FastAPI APIRouter that products include in one line.

Module

# circuitforge_core/api/feedback.py
from fastapi import APIRouter

def make_feedback_router(repo: str, product: str) -> APIRouter:
    """Return a configured feedback router for the given Forgejo repo and product name."""
    ...

Product usage (one line)

from circuitforge_core.api.feedback import make_feedback_router
app.include_router(make_feedback_router(repo="Circuit-Forge/kiwi", product="kiwi"))

After landing

Remove the hand-rolled feedback endpoints from kiwi, snipe, and peregrine and replace with make_feedback_router().

  • kiwi#14 (feedback button — merged)
  • snipe#18 (feedback FAB — merged)
  • Peregrine feedback route
## Summary Kiwi, Snipe, and Peregrine all independently implemented the same feedback endpoint pattern: - `GET /feedback/status` → `{"enabled": bool}` based on `FORGEJO_API_TOKEN` presence - `POST /feedback/submit` → creates a Forgejo issue Extract to `circuitforge_core.api.feedback` as a reusable FastAPI `APIRouter` that products include in one line. ## Module ```python # circuitforge_core/api/feedback.py from fastapi import APIRouter def make_feedback_router(repo: str, product: str) -> APIRouter: """Return a configured feedback router for the given Forgejo repo and product name.""" ... ``` ## Product usage (one line) ```python from circuitforge_core.api.feedback import make_feedback_router app.include_router(make_feedback_router(repo="Circuit-Forge/kiwi", product="kiwi")) ``` ## After landing Remove the hand-rolled feedback endpoints from kiwi, snipe, and peregrine and replace with `make_feedback_router()`. ## Related - kiwi#14 (feedback button — merged) - snipe#18 (feedback FAB — merged) - Peregrine feedback route
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/circuitforge-core#23
No description provided.