diff --git a/README.md b/README.md
index f77f7fd2..a98118f2 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,113 @@
-# IBCornelsen Online Energieausweis
+[![Contributors][contributors-shield]][contributors-url]
+[![Forks][forks-shield]][forks-url]
+[![Stargazers][stars-shield]][stars-url]
+[![Issues][issues-shield]][issues-url]
+[![MIT License][license-shield]][license-url]
+
+
+
+
+- [Beschreibung](#beschreibung)
+ - [Anforderungen](#anforderungen)
+ - [Installation](#installation)
+- [Nächste Schritte](#nächste-schritte)
+- [Beiträge zu unserer Arbeit](#beiträge-zu-unserer-arbeit)
+- [License](#license)
+- [Kontakt](#kontakt)
+
+
+## Beschreibung
+
+Dies ist das Repository für die Datenbank des IBCornelsen. Eine Demo kann direkt über GitHub heruntergeladen und mit **Docker** gestartet werden.
+
+Momentan arbeiten wir an der Umsetzung einer neuen, verbesserten Datenbankstruktur die aktuelle Probleme mit Hinsicht auf die Skalierung unserer Architektur lösen wird.
+
+Hier eine Veranschaulichung:
+
+
+
+### Anforderungen
+
+Die meisten unserer Systeme sind für Ubuntu gedacht und darauf getestet worden. Viele Funktionen werden ebenfalls auf Windows verfügbar sein, allerdings können unerwartetes Verhalten und Fehler nicht ausgeschlossen werden.
+
+Für dieses Projekt benötigst du:
+
+* docker
+ * Installationsanleitungen für **docker** kannst du [hier](https://docs.docker.com/engine/install/) finden.
+* NodeJS
+ * Downloads für Node stehen [hier](https://nodejs.org/en) zur Verfügung.
+* Einen Package Manger deiner Wahl, du kannst **NPM**, **pNPM** oder auch **Yarn** verwenden. Wir empfehlen **pNPM** da er in den meisten Situationen schneller ist und dabei das gleiche Feature Set wie **NPM** bietet.
+
+### Installation
+
+1. Klone das Repository
+
+ ```sh
+ git clone https://github.com/IBCornelsen/database.git
+ ```
+
+2. Führe `docker-compose` aus.
+
+ ```bash
+ docker-compose up --build
+ ```
+
+## Nächste Schritte
+
+* [ ] Verteilte Datenbankstruktur
+* [ ] Performance Optimierungen
+* [ ] Umstieg auf PostgreSQL
+ * [ ] Umzug der alten Daten
+
+See the [open issues](https://github.com/IBCornelsen/database/issues) for a full list of proposed features (and known issues).
+
+## Beiträge zu unserer Arbeit
+
+Wenn du Ideen, Vorschläge oder sonstige Anmerkungen haben solltest, schreck' nicht davor zurück dein Feature zu implementieren und eine Pull Request zu erstellen, wir sind **immer** offen für neues!
+
+1. Erstelle einen **Fork** des Repos
+2. Erstelle einen neuen Feature Branch (`git checkout -b feature/AmazingFeature`)
+3. Committe deine Änderungen (`git commit -m 'Add some AmazingFeature'`)
+4. Pushe deine Änderungen auf den neuen Branch (`git push origin feature/AmazingFeature`)
+5. Öffne eine Pull Request
+
+## License
+
+Veröffentlicht unter der GPL-3.0 Lizenz. Siehe `LICENSE` für mehr Information.
+
+## Kontakt
+
+IBCornelsen - [info@ibcornelsen.de](mailto://info@ibcornelsen.de)
+
+Organisation: [https://github.com/IBCornelsen/database](https://github.com/IBCornelsen/database)
+
+[contributors-shield]: https://img.shields.io/github/contributors/IBCornelsen/database.svg?style=for-the-badge
+[contributors-url]: https://github.com/IBCornelsen/database/graphs/contributors
+[forks-shield]: https://img.shields.io/github/forks/IBCornelsen/database.svg?style=for-the-badge
+[forks-url]: https://github.com/IBCornelsen/database/network/members
+[stars-shield]: https://img.shields.io/github/stars/IBCornelsen/database.svg?style=for-the-badge
+[stars-url]: https://github.com/IBCornelsen/database/stargazers
+[issues-shield]: https://img.shields.io/github/issues/IBCornelsen/database.svg?style=for-the-badge
+[issues-url]: https://github.com/IBCornelsen/database/issues
+[license-shield]: https://img.shields.io/github/license/IBCornelsen/database.svg?style=for-the-badge
+[license-url]: https://github.com/IBCornelsen/database/blob/master/LICENSE
diff --git a/build.sh b/build.sh
index caacb493..0358121c 100644
--- a/build.sh
+++ b/build.sh
@@ -47,8 +47,8 @@ echo "CERTIFICATE=$(cat /etc/letsencrypt/live/ibcornelsen.de/fullchain.pem | bas
# Und starten unsere App wieder.
docker run -d --name $APP_NAME --link $DB_CONTAINER_NAME \
-v "${PERSISTENT_DIR}:/persistent" \
- -p "$APP_PORT:80" \
- -e DB_CONNECTION=postgresql://$DB_USER:$DB_PASSWORD@${DB_CONTAINER_NAME}:$DB_PORT/$DB_NAME \
- -e DB_PORT=$DB_PORT \
- --env-file ~/apps/$APP_NAME/.env \
+ -p "${APP_PORT}:80" \
+ -e DB_CONNECTION=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_CONTAINER_NAME}:${DB_PORT}/${DB_NAME} \
+ -e DB_PORT=${DB_PORT} \
+ --env-file ~/apps/${APP_NAME}/.env
$APP_NAME;
diff --git a/docker-compose.yml b/docker-compose.yml
index b393aa36..72de1dd7 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -5,7 +5,7 @@ services:
container_name: online-energieausweis
command: pnpm run dev --host
links:
- - db
+ - database
environment:
PORT: 3000
DB_CONNECTION: "postgresql://main:hHMP8cd^N3SnzGRR@database:5432/main"
@@ -18,7 +18,7 @@ services:
- ./persistent:/persistent
networks:
- postgres
- db:
+ database:
build: ../database
ports:
- "5436:5432"
diff --git a/persistent/test.txt b/persistent/test.txt
deleted file mode 100644
index e69de29b..00000000
diff --git a/persistent/uploads/images/3bfcee31-723c-45fd-a716-1118e877bdbb.jpg b/persistent/uploads/images/3bfcee31-723c-45fd-a716-1118e877bdbb.jpg
new file mode 100644
index 00000000..2ee7916b
Binary files /dev/null and b/persistent/uploads/images/3bfcee31-723c-45fd-a716-1118e877bdbb.jpg differ
diff --git a/persistent/uploads/images/c646b143-5cdf-47c9-859a-87731595b75f.jpg b/persistent/uploads/images/c646b143-5cdf-47c9-859a-87731595b75f.jpg
new file mode 100644
index 00000000..30a8069f
Binary files /dev/null and b/persistent/uploads/images/c646b143-5cdf-47c9-859a-87731595b75f.jpg differ
diff --git a/persistent/uploads/images/c6ef6b29-d1ba-4076-996c-1cbf7d470eb9.jpg b/persistent/uploads/images/c6ef6b29-d1ba-4076-996c-1cbf7d470eb9.jpg
new file mode 100644
index 00000000..cf8f91a5
Binary files /dev/null and b/persistent/uploads/images/c6ef6b29-d1ba-4076-996c-1cbf7d470eb9.jpg differ
diff --git a/persistent/uploads/images/f89fb8e5-6902-4a50-8c07-ca2094c91dd6.jpg b/persistent/uploads/images/f89fb8e5-6902-4a50-8c07-ca2094c91dd6.jpg
new file mode 100644
index 00000000..963f40b8
Binary files /dev/null and b/persistent/uploads/images/f89fb8e5-6902-4a50-8c07-ca2094c91dd6.jpg differ
diff --git a/src/components/FeatureCard.svelte b/src/components/FeatureCard.svelte
new file mode 100644
index 00000000..5176eeca
--- /dev/null
+++ b/src/components/FeatureCard.svelte
@@ -0,0 +1,26 @@
+
+
+
+
+

+ {heading}
+
+
+
inkl. 19% MwSt
+
+ €{price}
+
+
+
+
+
diff --git a/src/components/UploadImages.svelte b/src/components/UploadImages.svelte
index 10a7d081..a802b2da 100644
--- a/src/components/UploadImages.svelte
+++ b/src/components/UploadImages.svelte
@@ -60,7 +60,7 @@
const dataURL = canvas.toDataURL("image/jpeg", 0.8);
- fetch("/api/image", {
+ fetch("/api/image.json", {
method: "PUT",
body: JSON.stringify({
data: dataURL.split(';base64,')[1],
diff --git a/src/pages/api/building/images.json.ts b/src/pages/api/building/images.json.ts
new file mode 100644
index 00000000..0f6dcc6e
--- /dev/null
+++ b/src/pages/api/building/images.json.ts
@@ -0,0 +1,25 @@
+import type { APIRoute } from "astro";
+import {
+ MissingEntityError,
+ error,
+ success,
+} from "src/lib/APIResponse";
+import { db } from "src/lib/shared";
+
+export const get: APIRoute = async ({ request }) => {
+ const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1]))
+
+ if (!body.uid) {
+ return error(["Missing 'uid' in request body."])
+ }
+
+ const gebaeude = await db("gebaeude").where({ uid: body.uid }).first();
+
+ if (!gebaeude) {
+ return MissingEntityError("gebaeude")
+ }
+
+ const images = await db("gebaeude_bilder").where({ gebaeude_id: gebaeude.id }).select("uid", "kategorie");
+
+ return success(images);
+};
\ No newline at end of file
diff --git a/src/pages/api/image.jpg.ts b/src/pages/api/image.jpg.ts
new file mode 100644
index 00000000..f6341023
--- /dev/null
+++ b/src/pages/api/image.jpg.ts
@@ -0,0 +1,45 @@
+import type { APIRoute } from "astro";
+import {
+ MissingEntityError,
+ error,
+} from "src/lib/APIResponse";
+import { z } from "zod";
+import * as path from "path";
+import * as fs from "fs";
+import { db } from "src/lib/shared";
+
+const ImageUploadChecker = z.object({
+ data: z.string(),
+ name: z.string(),
+ gebaeude_uid: z.string().optional(),
+ kategorie: z.string(),
+});
+
+export const get: APIRoute = async ({ request }) => {
+ const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1]))
+
+ if (!body.uid) {
+ return error(["Missing 'uid' in request body."])
+ }
+
+ const image = await db("gebaeude_bilder").where({ uid: body.uid }).select("uid", "kategorie").first();
+
+ if (!image) {
+ return MissingEntityError("image")
+ }
+
+ // Check if the image exists on disk
+ const location = path.join("/persistent/uploads/images", `${image.uid}.jpg`);
+
+ if (!fs.existsSync(location)) {
+ return MissingEntityError("image")
+ }
+
+ const data = fs.readFileSync(location);
+
+ return new Response(data, {
+ headers: {
+ "Content-Type": "image/jpeg"
+ }
+ });
+};
\ No newline at end of file
diff --git a/src/pages/api/image.ts b/src/pages/api/image.json.ts
similarity index 72%
rename from src/pages/api/image.ts
rename to src/pages/api/image.json.ts
index be9bde72..bd2ea3a3 100644
--- a/src/pages/api/image.ts
+++ b/src/pages/api/image.json.ts
@@ -8,6 +8,7 @@ import {
import * as jimp from "jimp";
import { z } from "zod";
import * as path from "path";
+import * as fs from "fs";
import { db } from "src/lib/shared";
const ImageUploadChecker = z.object({
@@ -17,6 +18,31 @@ const ImageUploadChecker = z.object({
kategorie: z.string(),
});
+export const get: APIRoute = async ({ request }) => {
+ const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1]))
+
+ if (!body.uid) {
+ return error(["Missing 'uid' in request body."])
+ }
+
+ const image = await db("gebaeude_bilder").where({ uid: body.uid }).select("uid", "kategorie").first();
+
+ if (!image) {
+ return MissingEntityError("image")
+ }
+
+ // Check if the image exists on disk
+ const location = path.join("/persistent/uploads/images", `${image.uid}.jpg`);
+
+ if (!fs.existsSync(location)) {
+ return MissingEntityError("image")
+ }
+
+ const data = fs.readFileSync(location, { encoding: "base64" });
+
+ return success(data);
+};
+
/**
* Speichert ein Bild auf unserem Server ab und gibt die UID des Bildes zurück
* @param param0
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 8d7fc6e4..bfdea8a0 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -2,6 +2,7 @@
import { BoxWithHeading } from "@ibcornelsen/ui";
import Widget from "../components/Widget.svelte";
import Layout from "../layouts/Layout.astro";
+import FeatureCard from "~/components/FeatureCard.svelte";
---
@@ -105,21 +106,7 @@ import Layout from "../layouts/Layout.astro";
-
-
-

- Verbrauchsausweis
Wohngebäude
-
-
-
inkl. 19% MwSt
-
- €45
-
-
+
Unsere Leistungen:
Prüfung durch Diplom Ingenieur
Energieausweis Vorschau als PDF
@@ -127,29 +114,9 @@ import Layout from "../layouts/Layout.astro";
Registrierung beim DiBt
Bearbeitung innhalb 24h
rechtssicher nach aktueller EnEV
- telefonische Beratung
-
-
-
-

- Bedarfsausweis
Wohngebäude
-
-
-
- inkl. 19% MwSt
-
-
- €75
-
-
+
telefonische Beratung
+
+
Unsere Leistungen:
Prüfung durch Diplom Ingenieur
Energieausweis Vorschau als PDF
@@ -157,29 +124,9 @@ import Layout from "../layouts/Layout.astro";
Registrierung beim DiBt
Bearbeitung innhalb 24h
rechtssicher nach aktueller EnEV
-
- telefonische Beratung
-
-
-
-
-

- Verbrauchsausweis
Gewerbe
-
-
-
inkl. 19% MwSt
-
- €65
-
-
+
telefonische Beratung
+
+
Unsere Leistungen:
Prüfung durch Diplom Ingenieur
Energieausweis Vorschau als PDF
@@ -187,12 +134,8 @@ import Layout from "../layouts/Layout.astro";
Registrierung beim DiBt
Bearbeitung innhalb 24h
rechtssicher nach aktueller EnEV
- telefonische Beratung
-
+
telefonische Beratung
+