Nicht-eingeloggte Nutzer sollen sich einfacher registrieren/authentifizieren können. Speichern oder Bestellen nicht-eingeloggte Nutzer auf der Kundendaten-Seite, so soll ein Popup aufgehen, wo sie einen Bestätigungscode eingeben können. Dieser Code wird umgehend an ihre eingegene Email gesendet. Wird der Code efolgreich eingegeben gibt es zwei Fälle: Unter der Email existiert bereits ein Account → Der Ausweis wird dann diesem User zugewiesen Unter der Email existiet noch kein Account → Ein neuer Account wird angelegt und der Ausweise dem neuen Account zugewiesen Wird ein neuner Account automatisch angelegt, so benötigen wir auch noch einen Prozess, wie der Nutzer dann sein Passwort vergeben kann. Idealerweise erhält er in seiner Willkommensmail einen Link zur Passwort setzung. Alternativ nutzt er einfach die bestehende Passwortrücksetzen-Funktion auf der Webseite. Um bei der Erstregistrierung soll ein Zahlencode an die eingegebene E-Mail verschickt werden. Dieser muss dann vom User eingegeben werden um die Registrierung bzw. meistens ja dann die Erstbestellung abzuschließen. Der Zahlencode kann ja dann das Passwort sein. Wir weisen den Kunden darauf hin sich ein eigenes Passwort zu vergeben.
66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
import { z } from "zod";
|
|
import { prisma } from "#lib/server/prisma.js";
|
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
|
import { verifyCode } from "#lib/pin.js";
|
|
import { logger } from "#lib/logger.js";
|
|
|
|
export const PUT = defineApiRoute({
|
|
meta: {
|
|
description:
|
|
"Erstellt, basierend auf einem existierenden und gültigen Refresh Tokens, einen neuen Access Token, welcher zur Authentifizierung genutzt werden kann. Der resultierende Access Token ist nur 2 Tage gültig und muss danach neu generiert werden. Diese Funktion gibt ebenfalls einen neuen Refresh Token zurück, der alte wird dadurch invalidiert.",
|
|
tags: ["Benutzer"],
|
|
summary: "Access Token anfragen.",
|
|
},
|
|
input: z.object({
|
|
pin: z.string(),
|
|
email: z.string(),
|
|
}),
|
|
output: z.object({
|
|
verified: z.boolean(),
|
|
}),
|
|
|
|
async fetch(input, ctx) {
|
|
const valid = verifyCode(input.email, input.pin);
|
|
if (!valid) {
|
|
throw new APIError({
|
|
code: "BAD_REQUEST",
|
|
message: "Die gegebene PIN ist nicht gültig.",
|
|
});
|
|
}
|
|
|
|
const user = await prisma.benutzer.findUnique({
|
|
where: {
|
|
email: input.email,
|
|
},
|
|
});
|
|
|
|
if (!user) {
|
|
throw new APIError({
|
|
code: "BAD_REQUEST",
|
|
message: "Die gegebene PIN ist nicht gültig.",
|
|
});
|
|
}
|
|
|
|
logger.info(`Verified ${input.email}`);
|
|
|
|
if (user.verified) {
|
|
return {
|
|
verified: true,
|
|
};
|
|
}
|
|
|
|
await prisma.benutzer.update({
|
|
where: {
|
|
id: user.id,
|
|
},
|
|
data: {
|
|
verified: true,
|
|
},
|
|
});
|
|
|
|
return {
|
|
verified: true,
|
|
};
|
|
},
|
|
});
|