Files
online-energieausweis/src/pages/api/user/index.ts
Moritz Utcke ba7792a4b9 Ausstellen
2025-04-07 21:27:38 -04:00

136 lines
2.9 KiB
TypeScript

import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { adminMiddleware, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { hashPassword } from "#lib/password.js";
import { createLexOfficeCustomer } from "#lib/server/lexoffice.js";
import { sendRegisterMail } from "#lib/server/mail/registrierung.js";
import { 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";
export const POST = defineApiRoute({
input: BenutzerSchema.omit({
id: true,
lex_office_id: true,
rolle: true,
created_at: true,
updated_at: true
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
if (user.email !== input.email) {
// TODO: Email wurde geändert, neue Bestätigunsmail schicken.
}
await prisma.benutzer.update({
where: {
id: user.id
},
data: {
adresse: input.adresse,
anrede: input.anrede,
email: input.email,
firma: input.firma,
name: input.name,
vorname: input.vorname,
ort: input.ort,
passwort: hashPassword(input.passwort),
plz: input.plz,
profilbild: input.profilbild,
telefon: input.telefon,
}
})
},
})
export const GET = defineApiRoute({
input: z.object({
id: UUidWithPrefix
}).or(z.object({
take: z.number(),
email: z.string()
})),
output: z.array(BenutzerSchema),
middleware: adminMiddleware,
async fetch(input, context, admin) {
if ("id" in input) {
const user = await prisma.benutzer.findUnique({
where: {
id: input.id
}
})
if (!user) {
return [];
}
return [user];
} else {
const users = await prisma.benutzer.findMany({
where: {
email: {
startsWith: input.email
}
},
take: input.take
})
return users;
}
},
})
export const PUT = defineApiRoute({
input: z.object({
email: z.string().email(),
passwort: z.string().min(8),
vorname: z.string(),
name: z.string()
}),
output: z.object({
id: UUidWithPrefix
}),
async fetch(input) {
const existingUser = await prisma.benutzer.findUnique({
where: {
email: input.email
}
})
if (existingUser) {
throw new APIError({
code: "CONFLICT",
message: "Email Adresse ist bereits vergeben."
})
}
const id = generatePrefixedId(9, VALID_UUID_PREFIXES.User);
const user = await prisma.benutzer.create({
data: {
email: input.email,
passwort: hashPassword(input.passwort),
vorname: input.vorname,
name: input.name,
id
}
})
const lex_office_id = await createLexOfficeCustomer(user);
await prisma.benutzer.update({
where: {
id: user.id
},
data: {
lex_office_id
}
})
await sendRegisterMail(user)
return { id }
},
})