diff --git a/bun.lock b/bun.lock index aa0e1e60..5c4f4c22 100644 --- a/bun.lock +++ b/bun.lock @@ -18,7 +18,7 @@ "@trpc/client": "^10.45.2", "@trpc/server": "^10.45.2", "astro": "^4.16.17", - "astro-typesafe-api": "^0.2.0", + "astro-typesafe-api": "^0.2.1", "body-scroll-lock": "^4.0.0-beta.0", "buffer": "^6.0.3", "bun": "^1.1.45", @@ -33,6 +33,7 @@ "jwt-decode": "^4.0.0", "moment": "^2.30.1", "moment-timezone": "^0.5.46", + "nodemailer": "^6.10.0", "pdf-lib": "^1.17.1", "postcss-nested": "^7.0.2", "radix-svelte-icons": "^1.0.0", @@ -56,6 +57,7 @@ "@types/is-base64": "^1.1.3", "@types/js-cookie": "^3.0.6", "@types/jsonwebtoken": "^9.0.7", + "@types/nodemailer": "^6.4.17", "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", @@ -477,6 +479,8 @@ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.1", "", {}, "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg=="], + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@2.3.0", "", {}, "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg=="], + "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@2.5.3", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", "debug": "^4.3.4", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.3", "svelte-hmr": "^0.15.3", "vitefu": "^0.2.4" }, "peerDependencies": { "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", "vite": "^4.0.0" } }, "sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w=="], "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@1.0.4", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^2.2.0", "svelte": "^3.54.0 || ^4.0.0", "vite": "^4.0.0" } }, "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ=="], @@ -545,6 +549,8 @@ "@types/node": ["@types/node@22.13.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA=="], + "@types/nodemailer": ["@types/nodemailer@6.4.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww=="], + "@types/pug": ["@types/pug@2.0.10", "", {}, "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA=="], "@types/qs": ["@types/qs@6.9.18", "", {}, "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA=="], @@ -651,7 +657,7 @@ "astro": ["astro@4.16.18", "", { "dependencies": { "@astrojs/compiler": "^2.10.3", "@astrojs/internal-helpers": "0.4.1", "@astrojs/markdown-remark": "5.3.0", "@astrojs/telemetry": "3.1.0", "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx": "^7.25.9", "@babel/types": "^7.26.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.3", "@types/babel__core": "^7.20.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.1.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^0.7.2", "cssesc": "^3.0.0", "debug": "^4.3.7", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.5.4", "esbuild": "^0.21.5", "estree-walker": "^3.0.3", "fast-glob": "^3.3.2", "flattie": "^1.1.1", "github-slugger": "^2.0.0", "gray-matter": "^4.0.3", "html-escaper": "^3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.14", "magicast": "^0.3.5", "micromatch": "^4.0.8", "mrmime": "^2.0.0", "neotraverse": "^0.6.18", "ora": "^8.1.1", "p-limit": "^6.1.0", "p-queue": "^8.0.1", "preferred-pm": "^4.0.0", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.6.3", "shiki": "^1.23.1", "tinyexec": "^0.3.1", "tsconfck": "^3.1.4", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3", "vite": "^5.4.11", "vitefu": "^1.0.4", "which-pm": "^3.0.0", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "zod": "^3.23.8", "zod-to-json-schema": "^3.23.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-G7zfwJt9BDHEZwlaLNvjbInIw2hPryyD654314KV/XT34pJU6SfN1S+mWa8RAkALcZNJnJXCJmT3JXLQStD3Lw=="], - "astro-typesafe-api": ["astro-typesafe-api@0.2.0", "", { "peerDependencies": { "astro": "^4.16.17", "typescript": "^5.0.0", "zod": "^3.24.1" }, "bin": { "astro-typesafe-api": "src/cli.ts" } }, "sha512-KCQZyfJ2+Mw7RJS9ThY13MyOTrfUHpfpcKt7qTA0BsvJB2JgxK0x+3YfurBJF+X7tsVVACmo+0QaHS/+xJuIcg=="], + "astro-typesafe-api": ["astro-typesafe-api@0.2.1", "", { "dependencies": { "es-codec": "^0.5.0", "globby": "^14.0.2" }, "peerDependencies": { "astro": "^4.16.17", "typescript": "^5.0.0", "zod": "^3.24.1" }, "bin": { "astro-typesafe-api": "src/cli.ts" } }, "sha512-8f0McZj9fWIzT19njJ2z/1zETnbper3ejuba93t72Xvsy6aMTEDXaIGDG3xc9KWUQ9zEcNg+VS52JNWGfYm6CQ=="], "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], @@ -947,6 +953,8 @@ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "es-codec": ["es-codec@0.5.0", "", {}, "sha512-iWbSEF1McYXr++XWCQypRx8hjs887Zlka/x2BVFYp4Li3PJJucTzixoYtY2SNyZRVVPO4aQ10w6wz2rI8noiRg=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], @@ -1129,7 +1137,7 @@ "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], - "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + "globby": ["globby@14.0.2", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", "ignore": "^5.2.4", "path-type": "^5.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.1.0" } }, "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw=="], "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], @@ -1575,6 +1583,8 @@ "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + "nodemailer": ["nodemailer@6.10.0", "", {}, "sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA=="], + "nopt": ["nopt@5.0.0", "", { "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], @@ -1651,7 +1661,7 @@ "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], - "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + "path-type": ["path-type@5.0.0", "", {}, "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg=="], "path2d": ["path2d@0.1.1", "", {}, "sha512-/+S03c8AGsDYKKBtRDqieTJv2GlkMb0bWjnqOgtF6MkjdUQ9a8ARAtxWf9NgKLGm2+WQr6+/tqJdU8HNGsIDoA=="], @@ -1967,7 +1977,7 @@ "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], - "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], "slice-ansi": ["slice-ansi@3.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="], @@ -2119,6 +2129,8 @@ "unicode-trie": ["unicode-trie@2.0.0", "", { "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="], + "unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], @@ -2265,6 +2277,8 @@ "@swc/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@typescript-eslint/typescript-estree/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + "@typescript-eslint/utils/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], "ahooks/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -2299,6 +2313,8 @@ "d3-dsv/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + "dir-glob/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + "eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@2.1.0", "", {}, "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="], "express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], @@ -2435,6 +2451,8 @@ "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + "@typescript-eslint/typescript-estree/globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + "@typescript-eslint/utils/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], diff --git a/package.json b/package.json index e9e51851..5874e3d4 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@trpc/client": "^10.45.2", "@trpc/server": "^10.45.2", "astro": "^4.16.17", - "astro-typesafe-api": "^0.2.0", + "astro-typesafe-api": "^0.2.1", "body-scroll-lock": "^4.0.0-beta.0", "buffer": "^6.0.3", "bun": "^1.1.45", @@ -47,6 +47,7 @@ "jwt-decode": "^4.0.0", "moment": "^2.30.1", "moment-timezone": "^0.5.46", + "nodemailer": "^6.10.0", "pdf-lib": "^1.17.1", "postcss-nested": "^7.0.2", "radix-svelte-icons": "^1.0.0", @@ -70,6 +71,7 @@ "@types/is-base64": "^1.1.3", "@types/js-cookie": "^3.0.6", "@types/jsonwebtoken": "^9.0.7", + "@types/nodemailer": "^6.4.17", "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 152bf153..489fcfa3 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -5,9 +5,10 @@ export const createCaller = createCallerFactory({ "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"), "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), - "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), - "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), + "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), + "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), + "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "objekt": await import("../src/pages/api/objekt/index.ts"), "ticket": await import("../src/pages/api/ticket/index.ts"), diff --git a/src/components/Ausweis/Ansprechpartner.svelte b/src/components/Ausweis/Ansprechpartner.svelte index 5af4997b..420d4e8d 100644 --- a/src/components/Ausweis/Ansprechpartner.svelte +++ b/src/components/Ausweis/Ansprechpartner.svelte @@ -1,7 +1,8 @@ diff --git a/src/components/Ausweis/Ausweisart.svelte b/src/components/Ausweis/Ausweisart.svelte index 51901a87..7c840974 100644 --- a/src/components/Ausweis/Ausweisart.svelte +++ b/src/components/Ausweis/Ausweisart.svelte @@ -10,18 +10,18 @@ import { Enums } from "@ibcornelsen/database/client"; import { BedarfsausweisWohnenClient, - GebaeudeAufnahmeClient, - GebaeudeClient, + AufnahmeClient, + ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "./types.js"; - export let objekt: GebaeudeClient; + export let objekt: ObjektClient; export let ausweis: | VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; - export let aufnahme: GebaeudeAufnahmeClient; + export let aufnahme: AufnahmeClient; export let ausweisart: Enums.Ausweisart; diff --git a/src/components/Ausweis/Bezahlung.svelte b/src/components/Ausweis/Bezahlung.svelte index 278c0823..f710a792 100644 --- a/src/components/Ausweis/Bezahlung.svelte +++ b/src/components/Ausweis/Bezahlung.svelte @@ -1,10 +1,10 @@ @@ -35,21 +35,92 @@ md:grid-cols-2 md:gap-x-6 md:gap-y-8 xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8 2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2 -"> - - - - - - - - - - - - - - +" +> + + + + + + + + + + + + diff --git a/src/components/Ausweis/DaemmungImage.svelte b/src/components/Ausweis/DaemmungImage.svelte index 53466f5d..b8d9319f 100644 --- a/src/components/Ausweis/DaemmungImage.svelte +++ b/src/components/Ausweis/DaemmungImage.svelte @@ -1,11 +1,11 @@
diff --git a/src/components/Ausweis/FensterImage.svelte b/src/components/Ausweis/FensterImage.svelte index 402ae94e..70ae2845 100644 --- a/src/components/Ausweis/FensterImage.svelte +++ b/src/components/Ausweis/FensterImage.svelte @@ -1,11 +1,11 @@
diff --git a/src/components/Ausweis/HeizungImage.svelte b/src/components/Ausweis/HeizungImage.svelte index 1dc0f934..a6d15b20 100644 --- a/src/components/Ausweis/HeizungImage.svelte +++ b/src/components/Ausweis/HeizungImage.svelte @@ -1,11 +1,11 @@
diff --git a/src/components/Ausweis/LueftungundLeerstand.svelte b/src/components/Ausweis/LueftungundLeerstand.svelte index cea31ba0..7e532edc 100644 --- a/src/components/Ausweis/LueftungundLeerstand.svelte +++ b/src/components/Ausweis/LueftungundLeerstand.svelte @@ -2,8 +2,9 @@ import HelpLabel from "#components/labels/HelpLabel.svelte"; import Inputlabel from "#components/labels/InputLabel.svelte"; + import { AufnahmeClient } from "./types.js"; - export let aufnahme: GebaeudeAufnahmeClient; + export let aufnahme: AufnahmeClient; diff --git a/src/components/Ausweis/PerformanceScore.svelte b/src/components/Ausweis/PerformanceScore.svelte index 6e6fe2bb..b4d4812c 100644 --- a/src/components/Ausweis/PerformanceScore.svelte +++ b/src/components/Ausweis/PerformanceScore.svelte @@ -3,16 +3,16 @@ import ThickArrowDown from "radix-svelte-icons/src/lib/icons/ThickArrowDown.svelte"; import { BedarfsausweisWohnenClient, - GebaeudeAufnahmeClient, - GebaeudeClient, + AufnahmeClient, + ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "./types.js"; import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte"; export let ausweis: VerbrauchsausweisWohnenClient; - export let aufnahme: GebaeudeAufnahmeClient; - export let objekt: GebaeudeClient; + export let aufnahme: AufnahmeClient; + export let objekt: ObjektClient; let maxPerformance = 250; diff --git a/src/components/Ausweis/Rechnungsadresse.svelte b/src/components/Ausweis/Rechnungsadresse.svelte index 920d1989..0ff1c4fa 100644 --- a/src/components/Ausweis/Rechnungsadresse.svelte +++ b/src/components/Ausweis/Rechnungsadresse.svelte @@ -1,14 +1,13 @@ - -
+ +
- - - - - - - - - - - - - -
- - - - - - - - \ No newline at end of file + + diff --git a/src/components/Ausweis/SanierungszustandWaermedammung.svelte b/src/components/Ausweis/SanierungszustandWaermedammung.svelte index 658c0505..33031477 100644 --- a/src/components/Ausweis/SanierungszustandWaermedammung.svelte +++ b/src/components/Ausweis/SanierungszustandWaermedammung.svelte @@ -8,16 +8,16 @@ //import Label from "../Label.svelte"; import { - GebaeudeAufnahmeClient, - GebaeudeClient, + AufnahmeClient, + ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, } from "./types.js"; import { boolean } from "astro:schema"; import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte" - export let gebaeude: GebaeudeClient; - export let aufnahme: GebaeudeAufnahmeClient; + export let gebaeude: ObjektClient; + export let aufnahme: AufnahmeClient; export let ausweis: VerbrauchsausweisWohnenClient export let images: UploadedGebaeudeBild[]; diff --git a/src/components/Ausweis/StromVerbrauch.svelte b/src/components/Ausweis/StromVerbrauch.svelte index 27167a94..1b479496 100644 --- a/src/components/Ausweis/StromVerbrauch.svelte +++ b/src/components/Ausweis/StromVerbrauch.svelte @@ -14,14 +14,14 @@ import fuelList from "./brennstoffListe.js"; import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung.js"; import { - GebaeudeAufnahmeClient, - GebaeudeClient, + AufnahmeClient, + ObjektClient, VerbrauchsausweisWohnenClient, } from "./types.js"; import { addNotification } from "#components/Notifications/shared.js"; - export let gebaeude: GebaeudeClient; - export let aufnahme: GebaeudeAufnahmeClient; + export let gebaeude: ObjektClient; + export let aufnahme: AufnahmeClient; export let ausweis: VerbrauchsausweisWohnenClient; // Wir dürfen bis zu 4.5 Jahre alte Klimafaktoren benutzen, also nehmen wir alle Monate seitdem und generieren daraus die Auswahl. diff --git a/src/components/ImageGrid.svelte b/src/components/ImageGrid.svelte index a942e7d8..40853055 100644 --- a/src/components/ImageGrid.svelte +++ b/src/components/ImageGrid.svelte @@ -1,7 +1,7 @@ diff --git a/src/components/Tabellen/A6WaermeTransferMaxStroemeGesamt.svelte b/src/components/Tabellen/A6WaermeTransferMaxStroemeGesamt.svelte index 59ea0097..a1cbace3 100644 --- a/src/components/Tabellen/A6WaermeTransferMaxStroemeGesamt.svelte +++ b/src/components/Tabellen/A6WaermeTransferMaxStroemeGesamt.svelte @@ -1,9 +1,9 @@

Willkommen zurück, {user.vorname}!

diff --git a/src/modules/KundendatenModule.svelte b/src/modules/KundendatenModule.svelte index 24a9e87b..36fadbcc 100644 --- a/src/modules/KundendatenModule.svelte +++ b/src/modules/KundendatenModule.svelte @@ -1,7 +1,7 @@ -
-
- -
- - -
- -

Energiesausweis erstellen

-

Verbrauchsausweis Wohnen {PRICES.VerbrauchsausweisWohnen[0]} €

- -
+" +> +
+ +
+
+

Energiesausweis erstellen

+

+ Verbrauchsausweis Wohnen {PRICES.VerbrauchsausweisWohnen[0]} € +

+ +
- - - + - - + - - + +
+
+

Zusatzleistungen:

- -
- -
- -

Zusatzleistungen:

- - {#each services as service} - + {#each services as service}
- - -
{@html service.price} € inkl. Mwst
-
{@html service.name}
- + +
+ {@html service.price} € inkl. Mwst +
+
{@html service.name}
- {/each} - - -
- - -
- -

Kosten:

- -
- - -
-
Netto-Preis Energieausweis
:
{(price * 0.81).toFixed(2) + " €"}
+ {/each}
- -
-
Zusatzleistung (Prüfung Mehraufwand) -
:
0.00 €
-
- -
-
19% gesetzl. MwSt. -
:
{(price * 0.19).toFixed(2) + " €"}
-
-
-
Preis inkl. MwSt. -
:
{price.toFixed(2) + " €"}
-
-
-
Bezahlmethode -
:
- {selectedPaymentType} + +
+

Kosten:

+ +
+
+
Netto-Preis Energieausweis
+
:
+
+ {(price * 0.81).toFixed(2) + " €"} +
+
+ +
+
Zusatzleistung (Prüfung Mehraufwand)
+
:
+
0.00 €
+
+ +
+
19% gesetzl. MwSt.
+
:
+
+ {(price * 0.19).toFixed(2) + " €"} +
+
+
+
Preis inkl. MwSt.
+
:
+
+ {price.toFixed(2) + " €"} +
+
+
+
Bezahlmethode
+
:
+
+ {selectedPaymentType} +
+
-
- -
-
+ - - -
- - - +
+ - - + ["Wohnfläche passt zu Wohneinheiten", false], + ]} + > - - - - + + - + ["Endenergieverbrauch schlüssig", false], + ]} + > - - + bullets={[["Leerstand nicht größer als 30%.", false]]} + > - - - + [ + "Bei Baujahr vor 1978 Dach oder Geschossdecke min. 12 cm gedämmt.", + false, + ], + ]} + > +
+
+
+

