fix(#11): Projektbasierte Organisation mit Einstellungen, Berechtigungen, Workflows und Reviews #54

Merged
Basti merged 16 commits from fix/11-projektbasierte-organisation into main 2026-03-30 21:34:44 +00:00
Owner

Bezieht sich auf #11

Änderungen

Phase 1: Backend Models + Migration

  • 5 neue Models: Project, ProjectSettings, ProjectMember, WorkflowConfig, ReviewConfig
  • project_id FK (nullable) auf Ticket, Repo, AppSignalApp
  • Alembic Migration

Phase 2: API + Service-Integration

  • CRUD-Router /api/projects mit Settings, Members, Workflow, Review
  • ?project=slug Filter auf bestehende Endpoints
  • EffectiveSettings-Resolver (Fallback auf global)
  • ScoringEngine: Schwellwerte aus Projekt
  • ReviewAgent: Strenge + Custom-Kriterien
  • Pipeline: max_review_rounds aus Projekt

Phase 3: Frontend

  • ProjectList.tsx: Kachel-Übersicht
  • ProjectDetail.tsx: 4-Tab-Ansicht
  • 15 neue API-Funktionen + Interfaces
  • Neue Routen + Navigation

Tests

  • 27 neue Tests (93 gesamt, alle grün)
  • TypeScript Check bestanden
Bezieht sich auf #11 ## Änderungen ### Phase 1: Backend Models + Migration - 5 neue Models: Project, ProjectSettings, ProjectMember, WorkflowConfig, ReviewConfig - project_id FK (nullable) auf Ticket, Repo, AppSignalApp - Alembic Migration ### Phase 2: API + Service-Integration - CRUD-Router `/api/projects` mit Settings, Members, Workflow, Review - `?project=slug` Filter auf bestehende Endpoints - EffectiveSettings-Resolver (Fallback auf global) - ScoringEngine: Schwellwerte aus Projekt - ReviewAgent: Strenge + Custom-Kriterien - Pipeline: max_review_rounds aus Projekt ### Phase 3: Frontend - ProjectList.tsx: Kachel-Übersicht - ProjectDetail.tsx: 4-Tab-Ansicht - 15 neue API-Funktionen + Interfaces - Neue Routen + Navigation ## Tests - 27 neue Tests (93 gesamt, alle grün) - TypeScript Check bestanden
Phase 1 - Backend Models + Migration:
- Project, ProjectSettings, ProjectMember, WorkflowConfig, ReviewConfig Models
- project_id FK (nullable) auf Ticket, Repo, AppSignalApp
- Alembic Migration für 5 neue Tabellen + 3 FK-Spalten

Phase 2 - API + Service-Integration:
- Vollständiger CRUD-Router /api/projects mit Settings, Members, Workflow, Review
- ?project=slug Filter auf Tickets, Repos, Stats Endpoints
- EffectiveSettings-Resolver (Projekt-Settings mit globalem Fallback)
- ScoringEngine: parameterisierte Schwellwerte aus Projekt-Config
- ReviewAgent: konfigurierbare Strenge und Custom-Kriterien pro Projekt
- Pipeline: max_review_rounds und Review-Config aus Projekt-Settings

Phase 3 - Frontend:
- ProjectList.tsx: Kachel-Übersicht mit Erstellen/Löschen
- ProjectDetail.tsx: 4-Tab-Ansicht (Settings, Members, Workflow, Review)
- client.ts: 15 neue API-Funktionen + Interfaces
- App.tsx: Neue Routen und Navigation

Tests: 27 neue Tests (93 gesamt, alle grün)
Type-Imports mit 'import type' separiert, unbenutzte Imports entfernt.
- ProjectContext: React Context + localStorage für ausgewähltes Projekt
- ProjectSelector: Dropdown im Header zwischen Nav und User-Info
- fetchTickets/fetchStats/fetchRepos: optionaler project-Parameter
- Dashboard: filtert Tickets und Stats nach ausgewähltem Projekt
- RepoRegistry: filtert Repos nach ausgewähltem Projekt
- App.tsx: ProjectProvider wrapping, Selector im Header
Der Button "Neues Projekt" war unsichtbar weil die Rolle falsch gelesen wurde.
- API: Endpoints zum Zuordnen/Entfernen von Repos und AppSignal-Apps
- Frontend: Neuer "Quellen"-Tab in ProjectDetail als erster Tab
- Repos und Apps können per Dropdown einem Projekt zugeordnet werden
- ProjectSettings: odoo_enabled, appsignal_enabled, gitlab_enabled Toggles
- ProjectSettings: AppSignal-Credentials (api_token, org_slug)
- ProjectSettings: GitLab-Credentials (url, token)
- Alembic Migration fuer neue Spalten
- Quellen-Tab: Integrationen an/aus schalten, Credentials konfigurieren,
  Repos und AppSignal-Apps unter der jeweiligen Integration zuordnen
- Navigation passt sich an: AppSignal/Repos nur sichtbar wenn im
  ausgewaehlten Projekt aktiviert
- ProjectContext laedt Settings mit und stellt sie der App bereit
Der GitLab-Projects-Endpoint liest jetzt gitlab_url und gitlab_token
aus den ProjectSettings wenn ein ?project=slug Parameter mitgegeben wird.
Das Frontend gibt den ausgewaehlten Projekt-Slug beim Import mit.
- ProjectSelector: Zahnrad-Button neben Dropdown navigiert direkt
  zur Projektkonfiguration
- ProjectList: Klick auf Karte waehlt Projekt UND oeffnet Detail-Seite,
  aktives Projekt visuell hervorgehoben (Ring), Slug entfernt,
  neues Projekt wird sofort ausgewaehlt und geoeffnet
- Dashboard: Hinweis-Banner wenn Projekt-Filter aktiv
- ProjectDetail: Tabs umbenannt (Integrationen, Team statt Quellen, Mitglieder)
- Empty-State verbessert mit direktem Erstellen-Link
- Kein Projekt ausgewaehlt: zentrierte Projektauswahl-Seite mit
  Projekt-Karten und Erstellen-Button
- Projekt ausgewaehlt: linke Sidebar mit Projekt-Dropdown, Navigation
  (Dashboard, Repos, AppSignal, Konfiguration), User-Info + Logout
- Navigation passt sich an aktivierte Integrationen an
- Sidebar zeigt Sektionen: Haupt-Nav, Projekt, System (admin)
- Alte Top-Navbar und ProjectSelector-Komponente entfernt
- Dashboard-Banner entfernt (Projekt-Kontext ist durch Sidebar klar)
- Settings-Seite: nur noch Projekte-Basispfad und System-Test
  (Hinweis dass Polling/Scoring pro Projekt konfiguriert wird)
- ProjectDetail Einstellungen-Tab: Odoo-Polling nur sichtbar wenn
  Odoo aktiviert, Scoring-Vorschau mit Bereichsanzeige, Claude-Config
  als 2-Spalten Grid
- Polling-Intervall und Stage-Namen werden beim Settings-Speichern
  mit an die ProjectSettings API geschickt
Sowohl beim manuellen Erstellen als auch beim GitLab-Import wird
das neue Repo via assignRepo() dem ausgewaehlten Projekt zugeordnet.
Dadurch taucht es sofort in der projekt-gefilterten Repo-Uebersicht auf.
- Beim Projekt-Erstellen wird der Ordner automatisch angelegt
- clone_or_update_repo: nutzt projekt-spezifisches Verzeichnis
- Pipeline: Repo-Path mit Projekt-Slug statt globalem repos_cache_dir
- GitLab-Import: sucht lokale Clones im Projekt-Verzeichnis
- repo_context_builder: prueft Projekt-Verzeichnis vor globalem Cache
- Struktur: PROJECTS_BASE_DIR/henke/repo-name/
Der Container konnte den Ordner nicht auf dem Host anlegen weil
PROJECTS_BASE_DIR nicht gemountet war. Jetzt wird der Pfad aus
der .env als bind-mount durchgereicht.
- Backend: delete_project prueft ob User Owner im Projekt oder
  globaler Admin ist, sonst 403
- Frontend: Loeschen-Button im ProjectDetail Header, nur sichtbar
  fuer Owner/Admin. Bestaetigung per confirm(). Nach Loeschen wird
  Projekt-Auswahl zurueckgesetzt und zur Startseite navigiert.
- Neue Hilfsfunktionen getTokenRole() und getTokenUsername() in client.ts
  dekodieren den JWT-Payload (Base64, keine Crypto — Signaturpruefung
  macht das Backend)
- localStorage speichert nur noch den Token, nicht mehr role/username
- Alle Stellen (App, ProjectSelector, ProjectList, ProjectDetail,
  TicketDetail, EnrichmentForm) nutzen jetzt getTokenRole()/getTokenUsername()
- Login.onLogin() bekommt nur noch den Token
- Manipulieren von localStorage gibt keine falschen Rechte mehr —
  die Rolle kommt immer aus dem signierten Token
Basti merged commit 033652e815 into main 2026-03-30 21:34:44 +00:00
Basti deleted branch fix/11-projektbasierte-organisation 2026-03-30 21:34:44 +00:00
Sign in to join this conversation.
No description provided.