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:
1 parent
be7f9b1aa3
commit
2659385205
12 files changed
+602
-65
No files matched your search
@@ -14,6 +14,7 @@ import {
|
||||
updateDocument,
|
||||
Query,
|
||||
} from './appwriteAdmin.js'
|
||||
import { ADMIN_LABEL, STAFF_LABEL, isAdminAccount } from './staffLabels.js'
|
||||
|
||||
function httpError(status, message) {
|
||||
const error = new Error(message)
|
||||
@@ -36,7 +37,7 @@ function sanitizeEmployee(employee, user) {
|
||||
displayName: employee.displayName || user?.name || '',
|
||||
email: employee.email || user?.email || '',
|
||||
shortcode: employee.shortcode || '',
|
||||
isAdmin: Boolean(user?.labels?.includes('admin')),
|
||||
isAdmin: isAdminAccount(user),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,11 +46,14 @@ async function employeeWithUser(employee) {
|
||||
return sanitizeEmployee(employee, user)
|
||||
}
|
||||
|
||||
async function setAdminLabel(userId, isAdmin) {
|
||||
// Jeder Mitarbeiter traegt das Label "mitarbeiter" (Zugang zum Ticketsystem, siehe staffLabels.js);
|
||||
// isAdmin undefined laesst "admin" unveraendert
|
||||
async function setStaffLabels(userId, isAdmin) {
|
||||
const user = await getUserById(userId)
|
||||
const labels = new Set(user.labels || [])
|
||||
if (isAdmin) labels.add('admin')
|
||||
else labels.delete('admin')
|
||||
labels.add(STAFF_LABEL)
|
||||
if (isAdmin === true) labels.add(ADMIN_LABEL)
|
||||
if (isAdmin === false) labels.delete(ADMIN_LABEL)
|
||||
await updateAppwriteUserLabels(userId, [...labels])
|
||||
}
|
||||
|
||||
@@ -77,7 +81,7 @@ export async function createEmployeeWithLogin(payload) {
|
||||
const user = await createAppwriteUser({ email, password, name: displayName })
|
||||
let employee
|
||||
try {
|
||||
await setAdminLabel(user.$id, isAdmin)
|
||||
await setStaffLabels(user.$id, isAdmin)
|
||||
employee = await createDocument(config.collections.employees, {
|
||||
userId: user.$id,
|
||||
displayName,
|
||||
@@ -131,9 +135,7 @@ export async function updateEmployeeWithLogin(employeeId, payload, actorUserId)
|
||||
if (password) {
|
||||
await updateAppwriteUserPassword(employee.userId, password)
|
||||
}
|
||||
if (payload?.isAdmin !== undefined) {
|
||||
await setAdminLabel(employee.userId, Boolean(payload.isAdmin))
|
||||
}
|
||||
await setStaffLabels(employee.userId, payload?.isAdmin === undefined ? undefined : Boolean(payload.isAdmin))
|
||||
|
||||
const updated = await updateDocument(config.collections.employees, employeeId, {
|
||||
displayName,
|
||||
|
||||
Reference in new issue
Block a user