Öffnungszeiten: Neubau anstoßen und Feld im Runner-Auftrag

buildZeiten (einbau.js) liefert dem Runner-Auftrag { siteKey } bei Funktion in setup/active,
null bei Sperrliste und Fehlern. stosseNeubauAn (neubau.js) stößt den Neubau unter der
Sperre zeiten-neubau an und meldet angestossen oder manuell.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-05 01:41:10 +00:00
1 parent 0042d8dd8f
commit 302b58cf72
5 files changed
+279 -2

No files matched your search

+3 -1
View File
@@ -11,6 +11,7 @@ import { envKey, decryptEnv, maskLog } from './previewEnv.js'
import { saveRunLog } from './previewLogs.js'
import * as runnerClient from './previewRunnerClient.js'
import { analysePrivacyData } from './analysePrivacy.js'
import { buildZeiten } from './zeiten/einbau.js'
const execFileAsync = promisify(execFile)
@@ -688,7 +689,7 @@ async function followRun({ repoFullName, project, token, runId, subdomain, job,
}
if (run.result === 'dev') {
await patchProject(repoFullName, project, { ...base, previewState: 'sleeping' })
try { await runnerClient.startDev(subdomain, { ...job, mode: 'dev', displayName: undefined, analytics: undefined }) } catch (err) {
try { await runnerClient.startDev(subdomain, { ...job, mode: 'dev', displayName: undefined, analytics: undefined, zeiten: undefined }) } catch (err) {
console.error('[previewDeploy] Dev-Registrierung fehlgeschlagen:', err.message)
}
} else {
@@ -786,6 +787,7 @@ async function runDeployViaRunner(repoFullName, branch, previewConfig, { project
...(displayName ? { displayName } : {}),
env,
analytics: await buildAnalytics(doc),
zeiten: await buildZeiten(doc),
}
const { runId } = await runnerClient.submitBuild(job)
if (current()) await patchProject(repoFullName, doc, { previewState: 'building', previewError: warning })
+33
View File
@@ -0,0 +1,33 @@
import { config } from '../../config.js'
import { getFeatureDoc } from '../siteFeatures.js'
/**
* Einbau des Zeiten-Skripts beim Deploy (Spec 4.6, Runner-Feld `zeiten`).
* Darf weder neubau.js noch previewRebuild.js importieren: previewDeploy laedt diese Datei, previewRebuild laedt
* previewDeploy (Zyklus).
*/
/** Zustaende, in denen die Leisten ausgespielt werden (wie teilweiseLive im Register). */
const AUSGEBEND = ['setup', 'active']
/** Subdomain auf der Sperrliste ZEITEN_KEIN_NEUBAU (Einbau von Hand, weder Neubau noch Einsetzen)? */
export function aufSperrliste(project) {
const subdomain = String(project?.subdomain || '').trim().toLowerCase()
return subdomain !== '' && config.zeiten.keinNeubau.includes(subdomain)
}
/**
* Zeiten-Feld fuer den Build-Auftrag: { siteKey } nur bei Funktion in setup/active und Projekt nicht auf der
* Sperrliste, sonst null. isPublic ist nicht noetig. Wirft nie: der Build darf an den Zeiten nicht scheitern.
*/
export async function buildZeiten(project) {
try {
if (!project?.$id || !project.customerId || aufSperrliste(project)) return null
const feature = await getFeatureDoc(project.customerId, project.$id, 'zeiten')
if (!feature || !AUSGEBEND.includes(feature.state) || !feature.siteKey) return null
return { siteKey: feature.siteKey }
} catch (err) {
console.warn(`[zeiten] Einbau-Abfrage für Projekt ${project?.$id} fehlgeschlagen: ${err?.message}`)
return null
}
}
+27
View File
@@ -0,0 +1,27 @@
import { withLocks } from '../keyedLock.js'
import { triggerRebuild } from '../previewRebuild.js'
import { isDevPreview } from '../analyse.js'
import { aufSperrliste } from './einbau.js'
/** Austauschbar fuer Tests: Neubau (Tests ersetzen das Feld, nie destrukturieren). */
export const zeitenDeps = { rebuild: triggerRebuild }
/**
* Neubau fuer den Einbau des Zeiten-Skripts anstossen (Spec 4.6), wenn die Funktion in einen ausgebenden Zustand
* (setup/active) wechselt. Hoechstens ein angestossener Neubau gleichzeitig (Portal-weite Sperre 'zeiten-neubau';
* nicht wiederbetretbar, nie innerhalb dieser Sperre aufrufen).
* 'angestossen': der Runner hat den Auftrag angenommen (result.queued === true).
* 'manuell': kein Repo, Preview aus, Dev-Modus, Sperrliste, Runner ausgelastet (503) oder Fehler; das Team baut ein.
* Wirft nie.
*/
export async function stosseNeubauAn(project) {
try {
if (!project?.repoFullName || project.previewMode === 'off' || isDevPreview(project) || aufSperrliste(project)) return 'manuell'
const result = await withLocks(['zeiten-neubau'], () => zeitenDeps.rebuild(project))
return result?.queued === true ? 'angestossen' : 'manuell'
} catch (err) {
// Zustand bleibt gespeichert, das Team setzt die Zeile von Hand ein
console.warn(`[zeiten] Neubau für Projekt ${project?.$id} nicht angestoßen: ${err?.message}`)
return 'manuell'
}
}