Mitarbeiter nur noch per Label: Kunden-Konten bekommen keinen Team-Zugang

Kunden haben Konten im selben Appwrite-Projekt wie das Ticketsystem. Bisher
galt als Mitarbeiter, wer einen employees-Eintrag hatte - den legte das
Ticketsystem beim Login jedes Kontos automatisch an, und jedes angemeldete
Konto konnte ihn auch selbst anlegen. Damit kam ein Kunde ueber /api/team an
Chats, Kundenansicht, Angebote und Finanzen.

- staffLabels.js: Mitarbeiter = Label "mitarbeiter" oder "admin" (setzt nur
  der Server-Key)
- Team-Eingang (requireStaffJwt) und Portal-Login-Sperre nur noch per Label;
  kein Abgleich ueber employees-Eintrag oder Mail mehr
- Portal-Login: Konto-Abruf gestoert -> 503 fuer alle (fail closed)
- Mitarbeiter anlegen/bearbeiten setzt das Label "mitarbeiter"
- scripts/mitarbeiter-zugang.mjs: --status (markiert employees-Eintraege von
  Kunden), --label, --eintrag-loeschen (nur Eintrag, nie das Konto), --rechte
  (Probelauf, --anwenden mit Sicherung, --zurueck): any/guests/users ->
  label:mitarbeiter + label:admin in Collections, Buckets und bei Dokument-/
  Datei-Sicherheit auch einzelnen Dokumenten und Dateien

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-03 10:54:09 +00:00
1 parent be7f9b1aa3
commit 2659385205
12 files changed
+602 -65

No files matched your search

+8 -12
View File
@@ -1,5 +1,6 @@
import { config } from '../config.js'
import { getEmployeeByEmail, getEmployeeByUserId } from '../services/appwriteAdmin.js'
import { getEmployeeByUserId } from '../services/appwriteAdmin.js'
import { isAdminAccount, isStaffAccount } from '../services/staffLabels.js'
/**
* Appwrite-Konto zum Bearer-JWT aus dem Ticketsystem (GET /account). null ohne Header oder wenn Appwrite
@@ -20,20 +21,15 @@ export async function appwriteAccountFromJwt(req) {
}
/**
* Mitarbeiter fuer den Team-Eingang: employees-Eintrag zur Konto-ID, Label "admin" oder - nur mit bestaetigter
* Konto-Mail - ein employees-Eintrag zur Mail. Kunden haben Konten im selben Appwrite-Projekt und koennen ihre
* Mail ohne Bestaetigung aendern; eine unbestaetigte Mail zaehlt deshalb nie.
* Mitarbeiter fuer den Team-Eingang: nur ein Konto mit Label "mitarbeiter" oder "admin" (staffLabels.js). Der
* employees-Eintrag liefert nur noch den Anzeigenamen - Kunden haben Konten im selben Appwrite-Projekt und
* konnten sich einen solchen Eintrag selbst anlegen.
*/
export async function resolveTeamStaff(account) {
if (!account?.$id) return null
const isAdmin = Array.isArray(account.labels) && account.labels.includes('admin')
let employee = await getEmployeeByUserId(account.$id).catch(() => null)
if (!employee && !isAdmin && account.emailVerification === true && account.email) {
employee = await getEmployeeByEmail(account.email).catch(() => null)
}
if (!employee && !isAdmin) return null
if (!account?.$id || !isStaffAccount(account)) return null
const employee = await getEmployeeByUserId(account.$id).catch(() => null)
return {
isAdmin,
isAdmin: isAdminAccount(account),
name: employee?.displayName || account.name || 'Mitarbeiter',
email: account.email || employee?.email || '',
}