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:
1 parent
a64a996291
commit
6718018211
5 files changed
+132
-7
No files matched your search
@@ -1,9 +1,10 @@
|
||||
import { config } from '../config.js'
|
||||
import { listDocuments, updateDocument, getDocument, upsertWebsiteProjectByRepo, Query } from './appwriteAdmin.js'
|
||||
import { listDocuments, updateDocument, getDocument, deleteDocument, upsertWebsiteProjectByRepo, Query } from './appwriteAdmin.js'
|
||||
import { importNewRepos } from './giteaAdmin.js'
|
||||
import { giteaFetch } from './giteaClient.js'
|
||||
import { withLocks } from './keyedLock.js'
|
||||
import { repoLockKey } from './repoMove.js'
|
||||
import { repoLockKey, isUnlinkedProject } from './repoMove.js'
|
||||
import { invalidateProjectCache } from './projectInsights.js'
|
||||
import { shouldSendAssignMail, dueReminder, sendRepoAssignMail } from './repoAssignMail.js'
|
||||
|
||||
/**
|
||||
@@ -84,6 +85,42 @@ export async function handleRepositoryCreated(payload, { now = new Date(), sendM
|
||||
return { created, mail }
|
||||
}
|
||||
|
||||
/**
|
||||
* Webhook `repository` / `deleted`: unverknuepfte Platzhalter-Dokumente des geloeschten Repos
|
||||
* entfernen. Sonst belegen sie den Namen (Unique-Index ohne Gross-/Kleinschreibung), und ein spaeter
|
||||
* gleich benanntes Repo kann nach dem Zuweisen nicht auf ihn umbenannt werden. Verknuepfte Dokumente
|
||||
* (Ticket, Kunde, Art, Preview) bleiben, ebenso alles, solange Gitea das Repo noch liefert.
|
||||
*/
|
||||
export async function handleRepositoryDeleted(payload) {
|
||||
const fullName = payload?.repository?.full_name
|
||||
if (!fullName) return { removed: 0 }
|
||||
|
||||
return withLocks(
|
||||
[repoLockKey(fullName)],
|
||||
async () => {
|
||||
try {
|
||||
await giteaFetch(`/repos/${fullName}`)
|
||||
return { removed: 0 } // Repo (oder eine Weiterleitung darauf) existiert noch
|
||||
} catch (err) {
|
||||
if (err.status !== 404) throw err
|
||||
}
|
||||
const docs = await listDocuments(collection(), [Query.equal('repoFullName', fullName), Query.limit(10)])
|
||||
let removed = 0
|
||||
for (const doc of docs) {
|
||||
if (!isUnlinkedProject(doc)) {
|
||||
console.warn(`[repoAssign] Repo ${fullName} gelöscht, Projekt ${doc.$id} ist verknüpft und bleibt`)
|
||||
continue
|
||||
}
|
||||
await deleteDocument(collection(), doc.$id)
|
||||
removed += 1
|
||||
}
|
||||
invalidateProjectCache(fullName)
|
||||
return { removed }
|
||||
},
|
||||
{ waitMs: 10000 }
|
||||
)
|
||||
}
|
||||
|
||||
/** Ein Lauf: neue Repos importieren + Mail, Wiederholungen, Erinnerungen. Wirft bei Appwrite-Fehlern nicht. */
|
||||
export async function runRepoAssignJob({
|
||||
now = new Date(),
|
||||
|
||||
Reference in new issue
Block a user