diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 1d1730fb..fbbe1e56 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -12,6 +12,7 @@ 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"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), @@ -19,7 +20,6 @@ export const createCaller = createCallerFactory({ "ausweise": await import("../src/pages/api/ausweise/index.ts"), "bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"), "bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"), - "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "bilder/[id]": await import("../src/pages/api/bilder/[id].ts"), @@ -32,12 +32,13 @@ export const createCaller = createCallerFactory({ "rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"), "rechnung": await import("../src/pages/api/rechnung/index.ts"), "ticket": await import("../src/pages/api/ticket/index.ts"), - "verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"), - "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), + "user/autocreate": await import("../src/pages/api/user/autocreate.ts"), "user": await import("../src/pages/api/user/index.ts"), "user/self": await import("../src/pages/api/user/self.ts"), "verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"), "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), + "verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"), + "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), "aufnahme/[id]/bilder": await import("../src/pages/api/aufnahme/[id]/bilder.ts"), "aufnahme/[id]": await import("../src/pages/api/aufnahme/[id]/index.ts"), diff --git a/src/lib/server/mail/auto-registrierung.ts b/src/lib/server/mail/auto-registrierung.ts new file mode 100644 index 00000000..bc579163 --- /dev/null +++ b/src/lib/server/mail/auto-registrierung.ts @@ -0,0 +1,45 @@ +import { transport } from "#lib/mail.js"; +import { + Benutzer, +} from "#lib/client/prisma.js"; + +export async function sendAutoRegisterMail( + user: Benutzer, + password: string +) { + await transport.sendMail({ + from: `"IBCornelsen" `, + to: user.email, + subject: `Ihre Registrierung bei IBCornelsen`, + bcc: "info@online-energieausweis.org", + html: `

Sehr geehrte*r ${user.vorname} ${user.name},

+

vielen Dank für Ihre Registrierung bei IBCornelsen. Ihr Benutzerkonto wurde erfolgreich erstellt.

+ + Nachfolgend finden Sie Ihre Zugangsdaten:

+ E-Mail: ${user.email}
+ Passwort: ${password}

+ + Sollten Sie diese Registrierung nicht vorgenommen haben, können Sie diese E-Mail einfach ignorieren. Ihr Benutzerkonto wird in diesem Fall nicht aktiviert.

+ + Falls Sie Fragen haben oder Unterstützung benötigen, stehen wir Ihnen gerne zur Verfügung. Kontaktieren Sie uns einfach unter support@online-energieausweis.org. +

+ Mit freundlichen Grüßen, +
+ Dipl.-Ing. Jens Cornelsen +
+
+ IB Cornelsen +
+ Katendeich 5A +
+ 21035 Hamburg +
+ www.online-energieausweis.org +
+
+ fon 040 · 209339850 +
+ fax 040 · 209339859 +

