Datenbank Umstellung

This commit is contained in:
Moritz Utcke
2023-12-09 10:40:39 +05:30
parent 2a995a1e8a
commit 9a6f5218d0
18 changed files with 242 additions and 106 deletions

20
.github/workflows/build-and-test.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: Build and Test
on:
push:
branches: [ dev ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Build the application
uses: actions/checkout@v3
- uses: oven-sh/setup-bun@v1
with:
bun-version: "latest"
- run: bun install
- run: bun run build
- run: bun run test:unit
- run: bun run test:e2e

View File

@@ -1,15 +1,15 @@
name: Node.js CD name: Dev Pipeline
on: on:
push: push:
branches: [ main ] branches: [ dev ]
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Deploy using ssh - name: Deploy dev changes.
uses: appleboy/ssh-action@master uses: appleboy/ssh-action@master
with: with:
host: "212.227.155.91" host: "212.227.155.91"

27
.github/workflows/prod-pipeline.yml vendored Normal file
View File

@@ -0,0 +1,27 @@
name: Production Deployment
on:
release:
types: [ created ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Deploy to production.
uses: appleboy/ssh-action@master
with:
host: "212.227.155.91"
username: "root"
password: "!2Zc727cI1"
port: 22
script: |
cd ~/apps/online-energieausweis
git reset --hard HEAD
git clean -f -d
git pull origin main
git status
npm install -g bun
bun install
bash build.sh

View File

@@ -28,7 +28,6 @@
- [License](#license) - [License](#license)
- [Kontakt](#kontakt) - [Kontakt](#kontakt)
## Beschreibung ## Beschreibung
Dies ist das Repository für das Online-Energieausweis Projekt des IBCornelsen. Eine Demo kann direkt über GitHub heruntergeladen und mit **Docker** gestartet werden. Dies ist das Repository für das Online-Energieausweis Projekt des IBCornelsen. Eine Demo kann direkt über GitHub heruntergeladen und mit **Docker** gestartet werden.
@@ -41,10 +40,10 @@ Die meisten unserer Systeme sind für Ubuntu gedacht und darauf getestet worden.
Für dieses Projekt benötigst du: Für dieses Projekt benötigst du:
* docker - docker
* Installationsanleitungen für **docker** kannst du [hier](https://docs.docker.com/engine/install/) finden. - Installationsanleitungen für **docker** kannst du [hier](https://docs.docker.com/engine/install/) finden.
* Einen Package Manger deiner Wahl, du kannst **NPM**, **pNPM** oder auch **Yarn** verwenden. Wir empfehlen allerdings **bun** aufgrund der verbesserten Geschwindigkeit und dem gelieferten Feature Set, da **bun** sowohl einen Package Manager als auch einen Task Runner beinhaltet. - Einen Package Manger deiner Wahl, du kannst **NPM**, **pNPM** oder auch **Yarn** verwenden. Wir empfehlen allerdings **bun** aufgrund der verbesserten Geschwindigkeit und dem gelieferten Feature Set, da **bun** sowohl einen Package Manager als auch einen Task Runner beinhaltet.
* Installationsanleitungen für **bun** kannst du [hier](https://bun.sh/) finden. - Installationsanleitungen für **bun** kannst du [hier](https://bun.sh/) finden.
### Installation ### Installation
@@ -64,10 +63,10 @@ Für dieses Projekt benötigst du:
## Nächste Schritte ## Nächste Schritte
* [ ] Funktionierender Checkout Flow - [ ] Funktionierender Checkout Flow
* [ ] Performance Optimierungen - [ ] Performance Optimierungen
* [ ] Automatische Tests - [ ] Automatische Tests
* [ ] Dokumentation - [ ] Dokumentation
Siehe alle [offenen issues](https://github.com/IBCornelsen/online-energieausweis/issues) für eine Liste der vorgeschlagenen Features (und bekannten Probleme). Siehe alle [offenen issues](https://github.com/IBCornelsen/online-energieausweis/issues) für eine Liste der vorgeschlagenen Features (und bekannten Probleme).

8
cypress.config.ts Normal file
View File

@@ -0,0 +1,8 @@
import { defineConfig } from 'cypress'
export default defineConfig({
e2e: {
baseUrl: 'http://localhost:3000',
supportFile: false
},
})

View File

@@ -0,0 +1,5 @@
describe('The Home page.', () => {
it("successfully loads", () => {
cy.visit("/")
})
})

View File

@@ -8,18 +8,21 @@ services:
- database - database
environment: environment:
PORT: 3000 PORT: 3000
DB_CONNECTION: "postgresql://main:hHMP8cd^N3SnzGRR@database:5432/main" DB_CONNECTION: ${DATABASE_URL}
NODE_ENV: "development" NODE_ENV: "development"
ports: ports:
- 3000:3000 - 3000:3000
volumes: volumes:
- ./:/online-energieausweis - ./:/online-energieausweis
- ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui - ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui
- ./node_modules/@ibcornelsen/database:/online-energieausweis/node_modules/@ibcornelsen/database
- ./persistent:/persistent - ./persistent:/persistent
networks: networks:
- postgres - postgres
database: database:
build: ../database build: ../database
env_file:
- ../database/.env
ports: ports:
- "5436:5432" - "5436:5432"
networks: networks:

View File

@@ -12,7 +12,8 @@
"test:unit": "bun test", "test:unit": "bun test",
"format": "prettier --write .", "format": "prettier --write .",
"build:production": "astro build && bun --bun server.js", "build:production": "astro build && bun --bun server.js",
"i18n:generate": "bunx astro-i18next generate" "i18n:generate": "bunx astro-i18next generate",
"prisma:studio": "bunx prisma studio --schema=./node_modules/@ibcornelsen/database/prisma/schema.prisma"
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
@@ -20,6 +21,7 @@
"@astrojs/node": "^5.1.4", "@astrojs/node": "^5.1.4",
"@astrojs/svelte": "^2.2.0", "@astrojs/svelte": "^2.2.0",
"@astrojs/tailwind": "^3.1.3", "@astrojs/tailwind": "^3.1.3",
"@ibcornelsen/database": "link:@ibcornelsen/database",
"@ibcornelsen/ui": "^0.0.2", "@ibcornelsen/ui": "^0.0.2",
"@mollie/api-client": "^3.7.0", "@mollie/api-client": "^3.7.0",
"astro": "^2.5.1", "astro": "^2.5.1",
@@ -50,6 +52,7 @@
"@types/uuid": "^9.0.1", "@types/uuid": "^9.0.1",
"@typescript-eslint/eslint-plugin": "^5.59.6", "@typescript-eslint/eslint-plugin": "^5.59.6",
"@typescript-eslint/parser": "^5.59.6", "@typescript-eslint/parser": "^5.59.6",
"cypress": "^13.6.1",
"eslint": "~8.15.0", "eslint": "~8.15.0",
"eslint-config-prettier": "8.1.0", "eslint-config-prettier": "8.1.0",
"prettier": "^2.8.8", "prettier": "^2.8.8",

View File

@@ -1,6 +1,5 @@
--- ---
import i18next from "i18next"; import i18next from "i18next";
import { HeadHrefLangs } from "astro-i18next/components";
import "../style/global.scss"; import "../style/global.scss";
import Footer from "../components/Footer.astro"; import Footer from "../components/Footer.astro";
@@ -108,6 +107,11 @@ const schema = JSON.stringify({
</html> </html>
<style is:global> <style is:global>
article {
@apply rounded-lg w-full shadow-md border;
}
body { body {
min-height: 100vh; min-height: 100vh;
} }

View File

@@ -1,7 +1,8 @@
import { db } from "../shared"; import { db, prisma } from "../shared";
import { UserRegisterValidator, UserType, UserTypeValidator } from "./type"; import { UserRegisterValidator, UserType, UserTypeValidator } from "./type";
import { v4 as uuid } from "uuid"; import { v4 as uuid } from "uuid";
import { hashPassword } from "../Password"; import { hashPassword } from "../Password";
import type { Benutzer } from "@ibcornelsen/database";
export class User { export class User {
@@ -10,12 +11,16 @@ export class User {
* @param uid Die unique/public id des gesuchten Benutzers. * @param uid Die unique/public id des gesuchten Benutzers.
* @returns {UserType | null} Die Daten des Nutzers oder null falls dieser nicht gefunden werden kann. * @returns {UserType | null} Die Daten des Nutzers oder null falls dieser nicht gefunden werden kann.
*/ */
public static async fromUID(uid: string): Promise<UserType | null> { public static async fromUID(uid: string): Promise<Benutzer | null> {
if (!uid || typeof uid !== "string") { if (!uid || typeof uid !== "string") {
return null; return null;
} }
const user = await db<UserType>("benutzer").select("*").where("uid", uid).first(); const user = await prisma.benutzer.findUnique({
where: {
uid
}
})
if (!user) { if (!user) {
return null; return null;
@@ -24,12 +29,16 @@ export class User {
return user; return user;
} }
public static async fromEmail(email: string): Promise<UserType | null> { public static async fromEmail(email: string): Promise<Benutzer | null> {
if (!email || typeof email !== "string") { if (!email || typeof email !== "string") {
return null; return null;
} }
const user = await db<UserType>("benutzer").select("*").where("email", email).first(); const user = await prisma.benutzer.findUnique({
where: {
email
}
})
if (!user) { if (!user) {
return null; return null;
@@ -43,12 +52,16 @@ export class User {
* @param uid Die private id des gesuchten Benutzers. * @param uid Die private id des gesuchten Benutzers.
* @returns {UserType | null} Die Daten des Nutzers oder null falls dieser nicht gefunden werden kann. * @returns {UserType | null} Die Daten des Nutzers oder null falls dieser nicht gefunden werden kann.
*/ */
public static async fromPrivateId(id: number): Promise<UserType | null> { public static async fromPrivateId(id: number): Promise<Benutzer | null> {
if (!id || typeof id !== "number") { if (!id || typeof id !== "number") {
return null; return null;
} }
const user = await db<UserType>("benutzer").select("*").where("id", id).first(); const user = await prisma.benutzer.findUnique({
where: {
id
}
})
if (!user) { if (!user) {
return null; return null;
@@ -65,11 +78,16 @@ export class User {
const uid = uuid(); const uid = uuid();
const hashedPassword = hashPassword(user.passwort); const hashedPassword = hashPassword(user.passwort);
const result = await db<UserType>("benutzer").insert({ const result = await prisma.benutzer.create({
data: {
email: user.email, email: user.email,
passwort: hashedPassword, passwort: hashedPassword,
uid: uid uid: uid
}, ["id"]) },
select: {
id: true
}
})
if (!result) { if (!result) {
return null; return null;
@@ -77,7 +95,7 @@ export class User {
return { return {
uid, uid,
id: result[0].id id: result.id
} }
} }
} }

View File

@@ -1,18 +1,34 @@
import { Ausstellgrund, Ausweisart } from "src/lib/Ausweis/types"; import { Benutzer, Rechnungen, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
import { Energiekennwerte } from "src/lib/Energiekennwerte";
import { Gebaeude } from "src/lib/Gebaeude"; import { Gebaeude } from "src/lib/Gebaeude";
import { getKlimafaktorenClient } from "src/lib/Klimafaktoren"; import { getKlimafaktorenClient } from "src/lib/Klimafaktoren";
import { getHeizwertfaktorClient } from "src/lib/server/Heizwertfaktor"; import { getHeizwertfaktorClient } from "src/lib/server/Heizwertfaktor";
export default class Verbrauchsausweis { export class Verbrauchsausweis implements Partial<VerbrauchsausweisWohnen & { benutzer: Benutzer, rechnung: Rechnungen }> {
public ausweisart: Ausweisart = "VA"; rechnungen_id: number | null = null;
public ausstellgrund: Ausstellgrund = "Vermietung"; erstellungsdatum: Date | null = null;
public warmwasser_enthalten: boolean = true; ausstellgrund: string | null = null;
public uid?: string; registriernummer: string | null = null;
public baujahr_anlage: number[] = []; erledigt: boolean | null = null;
baujahr_heizung: number[] = [];
zusaetzliche_heizquelle: boolean | null = null;
brennstoff_1: string | null = null;
einheit_1: string | null = null;
brennstoff_2: string | null = null;
einheit_2: string | null = null;
startdatum: Date | null = null;
enddatum: Date | null = null;
verbrauch_1: number | null = null;
verbrauch_2: number | null = null;
verbrauch_3: number | null = null;
verbrauch_4: number | null = null;
verbrauch_5: number | null = null;
verbrauch_6: number | null = null;
warmwasser_enthalten: boolean | null = null;
anteil_warmwasser_1: number | null = null;
anteil_warmwasser_2: number | null = null;
public get energetische_nutzfläche(): number { public get energetischeNutzflaeche(): number {
return ( return (
this.gebaeude.wohnflaeche * this.gebaeude.wohnflaeche *
(this.gebaeude.keller_beheizt ? 1.35 : 1.2) (this.gebaeude.keller_beheizt ? 1.35 : 1.2)
@@ -21,32 +37,30 @@ export default class Verbrauchsausweis {
public regnummer?: string; public regnummer?: string;
public kennwerte: Energiekennwerte = new Energiekennwerte();
public gebaeude: Gebaeude = new Gebaeude(); public gebaeude: Gebaeude = new Gebaeude();
public constructor(initializer?: Verbrauchsausweis) { public constructor(initializer?: VerbrauchsausweisWohnen) {
if (initializer) { if (initializer) {
this.ausweisart = initializer.ausweisart; Object.assign(this, initializer)
this.kennwerte = initializer.kennwerte;
} }
} }
public get primaer_energie_verbrauch(): Promise<number> { public get primaerEnergieVerbrauch(): Promise<number> {
return (async () => { return (async () => {
const Endenergieverbrauch = await this.end_energie_verbrauch; const Endenergieverbrauch = await this.endEnergieVerbrauch;
const brennstoff_1 = getHeizwertfaktorClient( const brennstoff_1 = getHeizwertfaktorClient(
this.kennwerte.energietraeger_1, this.brennstoff_1,
this.kennwerte.einheit_1 this.einheit_1
); );
return Endenergieverbrauch * brennstoff_1.primärenergiefaktor; return Endenergieverbrauch * brennstoff_1.primärenergiefaktor;
})(); })();
} }
public get end_energie_verbrauch(): Promise<number> { public get endEnergieVerbrauch(): Promise<number> {
return (async () => { return (async () => {
const date = this.kennwerte.zeitraum; const date = this.startdatum;
const klimafaktoren = await getKlimafaktorenClient( const klimafaktoren = await getKlimafaktorenClient(
date, date,
this.gebaeude.plz this.gebaeude.plz
@@ -55,32 +69,32 @@ export default class Verbrauchsausweis {
// Endenergieverbrauch // Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
let brennstoff_1 = getHeizwertfaktorClient( let brennstoff_1 = getHeizwertfaktorClient(
this.kennwerte.energietraeger_1, this.brennstoff_1,
this.kennwerte.einheit_1 this.einheit_1
); );
let brennstoff_2 = getHeizwertfaktorClient( let brennstoff_2 = getHeizwertfaktorClient(
this.kennwerte.energietraeger_2, this.brennstoff_2,
this.kennwerte.einheit_2 this.einheit_2
); );
let verbrauch_1_kwh = let verbrauch_1_kwh =
this.kennwerte.verbrauch_1 * brennstoff_1.umrechnungsfaktor; this.verbrauch_1 * brennstoff_1.umrechnungsfaktor;
let verbrauch_2_kwh = let verbrauch_2_kwh =
this.kennwerte.verbrauch_2 * brennstoff_1.umrechnungsfaktor; this.verbrauch_2 * brennstoff_1.umrechnungsfaktor;
let verbrauch_3_kwh = let verbrauch_3_kwh =
this.kennwerte.verbrauch_3 * brennstoff_1.umrechnungsfaktor; this.verbrauch_3 * brennstoff_1.umrechnungsfaktor;
let verbrauch_4_kwh = let verbrauch_4_kwh =
this.kennwerte.verbrauch_4 * brennstoff_2.umrechnungsfaktor; this.verbrauch_4 * brennstoff_2.umrechnungsfaktor;
let verbrauch_5_kwh = let verbrauch_5_kwh =
this.kennwerte.verbrauch_5 * brennstoff_2.umrechnungsfaktor; this.verbrauch_5 * brennstoff_2.umrechnungsfaktor;
let verbrauch_6_kwh = let verbrauch_6_kwh =
this.kennwerte.verbrauch_6 * brennstoff_2.umrechnungsfaktor; this.verbrauch_6 * brennstoff_2.umrechnungsfaktor;
let warmwasserZuschlag = 0; let warmwasserZuschlag = 0;
let leerstandsZuschlag = 0; let leerstandsZuschlag = 0;
let kuehlungsZuschlag = 0; let kuehlungsZuschlag = 0;
if (this.kennwerte.anteil_warmwasser_1 == 0) { if (this.anteil_warmwasser_1 == 0) {
warmwasserZuschlag = 20 * this.energetische_nutzfläche * 3; warmwasserZuschlag = 20 * this.energetischeNutzflaeche * 3;
} }
if (this.gebaeude.leerstand > 0) { if (this.gebaeude.leerstand > 0) {
@@ -99,11 +113,11 @@ export default class Verbrauchsausweis {
} }
if (this.gebaeude.energiequelle_2_nutzung[3]) { if (this.gebaeude.energiequelle_2_nutzung[3]) {
kuehlungsZuschlag = 6 * this.energetische_nutzfläche * 3; kuehlungsZuschlag = 6 * this.energetischeNutzflaeche * 3;
} }
let anteil_heizung = 1 - this.kennwerte.anteil_warmwasser_1 / 100; let anteil_heizung = 1 - this.anteil_warmwasser_1 / 100;
let anteil_warmwasser = this.kennwerte.anteil_warmwasser_1 / 100; let anteil_warmwasser = this.anteil_warmwasser_1 / 100;
let Energieverbrauchskennwert = let Energieverbrauchskennwert =
(anteil_heizung * (anteil_heizung *
@@ -122,9 +136,10 @@ export default class Verbrauchsausweis {
leerstandsZuschlag + leerstandsZuschlag +
kuehlungsZuschlag) / kuehlungsZuschlag) /
3 / 3 /
this.energetische_nutzfläche; this.energetischeNutzflaeche;
return Energieverbrauchskennwert; return Energieverbrauchskennwert;
})(); })();
} }
} }

View File

@@ -1,4 +1,5 @@
import knex, { Knex } from "knex"; import knex, { Knex } from "knex";
export { prisma } from "@ibcornelsen/database"
export function dbOpen(): Knex { export function dbOpen(): Knex {
const db = knex({ const db = knex({
@@ -9,5 +10,4 @@ export function dbOpen(): Knex {
return db; return db;
} }
export const db = dbOpen(); export const db = dbOpen();

View File

@@ -4,22 +4,36 @@ import {
error, error,
success, success,
} from "src/lib/APIResponse"; } from "src/lib/APIResponse";
import { db } from "src/lib/shared"; import { db, prisma } from "src/lib/shared";
export const get: APIRoute = async ({ request }) => { export const get: APIRoute = async ({ url }) => {
const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1])) const body = url.searchParams
const uid = body.get("uid")
if (!body.uid) { if (!body.has("uid") || !uid) {
return error(["Missing 'uid' in request body."]) return error(["Missing 'uid' in request body."])
} }
const gebaeude = await db("gebaeude").where({ uid: body.uid }).first();
const gebaeude = await prisma.gebaeudeStammdaten.findUnique({
where: {
uid: uid
}
})
if (!gebaeude) { if (!gebaeude) {
return MissingEntityError("gebaeude") return MissingEntityError("gebaeude")
} }
const images = await db("gebaeude_bilder").where({ gebaeude_id: gebaeude.id }).select("uid", "kategorie"); const images = await prisma.gebaeudeBilder.findMany({
where: {
gebaeude_stammdaten_id: gebaeude.id
},
select: {
uid: true,
kategorie: true
}
})
return success(images); return success(images);
}; };

View File

@@ -3,26 +3,27 @@ import {
MissingEntityError, MissingEntityError,
error, error,
} from "src/lib/APIResponse"; } from "src/lib/APIResponse";
import { z } from "zod";
import * as path from "path"; import * as path from "path";
import * as fs from "fs"; import * as fs from "fs";
import { db } from "src/lib/shared"; import { prisma } from "src/lib/shared";
const ImageUploadChecker = z.object({ export const get: APIRoute = async ({ url }) => {
data: z.string(), const body = url.searchParams
name: z.string(), const uid = body.get("uid")
gebaeude_uid: z.string().optional(),
kategorie: z.string(),
});
export const get: APIRoute = async ({ request }) => { if (!body.has("uid") || !uid) {
const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1]))
if (!body.uid) {
return error(["Missing 'uid' in request body."]) return error(["Missing 'uid' in request body."])
} }
const image = await db("gebaeude_bilder").where({ uid: body.uid }).select("uid", "kategorie").first(); const image = await prisma.gebaeudeBilder.findUnique({
where: {
uid
},
select: {
uid: true,
kategorie: true
}
})
if (!image) { if (!image) {
return MissingEntityError("image") return MissingEntityError("image")

View File

@@ -9,7 +9,7 @@ import * as jimp from "jimp";
import { z } from "zod"; import { z } from "zod";
import * as path from "path"; import * as path from "path";
import * as fs from "fs"; import * as fs from "fs";
import { db } from "src/lib/shared"; import { db, prisma } from "src/lib/shared";
const ImageUploadChecker = z.object({ const ImageUploadChecker = z.object({
data: z.string(), data: z.string(),
@@ -18,14 +18,23 @@ const ImageUploadChecker = z.object({
kategorie: z.string(), kategorie: z.string(),
}); });
export const get: APIRoute = async ({ request }) => { export const get: APIRoute = async ({ url }) => {
const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1])) const body = url.searchParams
const uid = body.get("uid")
if (!body.uid) { if (!body.has("uid") || !uid) {
return error(["Missing 'uid' in request body."]) return error(["Missing 'uid' in request body."])
} }
const image = await db("gebaeude_bilder").where({ uid: body.uid }).select("uid", "kategorie").first(); const image = await prisma.gebaeudeBilder.findUnique({
where: {
uid
},
select: {
uid: true,
kategorie: true
}
})
if (!image) { if (!image) {
return MissingEntityError("image") return MissingEntityError("image")
@@ -68,30 +77,44 @@ export const put: APIRoute = async ({ request }) => {
let gebaeude; let gebaeude;
if (!body.gebaeude_uid) { if (!body.gebaeude_uid) {
gebaeude = await db("gebaeude").insert({}).returning(["uid", "id"]); gebaeude = await prisma.gebaeudeStammdaten.create({
data: {},
select: {
uid: true,
id: true
}
})
if (!gebaeude) { if (!gebaeude) {
return ActionFailedError(); return ActionFailedError();
} }
} else { } else {
gebaeude = await db("gebaeude") gebaeude = await prisma.gebaeudeStammdaten.findUnique({
.select("*") where: {
.where("uid", body.gebaeude_uid); uid: body.gebaeude_uid
}
})
if (!gebaeude) { if (!gebaeude) {
return MissingEntityError("gebaeude"); return MissingEntityError("gebaeude");
} }
} }
const result = await db("gebaeude_bilder") const result = await prisma.gebaeudeBilder.create({
.insert({ gebaeude_id: gebaeude[0].id, kategorie: body.kategorie }) data: {
.returning(["uid"]); gebaeude_stammdaten_id: gebaeude.id,
kategorie: body.kategorie
},
select: {
uid: true
}
})
if (!result) { if (!result) {
return ActionFailedError(); return ActionFailedError();
} }
const location = path.join("/persistent/uploads", `${result[0].uid}.jpg`); const location = path.join("/persistent/uploads", `${result.uid}.jpg`);
const buffer = await jimpResult.getBufferAsync(jimp.MIME_JPEG) const buffer = await jimpResult.getBufferAsync(jimp.MIME_JPEG)
@@ -102,7 +125,7 @@ export const put: APIRoute = async ({ request }) => {
} }
return success({ return success({
uid: result[0].uid, uid: result.uid,
gebaeude_uid: gebaeude[0].uid, gebaeude_uid: gebaeude.uid,
}); });
}; };

View File

@@ -51,8 +51,7 @@ changeLanguage("de");
src="images/Bedarfsausweis-Wohngebaeude-Beispiel.jpg" src="images/Bedarfsausweis-Wohngebaeude-Beispiel.jpg"
alt="Energieausweis online erstellen" alt="Energieausweis online erstellen"
/> />
</div> </div>Sie möchten Ihren <strong>Energieausweis online erstellen</strong>?
<hr />Sie möchten Ihren <strong>Energieausweis online erstellen</strong>?
Auf dieser Seite finden Sie alle nötigen Informationen hierzu. Sollten Sie Auf dieser Seite finden Sie alle nötigen Informationen hierzu. Sollten Sie
sich nicht sicher sein <a href="/energieausweis-welcher-energieausweis.php" sich nicht sicher sein <a href="/energieausweis-welcher-energieausweis.php"
>welchen Energieausweis</a >welchen Energieausweis</a

View File

@@ -1153,6 +1153,7 @@ content>*:nth-child(3) {
} }
.rpt_foot { .rpt_foot {
@apply transition-colors transition-all;
/*width: calc(100% - 60px);*/ /*width: calc(100% - 60px);*/
display: block; display: block;
padding: 10px 30px; padding: 10px 30px;
@@ -1204,8 +1205,7 @@ content>*:nth-child(3) {
.rpt_plan { .rpt_plan {
width: 100%; width: 100%;
min-width: 152px; min-width: 152px;
-webkit-box-shadow: rgb(162, 162, 162) 1px 1px 3px 1px; @apply border shadow-md;
box-shadow: rgb(162, 162, 162) 1px 1px 3px 1px;
border-radius: .4em; border-radius: .4em;
background: #f5f5f5; background: #f5f5f5;
display: -webkit-box; display: -webkit-box;
@@ -1516,8 +1516,6 @@ body .objekt_card:first-of-type {
display: -webkit-box; display: -webkit-box;
display: -ms-flexbox; display: -ms-flexbox;
display: flex; display: flex;
-webkit-box-pack: end;
-ms-flex-pack: end;
justify-content: flex-end; justify-content: flex-end;
} }

View File

@@ -18,7 +18,6 @@ article hr {
article { article {
@apply px-8 py-6 w-full relative bg-white; @apply px-8 py-6 w-full relative bg-white;
box-shadow: rgb(162, 162, 162) 1px 1px 3px 1px;
} }
article h1 { article h1 {