From 9a92eaa92c057d4a8ae873ae72068054fda1428c Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Fri, 23 Feb 2024 11:51:59 +0700 Subject: [PATCH] PDF Designer --- .../VerbrauchsausweisWohnen/erstellen.cy.ts | 5 +- package.json | 3 + src/client/lib/validateAccessToken.ts | 28 +- .../Admin/DashboardAdminAusweis.svelte | 1394 +++++++++++++++++ .../Dashboard/DashboardSidebar.svelte | 23 +- .../VerbrauchsausweisWohnen_2016.ts | 4 - src/modules/Ausweise/AusweisWeiter.svelte | 2 +- .../DashboardAusweisePruefenModule.svelte | 34 + .../DashboardPDFDesignerModule.svelte | 98 ++ .../Dashboard/DashboardPDFViewerModule.svelte | 95 ++ .../dashboard/admin/ausweise-pruefen.astro | 15 + src/pages/dashboard/admin/pdf-designer.astro | 10 + src/pages/dashboard/admin/pdf-viewer.astro | 18 + src/pages/dashboard/index.astro | 18 +- src/server/lib/validateAccessToken.ts | 37 +- tailwind.config.cjs | 12 +- 16 files changed, 1750 insertions(+), 46 deletions(-) create mode 100644 src/components/Dashboard/Admin/DashboardAdminAusweis.svelte create mode 100644 src/modules/Dashboard/DashboardAusweisePruefenModule.svelte create mode 100644 src/modules/Dashboard/DashboardPDFDesignerModule.svelte create mode 100644 src/modules/Dashboard/DashboardPDFViewerModule.svelte create mode 100644 src/pages/dashboard/admin/ausweise-pruefen.astro create mode 100644 src/pages/dashboard/admin/pdf-designer.astro create mode 100644 src/pages/dashboard/admin/pdf-viewer.astro diff --git a/cypress/e2e/VerbrauchsausweisWohnen/erstellen.cy.ts b/cypress/e2e/VerbrauchsausweisWohnen/erstellen.cy.ts index 0164ed33..2c6f1513 100644 --- a/cypress/e2e/VerbrauchsausweisWohnen/erstellen.cy.ts +++ b/cypress/e2e/VerbrauchsausweisWohnen/erstellen.cy.ts @@ -244,12 +244,15 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => { // Der Ausweis sollte jetzt schon erstellt worden sein und wir sollten auf die kundendaten seite weitergeleitet worden sein. cy.url().should("contain", "/kundendaten"); + cy.wait(1000) + // Wir füllen jetzt die Kundendaten aus. + cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau"); cy.get("input[name='vorname']").should("contain.value", vorname); cy.get("input[name='name']").should("contain.value", nachname); cy.get("input[name='email']").should("contain.value", email); cy.get("input[name='telefon']").type(faker.phone.number()); - + cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`); cy.get("input[name='rechnung_strasse']").type(faker.location.streetAddress()); // TODO: Random Plz generieren, allerdings muss die auch in der Datenbank vorhanden sein... diff --git a/package.json b/package.json index d9946142..9b373fcf 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,9 @@ "@ibcornelsen/database": "link:@ibcornelsen/database", "@ibcornelsen/ui": "^0.0.2", "@mollie/api-client": "^3.7.0", + "@pdfme/common": "^3.2.3", + "@pdfme/generator": "^3.2.3", + "@pdfme/ui": "^3.2.3", "@trpc/client": "^10.45.0", "@trpc/server": "^10.45.0", "astro": "^2.5.1", diff --git a/src/client/lib/validateAccessToken.ts b/src/client/lib/validateAccessToken.ts index 408a7232..1f10b632 100644 --- a/src/client/lib/validateAccessToken.ts +++ b/src/client/lib/validateAccessToken.ts @@ -1,6 +1,7 @@ import Cookies from "js-cookie"; -import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "../../lib/constants"; +import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME, API_UID_COOKIE_NAME } from "../../lib/constants"; import { client } from "src/trpc"; +import moment from "moment"; export async function validateAccessTokenClient() { @@ -8,7 +9,11 @@ export async function validateAccessTokenClient() { const refreshToken = Cookies.get(API_REFRESH_TOKEN_COOKIE_NAME); if (accessToken) { - return true; + const { valid } = await client.v1.benutzer.validateAccessToken.query({accessToken}) + + if (!valid) { + Cookies.remove(API_ACCESS_TOKEN_COOKIE_NAME); + } } // Wir haben keinen Access Token mehr, vielleicht ist dieser ausgelaufen. @@ -16,6 +21,9 @@ export async function validateAccessTokenClient() { if (!refreshToken) { // Wir haben keinen Refresh Token, also müssen wir uns neu anmelden. + Cookies.remove(API_ACCESS_TOKEN_COOKIE_NAME); + Cookies.remove(API_REFRESH_TOKEN_COOKIE_NAME); + Cookies.remove(API_UID_COOKIE_NAME) return false; } @@ -23,21 +31,25 @@ export async function validateAccessTokenClient() { // Wenn das klappt, dann haben wir auch einen neuen Access Token. // Wenn das nicht klappt, dann müssen wir uns neu anmelden. try { - const { accessToken: newAccessToken, exp } = await client.v1.benutzer.getAccessToken.query({ + const { accessToken: newAccessToken, accessTokenExpiry, refreshToken: newRefreshToken, refreshTokenExpiry } = await client.v1.benutzer.getAccessToken.query({ refreshToken }) - const options = { + Cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, newAccessToken, { domain: `.${window.location.hostname}`, path: "/", - expires: exp - } - - Cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, newAccessToken, options); + expires: moment.unix(accessTokenExpiry).toDate() + }); + Cookies.set(API_REFRESH_TOKEN_COOKIE_NAME, newRefreshToken, { + domain: `.${window.location.hostname}`, + path: "/", + expires: moment.unix(refreshTokenExpiry).toDate() + }) return true; } catch (e) { Cookies.remove(API_ACCESS_TOKEN_COOKIE_NAME); Cookies.remove(API_REFRESH_TOKEN_COOKIE_NAME); + Cookies.remove(API_UID_COOKIE_NAME) return false; } } \ No newline at end of file diff --git a/src/components/Dashboard/Admin/DashboardAdminAusweis.svelte b/src/components/Dashboard/Admin/DashboardAdminAusweis.svelte new file mode 100644 index 00000000..0240448b --- /dev/null +++ b/src/components/Dashboard/Admin/DashboardAdminAusweis.svelte @@ -0,0 +1,1394 @@ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {ausweis["kontrolldatei"] + ? `` + : ""} + {!ausweis["regnummer"] + ? `` + : ""} + +
Status
{zurueckGestellt}
+ {table1Z1}
{table1Z2} + +
+ {table2Z1}
{table2Z2} + +
+ {table3Z1}
{table3Z2} + +
+ {table4Z1}
{table4Z2} + +
+ {table5Z1}
{table5Z2} + +
+ {table6Z1}
{table6Z2} + +
+ {table7Z1}
{table7Z2} + +
+ {table8Z1}
{table8Z2} + +
+ {table9Z1}
{table9Z2} + +
+ {table10Z1}
{table10Z2} + +
+ {table11Z1}
{table11Z2} + +
+ {table12Z1}
{table12Z2} + +
+ {table13Z1}
{table13Z2} + +
+ {table14Z1}
{table14Z2} + +
+ {table15Z1}
{table15Z2} + +
+ {table16Z1}
{table16Z2} + +
+ Gebäudebilder +
+ Boxpruefung + +
EnergieausweisDatenblattF
+
+
+
diff --git a/src/components/Dashboard/DashboardSidebar.svelte b/src/components/Dashboard/DashboardSidebar.svelte index a2ba991e..ca86aba0 100644 --- a/src/components/Dashboard/DashboardSidebar.svelte +++ b/src/components/Dashboard/DashboardSidebar.svelte @@ -1,7 +1,7 @@ + +

Ausweise

+ +
+ + {#await ausweisRequest} + + + + {:then ausweise} + {#if ausweise.length == 0} +
+

Es konnten keine Ausweise gefunden werden.

+

Erstellen sie einen Verbrauchsausweis für ihr Wohngebäude hier

+
+ {:else} + {#each ausweise as ausweis} + + {/each} + {/if} + {/await} + +
\ No newline at end of file diff --git a/src/modules/Dashboard/DashboardPDFDesignerModule.svelte b/src/modules/Dashboard/DashboardPDFDesignerModule.svelte new file mode 100644 index 00000000..51a72cf3 --- /dev/null +++ b/src/modules/Dashboard/DashboardPDFDesignerModule.svelte @@ -0,0 +1,98 @@ + + +
+ + + + + Test in Viewer + +
+ +
diff --git a/src/modules/Dashboard/DashboardPDFViewerModule.svelte b/src/modules/Dashboard/DashboardPDFViewerModule.svelte new file mode 100644 index 00000000..ecc1af2e --- /dev/null +++ b/src/modules/Dashboard/DashboardPDFViewerModule.svelte @@ -0,0 +1,95 @@ + + +
+
+ +
+
+
+
+

Ausweise

+ {#each ausweise as ausweis} +
+

{ausweis.gebaeude_stammdaten.adresse}

+ +
+ {/each} +
+
+
\ No newline at end of file diff --git a/src/pages/dashboard/admin/ausweise-pruefen.astro b/src/pages/dashboard/admin/ausweise-pruefen.astro new file mode 100644 index 00000000..819c919e --- /dev/null +++ b/src/pages/dashboard/admin/ausweise-pruefen.astro @@ -0,0 +1,15 @@ +--- +import UserLayout from "../../../layouts/UserLayout.astro"; +import { validateAccessTokenServer } from "src/server/lib/validateAccessToken"; +import DashboardAusweisePruefenModule from "#modules/Dashboard/DashboardAusweisePruefenModule.svelte"; + +const accessTokenValid = await validateAccessTokenServer(Astro); + +if (!accessTokenValid) { + return Astro.redirect("/auth/login") +} +--- + + + + \ No newline at end of file diff --git a/src/pages/dashboard/admin/pdf-designer.astro b/src/pages/dashboard/admin/pdf-designer.astro new file mode 100644 index 00000000..fd17c173 --- /dev/null +++ b/src/pages/dashboard/admin/pdf-designer.astro @@ -0,0 +1,10 @@ +--- +import UserLayout from "../../../layouts/UserLayout.astro"; +import DashboardPDFDesignerModule from "../../../modules/Dashboard/DashboardPDFDesignerModule.svelte"; + + +--- + + + + \ No newline at end of file diff --git a/src/pages/dashboard/admin/pdf-viewer.astro b/src/pages/dashboard/admin/pdf-viewer.astro new file mode 100644 index 00000000..892f647a --- /dev/null +++ b/src/pages/dashboard/admin/pdf-viewer.astro @@ -0,0 +1,18 @@ +--- +import UserLayout from "../../../layouts/UserLayout.astro"; +import DashboardPDFViewerModule from "../../../modules/Dashboard/DashboardPDFViewerModule.svelte"; +import { prisma } from "@ibcornelsen/database/server"; + +const ausweise = await prisma.verbrauchsausweisWohnen.findMany({ + take: 10, + include: { + benutzer: true, + gebaeude_stammdaten: true, + rechnungen: true + } +}) +--- + + + + \ No newline at end of file diff --git a/src/pages/dashboard/index.astro b/src/pages/dashboard/index.astro index c0eec6cd..116fc6e2 100644 --- a/src/pages/dashboard/index.astro +++ b/src/pages/dashboard/index.astro @@ -1,22 +1,10 @@ --- import UserLayout from "../../layouts/UserLayout.astro"; -import { API_UID_COOKIE_NAME } from "../../lib/constants"; -import UserModule from "#modules/UserModule.svelte"; -import { prisma } from "@ibcornelsen/database/server"; +import { validateAccessTokenServer } from "src/server/lib/validateAccessToken"; -const uid = Astro.cookies.get(API_UID_COOKIE_NAME).value +const accessTokenValid = await validateAccessTokenServer(Astro); -if (!uid) { - return Astro.redirect("/auth/login") -} - -const user = await prisma.benutzer.findUnique({ - where: { - uid - } -}) - -if (!user) { +if (!accessTokenValid) { return Astro.redirect("/auth/login") } --- diff --git a/src/server/lib/validateAccessToken.ts b/src/server/lib/validateAccessToken.ts index e538c915..69946c6b 100644 --- a/src/server/lib/validateAccessToken.ts +++ b/src/server/lib/validateAccessToken.ts @@ -1,42 +1,57 @@ import { createCaller } from "#lib/caller"; -import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "#lib/constants"; +import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME, API_UID_COOKIE_NAME } from "#lib/constants"; import type { AstroGlobal } from "astro"; import moment from "moment"; -export async function validateAccessTokenServer(astro: Readonly>>) { +export async function validateAccessTokenServer(astro: AstroGlobal) { const accessToken = astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME).value; const refreshToken = astro.cookies.get(API_REFRESH_TOKEN_COOKIE_NAME).value; - if (accessToken) { - return true; - } - - // Wir haben keinen Access Token mehr, vielleicht ist dieser ausgelaufen. - // Schauen wir mal, ob wir einen Refresh Token haben. - if (!refreshToken) { // Wir haben keinen Refresh Token, also müssen wir uns neu anmelden. + astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME); + astro.cookies.delete(API_REFRESH_TOKEN_COOKIE_NAME); + astro.cookies.delete(API_UID_COOKIE_NAME) return false; } + if (accessToken) { + const { valid } = await createCaller(astro).v1.benutzer.validateAccessToken({accessToken}) + + if (!valid) { + astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME); + } else { + return true + } + } + + // Wir haben keinen Access Token mehr, vielleicht ist dieser ausgelaufen. // Wir haben einen Refresh Token, also versuchen wir uns damit anzumelden. // Wenn das klappt, dann haben wir auch einen neuen Access Token. // Wenn das nicht klappt, dann müssen wir uns neu anmelden. + // TODO: Schlägt fehl! Ich habe keine Ahnung warum. Ich habe das Gefühl, dass das an der Astro-Implementierung liegt. Der Refresh Token updated sich nicht richtig.... try { - const { accessToken: newAccessToken, exp } = await createCaller(astro).v1.benutzer.getAccessToken({ + const { accessToken: newAccessToken, accessTokenExpiry, refreshToken: newRefreshToken, refreshTokenExpiry } = await createCaller(astro).v1.benutzer.getAccessToken({ refreshToken }) astro.cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, newAccessToken, { domain: `.${astro.url.host}`, path: "/", - expires: moment.unix(exp).toDate() + expires: moment.unix(accessTokenExpiry).toDate() }); + astro.cookies.set(API_REFRESH_TOKEN_COOKIE_NAME, newRefreshToken, { + domain: `.${astro.url.host}`, + path: "/", + expires: moment.unix(refreshTokenExpiry).toDate() + }) + return true; } catch (e) { astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME); astro.cookies.delete(API_REFRESH_TOKEN_COOKIE_NAME); + astro.cookies.delete(API_UID_COOKIE_NAME) return false; } } \ No newline at end of file diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 36ddde63..0839384b 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -3,6 +3,14 @@ module.exports = { content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}", "./node_modules/@ibcornelsen/ui/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], darkMode: "class", plugins: [require("daisyui"), require("@tailwindcss/typography")], + theme: { + extend: { + colors: { + "pdf-yellow-bright": "#f3cb00", + "pdf-yellow-light": "#fff6ca", + }, + }, + }, daisyui: { themes: [{ light: { @@ -43,9 +51,7 @@ module.exports = { '--btn-text-case': 'normal', '--navbar-padding': '.5rem', - '--border-btn': '1px', - "pdf-yellow-bright": "#f3cb00", - "pdf-yellow-light": "#fff6ca", + '--border-btn': '1px' }, 'dark': { 'primary': '#ff7d26',