` + }); +} diff --git a/src/modules/EmbeddedAuthFlowModule.svelte b/src/modules/EmbeddedAuthFlowModule.svelte index 75878b07..2503ab66 100644 --- a/src/modules/EmbeddedAuthFlowModule.svelte +++ b/src/modules/EmbeddedAuthFlowModule.svelte @@ -2,12 +2,11 @@ import { loginClient } from "#lib/login.js"; import EmbeddedLoginModule from "./EmbeddedLoginModule.svelte" import EmbeddedRegisterModule from "./EmbeddedRegisterModule.svelte" - import EmbeddedVerifyModule from "./EmbeddedVerifyModule.svelte"; export let onLogin: (response: Awaited>) => any; export let email: string = ""; export let password: string = ""; - export let route: "login" | "signup" | "verify" = "login" + export let route: "login" | "signup" = "login" const navigate = (target: string) => { route = target as typeof route; @@ -17,12 +16,8 @@ {#if route == "login"} {:else if route == "signup"} - { + { email = response.email navigate("verify") }} {navigate} /> -{:else if route == "verify"} - { - navigate("login") - }} {navigate} /> {/if} \ No newline at end of file diff --git a/src/modules/EmbeddedLoginModule.svelte b/src/modules/EmbeddedLoginModule.svelte index 0ecb9eac..eef1f67d 100644 --- a/src/modules/EmbeddedLoginModule.svelte +++ b/src/modules/EmbeddedLoginModule.svelte @@ -26,7 +26,7 @@ } -
+

Einloggen

diff --git a/src/modules/EmbeddedRegisterModule.svelte b/src/modules/EmbeddedRegisterModule.svelte index 508d3c9d..7460866f 100644 --- a/src/modules/EmbeddedRegisterModule.svelte +++ b/src/modules/EmbeddedRegisterModule.svelte @@ -3,26 +3,15 @@ import { api } from "astro-typesafe-api/client"; export let navigate: (target: string) => void; - export let onRegister: (response: { email: string, name: string, vorname: string }) => void; - export let password: string; + export let onRegister: (response: { email: string }) => void; export let email: string; - let vorname: string; - let name: string; let repeatEmail: string; - async function signUp(e: SubmitEvent) { + async function signup(e: SubmitEvent) { e.preventDefault() - if (password.length < 8) { - addNotification({ - message: "Passwort muss mindestens 8 Zeichen enthalten.", - dismissable: true, - timeout: 3000, - type: "error" - }) - return; - } else if (email !== repeatEmail) { + if (email !== repeatEmail) { addNotification({ message: "Die eingegebenen Email Adressen stimmen nicht überein.", dismissable: true, @@ -33,18 +22,15 @@ } try { - const response = await api.user.PUT.fetch({ + const response = await api.user.autocreate.PUT.fetch({ email, - passwort: password, - vorname, - name, }); onRegister({ email, - name, - vorname }) + + navigate("login") } catch (e) { addNotification({ message: "Ups...", @@ -58,33 +44,10 @@ } - +

Registrieren

+

Bitte geben sie ihre Email ein, um einen Account beim IBC zu erstellen, ein Passwort wird ihnen per Email zugesendet, dieses können sie im Nachhinein jederzeit ändern.

-
-
-

Vorname

- -
-
-

Nachname

- -
-

Email

-
-

Passwort

- -
- + Passwort Vergessen?
diff --git a/src/modules/EmbeddedVerifyModule.svelte b/src/modules/EmbeddedVerifyModule.svelte deleted file mode 100644 index 182c5276..00000000 --- a/src/modules/EmbeddedVerifyModule.svelte +++ /dev/null @@ -1,130 +0,0 @@ - - - -

Verifizieren

-

Bitte geben Sie die 4-stellige PIN ein, den Sie per E-Mail erhalten haben.

-
-
- { - handleInput(e, 0); - }} /> - { - handleInput(e, 1); - }} /> - { - handleInput(e, 2); - }} /> - { - handleInput(e, 3); - }} /> -
- -
- -
- PIN erneut anfordern -
- \ No newline at end of file diff --git a/src/pages/api/user/autocreate.ts b/src/pages/api/user/autocreate.ts new file mode 100644 index 00000000..960d2669 --- /dev/null +++ b/src/pages/api/user/autocreate.ts @@ -0,0 +1,61 @@ +import { IDWithPrefix } from "#components/Ausweis/types.js"; +import { VALID_UUID_PREFIXES } from "#lib/constants.js"; +import { generateIDWithPrefix } from "#lib/db.js"; +import { hashPassword } from "#lib/password.js"; +import { createLexOfficeCustomer } from "#lib/server/lexoffice.js"; +import { sendAutoRegisterMail } from "#lib/server/mail/auto-registrierung.js"; +import { prisma } from "#lib/server/prisma.js"; +import { defineApiRoute, APIError } from "astro-typesafe-api/server"; +import { z } from "astro:content"; + +export const PUT = defineApiRoute({ + input: z.object({ + email: z.string().email(), + }), + output: z.object({ + id: IDWithPrefix + }), + async fetch(input) { + let { email } = input; + email = email.toLowerCase(); + + const existingUser = await prisma.benutzer.findUnique({ + where: { + email + } + }) + + if (existingUser) { + throw new APIError({ + code: "CONFLICT", + message: "Email Adresse ist bereits vergeben." + }) + } + + const id = generateIDWithPrefix(9, VALID_UUID_PREFIXES.User); + const password = crypto.randomUUID().slice(0, 8); + + const user = await prisma.benutzer.create({ + data: { + email, + passwort: hashPassword(password), + id + } + }) + + const lex_office_id = await createLexOfficeCustomer(user); + + await prisma.benutzer.update({ + where: { + id: user.id + }, + data: { + lex_office_id + } + }) + + await sendAutoRegisterMail(user, password) + + return { id } + }, +}) \ No newline at end of file