Buchungskalender: Verdrahtung, Router-Gerüste und API-Vertrag
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1d2ca2791d
commit
a68baf10d9
37 files changed
+888
-30
No files matched your search
@@ -20,6 +20,8 @@ import termineRoutes from './routes/termine.js'
|
||||
import shopRoutes from './routes/shop.js'
|
||||
import shopWebhookRoutes from './routes/shopWebhook.js'
|
||||
import { shopSeiteRouter } from './routes/shopSeite.js'
|
||||
import unterkunftRoutes from './routes/unterkunft.js'
|
||||
import { unterkunftSeiteRouter } from './routes/unterkunftSeite.js'
|
||||
import zeitenRoutes from './routes/zeiten.js'
|
||||
import takeoverCreditRoutes from './routes/takeoverCredits.js'
|
||||
import { purgeExpiredUploads } from './services/takeoverCredits.js'
|
||||
@@ -29,6 +31,7 @@ import { purgeUnclaimedNewsImages } from './services/newsImages.js'
|
||||
import { runActivation } from './services/siteFeatures.js'
|
||||
import { runAboCheck, runAnalyseReconcile } from './services/analyse.js'
|
||||
import { fuenfMinutenJob, minutenJob, tagesbericht, taeglicherJob } from './services/termine/jobs.js'
|
||||
import { minutenJob as unterkunftMinutenJob, viertelstundenJob as unterkunftViertelstundenJob, taeglicherJob as unterkunftTaeglicherJob } from './services/unterkunft/jobs.js'
|
||||
import { minutenJob as shopMinutenJob, stuendlicherJob as shopStuendlicherJob, taeglicherJob as shopTaeglicherJob } from './services/shop/jobs.js'
|
||||
import { zeitenAboJob, zeitenErinnerungsJob } from './services/zeiten/jobs.js'
|
||||
import giteaWebhookRoutes from './routes/webhook/gitea.js'
|
||||
@@ -44,6 +47,7 @@ import newsRoutes from './routes/news.js'
|
||||
import publicNewsRoutes from './routes/publicNews.js'
|
||||
import publicTermineRoutes from './routes/publicTermine.js'
|
||||
import publicShopRoutes from './routes/publicShop.js'
|
||||
import publicUnterkunftRoutes from './routes/publicUnterkunft.js'
|
||||
import publicZeitenRoutes from './routes/publicZeiten.js'
|
||||
import adminAnalyseRoutes from './routes/admin/analyse.js'
|
||||
import { legalRouter } from './services/legalDocs.js'
|
||||
@@ -69,6 +73,8 @@ app.use(kundenansichtGuard)
|
||||
app.use('/api/public/termine/v1', publicTermineRoutes)
|
||||
// Oeffentliche Schnittstelle des Webshops (Kaeufer ohne Session): wie die des Terminplaners mit eigenem Parser (16 KB), daher ebenfalls VOR dem globalen Parser
|
||||
app.use('/api/public/shop/v1', publicShopRoutes)
|
||||
// Oeffentliche Schnittstelle des Buchungskalenders (Gaeste ohne Session): ebenfalls mit eigenem Parser VOR dem globalen
|
||||
app.use('/api/public/unterkunft/v1', publicUnterkunftRoutes)
|
||||
// Uebernahmegutschrift: Nachweise kommen als Base64 im JSON (max. 10 MB Dateien) -> eigenes Limit,
|
||||
// muss vor dem globalen Parser stehen (der ueberspringt bereits geparste Bodies). Login-Pruefung
|
||||
// zuerst, damit niemand ohne Session grosse Bodies parsen laesst.
|
||||
@@ -93,6 +99,7 @@ app.use('/api/termine', termineRoutes)
|
||||
// Stripe-Connect-Webhook des Webshops (ohne Sitzung): vor dem Router, braucht rawBody des globalen Parsers
|
||||
app.use('/api/shop/stripe-webhook', shopWebhookRoutes)
|
||||
app.use('/api/shop', shopRoutes)
|
||||
app.use('/api/unterkunft', unterkunftRoutes)
|
||||
app.use('/api/zeiten', zeitenRoutes)
|
||||
app.use('/api/team', teamRoutes)
|
||||
app.use('/api/admin/gitea', adminGiteaRoutes)
|
||||
@@ -129,6 +136,8 @@ app.use('/embed/', (_req, res, next) => {
|
||||
app.use('/rechtliches', legalRouter())
|
||||
// Webshop-Seiten fuer Kaeufer: /shop/:siteKey und /shop/:siteKey/widerruf (vor express.static)
|
||||
app.use(shopSeiteRouter())
|
||||
// Buchungskalender-Seiten fuer Gaeste: /unterkunft/:siteKey und /unterkunft/:siteKey/buchung/:id (vor express.static)
|
||||
app.use(unterkunftSeiteRouter())
|
||||
// Abgeschaltetes Admin-Panel und Rechnungsanalyse: Links aus alten Team-Mails ins Ticketsystem
|
||||
app.use('/admin.html', legacyAdminRedirect.admin)
|
||||
app.use('/kalkulation.html', legacyAdminRedirect.kalkulation)
|
||||
@@ -260,6 +269,29 @@ const server = app.listen(config.port, '0.0.0.0', () => {
|
||||
setInterval(shopTages, 24 * 60 * 60 * 1000).unref()
|
||||
}, 200 * 1000).unref()
|
||||
|
||||
// Buchungskalender: jede Minute Fristen ablaufen lassen (80 s nach dem Start beginnend), alle 15 Minuten iCal-Importe (140 s),
|
||||
// taeglich Aufbewahrung (210 s). Bei UNTERKUNFT_ENABLED=off kehrt jeder Lauf sofort zurueck. Die Jobs melden Einzelfehler selbst
|
||||
// (ohne Gastdaten); hier faengt der Rahmen alles Unerwartete ab.
|
||||
const unterkunftMinuten = () => unterkunftMinutenJob(new Date()).catch((err) => console.warn('[unterkunft] Minutenjob fehlgeschlagen:', err.message))
|
||||
setTimeout(() => {
|
||||
unterkunftMinuten()
|
||||
setInterval(unterkunftMinuten, 60 * 1000).unref()
|
||||
}, 80 * 1000).unref()
|
||||
const unterkunftViertelstunden = () =>
|
||||
unterkunftViertelstundenJob(new Date()).catch((err) => console.warn('[unterkunft] Viertelstundenjob fehlgeschlagen:', err.message))
|
||||
setTimeout(() => {
|
||||
unterkunftViertelstunden()
|
||||
setInterval(unterkunftViertelstunden, 15 * 60 * 1000).unref()
|
||||
}, 140 * 1000).unref()
|
||||
const unterkunftTages = () =>
|
||||
unterkunftTaeglicherJob(new Date())
|
||||
.then((r) => r && !r.aus && !r.uebersprungen && console.log(`[unterkunft] Tagesjob: ${JSON.stringify(r)}`))
|
||||
.catch((err) => console.warn('[unterkunft] Tagesjob fehlgeschlagen:', err.message))
|
||||
setTimeout(() => {
|
||||
unterkunftTages()
|
||||
setInterval(unterkunftTages, 24 * 60 * 60 * 1000).unref()
|
||||
}, 210 * 1000).unref()
|
||||
|
||||
// Oeffnungszeiten live: taeglich der Abo-Abgleich (4 Minuten nach dem Start beginnend; laeuft unabhaengig vom Schalter ZEITEN_ENABLED,
|
||||
// ohne Zeiten-Dokumente kostet er eine Abfrage) und stuendlich die Feiertags-Erinnerung (5 Minuten nach dem Start beginnend; nur bei
|
||||
// Schalter pilot/on und nur 08:00 bis 20:00 Berliner Zeit, sonst kehrt jeder Lauf sofort zurueck). Beide Jobs ueberlappen nicht und
|
||||
|
||||
Reference in new issue
Block a user