# Mögliche Erweiterung: Gitea-Integration ## Status Konzeptvorschlag – noch nicht implementiert. ## Ziel my2dos soll Issues in einer Gitea-Instanz erstellen können. Die Erfassung erfolgt direkt über einen Slash-Befehl. In einer ersten Version findet keine automatische bidirektionale Synchronisation statt. ## Vorgeschlagene Bedienung ### Issue im Standard-Repository erstellen ```text /issue Fehler beim Speichern Weitere Beschreibung des Problems. ``` ### Repository über einen Alias auswählen ```text /issue my2dos Fehler beim Speichern Weitere Beschreibung des Problems. ``` Dabei könnte `my2dos` beispielsweise auf `rucki/my2dos` verweisen. ### Mögliche spätere Optionen ```text /issue my2dos Fehler beim Speichern /labels bug,frontend ``` Weitere denkbare Angaben: - Labels - zuständige Person - Meilenstein - Priorität - Gitea-Projekt Die genaue Syntax sollte erst nach Erfahrungen mit der Basisversion festgelegt werden. ## Verhalten der ersten Version 1. Benutzer gibt `/issue` mit Titel und optionaler Beschreibung ein. 2. my2dos bestimmt das Standard-Repository oder löst den angegebenen Alias auf. 3. Das Issue wird über die Gitea-REST-API erstellt. 4. In my2dos wird ein lokaler Link-Eintrag zum Issue angelegt. 5. Issue-Nummer, Repository und URL werden lokal gespeichert. 6. Schlägt der API-Aufruf fehl, bleibt der eingegebene Text als lokaler Eintrag erhalten und zeigt einen verständlichen Fehlerstatus. Der Text darf bei Netzwerk- oder Gitea-Fehlern nicht verloren gehen. ## Einstellungen In den Benutzereinstellungen könnte ein Bereich **Gitea** ergänzt werden: - URL der Gitea-Instanz - API-Token - Standard-Repository - optionale Repository-Aliase - Verbindung testen Beispiel für Aliase: | Alias | Gitea-Repository | |---|---| | `my2dos` | `rucki/my2dos` | | `website` | `rucki/website` | Später könnten Verbindungen auch einem Team statt nur einem Benutzer gehören. ## Mögliches Datenmodell ### `GiteaConnection` - Benutzer oder Team - Server-URL - verschlüsselter API-Token - aktiv/inaktiv - Erstellungs- und Änderungszeitpunkt ### `GiteaRepository` - Gitea-Verbindung - Alias - Owner - Repository-Name - Kennzeichnung als Standard-Repository ### `ExternalIssue` - lokaler my2dos-Eintrag - Gitea-Repository - Issue-Nummer - externe URL - Synchronisationsstatus - letzte Fehlermeldung - Zeitpunkt der letzten Synchronisation Alternativ könnte `ExternalIssue` später zu einem allgemeinen Modell für externe Systeme erweitert werden. ## Gitea-API Zum Erstellen eines Issues wird voraussichtlich folgender Endpunkt verwendet: ```http POST /api/v1/repos/{owner}/{repository}/issues Authorization: token Content-Type: application/json ``` Beispielinhalt: ```json { "title": "Fehler beim Speichern", "body": "Weitere Beschreibung des Problems." } ``` Die genaue API muss gegen die eingesetzte Gitea-Version geprüft werden. ## Fehlerbehandlung Zu berücksichtigen sind insbesondere: - Gitea nicht erreichbar - Zeitüberschreitung - ungültiger oder abgelaufener Token - fehlende Berechtigung für das Repository - unbekannter Repository-Alias - Repository nicht gefunden - ungültige Labels oder Meilensteine Ein externer API-Aufruf sollte ein kurzes Timeout besitzen. Fehler müssen im lokalen Eintrag nachvollziehbar sein. Für spätere automatische Wiederholungen wäre ein Hintergrundjob sinnvoll. ## Sicherheit - API-Tokens dürfen nicht im Klartext angezeigt oder protokolliert werden. - Tokens sollten verschlüsselt gespeichert oder zunächst über Umgebungsvariablen bereitgestellt werden. - Tokens sollten nur die notwendigen Gitea-Berechtigungen besitzen. - Benutzerdefinierte Gitea-URLs müssen validiert werden, um SSRF-Zugriffe auf interne Dienste zu verhindern. - Für produktive Verbindungen sollte HTTPS verlangt werden. - Spätere Webhooks benötigen eine Signatur- oder Secret-Prüfung. ## Zusammenspiel mit Slash-Befehlen `/issue` ist eine Aktion und nicht zwingend ein neuer Eintragstyp. Zwei Varianten sind möglich: 1. `/issue` erstellt das externe Issue und lokal einen Link-Eintrag. 2. `/issue` erstellt lokal eine Aufgabe, die mit dem externen Issue verbunden ist. Für den MVP wird Variante 1 empfohlen, weil der externe Issue-Link das primäre Ergebnis ist. Vor der Implementierung sollte entschieden werden, ob `/issue` – wie die Typbefehle – nur am Anfang eines Eintrags erlaubt ist. ## Tests Mindestens erforderlich: - Parser für `/issue` - Standard-Repository und Alias-Auflösung - Titel und mehrzeilige Beschreibung - erfolgreicher API-Aufruf mit gemockter Gitea-API - Fehlerantworten und Timeouts - kein Verlust des lokalen Textes bei Fehlern - Berechtigungsprüfung für Benutzer und Teams - sichere Behandlung des Tokens - API- und UI-Erstellung ## Ausbaustufen ### Stufe 1: Issues erstellen - eine Gitea-Verbindung pro Benutzer - Standard-Repository - `/issue Titel` - lokaler Link zum erstellten Issue - robuste Fehlerbehandlung Geschätzter Aufwand: **1–2 Entwicklungstage**. ### Stufe 2: Mehrere Repositories und Labels - Repository-Aliase - Label-Zuordnung - Team-Verbindungen - Verbindungstest in den Einstellungen Geschätzter Gesamtaufwand: **3–5 Entwicklungstage**. ### Stufe 3: Bidirektionale Synchronisation - geschlossenes Gitea-Issue erledigt die lokale Aufgabe - erledigte lokale Aufgabe schließt das Gitea-Issue - Kommentare synchronisieren - Webhooks - Schutz vor Synchronisationsschleifen Geschätzter Aufwand: **1–2 Wochen**. ### Stufe 4: Vollständige Integration - OAuth statt manueller Tokens - mehrere Gitea-Instanzen - Hintergrundjobs und automatische Wiederholungen - Bearbeiter, Meilensteine und Projekte - Konfliktbehandlung Geschätzter Aufwand: **2–3 Wochen**. ## Empfohlener MVP 1. Gitea-URL, Token und Standard-Repository konfigurierbar machen. 2. Repository-Aliase unterstützen. 3. `/issue [alias] Titel` parsen. 4. Restlichen mehrzeiligen Text als Beschreibung verwenden. 5. Issue synchron über die Gitea-API erstellen. 6. Einen lokalen Link-Eintrag mit externer Referenz anlegen. 7. Bei Fehlern einen lokalen Eintrag mit Wiederholungsmöglichkeit behalten. 8. Noch keine automatische Synchronisation oder Webhooks implementieren. Diese Variante liefert schnell einen praktischen Nutzen und hält Sicherheits-, Synchronisations- und Betriebsaufwand zunächst überschaubar.