From 058a84025c72dba4f1b8625f2bc58d508bacfe2b Mon Sep 17 00:00:00 2001 From: Carl Mahnke Date: Fri, 16 May 2025 13:48:15 +0200 Subject: [PATCH] Benutzerdaten beim Speichern/Bestellen als Admin in Tabelle Benutzer speichern --- src/astro-typesafe-api-caller.ts | 2 +- src/client/lib/speichern.ts | 2 +- src/lib/server/user.ts | 18 ++++++++++++ src/modules/KundendatenModule.svelte | 29 ++++++++++++------- src/pages/api/user/index.ts | 12 ++++++-- .../energieausweis-erstellen/bezahlung.astro | 13 +++++++-- src/pages/kundendaten.astro | 12 ++++++-- 7 files changed, 69 insertions(+), 19 deletions(-) diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 262124be..c7f1a074 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -5,6 +5,7 @@ export const createCaller = createCallerFactory({ "klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"), "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), "unterlage": await import("../src/pages/api/unterlage.ts"), + "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"), "admin/bedarfsausweis-ausstellen": await import("../src/pages/api/admin/bedarfsausweis-ausstellen.ts"), "admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"), @@ -12,7 +13,6 @@ export const createCaller = createCallerFactory({ "admin/nicht-ausstellen": await import("../src/pages/api/admin/nicht-ausstellen.ts"), "admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"), "admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"), - "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "ausweise": await import("../src/pages/api/ausweise/index.ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"), diff --git a/src/client/lib/speichern.ts b/src/client/lib/speichern.ts index 14b72f79..17f5487f 100644 --- a/src/client/lib/speichern.ts +++ b/src/client/lib/speichern.ts @@ -178,7 +178,7 @@ export async function benutzerSpeichern(benutzer: Partial): Promise; + export let impersonatedUser: Partial | null = null; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen; export let aufnahme: AufnahmeClient; export let objekt: ObjektClient; @@ -61,6 +62,10 @@ ort = rechnung?.ort || localStorage.getItem("kundendaten.ort") || user.ort || ""; zusatzzeile = rechnung?.zusatzzeile || localStorage.getItem("kundendaten.zusatzzeile") || "" telefon = rechnung?.telefon || localStorage.getItem("kundendaten.telefon") || user.telefon || ""; + } else if (impersonatedUser) { + vorname = impersonatedUser.vorname || ""; + name = impersonatedUser.name || ""; + telefon = impersonatedUser.telefon || ""; } let abweichende_versand_adresse = JSON.parse(localStorage.getItem("kundendaten.abweichende_versand_adresse") || "false") @@ -253,13 +258,14 @@ } let resultUser: Awaited> | Awaited> | null = null; - - const benutzerObjekt = exclude({ - ...user, - name, - vorname, - telefon - }, ["rolle"]); + let baseUser = (impersonatedUser?impersonatedUser:user) + + const benutzerObjekt = { + ...baseUser, + name, + vorname, + telefon + }; resultUser = await benutzerSpeichern(benutzerObjekt); @@ -327,13 +333,14 @@ } let resultUser: Awaited> | Awaited> | null = null; - - const benutzerObjekt = exclude({ - ...user, + let baseUser = (impersonatedUser?impersonatedUser:user) + + const benutzerObjekt = { + ...baseUser, name, vorname, telefon - }, ["rolle"]); + }; resultUser = await benutzerSpeichern(benutzerObjekt); diff --git a/src/pages/api/user/index.ts b/src/pages/api/user/index.ts index 69c986b7..cc6a90cf 100644 --- a/src/pages/api/user/index.ts +++ b/src/pages/api/user/index.ts @@ -9,10 +9,10 @@ import { Benutzer, prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { BenutzerSchema } from "src/generated/zod/benutzer.js"; import { z } from "zod"; +import { Enums } from "#lib/client/prisma.js"; export const POST = defineApiRoute({ input: BenutzerSchema.omit({ - id: true, lex_office_id: true, rolle: true, created_at: true @@ -24,6 +24,7 @@ export const POST = defineApiRoute({ } const updateData: any = {}; + updateData.id = user.id; if (input.adresse) updateData.adresse = input.adresse; if (input.anrede) updateData.anrede = input.anrede; if (input.email) updateData.email = input.email; @@ -37,9 +38,16 @@ export const POST = defineApiRoute({ if (input.telefon) updateData.telefon = input.telefon; if (input.verified) updateData.telefon = input.verified; + //Admin may update other users + if (user.rolle == Enums.BenutzerRolle.ADMIN && input.id != user.id) { + updateData.id = input.id; + } else if(user.rolle != Enums.BenutzerRolle.ADMIN && input.id != user.id){ + return; + } + await prisma.benutzer.update({ where: { - id: user.id + id: updateData.id }, data: updateData }); diff --git a/src/pages/energieausweis-erstellen/bezahlung.astro b/src/pages/energieausweis-erstellen/bezahlung.astro index ef1a437c..fcbcd990 100644 --- a/src/pages/energieausweis-erstellen/bezahlung.astro +++ b/src/pages/energieausweis-erstellen/bezahlung.astro @@ -3,10 +3,11 @@ import { getAusweisartFromId } from "#components/Ausweis/types"; import AusweisLayoutPruefung from "#layouts/AusweisLayoutPruefung.astro"; import { getPrismaAusweisAdapter } from "#lib/server/ausweis"; import { Enums } from "#lib/server/prisma"; -import { getCurrentUser } from "#lib/server/user"; +import { getCurrentUser, getOtherUser } from "#lib/server/user"; import KundendatenModule from "#modules/KundendatenModule.svelte"; import { PaymentStatus } from "@mollie/api-client"; import { AusweisTyp } from "src/generated/enums"; +import { BenutzerClient } from "#components/Ausweis/types.js"; const uid = Astro.url.searchParams.get("uid") @@ -45,8 +46,16 @@ if (!ausweis) { if (ausweis.rechnung.status === PaymentStatus.paid) { return Astro.redirect("/dashboard") } + +let impersonatedUser: Partial | null = null; + +if (user){ + if (user.id !== ausweis.benutzer_id){ + impersonatedUser = await getOtherUser(Astro, ausweis.benutzer_id) || {} + } +} --- - + diff --git a/src/pages/kundendaten.astro b/src/pages/kundendaten.astro index cab2da8d..239b60e2 100644 --- a/src/pages/kundendaten.astro +++ b/src/pages/kundendaten.astro @@ -3,9 +3,10 @@ import KundendatenModule from "#modules/KundendatenModule.svelte"; import AusweisLayout from "#layouts/AusweisLayoutPruefung.astro"; import { Enums } from "#lib/client/prisma"; -import { getCurrentUser } from "#lib/server/user"; +import { getCurrentUser, getOtherUser } from "#lib/server/user"; import { getAusweisartFromId } from "#components/Ausweis/types"; import { getAufnahme, getBedarfsausweisWohnen, getBilder, getObjekt, getRechnung, getUnterlagen, getVerbrauchsausweisGewerbe, getVerbrauchsausweisWohnen } from "#lib/server/db"; +import { BenutzerClient } from "#components/Ausweis/types.js"; // Man sollte nur auf diese Seite kommen, wenn ein Ausweis bereits vorliegt und in der Datenbank abgespeichert wurde. @@ -70,9 +71,16 @@ if (!params.has("ausweis") || !params.has("aufnahme") || !params.has("objekt") | } } +let impersonatedUser: Partial | null = null; + +if (user){ + if (user.id !== ausweis.benutzer_id){ + impersonatedUser = await getOtherUser(Astro, ausweis.benutzer_id) || {} + } +} --- - +