GET /api/public/zeiten/v1/:siteKey mit CORS *, OPTIONS 204, 405, weichem ETag ohne stand, Cache-Control max-age=60, Expose-Headers Date, Grenze 120 je Minute und IP (zeiten/limits.js), 503 ohne Details und 404 für unbekannte Pfade. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
16 lines
866 B
JavaScript
16 lines
866 B
JavaScript
import { ipSchluessel, zaehle } from '../termine/limits.js'
|
|
|
|
/**
|
|
* Grenze der oeffentlichen Zeiten-Schnittstelle (Spezifikation 2026-10-04-oeffnungszeiten-live-design.md, Abschnitt 4.1):
|
|
* hoechstens 120 Abrufe je Minute und Client-IP. Der Zaehler liegt im Speicher dieses Prozesses (services/termine/limits.js:
|
|
* IPv6 je /64, 'ip:'-Schluessel verdraengen keine langlebigen Zaehler) und traegt einen eigenen Schluessel, damit Zeiten und
|
|
* Terminplaner nicht aus demselben Topf zaehlen. Tests leeren ihn mit resetTermineLimitsForTests.
|
|
*/
|
|
const ANFRAGEN_JE_IP = 120
|
|
const MINUTE_MS = 60 * 1000
|
|
|
|
/** Darf diese IP (IPv6 je /64) jetzt die Zeiten abrufen? Hoechstens 120 je Minute; true = erlaubt (gezaehlt), false = Grenze erreicht. */
|
|
export function darfZeitenAnfrage(ip, now) {
|
|
return zaehle(`ip:zeiten:${ipSchluessel(ip)}`, ANFRAGEN_JE_IP, MINUTE_MS, now)
|
|
}
|