6.2 KiB
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
/issue Fehler beim Speichern
Weitere Beschreibung des Problems.
Repository über einen Alias auswählen
/issue my2dos Fehler beim Speichern
Weitere Beschreibung des Problems.
Dabei könnte my2dos beispielsweise auf rucki/my2dos verweisen.
Mögliche spätere Optionen
/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
- Benutzer gibt
/issuemit Titel und optionaler Beschreibung ein. - my2dos bestimmt das Standard-Repository oder löst den angegebenen Alias auf.
- Das Issue wird über die Gitea-REST-API erstellt.
- In my2dos wird ein lokaler Link-Eintrag zum Issue angelegt.
- Issue-Nummer, Repository und URL werden lokal gespeichert.
- 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:
POST /api/v1/repos/{owner}/{repository}/issues
Authorization: token <API-TOKEN>
Content-Type: application/json
Beispielinhalt:
{
"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:
/issueerstellt das externe Issue und lokal einen Link-Eintrag./issueerstellt 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
- Gitea-URL, Token und Standard-Repository konfigurierbar machen.
- Repository-Aliase unterstützen.
/issue [alias] Titelparsen.- Restlichen mehrzeiligen Text als Beschreibung verwenden.
- Issue synchron über die Gitea-API erstellen.
- Einen lokalen Link-Eintrag mit externer Referenz anlegen.
- Bei Fehlern einen lokalen Eintrag mit Wiederholungsmöglichkeit behalten.
- Noch keine automatische Synchronisation oder Webhooks implementieren.
Diese Variante liefert schnell einen praktischen Nutzen und hält Sicherheits-, Synchronisations- und Betriebsaufwand zunächst überschaubar.