From b35b1b2efea8887a4605fc64b0f4f894d368c989 Mon Sep 17 00:00:00 2001 From: j-weissen Date: Mon, 13 Nov 2023 02:13:47 +0100 Subject: [PATCH] inital commit --- .gitignore | 33 ++ .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 62547 bytes .mvn/wrapper/maven-wrapper.properties | 2 + db/docker-compose.yml | 16 + docs/Angabe.md | 190 +++++++++++ mvnw | 308 ++++++++++++++++++ mvnw.cmd | 205 ++++++++++++ pom.xml | 66 ++++ .../aeticket/AeticketApplication.java | 13 + .../me/jweissen/aeticket/model/Category.java | 29 ++ .../me/jweissen/aeticket/model/Event.java | 36 ++ .../java/me/jweissen/aeticket/model/User.java | 24 ++ src/main/resources/application.yml | 0 .../aeticket/AeticketApplicationTests.java | 13 + 14 files changed, 935 insertions(+) create mode 100644 .gitignore create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 db/docker-compose.yml create mode 100644 docs/Angabe.md create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/me/jweissen/aeticket/AeticketApplication.java create mode 100644 src/main/java/me/jweissen/aeticket/model/Category.java create mode 100644 src/main/java/me/jweissen/aeticket/model/Event.java create mode 100644 src/main/java/me/jweissen/aeticket/model/User.java create mode 100644 src/main/resources/application.yml create mode 100644 src/test/java/me/jweissen/aeticket/AeticketApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cb28b0e37c7d206feb564310fdeec0927af4123a GIT binary patch literal 62547 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 z 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�OxG1%p^jXan)U`Au@`Z?)L+64}GDQ8*b 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 literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..5f0536e --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/db/docker-compose.yml b/db/docker-compose.yml new file mode 100644 index 0000000..1fe002c --- /dev/null +++ b/db/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3.8' + +services: + database: + container_name: database_myticket + image: mysql:8.0 + command: --default-authentication-plugin=mysql_native_password --log_bin_trust_function_creators=1 + environment: + MYSQL_ROOT_PASSWORD: rootpwd + MYSQL_DATABASE: myticket + MYSQL_USER: my + MYSQL_PASSWORD: ticket + ports: + - '4306:3306' + volumes: + - ./mysql:/var/lib/mysql \ No newline at end of file diff --git a/docs/Angabe.md b/docs/Angabe.md new file mode 100644 index 0000000..774f847 --- /dev/null +++ b/docs/Angabe.md @@ -0,0 +1,190 @@ +# Projekt "MyTicket.com", `Informationstechnische Projekte 5AHITN 2023 / 2024` + +## Aufgabenstellung +Es ist die Managementsoftware für einen Ticketshop zu erstellen. +Ihre Software soll zur Verwaltung von Veranstaltungen und der zugehörigen Vorverkaufstickets verwendet werden. +Es soll möglich sein über einen Administratoraccount unterschiedliche Events zu verwalten (hinzufügen / lesen / aktualisieren / löschen). +Jedes Event hat ein Start- und Enddatum (inkl. Uhrzeit), einen Namen, eine Detailbeschreibung. + +Für jedes Event können mehrere Ticketkategorien angelegt werden. Jede Kategorie hat ein bestimmtes Kontingent (Anzahl möglicher Karten) und einen bestimmten Ticketpreis. + +> **Beispiel:** Sie erzeugen für die für Ihren Maturaball "Maturaball HTL Steyr 2024" eine Veranstaltung. Veranstaltungsstart ist am 02. März 2024 um 20:00 Uhr. +> Es gibt drei Ticketkategorien: Kategorie A mit einem Kontingent von 500 Karten um 25€ je Ticket, Kategorie B mit einem Kontingent von 500 Karten um 22€ je Ticket und Kategorie C mit einem Kontingent von 350 Karten um 18€ je Ticket. + +Über Ihren Ticketshop können sich Endkunden Tickets für Veranstaltungen kaufen. +Um Tickets für eine Veranstaltung zu erwerben, müssen sich Endkunden im Ticketshop mit einem Benutzerkonto registrieren. +Ein registrierter Benutzer kann sich anschließend über die erfassten Benutzerdaten im System anmelden und (womöglich mehrere) Tickets unterschiedlicher Kategorien und unterschiedlicher Veranstaltungen in seinen Warenkorb legen. + +Im letzten Schritt (Checkout) wird der Gesamtpreis berechnet und die Zahlung getätigt. + +> **Beispiel:** Der Benutzer Peter Rathgeb kauft sich für die Veranstaltung "Maturaball HTL Steyr 2024" zwei Tickets der Kategorie A und ein Ticket der Kategorie B. Zusätzlich erwirbt der Benutzer zwei Tickets der Kategorie B (zu je 12€) für die Veranstaltung "Frühjahrskonzert Schulorchester HTL Steyr". +> Der Gesamtpreis seines Warenkorbs beträgt also 2 x 25€ + 1 x 22€ + 2 x 12€ = 118€ + +Sollten Tickets der gewählten Kategorie in der gewählten Menge nicht mehr verfügbar sein, so es nicht möglich sein, die Tickets der gewählten Kategorie in den Warenkorb zu legen. + + +## Umsetzung +Erstellen Sie für den obenstehenden Sachverhalt eine SpringWeb - Anwendung. Erstellen Sie für die Entitäten jeweils eine Model - Klasse (z.B. User, Event, Ticket, ...) in denen Sie die Eigenschaften und die Beziehungen der einzelnen Klassen zueinander abbilden. Diese Model - Klassen sollen über die entsprechenden Repositories und der JPA mit der Datenbank kommunizieren. Erstellen Sie zudem für jede Entity Klasse entsprechende Data-Transfer-Object - Klassen. Außerdem soll die Kommunikation zwischen Controllerendpunkt und Datenbank (Repository) über Service - Klassen gekapselt sein. + +__Erstellen Sie für den Admin - Benutzer Endpunkte für folgende Endpunkte:__ + * Verwaltung der Veranstaltungen (neu anlegen / bearbeiten / löschen) + * Verwaltung der Ticketkategorien (neu anlegen / bearbeiten / löschen) + * Verwaltung der Benutzer (neu anlegen / bearbeiten / löschen) + +__Erstellen Sie für alle anderen Benutzer Endpunkte für folgende Aufgaben:__ + * Registrierung eines neuen Benutzers + * Login eines bestehenden Benutzers + * Laden der zukünftigen Veranstaltungen + * Laden der Ticketkategorien einer Veranstaltung + * Tickets zum Warenkorb hinzufügen + * Checkout des Warenkorbs + * Laden der getätigten Bestellungen (inkl. aller Infos wie z.B. + +__Schreiben Sie Testfälle (Unit - Tests) für folgende Schnittstellen:__ + * Alle Methoden des Cart - Controller (Alle Endpunkte) + * Alle (sinnvollen) Methoden Ihrer Services + * Alle (sinnvollen = selbstgeschriebenen) Methoden Ihrer Repositories + +__Dokumentieren Sie alle Endpunkte Ihrer Anwendung (sprindoc)!__ + +__Testen Sie Ihre Endpunkte über eine im Projekt enthaltene requests.http - Datei.__ + +Befüllen Sie Ihre Anwendung mit sinnvollen Testdaten (Benutzer, Events, Ticketkategorien eines Events, Bestellungen, ...). Gerne können Sie bei Unklarheiten eigene Annahmen machen. + +## docker-compose.yml +```yml +version: '3.8' + +services: + database: + container_name: database_myticket + image: mysql:8.0 + command: --default-authentication-plugin=mysql_native_password --log_bin_trust_function_creators=1 + environment: + MYSQL_ROOT_PASSWORD: rootpwd + MYSQL_DATABASE: myticket + MYSQL_USER: my + MYSQL_PASSWORD: ticket + ports: + - '4306:3306' + volumes: + - ./mysql:/var/lib/mysql +``` + +## Endpunkte +### Registrierung + * `POST` - Request + * Endpunkt: `/api/v1/user/signup` + * Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt. + `{"email":"ratp@htl-steyr.ac.at", "password": "test", "firstname": "Peter", "lastname": "Rathgeb"}` + * Im Erfolgsfall wird der Statuscode `200` / der Accesstoken, der für 10 Minuten gültig ist, zurückgegeben. + * Bei Misserfolg wird der Statuscode `401` zurückgebeben. + +### Login + * `POST` - Request + * Endpunkt: `/api/v1/user/signin` + * Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt. + `{"email":"ratp@htl-steyr.ac.at", "password": "test"}` + * Im Erfolgsfall wird der Statuscode `200` / der Accesstoken, der für 10 Minuten gültig ist, zurückgegeben. + * Bei Misserfolg wird der Statuscode `401` zurückgebeben. + +### Benutzer ändern (nur für Administratoren zugänglich) + * `PUT` - Request + * Endpunkt: `/api/v1/user/update` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt. + `{"id": 1, "name": "Peter Rathgeb", "email": "peter@rathgeb.at"}` + * Im Erfolgsfall wird der Statuscode `200` zurückgegeben. + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Benutzer löschen (nur für Administratoren zugänglich) + * `DELETE` - Request + * Endpunkt: `/api/v1/user/delete/{id}` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Im Erfolgsfall wird der Statuscode `200` zurückgegeben. + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Benutzerliste laden (nur für Administratoren zugänglich) + * `GET` - Request + * Endpunkt: `/api/v1/user/list` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `[{"id": 1, "firstname": "Peter", "lastname": "Rathgeb", "email": "ratp@htl-steyr.ac.at"}, {"id": 2, "firstname": "Max", "lastname": "Musetermann", "email": "max@mustermann.at"}, ...]` + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Benutzer laden (nur für Administratoren zugänglich) + * `GET` - Request + * Endpunkt: `/api/v1/user/load/{id}` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `{"id": 1, "firstname": "Peter", "lastname": "Rathgeb" "email": "ratp@htl-steyr.ac.at"}` + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Event erzeugen (nur für Administratoren zugänglich) + * `POST` - Request + * Endpunkt: `/api/v1/event/create` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt. + `{"name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 20:00", "to": "03.03.2024 05:00", "description": "Maturaball der Abteilungen EL, IT, ME, Y", "ticketCategories": [{"name": "A", "price": 25, "stock": 500}, {"name": "B", "price": 22, "stock": 500}, {"name": "C", "price": 18, "stock": 300}]}` + * Im Erfolgsfall wird der Statuscode `200` zurückgegeben. + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Event ändern (nur für Administratoren zugänglich) + * `PUT` - Request + * Endpunkt: `/api/v1/event/update` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt. + `{"id": 1, "name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 19:00", "to": "03.03.2024 05:00", "description": "Bester Ball der HTL Steyr", "ticketCategories": [{"id": 1, "name": "A", "price": 26, "stock": 550}, {"id": 2, "name": "B", "price": 22, "stock": 500}, {"id": 3, "name": "C", "price": 18, "stock": 300}]}` + * Im Erfolgsfall wird der Statuscode `200` zurückgegeben. + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Event löschen (nur für Administratoren zugänglich) + * `DELETE` - Request + * Endpunkt: `/api/v1/event/{id}` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Im Erfolgsfall wird der Statuscode `200` zurückgegeben. + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Event laden + * `GET` - Request + * Endpunkt: `/api/v1/event/{id}` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `{"id": 1, "name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 19:00", "to": "03.03.2024 05:00", "description": "Bester Ball der HTL Steyr", "ticketCategories": [{"id": 1, "name": "A", "price": 25, "stock": 500}, {"id": 2, "name": "B", "price": 22, "stock": 500}, {"id": 3, "name": "C", "price": 18, "stock": 300}]}` + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Zukünftige Events laden + * `GET` - Request + * Endpunkt: `/api/v1/event/list` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `[{"id": 1, "name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 19:00", "to": "03.03.2024 05:00", "description": "Bester Ball der HTL Steyr", "ticketCategories": [{"id": 1, "name": "A", "price": 2, "stock": 500}, {"id": 2, "name": "B", "price": 22, "stock": 500}, {"id": 3, "name": "C", "price": 18, "stock": 300}]}, {"id": 1, "name": "Frühjahrskonzert der HTL Steyr", "from": "09.04.2024 19:00", "to": "09.04.2024 21:00", "description": "Konzert des Schulorchestersr", "ticketCategories": [{"id": 4, "name": "A", "price": 12, "stock": 50}, {"id": 5, "name": "B", "price": 10, "stock": 50}, {"id": 6, "name": "C", "price": 8, "stock": 50}]}]` + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Tickets zum Warenkorb hinzufügen + * `POST` - Request + * Endpunkt: `/api/v1/cart/add` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Erfoderliche Daten werden im Requst - Body als JSON - Objekt mitgeschickt. + `{"id": 1, tickets: [{"id": 1, "amount": 2}, {"id": 2, "amount": 1}]}` + * Im Erfolgsfall wird der Statuscode `200` zurückgegeben. + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Warenkorb laden + * `GET` - Request + * Endpunkt: `/api/v1/cart/list` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Im Erfolgsfall wird der Statuscode `200` und folgende Daten zurückgegeben: `[{"id": 1, "name": "Maturaball HTL Steyr 2024", "from": "02.03.2024 19:00", "to": "03.03.2024 05:00", "description": "Bester Ball der HTL Steyr", "tickets": [{"id": 1, "name": "A", "price": 25, "amount": 2}, {"id": 2, "name": "B", "price": 22, "amount": 1}]}, {"id": 2, "name": "Frühjahrskonzert der HTL Steyr", "from": "09.04.2024 19:00", "to": "09.04.2024 21:00", "description": "Konzert des Schulorchestersr", "tickets": [{"id": 4, "name": "A", "price": 12, "amount": 2}]}]` + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + +### Tickets kaufen + * `POST` - Request + * Endpunkt: `/api/v1/cart/checkout` + * Erforderlicher Token wird als Bearer - Token im Autorizationheader mitgeschickt. + * Im Erfolgsfall wird der Statuscode `200` und der Gesamtpreis zurückgegeben: `{"price": 118}` + * Anschließend wird eine Bestellung erzeugt und der Warenkorb für den Benutzer geleert. + * Bei Misserfolg wird der Statuscode `400` / `401` zurückgebeben. + + +## Abgabe +Abgabe ist am 20.12.2023 am Ende der Stunde (um 09:40 Uhr). +Abgabe: Projektverzeichnis +Abgabeverzeichnis: `H:\Abgabe\ITP\MyTicket` + +Für verspätete Abgaben gilt: Pro Tag Verspätung -> ein Notengrad schlechter. \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..66df285 --- /dev/null +++ b/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..95ba6f5 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..16f7a9a --- /dev/null +++ b/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.1.5 + + + me.jweissen + aeticket + 0.0.1-SNAPSHOT + aeticket + aeticket + + 21 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + com.mysql + mysql-connector-j + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + paketobuildpacks/builder-jammy-base:latest + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/me/jweissen/aeticket/AeticketApplication.java b/src/main/java/me/jweissen/aeticket/AeticketApplication.java new file mode 100644 index 0000000..9e4472a --- /dev/null +++ b/src/main/java/me/jweissen/aeticket/AeticketApplication.java @@ -0,0 +1,13 @@ +package me.jweissen.aeticket; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AeticketApplication { + + public static void main(String[] args) { + SpringApplication.run(AeticketApplication.class, args); + } + +} diff --git a/src/main/java/me/jweissen/aeticket/model/Category.java b/src/main/java/me/jweissen/aeticket/model/Category.java new file mode 100644 index 0000000..4fee061 --- /dev/null +++ b/src/main/java/me/jweissen/aeticket/model/Category.java @@ -0,0 +1,29 @@ +package me.jweissen.aeticket.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table +@Getter +@Setter +public class Category { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private Double price; + + @Column(nullable = false) + private int stock; + + @ManyToOne(optional = false) + @JoinColumn(nullable = false) + private Event event; + +} diff --git a/src/main/java/me/jweissen/aeticket/model/Event.java b/src/main/java/me/jweissen/aeticket/model/Event.java new file mode 100644 index 0000000..e750ea0 --- /dev/null +++ b/src/main/java/me/jweissen/aeticket/model/Event.java @@ -0,0 +1,36 @@ +package me.jweissen.aeticket.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Entity +@Table +@Getter +@Setter +public class Event { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String description; + + @Column(nullable = false) + private Date start; + + @Column(nullable = false) + private Date end; + + @OneToMany(mappedBy = "event") + @Column(nullable = false) + private List categories = new ArrayList<>(); + +} diff --git a/src/main/java/me/jweissen/aeticket/model/User.java b/src/main/java/me/jweissen/aeticket/model/User.java new file mode 100644 index 0000000..e450328 --- /dev/null +++ b/src/main/java/me/jweissen/aeticket/model/User.java @@ -0,0 +1,24 @@ +package me.jweissen.aeticket.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table +@Getter +@Setter +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column(nullable = false) + private String firstname; + + @Column(nullable = false) + private String lastname; + + @Column(nullable = false) + private String password; +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..e69de29 diff --git a/src/test/java/me/jweissen/aeticket/AeticketApplicationTests.java b/src/test/java/me/jweissen/aeticket/AeticketApplicationTests.java new file mode 100644 index 0000000..74d35be --- /dev/null +++ b/src/test/java/me/jweissen/aeticket/AeticketApplicationTests.java @@ -0,0 +1,13 @@ +package me.jweissen.aeticket; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AeticketApplicationTests { + + @Test + void contextLoads() { + } + +}