Kundenansicht: Beenden mit Rueckweg ins Ticketsystem, /me mit Ansichts-Kennung, Team-Routen Portal-Status, Protokoll, Preview-Link
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7d8ba56088
commit
c5afd42a5f
9 files changed
+284
-23
No files matched your search
+50
-1
@@ -14,6 +14,7 @@ import { loginWithAppwrite, getLoginCooldownRemainingSec, sessionNeedsSecondFact
|
||||
import {
|
||||
SESSION_REVOKED_MESSAGE,
|
||||
clearPortalSession,
|
||||
parsePortalSession,
|
||||
requireSession,
|
||||
setPortalSession,
|
||||
} from '../middleware/session.js'
|
||||
@@ -29,7 +30,15 @@ import {
|
||||
import { isPreviewProjectReady } from '../services/previewReadiness.js'
|
||||
import { consumeStaffPreviewToken } from '../services/staffPreviewTokens.js'
|
||||
import { getPortalAccessStatus } from '../services/portalAccessStatus.js'
|
||||
import { startKundenansicht } from '../services/kundenansicht.js'
|
||||
import {
|
||||
VIEW_EXPIRED_MESSAGE,
|
||||
endKundenansicht,
|
||||
isExpired,
|
||||
isKundenansicht,
|
||||
logOnce,
|
||||
setKundenansichtPreview,
|
||||
startKundenansicht,
|
||||
} from '../services/kundenansicht.js'
|
||||
import { logViewAction } from '../services/customerViewLog.js'
|
||||
import { resolveStaffAccount } from '../services/staffAccount.js'
|
||||
import { MFA_COOKIE, MFA_TTL_MS, resendStaffMfa, startStaffMfa, verifyStaffMfa } from '../services/staffMfa.js'
|
||||
@@ -265,6 +274,15 @@ router.post('/logout', (_req, res) => {
|
||||
res.json({ success: true })
|
||||
})
|
||||
|
||||
// Kundenansicht beenden ("Beenden" im Banner): Protokoll, Cookies weg, zurueck auf die Kundenseite im Ticketsystem
|
||||
router.post('/kundenansicht/ende', async (req, res) => {
|
||||
const session = parsePortalSession(req)
|
||||
if (!isKundenansicht(session)) return res.json({ redirect: `${config.womsBaseUrl}/customers` })
|
||||
await logOnce(session, 'beendet')
|
||||
endKundenansicht(res)
|
||||
return res.json({ redirect: `${config.womsBaseUrl}/customers/${encodeURIComponent(session.customerId)}` })
|
||||
})
|
||||
|
||||
router.get('/preview-access', async (req, res) => {
|
||||
const token = req.cookies?.[PREVIEW_COOKIE_NAME]
|
||||
if (!token) {
|
||||
@@ -393,6 +411,37 @@ router.get('/me', async (req, res) => {
|
||||
try {
|
||||
const session = JSON.parse(raw)
|
||||
|
||||
// Kundenansicht aus dem Ticketsystem: endet nach 2 Stunden, Preview-Zugang nur fuer diesen Kunden
|
||||
if (isKundenansicht(session)) {
|
||||
if (isExpired(session)) {
|
||||
endKundenansicht(res)
|
||||
await logOnce(session, 'abgelaufen')
|
||||
return res.json({ authenticated: false, reason: 'view_expired', message: VIEW_EXPIRED_MESSAGE })
|
||||
}
|
||||
const doc = await getDocument(config.collections.customers, session.customerId).catch(() => null)
|
||||
if (!doc) {
|
||||
endKundenansicht(res)
|
||||
return res.json({ authenticated: false })
|
||||
}
|
||||
const existing = req.cookies?.[PREVIEW_COOKIE_NAME]
|
||||
const preview = existing ? await verifyPreviewSessionToken(existing) : null
|
||||
if (preview?.role !== 'customer' || preview.customerId !== session.customerId) {
|
||||
const remainingSec = Math.max(1, Math.ceil((session.viewExpiresAt - Date.now()) / 1000))
|
||||
await setKundenansichtPreview(res, session, remainingSec).catch((err) =>
|
||||
console.warn('[kundenansicht] Preview-Cookie nicht gesetzt:', err.message)
|
||||
)
|
||||
}
|
||||
return res.json({
|
||||
authenticated: true,
|
||||
role: 'admin',
|
||||
viewAs: true,
|
||||
viewId: session.viewId,
|
||||
viewExpiresAt: session.viewExpiresAt,
|
||||
admin: { name: session.adminName || 'Mitarbeiter', email: session.adminEmail || '', isAdmin: Boolean(session.isAdmin) },
|
||||
customer: sanitizeCustomer(doc),
|
||||
})
|
||||
}
|
||||
|
||||
// Admin-Session (Ticketsystem-Mitarbeiter), optional im "Als Kunde ansehen"-Modus
|
||||
if (session.role === 'admin' && session.appwriteUserId) {
|
||||
// Sessions von vor der Mitarbeiter-Freigabe kennen das Flag nicht - die
|
||||
|
||||
Reference in new issue
Block a user