diff --git a/README.md b/README.md index 8ff87eb..f418326 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Jedes Repository, das auf dieser Gitea-Instanz mit dem Topic-Tag `dashboard` ver ``` ┌─────────────────┐ Gitea REST API v1 ┌──────────────────────┐ │ Gitea Server │ ◄────────────────────────► │ Backend Service │ -│ (Repos + Topics)│ │ (Bun + Hono) │ +│ (Repos + Topics)│ │ (Go, net/http) │ └─────────────────┘ └──────────┬───────────┘ │ ┌──────────▼───────────┐ @@ -46,7 +46,7 @@ Jedes Repository, das auf dieser Gitea-Instanz mit dem Topic-Tag `dashboard` ver **Warum SvelteKit?** - Leichtgewichtig und schnell – ideal für ein internes Dashboard - Server-Side Rendering (SSR) out of the box – kein Flackern beim Laden -- Einfache Reaktivität ohne overhead +- Einfache Reaktivität ohne Overhead - Perfekt für datengetriebene Dashboards mit Echtzeit-Updates via SSE oder WebSocket **Features im Frontend:** @@ -58,21 +58,37 @@ Jedes Repository, das auf dieser Gitea-Instanz mit dem Topic-Tag `dashboard` ver --- -## ⚙️ Backend: **Bun + Hono** +## ⚙️ Backend: **Go (net/http + pgx)** -**Warum Bun + Hono?** -- Bun ist deutlich schneller als Node.js – geringere Latenz bei API-Polling -- Hono ist ein ultraleichtes Web-Framework, ideal für REST APIs -- Nativer TypeScript-Support ohne Konfigurationsaufwand -- Eingebauter Cron-Job-Support für regelmäßiges Gitea-Polling +Go eignet sich hervorragend als Backend-Sprache – die Standardbibliothek ist so vollständig, dass kein Web-Framework nötig ist. `net/http` liefert alles was gebraucht wird: Routing, Handler, Middleware. Das Ergebnis ist eine dependency-arme, gut lesbare Codebasis. + +**Warum kein Framework?** +- `net/http` aus der Standardbibliothek reicht für ~6 Endpoints vollständig aus +- Kein Framework-Overhead, keine Breaking Changes durch externe Dependencies +- Go-typischer Ansatz: explizit, simpel, lesbar +- Kompiliert zu einer einzigen statischen Binary – minimaler Docker-Footprint + +**Externe Dependencies (minimal):** +- `pgx` – PostgreSQL-Treiber (direktes SQL, kein ORM) +- `godotenv` – `.env`-Datei laden **Backend-Aufgaben:** - `GET /api/projects` – alle getaggten Repos aus der DB zurückgeben - `POST /api/webhook` – Gitea Webhook-Listener für Push, Issue, Tag-Events -- `GET /api/projects/:id/issues` – Issues eines Repos live aus Gitea holen -- Hintergrund-Job: alle 5 Minuten Gitea API nach Repos mit Tag `dashboard` abfragen +- `GET /api/projects/{id}/issues` – Issues eines Repos live aus Gitea holen +- Hintergrund-Goroutine: alle 5 Minuten Gitea API nach Repos mit Tag `dashboard` abfragen - Repo-Daten in PostgreSQL cachen (inkl. Topics, letzter Aktivität, Issue-Count) +**Beispiel – HTTP-Server ohne Framework:** +```go +mux := http.NewServeMux() +mux.HandleFunc("GET /api/projects", h.listProjects) +mux.HandleFunc("POST /api/webhook", h.handleWebhook) +mux.HandleFunc("GET /api/projects/{id}/issues", h.listIssues) + +log.Fatal(http.ListenAndServe(":8080", mux)) +``` + --- ## 🗄️ Datenbank: **PostgreSQL** @@ -132,13 +148,13 @@ CREATE TABLE webhook_events ( ## 🔧 Tech Stack -| Schicht | Technologie | -|------------|--------------------------| -| Frontend | SvelteKit + TailwindCSS | -| Backend | Bun + Hono (TypeScript) | -| Datenbank | PostgreSQL + Drizzle ORM | -| API | Gitea REST API v1 | -| Deployment | Docker Compose | +| Schicht | Technologie | +|------------|------------------------------| +| Frontend | SvelteKit + TailwindCSS | +| Backend | Go + net/http (Standardlib) | +| Datenbank | PostgreSQL + pgx | +| API | Gitea REST API v1 | +| Deployment | Docker Compose | ---