Hustler-Stufe: Modul hustlerStufe.js mit HUSTLER_STUFE (Standard 3), Bauzeit-Wert VITE_HUSTLER_STUFE, Schwellen für Pult-Antworten (4) und Keller (6)
Eine Quelle der Wahrheit dafür, was die Oberfläche schon zeigen darf, solange der Dienst nur P1 und P3 kann. Der Wert aus dem Bau gilt nur als Ziffer 1 bis 9, sonst die Standardstufe; keine Überschreibung zur Laufzeit. Dazu tabErlaubt (Keller = ?tab=botleads) und linkErlaubt (Links in den Keller, auch über /workers und /leads). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
75ed38e68d
commit
7cd74a23d2
2 files changed
+181
No files matched your search
@@ -0,0 +1,69 @@
|
||||
// Stufen-Sperre der Hustler-Seite: EINE Quelle der Wahrheit dafür, was die Oberfläche schon zeigen darf. Der Dienst (workers-dienst) wächst Stufe für Stufe
|
||||
// (P1, P3, P4, P6); die Oberfläche ist fertig und würde sonst Knöpfe und Bildschirme zeigen, deren Endpunkte noch 404 liefern.
|
||||
// Stufe < 4: im Pult keine Antwort-Knöpfe (paste „Antwort des Kunden einfügen“, reply „Als Mensch antworten“, approve-preview, start-build).
|
||||
// Stufe < 6: kein Keller mit den Bot-Leads (kein Bildschirm, kein Link, kein Abruf von /api/workers/botleads); die Keller-Etage zoomt wie jede andere.
|
||||
// Kein React, kein DOM, kein Appwrite: unter Node testbar (loadModule). Es gibt keine Überschreibung zur Laufzeit (kein localStorage, keine Adresse): die Stufe ist
|
||||
// zur Bauzeit festgelegt. Nur der Prüfstand (scripts/workers-harness) baut mit VITE_HUSTLER_STUFE=6, damit seine P4- und Keller-Szenarien weiter laufen.
|
||||
|
||||
/** Ab dieser Stufe erscheinen die Antwort-Knöpfe im Pult (Dienst P4: paste, reply, approve-preview, start-build). */
|
||||
export const STUFE_ANTWORTEN = 4
|
||||
/** Ab dieser Stufe erscheint der Keller mit den Bot-Leads (Dienst P6: GET /botleads). */
|
||||
export const STUFE_KELLER = 6
|
||||
|
||||
const KLEINSTE = 1
|
||||
const GROESSTE = 9
|
||||
|
||||
/**
|
||||
* Stufe aus einem rohen Wert: nur eine ganze Zahl 1..9 (als Zahl oder als Ziffer im Text, Leerraum ringsum erlaubt) gilt; alles andere
|
||||
* (leer, Text, 0, 10, 6.5, 06, Infinity, undefined) ergibt `standard`.
|
||||
*/
|
||||
export function stufeAus(roh, standard) {
|
||||
if (typeof roh === 'number') return Number.isInteger(roh) && roh >= KLEINSTE && roh <= GROESSTE ? roh : standard
|
||||
if (typeof roh !== 'string') return standard
|
||||
const text = roh.trim()
|
||||
return /^[1-9]$/.test(text) ? Number(text) : standard
|
||||
}
|
||||
|
||||
// Der Wert aus dem Bau (Vite ersetzt import.meta.env.VITE_HUSTLER_STUFE beim Bauen, der Prüfstand setzt ihn über define). Unter Node gibt es import.meta.env nicht.
|
||||
function buildWert() {
|
||||
try {
|
||||
return import.meta.env.VITE_HUSTLER_STUFE
|
||||
} catch {
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
|
||||
// 3 = Dienst P3 live; ab 4 (P4) erscheinen die Antwort-Knöpfe im Pult, ab 6 (P6) der Keller mit den Bot-Leads; beim jeweiligen Livegang hier hochsetzen
|
||||
export const HUSTLER_STUFE = stufeAus(buildWert(), 3)
|
||||
|
||||
// Eine übergebene Stufe (Parameter der Funktionen und Bausteine, vor allem für Tests); fehlt sie oder ist sie unbrauchbar, gilt HUSTLER_STUFE
|
||||
const stufeOder = (stufe) => stufeAus(stufe, HUSTLER_STUFE)
|
||||
|
||||
/** Zeigt das Pult die Antwort-Knöpfe (paste, reply, approve-preview, start-build)? Ab Stufe 4. */
|
||||
export const antwortenOffen = (stufe = HUSTLER_STUFE) => stufeOder(stufe) >= STUFE_ANTWORTEN
|
||||
|
||||
/** Gibt es den Keller (Bildschirm Bot-Leads, Abruf von /botleads)? Ab Stufe 6. */
|
||||
export const kellerOffen = (stufe = HUSTLER_STUFE) => stufeOder(stufe) >= STUFE_KELLER
|
||||
|
||||
/** Darf dieser Bildschirm (Wert von ?tab=) auf der Stufe gezeigt werden? Nur der Keller ('botleads') ist gesperrt, alles andere ist frei. */
|
||||
export const tabErlaubt = (tabId, stufe = HUSTLER_STUFE) => tabId !== 'botleads' || kellerOffen(stufe)
|
||||
|
||||
// Adressen, unter denen die Hustler-Seite liegt: /hustler und die alten /workers und /leads (App.jsx leitet sie weiter, die Query bleibt)
|
||||
const SEITEN_PFADE = ['/hustler', '/workers', '/leads']
|
||||
|
||||
/**
|
||||
* Darf ein interner Link (aus der Spur im Dialog) auf der Stufe ein Link sein? Ein Link in den Keller (…/hustler?tab=botleads, auch über /workers und /leads)
|
||||
* ist unterhalb der Keller-Stufe nur Text; alles andere bleibt ein Link. Externe Adressen berührt das nicht.
|
||||
*/
|
||||
export function linkErlaubt(href, stufe = HUSTLER_STUFE) {
|
||||
if (kellerOffen(stufe)) return true
|
||||
if (typeof href !== 'string' || !/^\/(?![/\\])/.test(href)) return true // nur interne Pfade (ein einzelner / am Anfang), nie //host oder eine ganze Adresse
|
||||
let ziel
|
||||
try {
|
||||
ziel = new URL(href, 'https://hustler.invalid')
|
||||
} catch {
|
||||
return true
|
||||
}
|
||||
const pfad = ziel.pathname.replace(/\/+$/, '').toLowerCase()
|
||||
return !(SEITEN_PFADE.includes(pfad) && ziel.searchParams.get('tab') === 'botleads')
|
||||
}
|
||||
Reference in new issue
Block a user