Verwaiste Repo-Platzhalter blockieren keine Zuordnung mehr

Ein in Gitea geloeschtes Org-Repo liess sein unverknuepftes Projekt-Dokument
liegen. Der Unique-Index auf repoFullName ignoriert Gross-/Kleinschreibung,
darum scheiterte beim Zuweisen eines gleich benannten neuen Repos das
Umbenennen des Projekts; alle Pushes landeten im Platzhalter ohne Ticket,
also ohne Arbeitsblatt und ohne Push-Zeitmail (WEBklar/Schmacko-napf).

- repoMove: vor dem Umbenennen ein unverknuepftes fremdes Dokument mit dem
  Zielnamen entfernen (verknuepfte bleiben unangetastet)
- Webhook repository/deleted: unverknuepfte Platzhalter des geloeschten
  Repos entfernen, nur wenn Gitea das Repo wirklich nicht mehr kennt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-01 21:58:11 +00:00
1 parent a64a996291
commit 6718018211
5 files changed
+132 -7

No files matched your search

+12 -3
View File
@@ -16,7 +16,7 @@ import { ensureProjectTicket } from '../../services/ticketAdmin.js'
import { invalidateProjectCache } from '../../services/projectInsights.js'
import { withLocks } from '../../services/keyedLock.js'
import { repoLockKey, currentRepoFullName } from '../../services/repoMove.js'
import { handleRepositoryCreated } from '../../services/repoAssignJob.js'
import { handleRepositoryCreated, handleRepositoryDeleted } from '../../services/repoAssignJob.js'
const router = Router()
@@ -48,9 +48,18 @@ router.post('/gitea', async (req, res) => {
const payload = req.body || {}
// Ereignis "repository": nur `created` wird verarbeitet (neues Repo -> Dokument + Zuordnungs-Mail),
// alles andere (deleted, transfer, ...) wird mit 200 ignoriert. Der Push-Pfad bleibt unberuehrt.
// Ereignis "repository": `created` (neues Repo -> Dokument + Zuordnungs-Mail) und `deleted`
// (Platzhalter-Dokument entfernen), alles andere wird mit 200 ignoriert. Der Push-Pfad bleibt unberuehrt.
if (req.get('X-Gitea-Event') === 'repository') {
if (payload.action === 'deleted') {
try {
const r = await handleRepositoryDeleted(payload)
return res.json({ ok: true, removed: r.removed })
} catch (err) {
console.error('[webhook] repository/deleted:', err)
return res.status(500).json({ error: err.message || 'Webhook-Verarbeitung fehlgeschlagen' })
}
}
if (payload.action !== 'created') return res.json({ ok: true, ignored: true })
try {
const r = await handleRepositoryCreated(payload)