Hiermit bestelle ich folgende Version des Energieausweises:

+ +
+ +
{prices[0]} € inkl. MwSt.
+
Verbrauchsausweis online als PDF per E-Mail
+
+ +
+ +
{prices[1]} € inkl. MwSt.
+
+ Verbrauchsausweis online inkl. Beratung als PDF per E-Mail
- - -
- - - - - - -
-

Hiermit bestelle ich folgende Version des Energieausweises:

- - - -
- - -
{prices[0]} € inkl. MwSt.
-
Verbrauchsausweis online als PDF per E-Mail
-
- - -
- - -
{prices[1]} € inkl. MwSt.
-
Verbrauchsausweis online inkl. Beratung als PDF per E-Mail
-
- -
- - -
{prices[2]} € inkl. MwSt.
-
Verbrauchsausweis offline als PDF per E-Mail (Sie schicken uns 3 Verbrauchsabrechnungen)
-
- - -
- -

Zusatzleistungen

- - {#each services as service} - -
- - -
{@html service.price} € inkl. Mwst
-
{@html service.name}
- -
- {/each} - - +
+ +
{prices[2]} € inkl. MwSt.
+
+ Verbrauchsausweis offline als PDF per E-Mail (Sie schicken uns 3 + Verbrauchsabrechnungen) +
- - -
-
-
- - - +
+

Zusatzleistungen

+ {#each services as service} +
+ +
+ {@html service.price} € inkl. Mwst +
+
{@html service.name}
+
+ {/each} +
+ + - diff --git a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte index 42fdccc7..3d286748 100644 --- a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte +++ b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte @@ -27,7 +27,7 @@ import BilderZusatzsysteme from "../../components/Ausweis/BilderZusatzsysteme.svelte"; import moment from "moment"; import { Enums } from "@ibcornelsen/database/client"; - import { GebaeudeClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js"; + import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js"; import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; export let ausweis: VerbrauchsausweisGewerbeClient; diff --git a/src/pages/DIN18599/berechnungstabellen/index.astro b/src/pages/DIN18599/berechnungstabellen/index.astro index e93dd257..99d6db6f 100644 --- a/src/pages/DIN18599/berechnungstabellen/index.astro +++ b/src/pages/DIN18599/berechnungstabellen/index.astro @@ -3,7 +3,7 @@ import Layout from "#layouts/Layout.astro"; import { berechnungNutzenergiebedarfHeizen } from "#lib/Berechnungen/BedarfsausweisWohnen/BerechnungNutzenergiebedarfHeizen.js" import A12NutzenergiebedarfHeizung from "#components/Tabellen/A12NutzenergiebedarfHeizung.svelte"; -import { BedarfsausweisWohnenClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types"; +import { BedarfsausweisWohnenClient, AufnahmeClient } from "#components/Ausweis/types"; import A1AnlagenBeschreibung from "#components/Tabellen/A1AnlagenBeschreibung.svelte"; import A1AllgemeineAnlagenbeschreibung from "#components/Tabellen/A1AllgemeineAnlagenbeschreibung.svelte"; import A2WaermequellenSolareEinstrahlungWintergarten from "#components/Tabellen/A2WaermequellenSolareEinstrahlungWintergarten.svelte"; @@ -20,7 +20,7 @@ import A14AufwandszahlenMittlereBelastung from "#components/Tabellen/A14Aufwands import A15AufwandszahlenGesamtErzeugernutzWaerme from "#components/Tabellen/A15AufwandszahlenGesamtErzeugernutzWaerme.svelte"; const ausweis: BedarfsausweisWohnenClient = {}; -const gebaeude_aufnahme: GebaeudeAufnahmeClient = { flaeche: 152 } +const gebaeude_aufnahme: AufnahmeClient = { flaeche: 152 } --- diff --git a/src/pages/api/auth/forgot-password.ts b/src/pages/api/auth/forgot-password.ts new file mode 100644 index 00000000..d9252123 --- /dev/null +++ b/src/pages/api/auth/forgot-password.ts @@ -0,0 +1,137 @@ +import { APIError, defineApiRoute } from "astro-typesafe-api/server"; +import { z } from "zod"; +import * as nodemailer from "nodemailer" +import { prisma } from "@ibcornelsen/database/server"; +import { decodeToken, encodeToken } from "#lib/auth/token.js"; +import { TokenType } from "#lib/auth/types.js"; +import { hashPassword } from "#lib/password.js"; + +export const GET = defineApiRoute({ + input: z.object({ + email: z.string().email() + }), + output: z.void(), + async fetch(input, context, transfer) { + const user = await prisma.benutzer.findUnique({ + where: { + email: input.email + } + }) + + if (!user) { + // Wir senden einen INTERNAL_SERVER_ERROR zurück, damit man nicht aus dem Fehler schließen kann, ob es den Nutzer gibt. + throw new APIError({ + code: "INTERNAL_SERVER_ERROR", + message: "Etwas ist schiefgelaufen, bitte versuchen sie es erneut." + }) + } + + // Wir generieren einen Token der für 30 Minuten gültig ist, damit der Nutzer das Passwort zurücksetzen kann. + const resetToken = encodeToken({ + exp: Date.now() + 15 * 60 * 1000, + typ: TokenType.Reset, + uid: user.uid + }) + + const transport = nodemailer.createTransport({ + host: "smtp.ionos.de", + port: 465, + secure: true, + auth: { + user: "info@online-energieausweis.org", + pass: "Katendeich5a2024!" + } + }) + + const info = await transport.sendMail({ + from: `"IBCornelsen" `, + to: input.email, + subject: "Zurücksetzen ihres Passworts", + text: `Hallo ${user.vorname}, + +sie haben eine Anfrage zum Zurücksetzen ihres Passworts gestellt. Klicken sie auf den folgenden Link, um ein neues Passwort festzulegen: + +https://ibcornelsen.de/auth/passwort-zuruecksetzen?t=${resetToken} + +Dieser Link ist für die nächsten 15 Minuten gültig. Falls du diese Anfrage nicht gestellt hast, kannst du diese E-Mail ignorieren - dein Passwort bleibt unverändert. + +Falls du Hilfe benötigst, kontaktiere uns unter info@online-energieausweis.org. + +Viele Grüße, +IBCornelsen` + }) + + if (info.rejected) { + throw new APIError({ + code: "INTERNAL_SERVER_ERROR", + message: "Etwas ist schiefgelaufen, bitte versuchen sie es erneut." + }) + } + }, +}) + +export const POST = defineApiRoute({ + input: z.object({ + token: z.string(), + passwort: z.string() + }), + output: z.void(), + async fetch(input, context, transfer) { + const decoded = decodeToken(input.token); + + if (!decoded.exp || decoded.exp < Date.now() || decoded.typ !== TokenType.Reset || !decoded.uid) { + throw new APIError({ + code: "BAD_REQUEST", + message: "Der von ihnen benutzte Token ist nicht mehr gültig." + }) + } + + const user = await prisma.benutzer.findUnique({ + where: { + uid: decoded.uid + } + }) + + if (!user) { + throw new APIError({ + code: "NOT_FOUND", + message: "Kein Benutzer passt zu dem genutzten Token." + }) + } + + const hashed = hashPassword(input.passwort) + + await prisma.benutzer.update({ + where: { + uid: decoded.uid + }, + data: { + passwort: hashed + } + }) + + const transport = nodemailer.createTransport({ + host: "smtp.ionos.de", + port: 465, + secure: true, + auth: { + user: "info@online-energieausweis.org", + pass: "Katendeich5a2024!" + } + }) + + const info = await transport.sendMail({ + from: `"IBCornelsen" `, + to: user.email, + subject: "Ihr Passwort wurde erfolgreich zurückgesetzt", + text: `Hallo ${user.vorname}, + +Ihr Passwort wurde erfolgreich zurückgesetzt. Sie können sich jetzt mit Ihrem neuen Passwort anmelden. + +Falls Sie diese Änderung nicht selbst vorgenommen haben, setzen Sie Ihr Passwort bitte sofort erneut zurück und kontaktieren Sie unseren Support unter info@online-energieausweis.org. + +Viele Grüße, +IBCornelsen` + }) + }, +}) \ No newline at end of file diff --git a/src/pages/auth/passwort-zuruecksetzen.astro b/src/pages/auth/passwort-zuruecksetzen.astro index b5908dd9..11b2e8c5 100644 --- a/src/pages/auth/passwort-zuruecksetzen.astro +++ b/src/pages/auth/passwort-zuruecksetzen.astro @@ -2,6 +2,8 @@ import PasswortZuruecksetzenModule from "../../modules/Auth/PasswortZuruecksetzenModule.svelte"; import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; import MinimalLayout from "#layouts/MinimalLayout.astro"; +import { decodeToken } from "#lib/auth/token"; +import { TokenType } from "#lib/auth/types"; const valid = await validateAccessTokenServer(Astro) @@ -9,10 +11,19 @@ if (valid) { return Astro.redirect("/dashboard") } -const token = Astro.url.searchParams.get("token") +const token = Astro.url.searchParams.get("t") if (!token) { - return Astro.redirect("/login") + return Astro.redirect("/") +} + +const decoded = decodeToken(token) + +console.log(decoded.exp, Date.now()); + + +if (!decoded.exp || decoded.exp < Date.now() || decoded.typ !== TokenType.Reset) { + return Astro.redirect("/") } ---