diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 48ca6fbb5d1debf221a15c1bc2606816109255fc..f5788453e7e148b54e4c11a1b5a5a4b6e028413b 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -20,7 +20,7 @@ lint: disabled: - git-diff-check enabled: - - checkov@3.2.336 + - checkov@3.2.341 - dotenv-linter@3.3.0 - hadolint@2.12.1-beta - markdownlint@0.43.0 diff --git a/java/roomBooking/.gitignore b/java/roomBooking/.gitignore deleted file mode 100644 index 549e00a2a96fa9d7c5dbc9859664a78d980158c2..0000000000000000000000000000000000000000 --- a/java/roomBooking/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/java/roomBooking/.mvn/wrapper/maven-wrapper.properties b/java/roomBooking/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index d58dfb70bab565a697e6854eb012d17e0fd39bd4..0000000000000000000000000000000000000000 --- a/java/roomBooking/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,19 +0,0 @@ -# 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 -# -# http://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. -wrapperVersion=3.3.2 -distributionType=only-script -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/java/roomBooking/Dockerfile b/java/roomBooking/Dockerfile deleted file mode 100644 index 8d0b79d6514534deddac782fc9367bcdbcaf89c3..0000000000000000000000000000000000000000 --- a/java/roomBooking/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM maven:3-openjdk-17 AS maven -WORKDIR /app -COPY ./ ./ -RUN mvn -Dmaven.test.skip clean package -FROM openjdk:17-jdk-oracle -ARG JAR_FILE=/app/target/*.jar -COPY --from=maven ${JAR_FILE} app.jar -ENV PORT 8080 -EXPOSE $PORT -ENTRYPOINT ["java","-jar", "/app.jar"] \ No newline at end of file diff --git a/java/roomBooking/mvnw b/java/roomBooking/mvnw deleted file mode 100755 index 19529ddf8c6eaa08c5c75ff80652d21ce4b72f8c..0000000000000000000000000000000000000000 --- a/java/roomBooking/mvnw +++ /dev/null @@ -1,259 +0,0 @@ -#!/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 -# -# http://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.3.2 -# -# Optional ENV vars -# ----------------- -# JAVA_HOME - location of a JDK home dir, required when download maven via java source -# MVNW_REPOURL - repo url base for downloading maven distribution -# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven -# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output -# ---------------------------------------------------------------------------- - -set -euf -[ "${MVNW_VERBOSE-}" != debug ] || set -x - -# OS specific support. -native_path() { printf %s\\n "$1"; } -case "$(uname)" in -CYGWIN* | MINGW*) - [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" - native_path() { cygpath --path --windows "$1"; } - ;; -esac - -# set JAVACMD and JAVACCMD -set_java_home() { - # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched - 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" - JAVACCMD="$JAVA_HOME/jre/sh/javac" - else - JAVACMD="$JAVA_HOME/bin/java" - JAVACCMD="$JAVA_HOME/bin/javac" - - if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then - echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 - echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 - return 1 - fi - fi - else - JAVACMD="$( - 'set' +e - 'unset' -f command 2>/dev/null - 'command' -v java - )" || : - JAVACCMD="$( - 'set' +e - 'unset' -f command 2>/dev/null - 'command' -v javac - )" || : - - if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then - echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 - return 1 - fi - fi -} - -# hash string like Java String::hashCode -hash_string() { - str="${1:-}" h=0 - while [ -n "$str" ]; do - char="${str%"${str#?}"}" - h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) - str="${str#?}" - done - printf %x\\n $h -} - -verbose() { :; } -[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } - -die() { - printf %s\\n "$1" >&2 - exit 1 -} - -trim() { - # MWRAPPER-139: - # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. - # Needed for removing poorly interpreted newline sequences when running in more - # exotic environments such as mingw bash on Windows. - printf "%s" "${1}" | tr -d '[:space:]' -} - -# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties -while IFS="=" read -r key value; do - case "${key-}" in - distributionUrl) distributionUrl=$(trim "${value-}") ;; - distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; - esac -done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" -[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" - -case "${distributionUrl##*/}" in -maven-mvnd-*bin.*) - MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ - case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in - *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; - :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; - :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; - :Linux*x86_64*) distributionPlatform=linux-amd64 ;; - *) - echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 - distributionPlatform=linux-amd64 - ;; - esac - distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" - ;; -maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; -*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; -esac - -# apply MVNW_REPOURL and calculate MAVEN_HOME -# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash> -[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" -distributionUrlName="${distributionUrl##*/}" -distributionUrlNameMain="${distributionUrlName%.*}" -distributionUrlNameMain="${distributionUrlNameMain%-bin}" -MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" -MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" - -exec_maven() { - unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : - exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" -} - -if [ -d "$MAVEN_HOME" ]; then - verbose "found existing MAVEN_HOME at $MAVEN_HOME" - exec_maven "$@" -fi - -case "${distributionUrl-}" in -*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; -*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; -esac - -# prepare tmp dir -if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then - clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } - trap clean HUP INT TERM EXIT -else - die "cannot create temp dir" -fi - -mkdir -p -- "${MAVEN_HOME%/*}" - -# Download and Install Apache Maven -verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." -verbose "Downloading from: $distributionUrl" -verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" - -# select .zip or .tar.gz -if ! command -v unzip >/dev/null; then - distributionUrl="${distributionUrl%.zip}.tar.gz" - distributionUrlName="${distributionUrl##*/}" -fi - -# verbose opt -__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' -[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v - -# normalize http auth -case "${MVNW_PASSWORD:+has-password}" in -'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; -has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; -esac - -if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then - verbose "Found wget ... using wget" - wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" -elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then - verbose "Found curl ... using curl" - curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" -elif set_java_home; then - verbose "Falling back to use Java to download" - javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" - targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" - cat >"$javaSource" <<-END - public class Downloader extends java.net.Authenticator - { - protected java.net.PasswordAuthentication getPasswordAuthentication() - { - return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); - } - public static void main( String[] args ) throws Exception - { - setDefault( new Downloader() ); - java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); - } - } - END - # For Cygwin/MinGW, switch paths to Windows format before running javac and java - verbose " - Compiling Downloader.java ..." - "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" - verbose " - Running Downloader.java ..." - "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" -fi - -# If specified, validate the SHA-256 sum of the Maven distribution zip file -if [ -n "${distributionSha256Sum-}" ]; then - distributionSha256Result=false - if [ "$MVN_CMD" = mvnd.sh ]; then - echo "Checksum validation is not supported for maven-mvnd." >&2 - echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 - exit 1 - elif command -v sha256sum >/dev/null; then - if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then - distributionSha256Result=true - fi - elif command -v shasum >/dev/null; then - if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then - distributionSha256Result=true - fi - else - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 - echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 - exit 1 - fi - if [ $distributionSha256Result = false ]; then - echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 - echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 - exit 1 - fi -fi - -# unzip and move -if command -v unzip >/dev/null; then - unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" -else - tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" -fi -printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" -mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" - -clean || : -exec_maven "$@" diff --git a/java/roomBooking/mvnw.cmd b/java/roomBooking/mvnw.cmd deleted file mode 100644 index 249bdf3822221aa612d1da2605316cabd7b07e50..0000000000000000000000000000000000000000 --- a/java/roomBooking/mvnw.cmd +++ /dev/null @@ -1,149 +0,0 @@ -<# : batch portion -@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 http://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.3.2 -@REM -@REM Optional ENV vars -@REM MVNW_REPOURL - repo url base for downloading maven distribution -@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven -@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output -@REM ---------------------------------------------------------------------------- - -@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) -@SET __MVNW_CMD__= -@SET __MVNW_ERROR__= -@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% -@SET PSModulePath= -@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( - IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) -) -@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% -@SET __MVNW_PSMODULEP_SAVE= -@SET __MVNW_ARG0_NAME__= -@SET MVNW_USERNAME= -@SET MVNW_PASSWORD= -@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) -@echo Cannot start maven from wrapper >&2 && exit /b 1 -@GOTO :EOF -: end batch / begin powershell #> - -$ErrorActionPreference = "Stop" -if ($env:MVNW_VERBOSE -eq "true") { - $VerbosePreference = "Continue" -} - -# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties -$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl -if (!$distributionUrl) { - Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" -} - -switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { - "maven-mvnd-*" { - $USE_MVND = $true - $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" - $MVN_CMD = "mvnd.cmd" - break - } - default { - $USE_MVND = $false - $MVN_CMD = $script -replace '^mvnw','mvn' - break - } -} - -# apply MVNW_REPOURL and calculate MAVEN_HOME -# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash> -if ($env:MVNW_REPOURL) { - $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } - $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" -} -$distributionUrlName = $distributionUrl -replace '^.*/','' -$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' -$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" -if ($env:MAVEN_USER_HOME) { - $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" -} -$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' -$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" - -if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { - Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" - Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" - exit $? -} - -if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { - Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" -} - -# prepare tmp dir -$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile -$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" -$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null -trap { - if ($TMP_DOWNLOAD_DIR.Exists) { - try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } - catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } - } -} - -New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null - -# Download and Install Apache Maven -Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." -Write-Verbose "Downloading from: $distributionUrl" -Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" - -$webclient = New-Object System.Net.WebClient -if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { - $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) -} -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null - -# If specified, validate the SHA-256 sum of the Maven distribution zip file -$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum -if ($distributionSha256Sum) { - if ($USE_MVND) { - Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." - } - Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash - if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { - Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." - } -} - -# unzip and move -Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null -Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null -try { - Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null -} catch { - if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { - Write-Error "fail to move MAVEN_HOME" - } -} finally { - try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } - catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } -} - -Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/java/roomBooking/pom.xml b/java/roomBooking/pom.xml deleted file mode 100644 index 30de244f0964028a4aa0b50df0ff2cf4f4b1102f..0000000000000000000000000000000000000000 --- a/java/roomBooking/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.4</version> - <relativePath/> <!-- lookup parent from repository --> - </parent> - <groupId>com.uva</groupId> - <artifactId>roomBooking</artifactId> - <version>0.0.1-SNAPSHOT</version> - <name>roomBooking</name> - <description>Room Booking rest</description> - <url/> - <licenses> - <license/> - </licenses> - <developers> - <developer/> - </developers> - <scm> - <connection/> - <developerConnection/> - <tag/> - <url/> - </scm> - <properties> - <java.version>17</java.version> - </properties> - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-rest</artifactId> - </dependency> - - <dependency> - <groupId>com.mysql</groupId> - <artifactId>mysql-connector-j</artifactId> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-security</artifactId> - </dependency> - <dependency> - <groupId>com.auth0</groupId> - <artifactId>java-jwt</artifactId> - <version>4.4.0</version> - </dependency> - <dependency> - <groupId>jakarta.servlet</groupId> - <artifactId>jakarta.servlet-api</artifactId> - <scope>provided</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/java/roomBooking/src/main/java/com/uva/monolith/RoomBookingApplication.java b/java/roomBooking/src/main/java/com/uva/monolith/RoomBookingApplication.java deleted file mode 100644 index 0a5db248da6e6be909302e323931f79151b0ed62..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/RoomBookingApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.uva.monolith; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class RoomBookingApplication { - - public static void main(String[] args) { - SpringApplication.run(RoomBookingApplication.class, args); - } - -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/config/SecurityConfig.java b/java/roomBooking/src/main/java/com/uva/monolith/config/SecurityConfig.java deleted file mode 100644 index 8264f84a2e9f57dabaedc5892ea8a3ca0e931232..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/config/SecurityConfig.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.uva.monolith.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -import com.uva.monolith.filter.JwtAuthenticationFilter; -import com.uva.monolith.services.users.models.UserRol; - -@Configuration -@EnableWebSecurity -public class SecurityConfig { - - private final JwtAuthenticationFilter jwtAuthenticationFilter; - - public SecurityConfig(JwtAuthenticationFilter jwtAuthenticationFilter) { - this.jwtAuthenticationFilter = jwtAuthenticationFilter; - } - - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.csrf(csrf -> csrf.disable()) - .authorizeHttpRequests(authorize -> authorize - // Permitir OPTIONS sin autenticación - .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll() - // Acceso restringido a usuarios y administradores - .requestMatchers("users", "users/**").hasAnyRole( - UserRol.CLIENT.toString(), UserRol.HOTEL_ADMIN.toString(), UserRol.ADMIN.toString()) - // Acceso restringido a gestores de hoteles y administradores - .requestMatchers(HttpMethod.GET, "hotels", "hotels/*").hasAnyRole( - UserRol.CLIENT.toString(), UserRol.HOTEL_ADMIN.toString(), UserRol.ADMIN.toString()) - - .requestMatchers("hotels", "hotels/**") - .hasAnyRole(UserRol.ADMIN.toString(), UserRol.HOTEL_ADMIN.toString()) - // Acceso restringido a cualquier usuario del sistema - .requestMatchers("bookings", "bookings/**") - .hasAnyRole(UserRol.ADMIN.toString(), UserRol.HOTEL_ADMIN.toString(), UserRol.CLIENT.toString()) - // Rechazar el resto - .anyRequest().denyAll()) - // Registra el filtro antes del filtro estándar de autenticación - .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); - - return http.build(); - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/exceptions/GlobalExceptionHandler.java b/java/roomBooking/src/main/java/com/uva/monolith/exceptions/GlobalExceptionHandler.java deleted file mode 100644 index 9428c51a9c63c3623d44752c9e3cbe6cf78ac19f..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/exceptions/GlobalExceptionHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.uva.monolith.exceptions; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; - -@ControllerAdvice -public class GlobalExceptionHandler { - - @ExceptionHandler(HotelNotFoundException.class) - public ResponseEntity<Map<String, Object>> handleHotelNotFound(HotelNotFoundException ex) { - Map<String, Object> body = new HashMap<>(); - body.put("timestamp", LocalDateTime.now()); - body.put("message", ex.getMessage()); - - return new ResponseEntity<>(body, HttpStatus.NOT_FOUND); - } - - @ExceptionHandler(InvalidRequestException.class) - public ResponseEntity<Map<String, Object>> handleInvalidRequest(InvalidRequestException ex) { - Map<String, Object> body = new HashMap<>(); - body.put("timestamp", LocalDateTime.now()); - body.put("message", ex.getMessage()); - - return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST); - } - - @ExceptionHandler(InvalidDateRangeException.class) - public ResponseEntity<Map<String, Object>> handleInvalidDateRange(InvalidDateRangeException ex) { - Map<String, Object> body = new HashMap<>(); - body.put("timestamp", LocalDateTime.now()); - body.put("message", ex.getMessage()); - - return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST); - } - - @ExceptionHandler(Exception.class) - public ResponseEntity<Map<String, Object>> handleGeneralException(Exception ex) { - Map<String, Object> body = new HashMap<>(); - body.put("timestamp", LocalDateTime.now()); - body.put("message", "An unexpected error occurred: " + ex.getMessage()); - - return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR); - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/exceptions/HotelNotFoundException.java b/java/roomBooking/src/main/java/com/uva/monolith/exceptions/HotelNotFoundException.java deleted file mode 100644 index 129a0b1086b4b78eb1f1725b9f241f51ce5540f8..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/exceptions/HotelNotFoundException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.uva.monolith.exceptions; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(HttpStatus.NOT_FOUND) // Devuelve un 404 cuando se lanza la excepción -public class HotelNotFoundException extends RuntimeException { - public HotelNotFoundException(int id) { - super("Hotel not found with id: " + id); - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/exceptions/InvalidDateRangeException.java b/java/roomBooking/src/main/java/com/uva/monolith/exceptions/InvalidDateRangeException.java deleted file mode 100644 index 5fea986ef1e9279c459bc5aff10932049f283333..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/exceptions/InvalidDateRangeException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.uva.monolith.exceptions; - -public class InvalidDateRangeException extends RuntimeException { - public InvalidDateRangeException(String message) { - super(message); - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/exceptions/InvalidRequestException.java b/java/roomBooking/src/main/java/com/uva/monolith/exceptions/InvalidRequestException.java deleted file mode 100644 index ca09e054420dd174c4d2c3424dcc8fe74b6c8576..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/exceptions/InvalidRequestException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.uva.monolith.exceptions; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(HttpStatus.BAD_REQUEST) -public class InvalidRequestException extends RuntimeException { - public InvalidRequestException(String message) { - super(message); - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/filter/JwtAuthenticationFilter.java b/java/roomBooking/src/main/java/com/uva/monolith/filter/JwtAuthenticationFilter.java deleted file mode 100644 index 3b088ce78caee67736a2f1bc7f24f60e49b5a0fa..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/filter/JwtAuthenticationFilter.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.uva.monolith.filter; - -import com.auth0.jwt.JWT; -import com.auth0.jwt.JWTVerifier; -import com.auth0.jwt.algorithms.Algorithm; -import com.auth0.jwt.interfaces.DecodedJWT; -import com.auth0.jwt.exceptions.JWTVerificationException; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; - -import com.uva.monolith.services.users.models.UserRol; - -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.Filter; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.util.Collections; - -@Component -public class JwtAuthenticationFilter implements Filter { - - @Value("${security.jwt.secret-key}") - private String secretKey; - - @Value("${security.jwt.kid}") - private String kid; - - @Value("${security.jwt.expiration-time}") - private long jwtExpiration; - - private Algorithm getSigningAlgorithm() { - return Algorithm.HMAC256(secretKey); // Usar HMAC256 con la clave secreta - } - - private String getTokenFromRequest(HttpServletRequest request) { - String authHeader = request.getHeader("Authorization"); - if (authHeader == null || !authHeader.startsWith("Bearer ")) { - return null; - } - return authHeader.substring(7); - } - - private DecodedJWT validateAndDecodeToken(String token) { - try { - JWTVerifier verifier = JWT.require(getSigningAlgorithm()).build(); - return verifier.verify(token); // Verifica y decodifica el token - } catch (JWTVerificationException ex) { - System.out.println( - "[" + LocalDateTime.now().toString() + "] Error de verificación del token: " + ex.getMessage()); - return null; - } - } - - private String getEmailFromToken(DecodedJWT jwt) { - return jwt.getClaim("email").asString(); - } - - private UserRol getRoleFromToken(DecodedJWT jwt) { - String role = jwt.getClaim("rol").asString(); - return UserRol.valueOf(role); - } - - private String formatRole(UserRol rol) { - return String.format("ROLE_%s", rol.toString()); - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest) request; - String token = getTokenFromRequest(httpRequest); - - System.out.print("[" + LocalDateTime.now().toString() + "] TOKEN: " + token); - - if (token != null) { - DecodedJWT jwt = validateAndDecodeToken(token); - System.out.print(" " + jwt.toString() + " "); - if (jwt != null) { - String email = getEmailFromToken(jwt); - UserRol role = getRoleFromToken(jwt); - System.out.print(" email=" + email + " role=" + role + " "); - - if (email != null && role != null && SecurityContextHolder.getContext().getAuthentication() == null) { - // Crear la autoridad con el rol del token - SimpleGrantedAuthority authority = new SimpleGrantedAuthority(formatRole(role)); - - // Crear autenticación - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(email, - null, Collections.singletonList(authority)); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest)); - - // Establecer autenticación en el contexto de seguridad - SecurityContextHolder.getContext().setAuthentication(authentication); - } - } - } - - // Continuar con el resto de filtros - chain.doFilter(request, response); - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/controllers/BookingController.java b/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/controllers/BookingController.java deleted file mode 100644 index 61feb5104e87b7fcd333e36f07493532f397dbcf..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/controllers/BookingController.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.uva.monolith.services.bookings.controllers; - -import com.uva.monolith.services.bookings.models.Booking; -import com.uva.monolith.services.bookings.services.BookingService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.time.LocalDate; -import java.util.List; - -@RestController -@RequestMapping("/bookings") -@CrossOrigin(origins = "*") -public class BookingController { - - private final BookingService bookingService; - - public BookingController(BookingService bookingService) { - this.bookingService = bookingService; - } - - @GetMapping - public List<Booking> getAllBookings( - @RequestParam(required = false) LocalDate start, - @RequestParam(required = false) LocalDate end, - @RequestParam(required = false) Integer roomId, - @RequestParam(required = false) Integer userId) { - return bookingService.getBookings(start, end, roomId, userId); - } - - @PostMapping - public Booking createBooking(@RequestBody Booking booking) { - return bookingService.createBooking(booking); - } - - @GetMapping("/{id}") - public Booking getBookingById(@PathVariable Integer id) { - return bookingService.getBookingById(id); - } - - @DeleteMapping("/{id}") - public ResponseEntity<Void> deleteBooking(@PathVariable Integer id) { - try { - bookingService.deleteBooking(id); - return new ResponseEntity<>(HttpStatus.ACCEPTED); - } catch (RuntimeException e) { - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - } - - @DeleteMapping("/hotel/{hotelId}") - public ResponseEntity<Void> deleteBookingsByHotelId(@PathVariable Integer hotelId) { - try { - bookingService.deleteBookingsByHotelId(hotelId); - return new ResponseEntity<>(HttpStatus.ACCEPTED); - } catch (RuntimeException e) { - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - } - -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/models/Booking.java b/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/models/Booking.java deleted file mode 100644 index 533ee0c7a1fa053dce449b855f1e46e08dabbe66..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/models/Booking.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.uva.monolith.services.bookings.models; - -import jakarta.persistence.Basic; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import java.time.LocalDate; - -import com.uva.monolith.services.hotels.models.Room; -import com.uva.monolith.services.users.models.Client; - -@Entity -@Table(name = "bookings") -public class Booking { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Basic(optional = false) - private int id; - @JoinColumn(name = "user_id", referencedColumnName = "id") - @ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = CascadeType.MERGE) - private Client userId; - @JoinColumn(name = "room_id", referencedColumnName = "id") - @ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = CascadeType.MERGE) - private Room roomId; - @Column(name = "start_date", nullable = false) - private LocalDate startDate; - @Column(name = "end_date", nullable = false) - private LocalDate endDate; - - public Booking() { - } - - public Booking(int id, Client userId, Room roomID, LocalDate startDate, LocalDate endDate) { - this.id = id; - this.userId = userId; - this.roomId = roomID; - this.startDate = startDate; - this.endDate = endDate; - } - - public void setId(int id) { - this.id = id; - } - - public int getId() { - return this.id; - } - - public void setUserId(Client userId) { - this.userId = userId; - } - - public Client getUserId() { - return this.userId; - } - - public void setRoomId(Room roomID) { - this.roomId = roomID; - } - - public Room getRoomId() { - return this.roomId; - } - - public void setStartDate(LocalDate startDate) { - this.startDate = startDate; - } - - public LocalDate getStartDate() { - return this.startDate; - } - - public void setEndDate(LocalDate endDate) { - this.endDate = endDate; - } - - public LocalDate getEndDate() { - return this.endDate; - } - -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/repositories/BookingRepository.java b/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/repositories/BookingRepository.java deleted file mode 100644 index b5ace65939b898798e6e5416fedda793388f2615..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/repositories/BookingRepository.java +++ /dev/null @@ -1,41 +0,0 @@ -// BookingRepository.java -package com.uva.monolith.services.bookings.repositories; - -import jakarta.transaction.Transactional; - -import java.time.LocalDate; -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import com.uva.monolith.services.bookings.models.Booking; - -public interface BookingRepository extends JpaRepository<Booking, Integer> { - @Query("SELECT b FROM Booking b WHERE b.userId.id = ?1") - List<Booking> findByUserId(int userId); - - @Query("SELECT b FROM Booking b WHERE b.roomId.id = ?1") - List<Booking> findByRoomId(int roomId); - - @Query("SELECT b FROM Booking b WHERE b.startDate >= ?1 AND b.endDate <= ?2") - List<Booking> findByDateRange(@Param("startDate") LocalDate startDate, - @Param("endDate") LocalDate endDate); - - @Query("SELECT b FROM Booking b WHERE b.roomId.id = ?1 AND b.startDate < ?2 AND b.endDate > ?3") - List<Booking> findByRoomIdAndDateRange(@Param("roomId") int roomId, @Param("startDate") LocalDate startDate, - @Param("endDate") LocalDate endDate); - - @Transactional - @Modifying - @Query("DELETE FROM Booking b WHERE b.id = ?1") - void deleteBookingById(@Param("id") Integer id); - - @Transactional - @Modifying - @Query("DELETE FROM Booking b WHERE b.roomId.hotel.id = ?1") - void deleteAllByHotelId(int hotelId); - -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/services/BookingService.java b/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/services/BookingService.java deleted file mode 100644 index 36c51e602fe7cf9bfe9b88f5261104a3c068c782..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/bookings/services/BookingService.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.uva.monolith.services.bookings.services; - -import com.uva.monolith.services.bookings.models.Booking; -import com.uva.monolith.services.bookings.repositories.BookingRepository; -import com.uva.monolith.services.hotels.models.Room; -import com.uva.monolith.services.hotels.repositories.RoomRepository; -import com.uva.monolith.services.users.models.Client; -import com.uva.monolith.services.users.repositories.ClientRepository; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.time.LocalDate; -import java.util.List; - -@Service -public class BookingService { - - @Autowired - private BookingRepository bookingRepository; - - @Autowired - private RoomRepository roomRepository; - - @Autowired - private ClientRepository clientRepository; - - public List<Booking> getBookings(LocalDate start, LocalDate end, Integer roomId, Integer userId) { - List<Booking> bookings = null; - - if (start != null && end != null) { - bookings = bookingRepository.findByDateRange(start, end); - } - if (roomId != null) { - if (bookings == null) { - bookings = bookingRepository.findByRoomId(roomId); - } else { - bookings = bookings.stream() - .filter(booking -> booking.getRoomId().getId() == roomId) - .toList(); - } - } - if (userId != null) { - if (bookings == null) { - bookings = bookingRepository.findByUserId(userId); - } else { - bookings = bookings.stream() - .filter(booking -> booking.getUserId().getId() == userId) - .toList(); - } - } - if (start == null && end == null && roomId == null && userId == null) { - bookings = bookingRepository.findAll(); - } - - return bookings; - } - - public Booking createBooking(Booking booking) { - Client user = clientRepository.findById(booking.getUserId().getId()) - .orElseThrow(() -> new RuntimeException("User not found")); - Room room = roomRepository.findById(booking.getRoomId().getId()) - .orElseThrow(() -> new RuntimeException("Room not found")); - - // Check availability - List<Booking> existingBookings = bookingRepository.findByRoomIdAndDateRange( - room.getId(), booking.getStartDate(), booking.getEndDate()); - - if (!existingBookings.isEmpty()) { - throw new RuntimeException("Room is not available for the selected dates"); - } - - booking.setUserId(user); - booking.setRoomId(room); - return bookingRepository.save(booking); - } - - public Booking getBookingById(Integer id) { - return bookingRepository.findById(id) - .orElseThrow(() -> new RuntimeException("Booking not found")); - } - - public void deleteBooking(Integer id) { - if (!bookingRepository.existsById(id)) { - throw new RuntimeException("Booking not found"); - } - bookingRepository.deleteBookingById(id); - } - - public void deleteBookingsByHotelId(int hotelId) { - bookingRepository.deleteAllByHotelId(hotelId); - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/controllers/HotelController.java b/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/controllers/HotelController.java deleted file mode 100644 index 781cb6278b0b40d237b603d7cfc61a63b7b2af0f..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/controllers/HotelController.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.uva.monolith.services.hotels.controllers; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.time.LocalDate; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; - -import com.uva.monolith.exceptions.HotelNotFoundException; -import com.uva.monolith.exceptions.InvalidDateRangeException; -import com.uva.monolith.exceptions.InvalidRequestException; -import com.uva.monolith.services.bookings.repositories.BookingRepository; -import com.uva.monolith.services.hotels.models.Hotel; -import com.uva.monolith.services.hotels.models.Room; -import com.uva.monolith.services.hotels.repositories.HotelRepository; -import com.uva.monolith.services.hotels.repositories.RoomRepository; -import com.uva.monolith.services.users.models.HotelManager; -import com.uva.monolith.services.users.repositories.HotelManagerRepository; - -@RestController -@RequestMapping("hotels") -@CrossOrigin(origins = "*") -public class HotelController { - @Autowired - private HotelManagerRepository hotelManagerRepository; - private final HotelRepository hotelRepository; - private final RoomRepository roomRepository; - private final BookingRepository bookingRepository; - - public HotelController(HotelRepository hotelRepository, RoomRepository roomRepository, - BookingRepository bookingRepository) { - this.hotelRepository = hotelRepository; - this.roomRepository = roomRepository; - this.bookingRepository = bookingRepository; - } - - // Obtener todos los hoteles - @GetMapping - public List<Hotel> getAllHotels( - @RequestParam(required = false) Integer managerId, - @RequestParam(required = false) LocalDate start, - @RequestParam(required = false) LocalDate end) { - List<Hotel> hotels = (managerId != null) - ? hotelRepository.findAllByHotelManager(managerId) - : hotelRepository.findAll(); - if (start != null && end != null) { - // Filtramos para los hoteles que - // tengan habitaciones disponibles para ese rango de fechas - System.out.println(start); - System.out.println(end); - hotels = hotels.stream().map(h -> { - if (h.getRooms().size() == 0) - return h; - h.setRooms(roomRepository.findAvailableRoomsByHotelAndDates(h.getId(), start, end)); - return h; - }).filter(h -> h.getRooms().size() >= 0).toList(); - } - return hotels; - } - - // Añadir un hotel con sus habitaciones - @PostMapping - public ResponseEntity<Hotel> addHotel(@RequestBody Hotel hotel) { - Optional<HotelManager> hm = hotelManagerRepository.findById(hotel.getHotelManager().getId()); - if (!hm.isPresent()) { - return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - } - hotel.setHotelManager(hm.get()); - Hotel savedHotel = hotelRepository.save(hotel); - return new ResponseEntity<>(savedHotel, HttpStatus.CREATED); - } - - // Obtener un hotel por su ID - @GetMapping("/{id}") - public Hotel getHotelById(@PathVariable int id) { - return hotelRepository.findById(id) - .orElseThrow(() -> new HotelNotFoundException(id)); - } - - // Borrar un hotel junto con sus habitaciones (borrado en cascada) - @DeleteMapping("/{id}") - @Transactional - public ResponseEntity<Void> deleteHotel(@PathVariable Integer id) { - Hotel target = hotelRepository.findById(id) - .orElseThrow(() -> new HotelNotFoundException(id)); - bookingRepository.deleteAllByHotelId(id); - HotelManager hm = target.getHotelManager(); - hm.getHotels().removeIf(h -> h.getId() == target.getId()); - hotelManagerRepository.save(hm); - bookingRepository.flush(); - hotelRepository.delete(target); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - // Obtener habitaciones de un hotel según disponibilidad y fechas - @GetMapping("/{hotelId}/rooms") - public ResponseEntity<List<Room>> getRoomsFromHotel( - @PathVariable int hotelId, - @RequestParam(required = false) LocalDate start, - @RequestParam(required = false) LocalDate end) { - - List<Room> rooms; - if (start != null && end != null) { - if (!start.isBefore(end)) { - throw new InvalidDateRangeException("La fecha de inicio debe ser anterior a la fecha de fin"); - } - rooms = roomRepository.findAvailableRoomsByHotelAndDates(hotelId, start, end); - } else { - rooms = roomRepository.findAllByHotelId(hotelId); - } - return new ResponseEntity<>(rooms, HttpStatus.OK); - } - - // Actualizar disponibilidad de una habitación específica en un hotel - @PatchMapping("/{hotelId}/rooms/{roomId}") - public ResponseEntity<Room> updateRoomAvailability( - @PathVariable int hotelId, - @PathVariable int roomId, - @RequestBody Map<String, Boolean> body) { - - if (!body.containsKey("available")) { - throw new InvalidRequestException("El campo 'available' es obligatorio"); - } - - Room targetRoom = roomRepository.findByIdAndHotelId(roomId, hotelId) - .orElseThrow(() -> new IllegalArgumentException("Habitación no encontrada")); - - targetRoom.setAvailable(body.get("available")); - roomRepository.save(targetRoom); - - return new ResponseEntity<>(targetRoom, HttpStatus.OK); - } - - // Obtener los detalles de una habitación específica en un hotel - @GetMapping("/{hotelId}/rooms/{roomId}") - public Room getRoomByIdFromHotel( - @PathVariable int hotelId, @PathVariable int roomId) { - return roomRepository.findByIdAndHotelId(roomId, hotelId) - .orElseThrow(() -> new HotelNotFoundException(hotelId)); - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/Address.java b/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/Address.java deleted file mode 100644 index 5f31a2a530da46c00460ad6cc6151b0769c1da61..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/Address.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.uva.monolith.services.hotels.models; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import jakarta.persistence.Basic; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.OneToOne; -import jakarta.persistence.Table; - -@Entity -@Table(name = "addresses") -public class Address { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Basic(optional = false) - private int id; - - @Basic(optional = false) - @Column(name = "street_kind") - private String streetKind; - - @Basic(optional = false) - @Column(name = "street_name") - private String streetName; - - @Basic(optional = false) - private int number; - - @Basic(optional = false) - @Column(name = "post_code") - private String postCode; - - @Basic(optional = true) - @Column(name = "other_info") - private String otherInfo; - - @JsonIgnore - @OneToOne(mappedBy = "address", fetch = FetchType.EAGER, cascade = CascadeType.ALL) - private Hotel hotel; - - public Address() { - } - - public Address(String streetKind, String streetName, int number, String postCode, String otherInfo, Hotel hotel) { - setStreetKind(streetKind); - setStreetName(streetName); - setNumber(number); - setPostCode(postCode); - setOtherInfo(otherInfo); - setHotel(hotel); - } - - public int getId() { - return this.id; - } - - public void setId(int id) { - this.id = id; - } - - public String getStreetKind() { - return this.streetKind; - } - - public void setStreetKind(String streetKind) { - this.streetKind = streetKind; - } - - public String getStreetName() { - return this.streetName; - } - - public void setStreetName(String streetName) { - this.streetName = streetName; - } - - public int getNumber() { - return this.number; - } - - public void setNumber(int number) { - this.number = number; - } - - public String getPostCode() { - return this.postCode; - } - - public void setPostCode(String postCode) { - this.postCode = postCode; - } - - public String getOtherInfo() { - return this.otherInfo; - } - - public void setOtherInfo(String otherInfo) { - this.otherInfo = otherInfo; - } - - public Hotel getHotel() { - return this.hotel; - } - - public void setHotel(Hotel hotel) { - this.hotel = hotel; - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/Hotel.java b/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/Hotel.java deleted file mode 100644 index 21f5cec8b44f9fae1a566b7af92964d30b654546..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/Hotel.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.uva.monolith.services.hotels.models; - -import java.util.List; - -import com.uva.monolith.services.users.models.HotelManager; - -import jakarta.persistence.Basic; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.Table; - -@Entity -@Table(name = "hotels") -// @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, -// property = "id") -public class Hotel { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Basic(optional = false) - private int id; - - @Basic(optional = false) - private String name; - - @JoinColumn(name = "address_id", referencedColumnName = "id") - @OneToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.EAGER) - private Address address; - - @OneToMany(mappedBy = "hotel", fetch = FetchType.EAGER, cascade = CascadeType.ALL) - private List<Room> rooms; - - @ManyToOne(optional = false) - @JoinColumn(name = "hotel_manager", referencedColumnName = "id") - private HotelManager hotelManager; - - public Hotel() { - } - - public Hotel(int id, String name, Address address, List<Room> rooms, HotelManager hotelManager) { - setId(id); - setName(name); - setAddress(address); - setRooms(rooms); - setHotelManager(hotelManager); - } - - public int getId() { - return this.id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public Address getAddress() { - return this.address; - } - - public void setAddress(Address address) { - this.address = address; - } - - public List<Room> getRooms() { - return this.rooms; - } - - public void setRooms(List<Room> rooms) { - this.rooms = rooms; - rooms.forEach(room -> room.setHotel(this)); - } - - public void setHotelManager(HotelManager hotelManager) { - this.hotelManager = hotelManager; - } - - public HotelManager getHotelManager() { - return hotelManager; - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/Room.java b/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/Room.java deleted file mode 100644 index 72a6a728f729dc7b93b727606172de7cbe385ebb..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/Room.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.uva.monolith.services.hotels.models; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.uva.monolith.services.bookings.models.Booking; - -import jakarta.persistence.Basic; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; - -@Entity -@Table(name = "rooms") -// @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, -// property = "id") -public class Room { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Basic(optional = false) - private int id; - - @ManyToOne - @JoinColumn(name = "hotel_id", referencedColumnName = "id") - @JsonIgnore - private Hotel hotel; - @Column(name = "room_number", nullable = false) - private String roomNumber; - @Column(name = "type", nullable = false) - private RoomType type; - @Column(name = "available", nullable = false) - private boolean available; - @JsonIgnore - @OneToMany(mappedBy = "roomId", fetch = FetchType.EAGER, cascade = CascadeType.ALL) - private List<Booking> bookings; - - public Room() { - } - - public Room(int id, Hotel hotelId, String roomNumber, RoomType type, boolean available, List<Booking> bookings) { - this.id = id; - this.hotel = hotelId; - this.roomNumber = roomNumber; - this.type = type; - this.available = available; - this.bookings = bookings; - } - - public void setId(int id) { - this.id = id; - } - - public int getId() { - return this.id; - } - - public void setHotel(Hotel hotelId) { - this.hotel = hotelId; - } - - public Hotel getHotel() { - return this.hotel; - } - - public void setRoomNumber(String roomNumber) { - this.roomNumber = roomNumber; - } - - public String getRoomNumber() { - return this.roomNumber; - } - - public void setType(RoomType type) { - this.type = type; - } - - public RoomType getType() { - return this.type; - } - - public void setAvailable(boolean available) { - this.available = available; - } - - public boolean isAvailable() { - return this.available; - } - - public List<Booking> getBookings() { - return this.bookings; - } - - public void setBookings(List<Booking> bookings) { - this.bookings = bookings; - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/RoomType.java b/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/RoomType.java deleted file mode 100644 index b9e82584850795afa7c7392248e3a6472ce24ac0..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/models/RoomType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.uva.monolith.services.hotels.models; - -public enum RoomType { - SINGLE, - DOUBLE, - SUITE -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/repositories/HotelRepository.java b/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/repositories/HotelRepository.java deleted file mode 100644 index eddb6640a275284cb70bde60a29afd33039ba454..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/repositories/HotelRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.uva.monolith.services.hotels.repositories; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - -import com.uva.monolith.services.hotels.models.Hotel; - -public interface HotelRepository extends JpaRepository<Hotel, Integer> { - @Query("SELECT h FROM Hotel h WHERE h.hotelManager.id = ?1") - List<Hotel> findAllByHotelManager(Integer hotelManager); -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/repositories/RoomRepository.java b/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/repositories/RoomRepository.java deleted file mode 100644 index 15cc3d370129e0753b9ac9b1eb24136c93bf5405..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/hotels/repositories/RoomRepository.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.uva.monolith.services.hotels.repositories; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - -import com.uva.monolith.services.hotels.models.Room; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - -public interface RoomRepository extends JpaRepository<Room, Integer> { - - Optional<Room> findByIdAndHotelId(int id, int hotelId); - - // Encontrar todas las habitaciones de un hotel - List<Room> findAllByHotelId(int hotelId); - - // Encontrar habitaciones disponibles de un hotel en un rango de fechas - @Query(""" - SELECT r FROM Room r - WHERE r.hotel.id = ?1 - AND r.available = true - AND NOT EXISTS ( - SELECT b FROM Booking b - WHERE b.roomId.id = r.id - AND ( - b.endDate >= ?2 - OR - ?3 >= b.startDate - ) - ) - """) - List<Room> findAvailableRoomsByHotelAndDates( - int hotelId, LocalDate startDate, LocalDate endDate); -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/controllers/UserController.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/controllers/UserController.java deleted file mode 100644 index 15fc498b79e239020aba6833ae9dbfaa8eeb59ee..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/controllers/UserController.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.uva.monolith.services.users.controllers; - -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.HttpClientErrorException; - -import com.uva.monolith.services.users.models.User; -import com.uva.monolith.services.users.models.UserStatus; -import com.uva.monolith.services.users.services.UserService; - -@RestController -@RequestMapping("users") -@CrossOrigin(origins = "*") -public class UserController { - - @Autowired - private UserService userService; - - @GetMapping - public ResponseEntity<List<User>> getAllUsers() { - List<User> users = userService.getAllUsers(); - return ResponseEntity.ok(users); - } - - @GetMapping(params = { "email" }) - public ResponseEntity<?> getUserByEmail(@RequestParam String email) { - try { - return ResponseEntity.ok(userService.getUserByEmail(email)); - } catch (HttpClientErrorException e) { - if (e.getStatusCode() == HttpStatus.NOT_FOUND) - return new ResponseEntity<String>(HttpStatus.NOT_FOUND); - throw e; - } - } - - @PostMapping - public ResponseEntity<?> addUser(@RequestBody User user) { - userService.registerNewUser(user); - return new ResponseEntity<>(HttpStatus.ACCEPTED); - } - - @GetMapping("/{id}") - public ResponseEntity<?> getUserById(@PathVariable int id) { - return ResponseEntity.ok(userService.getUserById(id)); - } - - @PutMapping("/{id}") - public ResponseEntity<?> updateUserData(@PathVariable int id, @RequestBody Map<String, String> json) { - System.err.println(json.entrySet().size()); - json.keySet().forEach(k -> System.err.println(k)); - String name = json.get("name"); - String email = json.get("email"); - if (name == null || email == null) { - return new ResponseEntity<String>("Missing required fields", HttpStatus.BAD_REQUEST); - } - try { - User user = userService.updateUserData(id, name, email); - return new ResponseEntity<User>(user, HttpStatus.OK); - } catch (HttpClientErrorException e) { - if (e.getStatusCode() == HttpStatus.NOT_FOUND) - return new ResponseEntity<String>(HttpStatus.NOT_FOUND); - throw e; - } - } - - @PatchMapping("/{id}") - public ResponseEntity<?> updateUserState(@PathVariable int id, @RequestBody Map<String, String> json) { - - String strStatus = json.get("status"); - if (strStatus == null) { - return new ResponseEntity<String>("Missing required fields", HttpStatus.BAD_REQUEST); - } - try { - UserStatus userStatus = UserStatus.valueOf(strStatus); - return ResponseEntity.ok(userService.updateUserStatus(id, userStatus)); - } catch (IllegalArgumentException e) { - return new ResponseEntity<String>("Unknown user state", HttpStatus.BAD_REQUEST); - } catch (HttpClientErrorException e) { - if (e.getStatusCode() == HttpStatus.NOT_FOUND) - return new ResponseEntity<String>(HttpStatus.NOT_FOUND); - throw e; - } - - } - - @DeleteMapping("/{id}") - public ResponseEntity<?> deleteUser(@PathVariable Integer id) { - try { - return ResponseEntity.ok(userService.deleteUserById(id)); - } catch (HttpClientErrorException e) { - if (e.getStatusCode() == HttpStatus.NOT_FOUND) - return new ResponseEntity<String>(HttpStatus.NOT_FOUND); - throw e; - } - } - -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/AuthResponse.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/AuthResponse.java deleted file mode 100644 index 8f334813beee8cb95caa275c66e46c9c539f2bd5..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/AuthResponse.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.uva.monolith.services.users.models; - -public class AuthResponse { - - private int id; - private String username; - private String email; - private String password; - private UserRol rol; - - public int getId() { - return this.id; - } - - public void setId(int id) { - this.id = id; - } - - public String getUsername() { - return this.username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getEmail() { - return this.email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return this.password; - } - - public void setPassword(String password) { - this.password = password; - } - - public UserRol getRol() { - return this.rol; - } - - public void setRol(UserRol rol) { - this.rol = rol; - } - -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/Client.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/Client.java deleted file mode 100644 index e106ecd3789a0237602e3194feacab7ddcbf4dfd..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/Client.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.uva.monolith.services.users.models; - -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.uva.monolith.services.bookings.models.Booking; - -import jakarta.persistence.Basic; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; - -@Entity -@Table(name = "user_client") -public class Client extends User { - - @Basic(optional = false) - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private UserStatus status; - - @JsonIgnore - @OneToMany(mappedBy = "userId", fetch = FetchType.EAGER, cascade = CascadeType.ALL) - private List<Booking> bookings; - - public Client() { - super(); - bookings = new ArrayList<>(); - status = UserStatus.NO_BOOKINGS; - } - - public Client(int id, String name, String email, String password, UserStatus status, - List<Booking> bookings) { - super(id, name, email, password, UserRol.CLIENT); - setStatus(status); - setBookings(bookings); - } - - public UserStatus getStatus() { - if (getBookings() == null || getBookings().isEmpty()) - return UserStatus.NO_BOOKINGS; - boolean activeBookings = getBookings().stream() - .anyMatch(booking -> !booking.getEndDate().isBefore(LocalDate.now())); // reserva >= ahora - return activeBookings ? UserStatus.WITH_ACTIVE_BOOKINGS : UserStatus.WITH_INACTIVE_BOOKINGS; - } - - public void setStatus(UserStatus status) { - this.status = status; - } - - public List<Booking> getBookings() { - return this.bookings; - } - - public void setBookings(List<Booking> bookings) { - this.bookings = bookings; - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/HotelManager.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/HotelManager.java deleted file mode 100644 index 0e6f4b0aafa35ab8b23d202814c1fabefdcf86ed..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/HotelManager.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.uva.monolith.services.users.models; - -import java.util.ArrayList; -import java.util.List; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.uva.monolith.services.hotels.models.Hotel; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; - -@Entity -@Table(name = "hotel_manager_user") -public class HotelManager extends User { - - @JsonIgnore - @OneToMany(mappedBy = "hotelManager", fetch = FetchType.EAGER, cascade = CascadeType.ALL) - private List<Hotel> hotels; - - public HotelManager() { - super(); - hotels = new ArrayList<>(); - } - - public HotelManager(int id, String name, String email, String password, List<Hotel> hotels) { - super(id, name, email, password, UserRol.HOTEL_ADMIN); - setHotels(hotels); - } - - public List<Hotel> getHotels() { - return this.hotels; - } - - public void setHotels(List<Hotel> hotels) { - this.hotels = hotels; - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/User.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/User.java deleted file mode 100644 index ecfd33d1e39f6760f39fb0ad48fa195cd71432ea..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/User.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.uva.monolith.services.users.models; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import jakarta.persistence.Basic; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Inheritance; -import jakarta.persistence.InheritanceType; -import jakarta.persistence.Table; - -@Entity -@Inheritance(strategy = InheritanceType.JOINED) -@Table(name = "users") -public class User { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Basic(optional = false) - @Column(nullable = false) - private int id; - - @Basic(optional = false) - @Column(nullable = false) - private String name; - - @Basic(optional = false) - @Column(nullable = false, unique = true) - private String email; - - @Basic(optional = false) - @Column(nullable = false) - private String password; - - @Basic(optional = false) - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private UserRol rol = UserRol.CLIENT; - - public User() { - } - - public User(int id, String name, String email, String password, UserRol rol) { - setId(id); - setName(name); - setEmail(email); - setRol(rol); - } - - public int getId() { - return this.id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public String getEmail() { - return this.email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } - - public void setPassword(String rawPassword) { - this.password = rawPassword; - } - - public UserRol getRol() { - return this.rol; - } - - public void setRol(UserRol rol) { - this.rol = rol; - } -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/UserRol.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/UserRol.java deleted file mode 100644 index f408ba5ef9d34d96c32d3c42a6c2c51b1c6f22b1..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/UserRol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.uva.monolith.services.users.models; - -public enum UserRol { - ADMIN, HOTEL_ADMIN, CLIENT -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/UserStatus.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/UserStatus.java deleted file mode 100644 index 362b8688260d4c13dc4a8eae205411c9d5533d79..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/models/UserStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.uva.monolith.services.users.models; - -public enum UserStatus { - NO_BOOKINGS, WITH_ACTIVE_BOOKINGS, WITH_INACTIVE_BOOKINGS; -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/repositories/ClientRepository.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/repositories/ClientRepository.java deleted file mode 100644 index 1c1b46fbe665075b8f817367ff14ee65cf69ff76..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/repositories/ClientRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.uva.monolith.services.users.repositories; - -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; - -import com.uva.monolith.services.users.models.Client; - -public interface ClientRepository extends JpaRepository<Client, Integer> { - Optional<Client> findByEmail(String email); -} \ No newline at end of file diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/repositories/HotelManagerRepository.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/repositories/HotelManagerRepository.java deleted file mode 100644 index 092a251b199fdecd80a2654fc3e6c96d1b7eb7f4..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/repositories/HotelManagerRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.uva.monolith.services.users.repositories; - -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; - -import com.uva.monolith.services.users.models.HotelManager; - -public interface HotelManagerRepository extends JpaRepository<HotelManager, Integer> { - Optional<HotelManager> findByEmail(String email); -} \ No newline at end of file diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/repositories/UserRepository.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/repositories/UserRepository.java deleted file mode 100644 index e5b44c976f095719854aa8070abc843b898036fe..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/repositories/UserRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.uva.monolith.services.users.repositories; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.uva.monolith.services.users.models.User; - -public interface UserRepository extends JpaRepository<User, Integer> { - Optional<User> findByEmail(String email); -} diff --git a/java/roomBooking/src/main/java/com/uva/monolith/services/users/services/UserService.java b/java/roomBooking/src/main/java/com/uva/monolith/services/users/services/UserService.java deleted file mode 100644 index bdd5b9db80a7c699844cfcd48669171ffbe6b8f0..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/java/com/uva/monolith/services/users/services/UserService.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.uva.monolith.services.users.services; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpClientErrorException; - -import com.uva.monolith.services.users.models.AuthResponse; -import com.uva.monolith.services.users.models.Client; -import com.uva.monolith.services.users.models.HotelManager; -import com.uva.monolith.services.users.models.User; -import com.uva.monolith.services.users.models.UserRol; -import com.uva.monolith.services.users.models.UserStatus; -import com.uva.monolith.services.users.repositories.ClientRepository; -import com.uva.monolith.services.users.repositories.HotelManagerRepository; -import com.uva.monolith.services.users.repositories.UserRepository; - -@Service -public class UserService { - - @Autowired - private UserRepository userRepository; - - @Autowired - private ClientRepository clientRepository; - - @Autowired - private HotelManagerRepository hotelManagerRepository; - - public List<User> getAllUsers() { - return userRepository.findAll(); - } - - private User assertUser(Optional<? extends User> opUser) { - return opUser.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND)); - } - - public User getUserById(int id) { - return assertUser(userRepository.findById(id)); - } - - public AuthResponse getUserByEmail(String email) { - User u = assertUser(userRepository.findByEmail(email)); - AuthResponse auth = new AuthResponse(); - BeanUtils.copyProperties(u, auth); - return auth; - } - - public User registerNewUser(User registerRequest) { - User newUser; - - // Aseguramos que tenga un rol, por defecto es cliente - if (registerRequest.getRol() == null) - registerRequest.setRol(UserRol.CLIENT); - - switch (registerRequest.getRol()) { - case HOTEL_ADMIN: - HotelManager hm = new HotelManager(); - BeanUtils.copyProperties(registerRequest, hm); - newUser = hotelManagerRepository.save(hm); - break; - - case ADMIN: - User admin = new User(); - BeanUtils.copyProperties(registerRequest, admin); - newUser = admin; // userAPI.save(admin); - break; - - case CLIENT: // Por defecto cliente normal - default: - Client client = new Client(); - BeanUtils.copyProperties(registerRequest, client); - client.setRol(UserRol.CLIENT); - newUser = clientRepository.save(client); - break; - } - return newUser; - } - - public User updateUserData(int id, String name, String email) { - User user = getUserById(id); - user.setName(name); - user.setEmail(email); - return userRepository.save(user); - } - - public User updateUserStatus(int id, UserStatus status) { - - Client user = (Client) assertUser(clientRepository.findById(id)); - - boolean activeBookings = user.getBookings().stream() - .anyMatch(booking -> !booking.getEndDate().isBefore(LocalDate.now())); // reserva >= ahora - boolean inactiveBookings = user.getBookings().stream() - .anyMatch(booking -> booking.getStartDate().isBefore(LocalDate.now())); // reserva < ahora - - switch (status) { - case NO_BOOKINGS: - if (!user.getBookings().isEmpty()) - throw new IllegalArgumentException("Invalid State: The user has at least one booking"); - break; - case WITH_ACTIVE_BOOKINGS: - if (user.getBookings().isEmpty()) - throw new IllegalArgumentException("Invalid State: The user don't has bookings"); - if (!activeBookings) - throw new IllegalArgumentException("Invalid State: The user don't has active bookings"); - break; - case WITH_INACTIVE_BOOKINGS: - if (user.getBookings().isEmpty()) - throw new IllegalArgumentException("Invalid State: The user don't has bookings"); - if (!inactiveBookings) - throw new IllegalArgumentException("Invalid State: The user don't has inactive bookings"); - break; - default: - break; - } - user.setStatus(status); - return userRepository.save(user); - } - - public User deleteUserById(int id) { - User user = getUserById(id); - // TODO eliminar reservas de usuario ahora mismo no por el modo cascada pero a - // futuro sí, después de la disgregación en microservicios - userRepository.deleteById(id); - return user; - } -} diff --git a/java/roomBooking/src/main/resources/application.properties b/java/roomBooking/src/main/resources/application.properties deleted file mode 100644 index e9b75a35a39f7947153b79b234d6377a853078d4..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/main/resources/application.properties +++ /dev/null @@ -1,18 +0,0 @@ -spring.application.name=roomBooking -spring.jpa.hibernate.ddl-auto=update -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect -spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/RoomsBooking?createDatabaseIfNotExist=true -spring.datasource.username=user -spring.datasource.password=password -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.security.user.name=admin -spring.security.user.password=admin - -# Usar esto para alternar entre las exposición del room repository ya que no es necesario su uso pero por defecto, al no cubrir su ruta, se expone -# spring.data.rest.base-path=false -external.services.auth.host=localhost:8101 - -security.jwt.secret-key=MiClaveDeSeguridadMuyLargaParaQueNoFalleSpringBoot -# 1h in millisecond -security.jwt.expiration-time=3600000 -security.jwt.kid=cYz3kNRLAirxVhHXQ5rh5xKrOwHwZVui \ No newline at end of file diff --git a/java/roomBooking/src/test/java/com/uva/roomBooking/RoomBookingApplicationTests.java b/java/roomBooking/src/test/java/com/uva/roomBooking/RoomBookingApplicationTests.java deleted file mode 100644 index 3b50599492c36017391c0dcabd81573f123a809a..0000000000000000000000000000000000000000 --- a/java/roomBooking/src/test/java/com/uva/roomBooking/RoomBookingApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.uva.roomBooking; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class RoomBookingApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/java/services/bookings/src/main/java/com/uva/apis/bookings/controllers/BookingController.java b/java/services/bookings/src/main/java/com/uva/apis/bookings/controllers/BookingController.java index 44ee237a73f601bfd4104774866cf6388555a41c..597c657f9d4fed32aa5f3b82a7bf0c44fe5b0203 100644 --- a/java/services/bookings/src/main/java/com/uva/apis/bookings/controllers/BookingController.java +++ b/java/services/bookings/src/main/java/com/uva/apis/bookings/controllers/BookingController.java @@ -2,6 +2,7 @@ package com.uva.apis.bookings.controllers; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -39,12 +40,27 @@ public class BookingController { return bookingService.getBookingById(id); } - @DeleteMapping /// ?hotelId={hotelId} - public ResponseEntity<Void> deleteBooking(@RequestParam int hotelId) { + @DeleteMapping /// ?hotelId={hotelId}|managerId={managerId} + public ResponseEntity<?> deleteBooking( + @RequestParam(required = false) Integer hotelId, + @RequestParam(required = false) Integer managerId) { try { - bookingService.deleteBookingsByHotelId(hotelId); - return new ResponseEntity<>(HttpStatus.ACCEPTED); + List<Booking> bookings; + String message; + if (managerId != null) { + bookings = bookingService.deleteAllByManagerId(managerId); + message = "No bookings for this manager"; + } else if (hotelId != null) { + bookings = bookingService.deleteBookingsByHotelId(hotelId); + message = "No bookings for this hotel"; + } else { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + return !bookings.isEmpty() + ? new ResponseEntity<>(bookings, HttpStatus.OK) + : new ResponseEntity<>(message, HttpStatus.BAD_REQUEST); } catch (RuntimeException e) { + e.printStackTrace(System.err); return new ResponseEntity<>(HttpStatus.NOT_FOUND); } } diff --git a/java/services/bookings/src/main/java/com/uva/apis/bookings/models/Booking.java b/java/services/bookings/src/main/java/com/uva/apis/bookings/models/Booking.java index 8af8688534991b81c0b2b79aa01344bd5b2b86fa..fee28fd4b673f11db95d7b6296e5faee21cadd8d 100644 --- a/java/services/bookings/src/main/java/com/uva/apis/bookings/models/Booking.java +++ b/java/services/bookings/src/main/java/com/uva/apis/bookings/models/Booking.java @@ -31,6 +31,9 @@ public class Booking { @Column(name = "user_id", nullable = false) private int userId; + @Column(name = "manager_id", nullable = false) + private int managerId; + @Column(name = "hotel_id", nullable = false) private int hotelId; diff --git a/java/services/bookings/src/main/java/com/uva/apis/bookings/repositories/BookingRepository.java b/java/services/bookings/src/main/java/com/uva/apis/bookings/repositories/BookingRepository.java index 646fa074709a0c14dd109c579d624f5ce20245e2..678b67eb4ad17734c90d10d3d74430991acec01d 100644 --- a/java/services/bookings/src/main/java/com/uva/apis/bookings/repositories/BookingRepository.java +++ b/java/services/bookings/src/main/java/com/uva/apis/bookings/repositories/BookingRepository.java @@ -10,6 +10,8 @@ import org.springframework.data.repository.query.Param; import com.uva.apis.bookings.models.Booking; +import jakarta.transaction.Transactional; + public interface BookingRepository extends JpaRepository<Booking, Integer> { List<Booking> findByUserId(int userId); @@ -26,8 +28,14 @@ public interface BookingRepository extends JpaRepository<Booking, Integer> { void deleteById(int id); + @Transactional void deleteAllByHotelId(int hotelId); List<Booking> findByHotelId(Integer roomId); + @Transactional + void deleteAllByManagerId(int managerId); + + List<Booking> findByManagerId(int managerId); + } diff --git a/java/services/bookings/src/main/java/com/uva/apis/bookings/services/BookingService.java b/java/services/bookings/src/main/java/com/uva/apis/bookings/services/BookingService.java index 8d9425c87d1ead527a7b7c22040f4cbc7aa9577a..161a43540baa4f9ddc977ce48c13b1f03bf05c3e 100644 --- a/java/services/bookings/src/main/java/com/uva/apis/bookings/services/BookingService.java +++ b/java/services/bookings/src/main/java/com/uva/apis/bookings/services/BookingService.java @@ -11,6 +11,7 @@ import com.uva.apis.bookings.models.Booking; import com.uva.apis.bookings.repositories.BookingRepository; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; @Service @@ -117,8 +118,22 @@ public class BookingService { bookingRepository.deleteById(id); } - public void deleteBookingsByHotelId(int hotelId) { + public List<Booking> deleteBookingsByHotelId(int hotelId) { // Extraer reservas realizadas al hotel + List<Booking> bookings = bookingRepository.findByHotelId(hotelId); + if (bookings.isEmpty()) { + return new ArrayList<>(); + } bookingRepository.deleteAllByHotelId(hotelId); + return bookings; + } + + public List<Booking> deleteAllByManagerId(int managerId) { + List<Booking> bookings = bookingRepository.findByManagerId(managerId); + if (bookings.isEmpty()) { + return new ArrayList<>(); + } + bookingRepository.deleteAllByManagerId(managerId); + return bookings; } } diff --git a/java/services/hotels/src/main/java/com/uva/monolith/api/BookingAPI.java b/java/services/hotels/src/main/java/com/uva/monolith/api/BookingAPI.java index 0f09e3b92f97997077118a488da41eee42602d9d..369066bd537e131c333b04ae0415f7527cff6885 100644 --- a/java/services/hotels/src/main/java/com/uva/monolith/api/BookingAPI.java +++ b/java/services/hotels/src/main/java/com/uva/monolith/api/BookingAPI.java @@ -15,7 +15,7 @@ public class BookingAPI { @Autowired private RestTemplate restTemplate; - + @Value("${external.services.bookings.url}") private String BOOKING_API_URL; @@ -45,4 +45,9 @@ public class BookingAPI { return notAvailableRooms; } + + public void deleteAllByManagerId(Integer managerId) { + String url = BOOKING_API_URL + "?managerId={managerId}"; + restTemplate.delete(url, managerId); + } } \ No newline at end of file diff --git a/java/services/hotels/src/main/java/com/uva/monolith/api/HotelManagerAPI.java b/java/services/hotels/src/main/java/com/uva/monolith/api/ManagerAPI.java similarity index 90% rename from java/services/hotels/src/main/java/com/uva/monolith/api/HotelManagerAPI.java rename to java/services/hotels/src/main/java/com/uva/monolith/api/ManagerAPI.java index f4b0c18bb3fdfbadd919807368121500b92153ce..3dc33257d9ce9df4a2651bea2a6c3dcfbba7e8fa 100644 --- a/java/services/hotels/src/main/java/com/uva/monolith/api/HotelManagerAPI.java +++ b/java/services/hotels/src/main/java/com/uva/monolith/api/ManagerAPI.java @@ -10,7 +10,7 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; @Component -public class HotelManagerAPI { +public class ManagerAPI { @Autowired private RestTemplate restTemplate; @@ -18,7 +18,7 @@ public class HotelManagerAPI { @Value("${external.services.managers.url}") private String MANAGERS_API_URL; - public Boolean existsHotelManagerById(int id) { + public Boolean existsManagerById(int id) { try { String url = MANAGERS_API_URL + "/{id}"; return restTemplate.getForObject(url, Map.class, id).containsKey("id"); diff --git a/java/services/hotels/src/main/java/com/uva/monolith/services/hotels/controllers/HotelController.java b/java/services/hotels/src/main/java/com/uva/monolith/services/hotels/controllers/HotelController.java index 39c1b314c15ad3f49a9fad76dde88f45cc9b7458..75c9aed4195a05a969db8f6f85d10cc328b606ae 100644 --- a/java/services/hotels/src/main/java/com/uva/monolith/services/hotels/controllers/HotelController.java +++ b/java/services/hotels/src/main/java/com/uva/monolith/services/hotels/controllers/HotelController.java @@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import com.uva.monolith.api.BookingAPI; -import com.uva.monolith.api.HotelManagerAPI; +import com.uva.monolith.api.ManagerAPI; import com.uva.monolith.exceptions.HotelNotFoundException; import com.uva.monolith.exceptions.InvalidDateRangeException; import com.uva.monolith.exceptions.InvalidRequestException; @@ -32,7 +32,7 @@ public class HotelController { @Autowired private BookingAPI bookingAPI; @Autowired - private HotelManagerAPI hotelManagerAPI; + private ManagerAPI managerAPI; // Obtener todos los hoteles @GetMapping @@ -62,7 +62,7 @@ public class HotelController { // Añadir un hotel con sus habitaciones @PostMapping public ResponseEntity<?> addHotel(@RequestBody Hotel hotel) { - boolean exist = hotelManagerAPI.existsHotelManagerById(hotel.getManagerId()); + boolean exist = managerAPI.existsManagerById(hotel.getManagerId()); if (!exist) { return new ResponseEntity<>( "No existe el manager con id " + String.valueOf(hotel.getManagerId()), HttpStatus.BAD_REQUEST); @@ -78,6 +78,19 @@ public class HotelController { .orElseThrow(() -> new HotelNotFoundException(id)); } + // Borrar hoteles administrados por un manager concreto + @DeleteMapping + public ResponseEntity<?> deleteHotelsByManagerId( + @RequestParam(required = true) Integer managerId) { + List<Hotel> hotels = hotelRepository.findAllByManagerId(managerId); + if (hotels.isEmpty()) { + return new ResponseEntity<>("No hay hoteles para el manager con id " + managerId, HttpStatus.BAD_REQUEST); + } + bookingAPI.deleteAllByManagerId(managerId); + hotelRepository.deleteAll(hotels); + return new ResponseEntity<>(hotels, HttpStatus.OK); + } + // Borrar un hotel junto con sus habitaciones (borrado en cascada) @DeleteMapping("/{id}") @Transactional diff --git a/java/services/users/src/main/java/com/uva/api/apis/BookingAPI.java b/java/services/users/src/main/java/com/uva/api/apis/BookingAPI.java index 3c17afe11eca919848621eba55ba84b75f666f45..e7a51f960dcc463c54c0fe0f56c1654bbe4c5025 100644 --- a/java/services/users/src/main/java/com/uva/api/apis/BookingAPI.java +++ b/java/services/users/src/main/java/com/uva/api/apis/BookingAPI.java @@ -21,7 +21,6 @@ public class BookingAPI { public List<Booking> getAllBookingsByUserId(int id) { String url = BOOKING_API_URL + "?userId={id}"; - System.out.println("\n" + url); Booking[] bookingsArray = restTemplate .getForObject(url, Booking[].class, id); @@ -29,4 +28,9 @@ public class BookingAPI { } + public void deleteAllByUserId(int id) { + String url = BOOKING_API_URL + "?userId={id}"; + restTemplate.delete(url, id); + } + } diff --git a/java/services/users/src/main/java/com/uva/api/apis/HotelApi.java b/java/services/users/src/main/java/com/uva/api/apis/HotelApi.java index f6e3899272a2d5e16a3d474c904276ef80ab787d..394ee623e262a748949114e57784ef3fe3002d95 100644 --- a/java/services/users/src/main/java/com/uva/api/apis/HotelApi.java +++ b/java/services/users/src/main/java/com/uva/api/apis/HotelApi.java @@ -1,5 +1,22 @@ package com.uva.api.apis; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +@Component public class HotelApi { + @Autowired + private RestTemplate restTemplate; + + @Value("${external.services.hotels.url}") + private String HOTELS_API; + + public void deleteAllByManagerId(Integer id) { + String url = HOTELS_API + "?managerId={id}"; + restTemplate.delete(url, id); + } + } diff --git a/java/services/users/src/main/java/com/uva/api/controllers/UserController.java b/java/services/users/src/main/java/com/uva/api/controllers/UserController.java index 121670cb98bb3e26a6e9f49b3d5914d70f0b3863..4f15524cabd20e6d518fc7be824090b016f65881 100644 --- a/java/services/users/src/main/java/com/uva/api/controllers/UserController.java +++ b/java/services/users/src/main/java/com/uva/api/controllers/UserController.java @@ -116,7 +116,17 @@ public class UserController { @DeleteMapping("/{id}") public ResponseEntity<?> deleteUser(@PathVariable Integer id) { try { - return ResponseEntity.ok(userService.deleteUserById(id)); + User user = userService.getUserById(id); + switch (user.getRol()) { + case CLIENT: + clientService.deleteById(id); + break; + case HOTEL_ADMIN: + managerService.deleteById(id); + default: + break; + } + return ResponseEntity.ok(user); } catch (HttpClientErrorException e) { if (e.getStatusCode() == HttpStatus.NOT_FOUND) return new ResponseEntity<String>(HttpStatus.NOT_FOUND); diff --git a/java/services/users/src/main/java/com/uva/api/services/ClientService.java b/java/services/users/src/main/java/com/uva/api/services/ClientService.java index c692486d9e56558eb27fc372ccb50bac3a2fb6bf..146c85d24edc73d6e7c227c60e33c4af3453b20c 100644 --- a/java/services/users/src/main/java/com/uva/api/services/ClientService.java +++ b/java/services/users/src/main/java/com/uva/api/services/ClientService.java @@ -34,18 +34,17 @@ public class ClientService { Client client = Utils.assertUser(clientRepository.findById(id)); List<Booking> bookings; try { - bookings = bookingAPI.getAllBookingsByUserId(client.getId()); + bookings = bookingAPI.getAllBookingsByUserId(client.getId()); } catch (Exception e) { - bookings = new ArrayList<>(); + bookings = new ArrayList<>(); } client.setBookings(bookings); return client; -} - - + } public Client deleteById(int id) { Client client = Utils.assertUser(clientRepository.findById(id)); + bookingAPI.deleteAllByUserId(id); clientRepository.delete(client); return client; } diff --git a/java/services/users/src/main/java/com/uva/api/services/ManagerService.java b/java/services/users/src/main/java/com/uva/api/services/ManagerService.java index 098fc043649d85383c5371d2f995f4a908bc63c3..87d8f38c546f2080522205927400a3dcaa42672b 100644 --- a/java/services/users/src/main/java/com/uva/api/services/ManagerService.java +++ b/java/services/users/src/main/java/com/uva/api/services/ManagerService.java @@ -6,6 +6,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.uva.api.apis.HotelApi; import com.uva.api.models.Manager; import com.uva.api.models.User; import com.uva.api.repositories.ManagerRepository; @@ -14,6 +15,9 @@ import com.uva.api.utils.Utils; @Service public class ManagerService { + @Autowired + private HotelApi hotelApi; + @Autowired private ManagerRepository managerRepository; @@ -34,6 +38,7 @@ public class ManagerService { public Object deleteById(Integer id) { Manager manager = Utils.assertUser(managerRepository.findById(id)); + hotelApi.deleteAllByManagerId(id); managerRepository.delete(manager); return manager; } diff --git a/java/services/users/src/main/resources/application.properties b/java/services/users/src/main/resources/application.properties index 3d3c5062f7694a2d5cfda9e7f09371cbee1358bf..a8ff83c7a248ce7b47b84e45e52fed2c67d254b0 100644 --- a/java/services/users/src/main/resources/application.properties +++ b/java/services/users/src/main/resources/application.properties @@ -16,4 +16,5 @@ security.jwt.secret-key=MiClaveDeSeguridadMuyLargaParaQueNoFalleSpringBoot security.jwt.expiration-time=3600000 security.jwt.kid=cYz3kNRLAirxVhHXQ5rh5xKrOwHwZVui -external.services.bookings.url=localhost:8401/bookings \ No newline at end of file +external.services.hotels.url=http://localhost:8301/hotels +external.services.bookings.url=http://localhost:8401/bookings \ No newline at end of file diff --git a/poblate/mocks/bookings.json b/poblate/mocks/bookings.json new file mode 100644 index 0000000000000000000000000000000000000000..bf93e638b17471bc9585c37e0689f6808da03285 --- /dev/null +++ b/poblate/mocks/bookings.json @@ -0,0 +1,16 @@ +[ + { + "clientId": 1, + "hotelId": 1, + "roomId": 2, + "startDate": "2024-10-20", + "endDate": "2024-10-25" + }, + { + "clientId": 3, + "hotelId": 2, + "roomId": 3, + "startDate": "2025-02-22", + "endDate": "2025-02-27" + } +] diff --git a/poblate/mocks/hotels.json b/poblate/mocks/hotels.json new file mode 100644 index 0000000000000000000000000000000000000000..4331cfea0d6964414b2b702b1cfafeb90a133821 --- /dev/null +++ b/poblate/mocks/hotels.json @@ -0,0 +1,48 @@ +[ + { + "name": "Ocean View Hotel", + "address": { + "streetKind": "Avenida", + "streetName": "Marítima", + "number": 123, + "postCode": "45678", + "otherInfo": "Frente al mar" + }, + "managerId": 2, + "rooms": [ + { + "roomNumber": "101", + "type": "SINGLE", + "available": true + }, + { + "roomNumber": "102", + "type": "DOUBLE", + "available": false + } + ] + }, + { + "name": "Mountain Retreat", + "address": { + "streetKind": "Calle", + "streetName": "Bosque", + "number": 42, + "postCode": "98765", + "otherInfo": "Cerca del parque nacional" + }, + "managerId": 2, + "rooms": [ + { + "roomNumber": "201", + "type": "DOUBLE", + "available": true + }, + { + "roomNumber": "202", + "type": "SUITE", + "available": true + } + ] + } +] diff --git a/poblate/mocks/users.json b/poblate/mocks/users.json new file mode 100644 index 0000000000000000000000000000000000000000..72cd088b876a8b8d5a4adc4e588f01bdf61c3995 --- /dev/null +++ b/poblate/mocks/users.json @@ -0,0 +1,20 @@ +[ + { + "name": "John Doe", + "email": "john.doe@example.com", + "password": "securePassword123", + "rol": "CLIENT" + }, + { + "name": "Jane Smith", + "email": "jane.smith@example.com", + "password": "securePassword456", + "rol": "HOTEL_ADMIN" + }, + { + "name": "Alice Johnson", + "email": "alice.johnson@example.com", + "password": "securePassword789", + "rol": "CLIENT" + } +]