From d3c6858eccf5e1e91b3bee4993bd4ce7d7cf06cf Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 30 Sep 2026 18:02:56 +0000 Subject: [PATCH] Projektarten: Zuordnungs-Mail auch ohne vorherigen Versuch nachholen Co-Authored-By: Claude Sonnet 5.5 --- server/services/repoAssignJob.js | 7 +++++-- test/repoAssignDetect.test.js | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/server/services/repoAssignJob.js b/server/services/repoAssignJob.js index 3986c26..95834b2 100644 --- a/server/services/repoAssignJob.js +++ b/server/services/repoAssignJob.js @@ -101,6 +101,9 @@ export async function runRepoAssignJob({ if (isOrgOwner(repo)) continue const login = repo.owner?.login || '' if (!login) continue + // Alte Repos (>= 24 h) bekommen keinen Ersteller: sie werden nie gemailt und nie erinnert. + const age = now.getTime() - new Date(repo.created_at || 0).getTime() + if (!(age < 24 * 3600_000)) continue handled.add(projectId) await updateDocument(collection(), projectId, { createdByGitea: login }) const r = await sendFirstMailIfDue(projectId, repo, login, { now, createdNow: true, sendMail }) @@ -110,9 +113,9 @@ export async function runRepoAssignJob({ const docs = await listDocuments(collection(), [Query.limit(5000)]) for (const p of docs) { if (!p.createdByGitea || p.kind || handled.has(p.$id)) continue - // Wiederholung: erste Mail fehlgeschlagen (1-2 Versuche), Repo noch juenger als 24 h. + // Wiederholung/Nachholen: erste Mail noch nicht raus (0-2 Versuche), Repo noch juenger als 24 h. const attempts = Number(p.assignMailAttempts || 0) - if (!p.assignMailSentAt && attempts > 0 && attempts < 3) { + if (!p.assignMailSentAt && attempts < 3) { let repo try { repo = await fetchRepo(p.repoFullName) diff --git a/test/repoAssignDetect.test.js b/test/repoAssignDetect.test.js index 5891910..9b1ce40 100644 --- a/test/repoAssignDetect.test.js +++ b/test/repoAssignDetect.test.js @@ -105,6 +105,21 @@ test('Job: 20 alte Repos → 0 Mails', async () => { assert.equal(c.imported, 20) assert.equal(c.mails, 0) assert.equal(sink.sent.length, 0) + assert.ok(!docsOf('knso/alt0')[0].createdByGitea, 'alte Repos bekommen kein createdByGitea') +}) + +test('Job: Mail ohne vorherigen Versuch wird nachgeholt (createdByGitea, 0 Versuche)', async () => { + freshSink() + gitea.addRepo({ full_name: 'knso/nachholen', created_at: ago(2) }) + await runRepoAssignJob({ now: NOW }) + const [doc] = docsOf('knso/nachholen') + // Lauf abgebrochen, bevor die erste Mail versucht wurde + aw.all('websiteProjects').find((d) => d.$id === doc.$id).assignMailSentAt = '' + Object.assign(aw.all('websiteProjects').find((d) => d.$id === doc.$id), { assignMailAttempts: 0 }) + freshSink() + const c = await runRepoAssignJob({ now: NOW }) + assert.equal(c.retries, 1) + assert.equal(sink.sent.length, 1) }) test('Job: neues Nutzer-Repo → Mail, Org-Repo → keine Mail', async () => {