62 lines
2.6 KiB
JavaScript
62 lines
2.6 KiB
JavaScript
import { config } from '../../config.js'
|
|
import { parsePortalSession } from '../../middleware/session.js'
|
|
|
|
/**
|
|
* Pilot-Schalter der neuen Kundenansicht: KUNDENANSICHT_NEU = off (Vorgabe) | pilot | on, dazu die Komma-Liste
|
|
* KUNDENANSICHT_NEU_PILOT_EMAILS ('*' = alle). Liest config.kundenansichtNeu bei jedem Aufruf. Der Modus off
|
|
* schlaegt jede Liste; eine leere Liste im Pilot laesst nur die Mitarbeiter-Kundenansicht durch.
|
|
*/
|
|
|
|
/** 'off' | 'pilot' | 'on'; alles andere (leer, unbekannt) gilt als off. */
|
|
export function neueAnsichtModus() {
|
|
const mode = config.kundenansichtNeu.mode
|
|
return mode === 'pilot' || mode === 'on' ? mode : 'off'
|
|
}
|
|
|
|
/** Nicht-leerer Text nach dem Trimmen? */
|
|
const istText = (wert) => typeof wert === 'string' && wert.trim() !== ''
|
|
|
|
/** Listenvergleich im Pilot: '*' oder die getrimmte, klein geschriebene E-Mail steht in der Liste; ein Nicht-Text zaehlt als leer. */
|
|
function stehtInPilotListe(email) {
|
|
const erlaubt = config.kundenansichtNeu.pilotEmails
|
|
if (erlaubt.includes('*')) return true
|
|
const adresse = typeof email === 'string' ? email.trim().toLowerCase() : ''
|
|
return adresse !== '' && erlaubt.includes(adresse)
|
|
}
|
|
|
|
const istObjekt = (wert) => wert !== null && typeof wert === 'object' && !Array.isArray(wert)
|
|
|
|
/** Mitarbeiter-Kundenansicht ("Als Kunde ansehen") mit Kennung. */
|
|
const istKundenansicht = (s) => s.viewAs === true && istText(s.viewId)
|
|
|
|
/** Angemeldeter Kunde (keine alte Mitarbeiter-Sitzung). */
|
|
const istKundenSitzung = (s) => istText(s.customerId) && istText(s.appwriteUserId) && s.role !== 'admin'
|
|
|
|
/** Sieht diese Sitzung die neue Kundenansicht? Ungueltige Sitzungen: nie. */
|
|
export function neueAnsichtFuerSession(session) {
|
|
const modus = neueAnsichtModus()
|
|
if (modus === 'off') return false
|
|
if (!istObjekt(session)) return false
|
|
const kundenansicht = istKundenansicht(session)
|
|
if (!kundenansicht && !istKundenSitzung(session)) return false
|
|
if (modus === 'on') return true
|
|
return kundenansicht || stehtInPilotListe(session.email)
|
|
}
|
|
|
|
/** Sieht diese Anfrage die neue Kundenansicht? req.session hat Vorrang, sonst das signierte Cookie. */
|
|
export function neueAnsicht(req) {
|
|
return neueAnsichtFuerSession(req?.session ?? parsePortalSession(req))
|
|
}
|
|
|
|
/**
|
|
* Fuer Jobs und Dienste ohne Cookie: gleiche Modus- und Listenregeln, aber ohne Sitzungspruefung und ohne
|
|
* Mitarbeiter-Regel. Ohne nicht-leere customerId ist die Antwort in jedem Modus false.
|
|
*/
|
|
export function neueAnsichtFuerKunde(kunde) {
|
|
const modus = neueAnsichtModus()
|
|
if (modus === 'off') return false
|
|
if (!istObjekt(kunde) || !istText(kunde.customerId)) return false
|
|
if (modus === 'on') return true
|
|
return stehtInPilotListe(kunde.email)
|
|
}
|