From 16bba2b311ac4d2b58125a74e226f8b3719ac0b9 Mon Sep 17 00:00:00 2001 From: jtiradohernandez Date: Sat, 16 Mar 2024 09:51:06 +0100 Subject: [PATCH 01/79] Base of the program --- .idea/.gitignore | 6 + .idea/compiler.xml | 18 + .idea/encodings.xml | 6 + .idea/homework-java-ironlibrary.iml | 9 + .idea/jarRepositories.xml | 20 ++ .idea/misc.xml | 14 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + ironlibrary/.gitignore | 23 ++ ironlibrary/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 62547 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + README.md => ironlibrary/README.md | 0 ironlibrary/mvnw | 308 ++++++++++++++++++ ironlibrary/mvnw.cmd | 205 ++++++++++++ ironlibrary/pom.xml | 63 ++++ .../ironlibrary/IronlibraryApplication.java | 13 + .../main/java/com/example/ironlibrary/SQL.sql | 0 .../src/main/resources/application.properties | 8 + .../IronlibraryApplicationTests.java | 13 + 19 files changed, 722 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/homework-java-ironlibrary.iml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 ironlibrary/.gitignore create mode 100644 ironlibrary/.mvn/wrapper/maven-wrapper.jar create mode 100644 ironlibrary/.mvn/wrapper/maven-wrapper.properties rename README.md => ironlibrary/README.md (100%) create mode 100755 ironlibrary/mvnw create mode 100644 ironlibrary/mvnw.cmd create mode 100644 ironlibrary/pom.xml create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/IronlibraryApplication.java create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql create mode 100644 ironlibrary/src/main/resources/application.properties create mode 100644 ironlibrary/src/test/java/com/example/ironlibrary/IronlibraryApplicationTests.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..7f3b5878 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,6 @@ +# Default ignored files +/shelf/ +/workspace.xml + + + diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..08cb5482 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..3efb871c --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/homework-java-ironlibrary.iml b/.idea/homework-java-ironlibrary.iml new file mode 100644 index 00000000..d6ebd480 --- /dev/null +++ b/.idea/homework-java-ironlibrary.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..712ab9d9 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..a60ecf2e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..821fdf28 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ironlibrary/.gitignore b/ironlibrary/.gitignore new file mode 100644 index 00000000..9d9398ff --- /dev/null +++ b/ironlibrary/.gitignore @@ -0,0 +1,23 @@ +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 + +### VS Code ### +.vscode/ \ No newline at end of file diff --git a/ironlibrary/.mvn/wrapper/maven-wrapper.jar b/ironlibrary/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cb28b0e37c7d206feb564310fdeec0927af4123a GIT binary patch literal 62547 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 A?*IS* literal 0 HcmV?d00001 diff --git a/ironlibrary/.mvn/wrapper/maven-wrapper.properties b/ironlibrary/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..5f0536eb --- /dev/null +++ b/ironlibrary/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/README.md b/ironlibrary/README.md similarity index 100% rename from README.md rename to ironlibrary/README.md diff --git a/ironlibrary/mvnw b/ironlibrary/mvnw new file mode 100755 index 00000000..66df2854 --- /dev/null +++ b/ironlibrary/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/ironlibrary/mvnw.cmd b/ironlibrary/mvnw.cmd new file mode 100644 index 00000000..95ba6f54 --- /dev/null +++ b/ironlibrary/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/ironlibrary/pom.xml b/ironlibrary/pom.xml new file mode 100644 index 00000000..b550766a --- /dev/null +++ b/ironlibrary/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.3 + + + com.example + ironlibrary + 0.0.1-SNAPSHOT + ironlibrary + Ironlibrary project for Ironhack + + 21 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + com.mysql + mysql-connector-j + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/IronlibraryApplication.java b/ironlibrary/src/main/java/com/example/ironlibrary/IronlibraryApplication.java new file mode 100644 index 00000000..21dc5934 --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/IronlibraryApplication.java @@ -0,0 +1,13 @@ +package com.example.ironlibrary; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class IronlibraryApplication { + + public static void main(String[] args) { + SpringApplication.run(IronlibraryApplication.class, args); + } + +} diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql new file mode 100644 index 00000000..e69de29b diff --git a/ironlibrary/src/main/resources/application.properties b/ironlibrary/src/main/resources/application.properties new file mode 100644 index 00000000..680d6e9a --- /dev/null +++ b/ironlibrary/src/main/resources/application.properties @@ -0,0 +1,8 @@ +spring.application.name=ironlibrary +spring.datasource.url=jdbc:mysql://localhost:3306/TO FILL ?serverTimezone=UTC +spring.datasource.username=root +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.hibernate.ddl-auto=validate +spring.jpa.show-sql=true \ No newline at end of file diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/IronlibraryApplicationTests.java b/ironlibrary/src/test/java/com/example/ironlibrary/IronlibraryApplicationTests.java new file mode 100644 index 00000000..75feacd2 --- /dev/null +++ b/ironlibrary/src/test/java/com/example/ironlibrary/IronlibraryApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.ironlibrary; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class IronlibraryApplicationTests { + + @Test + void contextLoads() { + } + +} From b2068f66d0da2f23e94e42a8dbd1b6a1c6869629 Mon Sep 17 00:00:00 2001 From: jtiradohernandez Date: Sat, 16 Mar 2024 11:21:08 +0100 Subject: [PATCH 02/79] Creation of packages model and repository and modification of application properties --- .idea/.gitignore | 8 +++++++- ironlibrary/.gitignore | 2 +- .../main/java/com/example/ironlibrary/model/Author.java | 4 ++++ .../example/ironlibrary/repository/AuthorRepository.java | 4 ++++ ironlibrary/src/main/resources/application.properties | 4 ++-- 5 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java diff --git a/.idea/.gitignore b/.idea/.gitignore index 7f3b5878..d47ce2f2 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,6 +1,12 @@ # Default ignored files /shelf/ /workspace.xml - +/compiler.xml +/encodings.xml +/homework-java-ironlibrary.iml +/jarRepositories.xml +/misc.xml +/modules.xml +/vcs.xml diff --git a/ironlibrary/.gitignore b/ironlibrary/.gitignore index 9d9398ff..52c43022 100644 --- a/ironlibrary/.gitignore +++ b/ironlibrary/.gitignore @@ -20,4 +20,4 @@ target/ *.ipr ### VS Code ### -.vscode/ \ No newline at end of file +.vscode/ diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java new file mode 100644 index 00000000..1ffc4a2e --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java @@ -0,0 +1,4 @@ +package com.example.ironlibrary.model; + +public class Author { +} diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java b/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java new file mode 100644 index 00000000..093eee88 --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java @@ -0,0 +1,4 @@ +package com.example.ironlibrary.repository; + +public interface AuthorRepository { +} diff --git a/ironlibrary/src/main/resources/application.properties b/ironlibrary/src/main/resources/application.properties index 680d6e9a..791c3f54 100644 --- a/ironlibrary/src/main/resources/application.properties +++ b/ironlibrary/src/main/resources/application.properties @@ -1,7 +1,7 @@ spring.application.name=ironlibrary spring.datasource.url=jdbc:mysql://localhost:3306/TO FILL ?serverTimezone=UTC -spring.datasource.username=root -spring.datasource.password= +spring.datasource.username=ironhack +spring.datasource.password=ironhack2024 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=validate From c13fe196b42f16f68a23afb749081976f4dc4cb2 Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Sat, 16 Mar 2024 11:37:03 +0100 Subject: [PATCH 03/79] add validator interface --- .../main/java/com/example/ironlibrary/model/Validator.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/model/Validator.java diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Validator.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Validator.java new file mode 100644 index 00000000..7b7f2b62 --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Validator.java @@ -0,0 +1,5 @@ +package com.example.ironlibrary.model; + +public interface Validator { + boolean input_validation(); +} From d4cfa25019e486e89814d27f795b0b2d5372c2bd Mon Sep 17 00:00:00 2001 From: Darren <111098562+DJH23@users.noreply.github.com> Date: Sat, 16 Mar 2024 11:43:02 +0100 Subject: [PATCH 04/79] create Issue model --- .../com/example/ironlibrary/model/Issue.java | 18 ++++++++++++++++++ .../repository/IssueRepository.java | 12 ++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java new file mode 100644 index 00000000..fa19214c --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java @@ -0,0 +1,18 @@ +package com.example.ironlibrary.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class Issue { + private int issueId; + private String issueDate; + private String returnDate; + // To be used later. + //private Student issueStudent; + //private Book issueBook; + +} diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java b/ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java new file mode 100644 index 00000000..61df4314 --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java @@ -0,0 +1,12 @@ +package com.example.ironlibrary.repository; + +import com.example.ironlibrary.model.Issue; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface IssueRepository extends JpaRepository { + + // List findByIssueStudent_StudentId(Integer studentId); + +} From e4e613abf26fd19f496152c66f968bf2ea46b0c2 Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Sat, 16 Mar 2024 12:12:38 +0100 Subject: [PATCH 05/79] refactor name --- .../ironlibrary/model/{Validator.java => InputValidator.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename ironlibrary/src/main/java/com/example/ironlibrary/model/{Validator.java => InputValidator.java} (68%) diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Validator.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/InputValidator.java similarity index 68% rename from ironlibrary/src/main/java/com/example/ironlibrary/model/Validator.java rename to ironlibrary/src/main/java/com/example/ironlibrary/model/InputValidator.java index 7b7f2b62..1d686c7f 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Validator.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/InputValidator.java @@ -1,5 +1,5 @@ package com.example.ironlibrary.model; -public interface Validator { +public interface InputValidator { boolean input_validation(); } From 66887f26e57b919a7e3da0b9a1e86ee03533022a Mon Sep 17 00:00:00 2001 From: Darren <111098562+DJH23@users.noreply.github.com> Date: Sat, 16 Mar 2024 12:35:26 +0100 Subject: [PATCH 06/79] add InputValidator implementation to Issue model --- .../main/java/com/example/ironlibrary/model/Issue.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java index fa19214c..88568193 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java @@ -7,7 +7,7 @@ @Getter @Setter @AllArgsConstructor -public class Issue { +public class Issue implements InputValidator{ private int issueId; private String issueDate; private String returnDate; @@ -15,4 +15,11 @@ public class Issue { //private Student issueStudent; //private Book issueBook; + @Override + public boolean input_validation() { + // Implement validation logic here + // Return true if validation passes, false otherwise + return true; + } + } From 30c48a1ff2da63b14c77a7b2d826bd28d17b7b97 Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Sat, 16 Mar 2024 12:50:54 +0100 Subject: [PATCH 07/79] Book class creation and test --- .../com/example/ironlibrary/model/Book.java | 53 +++++++++++++++++++ .../example/ironlibrary/model/Categories.java | 14 +++++ .../repository/BookRepository.java | 10 ++++ .../src/main/resources/application.properties | 2 +- .../example/ironlibrary/BookClassTests.java | 33 ++++++++++++ 5 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/model/Categories.java create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/repository/BookRepository.java create mode 100644 ironlibrary/src/test/java/com/example/ironlibrary/BookClassTests.java diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java new file mode 100644 index 00000000..924cf9f3 --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java @@ -0,0 +1,53 @@ +package com.example.ironlibrary.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Objects; + +@Getter +@Setter +@NoArgsConstructor +@Entity +@Table(name = "book") +public class Book implements InputValidator{ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="id") + private int id; + + private String isbn; + private String title; + + @Enumerated(EnumType.STRING) + private Categories Category; + + private int quantity; + + public Book(String isbn, String title, Categories category, int quantity) { + this.isbn = isbn; + this.title = title; + Category = category; + this.quantity = quantity; + } + + @Override + public boolean input_validation() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return quantity == book.quantity && Objects.equals(isbn, book.isbn) && Objects.equals(title, book.title) && Category == book.Category; + } + + @Override + public int hashCode() { + return Objects.hash(isbn, title, Category, quantity); + } +} diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Categories.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Categories.java new file mode 100644 index 00000000..7b4a9c7d --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Categories.java @@ -0,0 +1,14 @@ +package com.example.ironlibrary.model; + +public enum Categories { + HORROR, + SCIENCE, + ROMANCE, + FICTION, + FANTASY, + ADVENTURE, + BIOGRAPHY, + MISTERY, + OTHERS + +} diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/BookRepository.java b/ironlibrary/src/main/java/com/example/ironlibrary/repository/BookRepository.java new file mode 100644 index 00000000..172fa26a --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/repository/BookRepository.java @@ -0,0 +1,10 @@ +package com.example.ironlibrary.repository; + +import com.example.ironlibrary.model.Book; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface BookRepository extends JpaRepository { + Optional findBookByTitle(String title); +} diff --git a/ironlibrary/src/main/resources/application.properties b/ironlibrary/src/main/resources/application.properties index 791c3f54..a096c8ec 100644 --- a/ironlibrary/src/main/resources/application.properties +++ b/ironlibrary/src/main/resources/application.properties @@ -1,5 +1,5 @@ spring.application.name=ironlibrary -spring.datasource.url=jdbc:mysql://localhost:3306/TO FILL ?serverTimezone=UTC +spring.datasource.url=jdbc:mysql://localhost:3306/library?serverTimezone=UTC spring.datasource.username=ironhack spring.datasource.password=ironhack2024 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/BookClassTests.java b/ironlibrary/src/test/java/com/example/ironlibrary/BookClassTests.java new file mode 100644 index 00000000..7cbbdd81 --- /dev/null +++ b/ironlibrary/src/test/java/com/example/ironlibrary/BookClassTests.java @@ -0,0 +1,33 @@ +package com.example.ironlibrary; + +import com.example.ironlibrary.model.Book; +import com.example.ironlibrary.model.Categories; +import com.example.ironlibrary.repository.BookRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest +public class BookClassTests { + @AfterEach + public void tearDown(){ + bookRepository.deleteAll(); + } + @Autowired + BookRepository bookRepository; + @Test + public void bookCreationTest(){ + Book sample_book = new Book("1234","my awesome book", Categories.ADVENTURE,3); + bookRepository.save(sample_book); + Optional db_book=bookRepository.findBookByTitle("my awesome book"); + assertTrue(db_book.isPresent()); + assertEquals(sample_book,db_book.get()); + } +} From 3f19c58480598f5a7d30dfa4028cafd92e0bd079 Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Sat, 16 Mar 2024 12:51:22 +0100 Subject: [PATCH 08/79] Book DDL --- .../main/java/com/example/ironlibrary/SQL.sql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql index e69de29b..fbc0e195 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql +++ b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql @@ -0,0 +1,20 @@ +drop schema library; +create schema library; +use library; + +create table book( +id int AUTO_INCREMENT not null, +isbn varchar(64) not null, +title varchar(255) not null, +category enum('HORROR', + 'SCIENCE', + 'ROMANCE', + 'FICTION', + 'FANTASY', + 'ADVENTURE', + 'BIOGRAPHY', + 'MISTERY', + 'OTHERS'), +quantity int not null, +primary key(id) +); From 75a3a58619a40f2c83a9edef5b68b34b0202b7d0 Mon Sep 17 00:00:00 2001 From: Darren <111098562+DJH23@users.noreply.github.com> Date: Sat, 16 Mar 2024 12:59:23 +0100 Subject: [PATCH 09/79] add Issue testing --- ironlibrary/pom.xml | 17 +++++++++++++++++ .../java/com/example/ironlibrary/IssueTest.java | 14 ++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java diff --git a/ironlibrary/pom.xml b/ironlibrary/pom.xml index b550766a..98727e7a 100644 --- a/ironlibrary/pom.xml +++ b/ironlibrary/pom.xml @@ -41,6 +41,23 @@ spring-boot-starter-test test + + org.testng + testng + RELEASE + test + + + org.testng + testng + RELEASE + test + + + junit + junit + test + diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java new file mode 100644 index 00000000..9a8f2a79 --- /dev/null +++ b/ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java @@ -0,0 +1,14 @@ +package com.example.ironlibrary; + +import com.example.ironlibrary.model.Issue; +import org.junit.Test; +import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class IssueTest { + @Test + public void testInputValidation() { + Issue issue = new Issue(1, "2022-03-01", "2022-03-31"); + assertTrue(issue.input_validation()); + } +} From 51fdafee745732a30946d2f3f2a0235133022328 Mon Sep 17 00:00:00 2001 From: jtiradohernandez Date: Sat, 16 Mar 2024 13:02:22 +0100 Subject: [PATCH 10/79] Solution of author model, repository and DDL tasks --- .idea/compiler.xml | 1 + .../main/java/com/example/ironlibrary/SQL.sql | 10 ++++ .../com/example/ironlibrary/model/Author.java | 39 ++++++++++++++++ .../repository/AuthorRepository.java | 7 ++- .../src/main/resources/application.properties | 2 +- .../example/ironlibrary/model/AuthorTest.java | 46 +++++++++++++++++++ 6 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 ironlibrary/src/test/java/com/example/ironlibrary/model/AuthorTest.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 08cb5482..92f3a6c4 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,6 +2,7 @@ + diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql index e69de29b..9812c621 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql +++ b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql @@ -0,0 +1,10 @@ +CREATE SCHEMA library; + +CREATE TABLE library.author( + author_id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(255), + email VARCHAR(255), + author_book VARCHAR(255), + PRIMARY KEY (author_id), + FOREIGN KEY (author_book) REFERENCES library.book(isbn) + ); \ No newline at end of file diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java index 1ffc4a2e..3e2bfcff 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java @@ -1,4 +1,43 @@ package com.example.ironlibrary.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Objects; + +@Getter +@Setter +@NoArgsConstructor +@Entity +@Table(name = "author") public class Author { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int authorId; + private String name; + private String email; + + @OneToOne + @JoinColumn(name="book_id") + private Book authorBook; + + public Author(String name, String email, Book authorBook) { + setName(name); + setEmail(email); + setAuthorBook(authorBook); + } + + + @Override + public boolean input_validation() { + return false; + } + + @Override + public int hashCode() { + return Objects.hash(authorId, name, email, authorBook); + } } diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java b/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java index 093eee88..566ab49b 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java @@ -1,4 +1,9 @@ package com.example.ironlibrary.repository; -public interface AuthorRepository { +import com.example.ironlibrary.model.Author; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AuthorRepository extends JpaRepository { } diff --git a/ironlibrary/src/main/resources/application.properties b/ironlibrary/src/main/resources/application.properties index 791c3f54..a096c8ec 100644 --- a/ironlibrary/src/main/resources/application.properties +++ b/ironlibrary/src/main/resources/application.properties @@ -1,5 +1,5 @@ spring.application.name=ironlibrary -spring.datasource.url=jdbc:mysql://localhost:3306/TO FILL ?serverTimezone=UTC +spring.datasource.url=jdbc:mysql://localhost:3306/library?serverTimezone=UTC spring.datasource.username=ironhack spring.datasource.password=ironhack2024 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/model/AuthorTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/model/AuthorTest.java new file mode 100644 index 00000000..a308ece3 --- /dev/null +++ b/ironlibrary/src/test/java/com/example/ironlibrary/model/AuthorTest.java @@ -0,0 +1,46 @@ +package com.example.ironlibrary.model; + +import com.example.ironlibrary.repository.AuthorRepository; +import lombok.EqualsAndHashCode; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + + +@SpringBootTest +@EqualsAndHashCode +class AuthorTest { + + @Autowired + private AuthorRepository authorRepository; + + Author author; + Book book; + + @BeforeEach + void setUp() { + book = new Book(); + author = new Author("Xavi","xavi@mail.com", book); + authorRepository.save(author); + } + + @AfterEach + void tearDown() { + authorRepository.deleteAll(); + } + + + @Test + public void createAuthor(){ + Optional authorFound = authorRepository.findById(author.getAuthorId()); + assertEquals(author.getAuthorId(),authorFound.get().getAuthorId()); + assertEquals(author.getName(),authorFound.get().getName()); + assertEquals(author.getEmail(),authorFound.get().getEmail()); + } + + +} \ No newline at end of file From 82eec486aaecf28ac8e92470685b7329fa3545cf Mon Sep 17 00:00:00 2001 From: jtiradohernandez Date: Sat, 16 Mar 2024 13:06:13 +0100 Subject: [PATCH 11/79] Add pom on gitignore and adapt author model to validator abstract class --- ironlibrary/.gitignore | 1 + .../src/main/java/com/example/ironlibrary/model/Author.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ironlibrary/.gitignore b/ironlibrary/.gitignore index 52c43022..cf44e9d0 100644 --- a/ironlibrary/.gitignore +++ b/ironlibrary/.gitignore @@ -21,3 +21,4 @@ target/ ### VS Code ### .vscode/ +/pom.xml \ No newline at end of file diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java index 3e2bfcff..4ba5d67f 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java @@ -13,7 +13,7 @@ @NoArgsConstructor @Entity @Table(name = "author") -public class Author { +public class Author implements InputValidator { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int authorId; From 80b579f0e703d4272714968b378560bdf0419383 Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Sat, 16 Mar 2024 13:39:00 +0100 Subject: [PATCH 12/79] change isbn to primary key --- ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql | 5 ++--- .../src/main/java/com/example/ironlibrary/model/Book.java | 6 ++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql index fbc0e195..3686b705 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql +++ b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql @@ -3,7 +3,6 @@ create schema library; use library; create table book( -id int AUTO_INCREMENT not null, isbn varchar(64) not null, title varchar(255) not null, category enum('HORROR', @@ -16,5 +15,5 @@ category enum('HORROR', 'MISTERY', 'OTHERS'), quantity int not null, -primary key(id) -); +primary key(isbn) +); \ No newline at end of file diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java index 924cf9f3..bec8cb4a 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java @@ -14,11 +14,9 @@ @Table(name = "book") public class Book implements InputValidator{ @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name="id") - private int id; - + @Column(name="isbn") private String isbn; + private String title; @Enumerated(EnumType.STRING) From ea9c0f7b9f4dbb7f6dde883f3cf7b4c88f21b8b0 Mon Sep 17 00:00:00 2001 From: jtiradohernandez Date: Sat, 16 Mar 2024 13:49:43 +0100 Subject: [PATCH 13/79] Add book dependency --- .../main/java/com/example/ironlibrary/SQL.sql | 20 ++++++++++--------- .../com/example/ironlibrary/model/Author.java | 8 ++++++++ .../com/example/ironlibrary/AuthorTest.java | 6 ++---- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql index 69a8ab71..29885524 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql +++ b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql @@ -2,15 +2,6 @@ drop schema library; create schema library; use library; -CREATE TABLE library.author( - author_id INT NOT NULL AUTO_INCREMENT, - name VARCHAR(255), - email VARCHAR(255), - author_book VARCHAR(255), - PRIMARY KEY (author_id), - FOREIGN KEY (author_book) REFERENCES library.book(isbn) - ); - create table book( id int AUTO_INCREMENT not null, isbn varchar(64) not null, @@ -28,3 +19,14 @@ quantity int not null, primary key(id) ); +CREATE TABLE library.author( + author_id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(255), + email VARCHAR(255), + author_book VARCHAR(255), + PRIMARY KEY (author_id), + FOREIGN KEY (author_book) REFERENCES library.book(isbn) + ); + + + diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java index 4ba5d67f..63da3d7c 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java @@ -36,6 +36,14 @@ public boolean input_validation() { return false; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Author author = (Author) o; + return authorId == author.authorId && authorBook.equals(author.authorBook) && Objects.equals(name, author.name) && email == author.email; + } + @Override public int hashCode() { return Objects.hash(authorId, name, email, authorBook); diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/AuthorTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/AuthorTest.java index 8faabd7b..32b2f3e9 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/AuthorTest.java +++ b/ironlibrary/src/test/java/com/example/ironlibrary/AuthorTest.java @@ -14,7 +14,6 @@ @SpringBootTest -@EqualsAndHashCode class AuthorTest { @Autowired @@ -39,9 +38,8 @@ void tearDown() { @Test public void createAuthor(){ Optional authorFound = authorRepository.findById(author.getAuthorId()); - assertEquals(author.getAuthorId(),authorFound.get().getAuthorId()); - assertEquals(author.getName(),authorFound.get().getName()); - assertEquals(author.getEmail(),authorFound.get().getEmail()); + assertTrue(authorFound.isPresent()); + assertEquals(author,authorFound.get()); } From c6f3fcfd9b58d55ca4727465ebfdce00ea5d6bd9 Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 16 Mar 2024 13:52:52 +0100 Subject: [PATCH 14/79] student model and repostory, tests --- .../example/ironlibrary/model/Student.java | 50 +++++++++++++++++++ .../repository/StudentRepository.java | 2 + .../ironlibrary/model/StudentTest.java | 4 ++ .../repository/StudentRepositoryTest.java | 4 ++ 4 files changed, 60 insertions(+) create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java create mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java create mode 100644 ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java create mode 100644 ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java new file mode 100644 index 00000000..026af50b --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java @@ -0,0 +1,50 @@ +package com.example.ironlibrary.model; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Table(name="student") +@Data +@NoArgsConstructor + +public class Student implements InputValidator{ + @Id + private String usn; + private String name; + +// @OneToOne(mappedBy="issueStudent") +// private Issue issue; + + public Student(String usn, String name) { + this.usn = usn; + this.name = name; + } + + public String getUsn() { + return usn; + } + + public void setUsn(String usn) { + this.usn = usn; //uniqueIdGenerator() de Utils + + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean input_validation() { + //añadir logica de validacion name + return false; + } +} diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java b/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java new file mode 100644 index 00000000..da016ab6 --- /dev/null +++ b/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java @@ -0,0 +1,2 @@ +package com.example.ironlibrary.repository;public interface StudentRepository { +} diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java new file mode 100644 index 00000000..de48c4af --- /dev/null +++ b/ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class StudentTest { + +} \ No newline at end of file diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java new file mode 100644 index 00000000..6335a37f --- /dev/null +++ b/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class StudentRepositoryTest { + +} \ No newline at end of file From 87c7065437ddd6b4d49ac90bbdcbfa61778bff5b Mon Sep 17 00:00:00 2001 From: Darren <111098562+DJH23@users.noreply.github.com> Date: Sat, 16 Mar 2024 13:59:17 +0100 Subject: [PATCH 15/79] modify Issue and its testing --- .../com/example/ironlibrary/model/Issue.java | 28 +++++++++--- .../repository/IssueRepository.java | 4 +- .../ironlibrary/IssueRepositoryTest.java | 43 +++++++++++++++++++ .../com/example/ironlibrary/IssueTest.java | 34 ++++++++++++--- 4 files changed, 93 insertions(+), 16 deletions(-) create mode 100644 ironlibrary/src/test/java/com/example/ironlibrary/IssueRepositoryTest.java diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java index 88568193..9f506249 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java @@ -1,19 +1,26 @@ package com.example.ironlibrary.model; -import lombok.AllArgsConstructor; +import jakarta.persistence.*; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; +@Entity @Getter @Setter -@AllArgsConstructor -public class Issue implements InputValidator{ +@NoArgsConstructor // Generates a no-args constructor for JPA +public class Issue implements InputValidator { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private int issueId; private String issueDate; private String returnDate; - // To be used later. - //private Student issueStudent; - //private Book issueBook; + + // Constructor without issueId + public Issue(String issueDate, String returnDate) { + this.issueDate = issueDate; + this.returnDate = returnDate; + } @Override public boolean input_validation() { @@ -22,4 +29,13 @@ public boolean input_validation() { return true; } + // Assuming Student and Book + // To be uncommented and used later. + // @OneToOne + // private Student issueStudent; + // @OneToOne + // private Book issueBook; } + + + diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java b/ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java index 61df4314..96d86f28 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java @@ -6,7 +6,5 @@ @Repository public interface IssueRepository extends JpaRepository { - - // List findByIssueStudent_StudentId(Integer studentId); - + Issue findByIssueId(int issueId); } diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/IssueRepositoryTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/IssueRepositoryTest.java new file mode 100644 index 00000000..bec68a79 --- /dev/null +++ b/ironlibrary/src/test/java/com/example/ironlibrary/IssueRepositoryTest.java @@ -0,0 +1,43 @@ +package com.example.ironlibrary; + +import com.example.ironlibrary.model.Issue; +import com.example.ironlibrary.repository.IssueRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Optional; + +@DataJpaTest +public class IssueRepositoryTest { + + @Autowired + private IssueRepository issueRepository; + + @Test + void testIssueCreationAndRetrieval() { + // Create and save an Issue + Issue savedIssue = issueRepository.save(new Issue("2023-01-01", "2023-01-10")); + + // Retrieve the saved Issue by ID + Optional retrievedIssue = issueRepository.findById(savedIssue.getIssueId()); + + // Verify the retrieval + assertTrue(retrievedIssue.isPresent(), "Issue should be found by ID"); + assertEquals("2023-01-01", retrievedIssue.get().getIssueDate(), "Issue dates should match"); + } + + @Test + void testFindByIssueId() { + // Create and save an Issue + Issue savedIssue = issueRepository.save(new Issue("2023-02-01", "2023-02-10")); + + // Use the custom findByIssueId method + Issue foundIssue = issueRepository.findByIssueId(savedIssue.getIssueId()); + + // Verify the result + assertNotNull(foundIssue, "Issue should be found with custom query"); + assertEquals("2023-02-01", foundIssue.getIssueDate(), "Issue dates should match in custom query"); + } +} diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java index 9a8f2a79..28b732bc 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java +++ b/ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java @@ -1,14 +1,34 @@ package com.example.ironlibrary; import com.example.ironlibrary.model.Issue; -import org.junit.Test; -import static org.junit.Assert.*; -import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class IssueTest { + + @Test + void testConstructorAssignsValuesCorrectly() { + // Given + String expectedIssueDate = "2023-01-01"; + String expectedReturnDate = "2023-01-10"; + + // When + Issue issue = new Issue(expectedIssueDate, expectedReturnDate); + + // Then + assertEquals(expectedIssueDate, issue.getIssueDate(), "IssueDate should match the constructor input"); + assertEquals(expectedReturnDate, issue.getReturnDate(), "ReturnDate should match the constructor input"); + } -public class IssueTest { @Test - public void testInputValidation() { - Issue issue = new Issue(1, "2022-03-01", "2022-03-31"); - assertTrue(issue.input_validation()); + void testInputValidation() { + // Given + Issue issue = new Issue("2023-01-01", "2023-01-10"); + + // When + Boolean isValid = issue.input_validation(); + + // Then + assertTrue(isValid, "input_validation should return true"); } } From 5c427aef301cf9cc87295bb6ab4b09f8bb0bba6b Mon Sep 17 00:00:00 2001 From: Darren <111098562+DJH23@users.noreply.github.com> Date: Sat, 16 Mar 2024 14:05:32 +0100 Subject: [PATCH 16/79] modify Issue and its testing --- ironlibrary/pom.xml | 80 --------------------------------------------- 1 file changed, 80 deletions(-) delete mode 100644 ironlibrary/pom.xml diff --git a/ironlibrary/pom.xml b/ironlibrary/pom.xml deleted file mode 100644 index 98727e7a..00000000 --- a/ironlibrary/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.2.3 - - - com.example - ironlibrary - 0.0.1-SNAPSHOT - ironlibrary - Ironlibrary project for Ironhack - - 21 - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - - com.mysql - mysql-connector-j - runtime - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-test - test - - - org.testng - testng - RELEASE - test - - - org.testng - testng - RELEASE - test - - - junit - junit - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - From 81992940e1e72689e505cd767c04a26ece6f4411 Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 16 Mar 2024 14:06:05 +0100 Subject: [PATCH 17/79] subit tests y student repository --- .../repository/StudentRepository.java | 11 +++++- .../ironlibrary/model/StudentTest.java | 28 +++++++++++++- .../repository/StudentRepositoryTest.java | 37 ++++++++++++++++++- 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java b/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java index da016ab6..615d1e94 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java @@ -1,2 +1,11 @@ -package com.example.ironlibrary.repository;public interface StudentRepository { +package com.example.ironlibrary.repository; + +import com.example.ironlibrary.model.Student; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface StudentRepository extends JpaRepository { + + //Optional findByName(String name); } diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java index de48c4af..90cedc90 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java +++ b/ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java @@ -1,4 +1,30 @@ +package com.example.ironlibrary.model; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.*; + class StudentTest { - + + @BeforeEach + void setUp() { + } + + @AfterEach + void tearDown() { + } + + @Test + public void testStudentCreation() { + + Student student = new Student("abcd", "Juan"); + + assertNotNull(student); + + assertEquals("abcd", student.getUsn()); + + assertEquals("Juan", student.getName()); + } } \ No newline at end of file diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java index 6335a37f..4ea41df0 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java +++ b/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java @@ -1,4 +1,39 @@ +package com.example.ironlibrary.repository; + +import com.example.ironlibrary.model.Student; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; + import static org.junit.jupiter.api.Assertions.*; +@SpringBootTest class StudentRepositoryTest { - + + @Autowired + private StudentRepository studentRepository; + + private Student student; + + @BeforeEach + void setUp() { +// student = new Student("avcbdhdhd", "Juan"); +// student = studentRepository.save(student); + } + + @AfterEach + void tearDown() { + studentRepository.deleteAll(); + studentRepository.flush(); + } + +// @Test +// void findByName() { +// Optional student = studentRepository.findByName("Juan"); +// assertTrue(student.isPresent()); +// assertEquals("Juan", student.get().getName()); +// } } \ No newline at end of file From a674aa7ce85763c513ed4c9ee14bdf98e5a4941b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Sat, 16 Mar 2024 14:09:40 +0100 Subject: [PATCH 18/79] Create automationtest.yml Create the github action that will launch all the test when a PR is opened --- .github/workflows/automationtest.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/automationtest.yml diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml new file mode 100644 index 00000000..8ec9590d --- /dev/null +++ b/.github/workflows/automationtest.yml @@ -0,0 +1,28 @@ +name: Launch automated testing + # Triger that will launch this action +on: + pull_request: + types: [opened, reopened] #When a pull request is opened or reopened will trigger this action + + +#The action that will be performed once the action is triggered +jobs: + run_tests: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set up JDK 21 + uses: actions/setup-java@v1 + with: + java-version: '21' + - name: Cache Maven packages + uses: actions/cache@v2 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Build + run: mvn --batch-mode -DskipTests package + - name: Test + run: mvn clean test From 17d395ff474548594fd5716b2fad1ff969b61861 Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 16 Mar 2024 14:19:57 +0100 Subject: [PATCH 19/79] actualizar test studentrepository --- .../repository/StudentRepositoryTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java index 4ea41df0..a57cdf8f 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java +++ b/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java @@ -20,8 +20,8 @@ class StudentRepositoryTest { @BeforeEach void setUp() { -// student = new Student("avcbdhdhd", "Juan"); -// student = studentRepository.save(student); + student = new Student("avcbdhdhd", "Juan"); + student = studentRepository.save(student); } @AfterEach @@ -30,10 +30,10 @@ void tearDown() { studentRepository.flush(); } -// @Test -// void findByName() { -// Optional student = studentRepository.findByName("Juan"); -// assertTrue(student.isPresent()); -// assertEquals("Juan", student.get().getName()); -// } + @Test + void findByName() { + Optional student = studentRepository.findByName("Juan"); + assertTrue(student.isPresent()); + assertEquals("Juan", student.get().getName()); + } } \ No newline at end of file From 043389b3398f396b1dbbf244b8f05f627aa9cf16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Sat, 16 Mar 2024 14:20:13 +0100 Subject: [PATCH 20/79] Update automationtest.yml First fix of automation --- .github/workflows/automationtest.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 8ec9590d..ff116b7d 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -16,12 +16,6 @@ jobs: uses: actions/setup-java@v1 with: java-version: '21' - - name: Cache Maven packages - uses: actions/cache@v2 - with: - path: ~/.m2 - key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} - restore-keys: ${{ runner.os }}-m2 - name: Build run: mvn --batch-mode -DskipTests package - name: Test From 49aad561e050c6f4789755bdd86563914a2cb167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Sat, 16 Mar 2024 14:24:54 +0100 Subject: [PATCH 21/79] Update automationtest.yml Try to fix action unable to reach pom --- .github/workflows/automationtest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index ff116b7d..18f27565 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -19,4 +19,4 @@ jobs: - name: Build run: mvn --batch-mode -DskipTests package - name: Test - run: mvn clean test + run: mvn clean test /ironlibrary/pom.xml From 6f146cbcf54fd18bfd57234a3cefa54ab38a8c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Sat, 16 Mar 2024 14:27:17 +0100 Subject: [PATCH 22/79] Update automationtest.yml second try to fix the action unable to find pom --- .github/workflows/automationtest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 18f27565..14b31c2a 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -17,6 +17,6 @@ jobs: with: java-version: '21' - name: Build - run: mvn --batch-mode -DskipTests package + run: -f ironlibrary/ clean compile - name: Test - run: mvn clean test /ironlibrary/pom.xml + run: mvn clean test From ee3b020f7266992e21ac634cd28791b18e7a094a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Sat, 16 Mar 2024 14:28:21 +0100 Subject: [PATCH 23/79] Update automationtest.yml --- .github/workflows/automationtest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 14b31c2a..f97f1ad5 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -17,6 +17,6 @@ jobs: with: java-version: '21' - name: Build - run: -f ironlibrary/ clean compile + run: -f /ironlibrary/ clean compile - name: Test run: mvn clean test From 6b4c1fcfab61f216b421eac17fa8fac8bbf17cbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Sat, 16 Mar 2024 14:29:42 +0100 Subject: [PATCH 24/79] Update automationtest.yml I forgot mvn word --- .github/workflows/automationtest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index f97f1ad5..1b9462fc 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -17,6 +17,6 @@ jobs: with: java-version: '21' - name: Build - run: -f /ironlibrary/ clean compile + run: mvn -f /ironlibrary clean compile - name: Test run: mvn clean test From c2ba9b68e0f8231f9e826fba1636b2c778d79e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Sat, 16 Mar 2024 14:30:57 +0100 Subject: [PATCH 25/79] Update automationtest.yml --- .github/workflows/automationtest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 1b9462fc..9dc2b25f 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -17,6 +17,6 @@ jobs: with: java-version: '21' - name: Build - run: mvn -f /ironlibrary clean compile + run: mvn -f ironlibrary/pom.xml clean compile - name: Test run: mvn clean test From 1e6a168690ad7c37aab85df12359fc2558412bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Sat, 16 Mar 2024 14:34:59 +0100 Subject: [PATCH 26/79] Update automationtest.yml Test command requires also the pom location --- .github/workflows/automationtest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 9dc2b25f..dc85069d 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -19,4 +19,4 @@ jobs: - name: Build run: mvn -f ironlibrary/pom.xml clean compile - name: Test - run: mvn clean test + run: mvn -f ironlibrary/pom.xml clean test From 4b5f60e93d2c1049575aca319abd75c2f3eb8449 Mon Sep 17 00:00:00 2001 From: Darren <111098562+DJH23@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:02:01 +0100 Subject: [PATCH 27/79] add Issue DDL in SQL --- .../src/main/java/com/example/ironlibrary/SQL.sql | 9 ++++++++- .../main/java/com/example/ironlibrary/model/Issue.java | 10 ++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql index 3686b705..7bc732aa 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql +++ b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql @@ -12,8 +12,15 @@ category enum('HORROR', 'FANTASY', 'ADVENTURE', 'BIOGRAPHY', - 'MISTERY', + 'MYSTERY', 'OTHERS'), quantity int not null, primary key(isbn) +); + +CREATE TABLE Issue ( + issueId INT AUTO_INCREMENT NOT NULL, + issueDate VARCHAR(255) NOT NULL, + returnDate VARCHAR(255) NOT NULL, + PRIMARY KEY(issueId) ); \ No newline at end of file diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java index 9f506249..5b3934e7 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java @@ -29,12 +29,10 @@ public boolean input_validation() { return true; } - // Assuming Student and Book - // To be uncommented and used later. - // @OneToOne - // private Student issueStudent; - // @OneToOne - // private Book issueBook; + @OneToOne + private Student issueStudent; + @OneToOne + private Book issueBook; } From a34de27c992509a1b42cfb4d09f72d140d50fbd4 Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 16 Mar 2024 15:45:56 +0100 Subject: [PATCH 28/79] add hascode and equals to Student.java ; add student table to SQL ; uncomment StudenRepository --- .../src/main/java/com/example/ironlibrary/SQL.sql | 8 +++++++- .../com/example/ironlibrary/model/Student.java | 14 ++++++++++++++ .../ironlibrary/repository/StudentRepository.java | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql index 7bc732aa..274156b1 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql +++ b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql @@ -23,4 +23,10 @@ CREATE TABLE Issue ( issueDate VARCHAR(255) NOT NULL, returnDate VARCHAR(255) NOT NULL, PRIMARY KEY(issueId) -); \ No newline at end of file +); + +CREATE TABLE student ( + usn VARCHAR(255) NOT NULL, + name VARCHAR(255) NOT NULL, + PRIMARY KEY (usn) + ); \ No newline at end of file diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java index 026af50b..4bc99b40 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java @@ -6,6 +6,8 @@ import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.Objects; + @Entity @Table(name="student") @Data @@ -41,6 +43,18 @@ public void setName(String name) { this.name = name; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Student student = (Student) o; + return Objects.equals(usn, student.usn) && Objects.equals(name, student.name); + } + + @Override + public int hashCode() { + return Objects.hash(usn, name); + } @Override public boolean input_validation() { diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java b/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java index 615d1e94..ad697797 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java @@ -7,5 +7,5 @@ public interface StudentRepository extends JpaRepository { - //Optional findByName(String name); + Optional findByName(String name); } From 3585ac3475b9993b7dd17f4ef98cbe7f8cc8816a Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 16 Mar 2024 16:51:10 +0100 Subject: [PATCH 29/79] recuperar pom --- ironlibrary/pom.xml | 80 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 ironlibrary/pom.xml diff --git a/ironlibrary/pom.xml b/ironlibrary/pom.xml new file mode 100644 index 00000000..98727e7a --- /dev/null +++ b/ironlibrary/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.3 + + + com.example + ironlibrary + 0.0.1-SNAPSHOT + ironlibrary + Ironlibrary project for Ironhack + + 21 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + com.mysql + mysql-connector-j + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.testng + testng + RELEASE + test + + + org.testng + testng + RELEASE + test + + + junit + junit + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + From f9213d51469056cd58546327054291718a2879d5 Mon Sep 17 00:00:00 2001 From: jtiradohernandez Date: Sun, 17 Mar 2024 21:06:33 +0100 Subject: [PATCH 30/79] Final solution for Author model, repository, DDL and tests --- .../src/main/java/com/example/ironlibrary/SQL.sql | 2 +- .../main/java/com/example/ironlibrary/model/Author.java | 2 +- .../test/java/com/example/ironlibrary/AuthorTest.java | 9 +++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql index d69bf503..cca0ff30 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql +++ b/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql @@ -27,7 +27,7 @@ CREATE TABLE library.author( FOREIGN KEY (author_book) REFERENCES library.book(isbn) ); -CREATE TABLE Issue ( +CREATE TABLE issue ( issueId INT AUTO_INCREMENT NOT NULL, issueDate VARCHAR(255) NOT NULL, returnDate VARCHAR(255) NOT NULL, diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java index 63da3d7c..dbf48312 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java +++ b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java @@ -21,7 +21,7 @@ public class Author implements InputValidator { private String email; @OneToOne - @JoinColumn(name="book_id") + @JoinColumn(name="author_book") private Book authorBook; public Author(String name, String email, Book authorBook) { diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/AuthorTest.java b/ironlibrary/src/test/java/com/example/ironlibrary/AuthorTest.java index 32b2f3e9..b07e5241 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/AuthorTest.java +++ b/ironlibrary/src/test/java/com/example/ironlibrary/AuthorTest.java @@ -2,7 +2,9 @@ import com.example.ironlibrary.model.Author; import com.example.ironlibrary.model.Book; +import com.example.ironlibrary.model.Categories; import com.example.ironlibrary.repository.AuthorRepository; +import com.example.ironlibrary.repository.BookRepository; import lombok.EqualsAndHashCode; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; @@ -18,13 +20,16 @@ class AuthorTest { @Autowired private AuthorRepository authorRepository; + @Autowired + private BookRepository bookRepository; Author author; Book book; @BeforeEach void setUp() { - book = new Book(); + book = new Book("1234","my awesome book", Categories.ADVENTURE,3); + bookRepository.save(book); author = new Author("Xavi","xavi@mail.com", book); authorRepository.save(author); } @@ -39,7 +44,7 @@ void tearDown() { public void createAuthor(){ Optional authorFound = authorRepository.findById(author.getAuthorId()); assertTrue(authorFound.isPresent()); - assertEquals(author,authorFound.get()); + assertEquals(author.getAuthorId(),authorFound.get().getAuthorId()); } From a61c448e0993573a607129d56b99d05fb5dec60b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= Date: Mon, 18 Mar 2024 17:51:41 +0100 Subject: [PATCH 31/79] Re-structured --- ironlibrary/.gitignore => .gitignore | 23 +- .idea/.gitignore | 2 + .idea/encodings.xml | 3 +- .idea/homework-java-ironlibrary.iml | 6 +- .idea/misc.xml | 1 + .idea/modules.xml | 8 - ironlibrary/README.md => README.md | 0 ironlibrary/.mvn/wrapper/maven-wrapper.jar | Bin 62547 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - ironlibrary/mvnw | 308 ------------------ ironlibrary/mvnw.cmd | 205 ------------ ironlibrary/pom.xml | 80 ----- .../com/example/ironlibrary/model/Author.java | 4 - .../repository/AuthorRepository.java | 4 - .../IronlibraryApplicationTests.java | 13 - pom.xml | 81 +++++ .../main/java}/IronlibraryApplication.java | 2 - src/main/java/model/Author.java | 4 + .../main/java}/model/Book.java | 2 +- .../main/java}/model/Categories.java | 2 +- .../main/java}/model/InputValidator.java | 2 +- .../main/java}/model/Issue.java | 2 +- .../main/java}/model/Student.java | 8 +- .../java/repository/AuthorRepository.java | 4 + .../main/java}/repository/BookRepository.java | 4 +- .../java}/repository/IssueRepository.java | 4 +- .../java}/repository/StudentRepository.java | 4 +- .../main/resources/application.properties | 0 .../SQL.sql => src/main/resources/schema.sql | 0 .../test/java/model/BookTests.java | 9 +- .../test/java/model}/IssueTest.java | 9 +- .../test/java}/model/StudentTest.java | 5 +- .../java/repository}/IssueRepositoryTest.java | 8 +- .../repository/StudentRepositoryTest.java | 7 +- 34 files changed, 151 insertions(+), 665 deletions(-) rename ironlibrary/.gitignore => .gitignore (62%) delete mode 100644 .idea/modules.xml rename ironlibrary/README.md => README.md (100%) delete mode 100644 ironlibrary/.mvn/wrapper/maven-wrapper.jar delete mode 100644 ironlibrary/.mvn/wrapper/maven-wrapper.properties delete mode 100755 ironlibrary/mvnw delete mode 100644 ironlibrary/mvnw.cmd delete mode 100644 ironlibrary/pom.xml delete mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java delete mode 100644 ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java delete mode 100644 ironlibrary/src/test/java/com/example/ironlibrary/IronlibraryApplicationTests.java create mode 100644 pom.xml rename {ironlibrary/src/main/java/com/example/ironlibrary => src/main/java}/IronlibraryApplication.java (89%) create mode 100644 src/main/java/model/Author.java rename {ironlibrary/src/main/java/com/example/ironlibrary => src/main/java}/model/Book.java (96%) rename {ironlibrary/src/main/java/com/example/ironlibrary => src/main/java}/model/Categories.java (79%) rename {ironlibrary/src/main/java/com/example/ironlibrary => src/main/java}/model/InputValidator.java (63%) rename {ironlibrary/src/main/java/com/example/ironlibrary => src/main/java}/model/Issue.java (95%) rename {ironlibrary/src/main/java/com/example/ironlibrary => src/main/java}/model/Student.java (91%) create mode 100644 src/main/java/repository/AuthorRepository.java rename {ironlibrary/src/main/java/com/example/ironlibrary => src/main/java}/repository/BookRepository.java (71%) rename {ironlibrary/src/main/java/com/example/ironlibrary => src/main/java}/repository/IssueRepository.java (73%) rename {ironlibrary/src/main/java/com/example/ironlibrary => src/main/java}/repository/StudentRepository.java (70%) rename {ironlibrary/src => src}/main/resources/application.properties (100%) rename ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql => src/main/resources/schema.sql (100%) rename ironlibrary/src/test/java/com/example/ironlibrary/BookClassTests.java => src/test/java/model/BookTests.java (77%) rename {ironlibrary/src/test/java/com/example/ironlibrary => src/test/java/model}/IssueTest.java (81%) rename {ironlibrary/src/test/java/com/example/ironlibrary => src/test/java}/model/StudentTest.java (77%) rename {ironlibrary/src/test/java/com/example/ironlibrary => src/test/java/repository}/IssueRepositoryTest.java (91%) rename {ironlibrary/src/test/java/com/example/ironlibrary => src/test/java}/repository/StudentRepositoryTest.java (84%) diff --git a/ironlibrary/.gitignore b/.gitignore similarity index 62% rename from ironlibrary/.gitignore rename to .gitignore index 52c43022..7ddfa42d 100644 --- a/ironlibrary/.gitignore +++ b/.gitignore @@ -1,8 +1,7 @@ -HELP.md +# Maven +log/ target/ !.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ ### STS ### .apt_generated @@ -20,4 +19,20 @@ target/ *.ipr ### VS Code ### -.vscode/ +.vscode + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# Log file +*.log + + +# MacOS +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore index d47ce2f2..3653f57f 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -10,3 +10,5 @@ /vcs.xml +# GitHub Copilot persisted chat sessions +/copilot/chatSessions diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 3efb871c..aa00ffab 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,6 +1,7 @@ - + + \ No newline at end of file diff --git a/.idea/homework-java-ironlibrary.iml b/.idea/homework-java-ironlibrary.iml index d6ebd480..8ac229cf 100644 --- a/.idea/homework-java-ironlibrary.iml +++ b/.idea/homework-java-ironlibrary.iml @@ -2,7 +2,11 @@ - + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index a60ecf2e..9cb884d4 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,6 +5,7 @@ diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 821fdf28..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/ironlibrary/README.md b/README.md similarity index 100% rename from ironlibrary/README.md rename to README.md diff --git a/ironlibrary/.mvn/wrapper/maven-wrapper.jar b/ironlibrary/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index cb28b0e37c7d206feb564310fdeec0927af4123a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62547 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 A?*IS* diff --git a/ironlibrary/.mvn/wrapper/maven-wrapper.properties b/ironlibrary/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 5f0536eb..00000000 --- a/ironlibrary/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/ironlibrary/mvnw b/ironlibrary/mvnw deleted file mode 100755 index 66df2854..00000000 --- a/ironlibrary/mvnw +++ /dev/null @@ -1,308 +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 -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.2.0 -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "$(uname)" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME - else - JAVA_HOME="/Library/Java/Home"; export JAVA_HOME - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=$(java-config --jre-home) - fi -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --unix "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --unix "$CLASSPATH") -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && - JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="$(which javac)" - if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=$(which readlink) - if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then - if $darwin ; then - javaHome="$(dirname "\"$javaExecutable\"")" - javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" - else - javaExecutable="$(readlink -f "\"$javaExecutable\"")" - fi - javaHome="$(dirname "\"$javaExecutable\"")" - javaHome=$(expr "$javaHome" : '\(.*\)/bin') - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=$(cd "$wdir/.." || exit 1; pwd) - fi - # end of workaround - done - printf '%s' "$(cd "$basedir" || exit 1; pwd)" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - # Remove \r in case we run on Windows within Git Bash - # and check out the repository with auto CRLF management - # enabled. Otherwise, we may read lines that are delimited with - # \r\n and produce $'-Xarg\r' rather than -Xarg due to word - # splitting rules. - tr -s '\r\n' ' ' < "$1" - fi -} - -log() { - if [ "$MVNW_VERBOSE" = true ]; then - printf '%s\n' "$1" - fi -} - -BASE_DIR=$(find_maven_basedir "$(dirname "$0")") -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR -log "$MAVEN_PROJECTBASEDIR" - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" -if [ -r "$wrapperJarPath" ]; then - log "Found $wrapperJarPath" -else - log "Couldn't find $wrapperJarPath, downloading it ..." - - if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - fi - while IFS="=" read -r key value; do - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) - safeValue=$(echo "$value" | tr -d '\r') - case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; - esac - done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" - log "Downloading from: $wrapperUrl" - - if $cygwin; then - wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") - fi - - if command -v wget > /dev/null; then - log "Found wget ... using wget" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - log "Found curl ... using curl" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - fi - else - log "Falling back to using Java to download" - javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" - javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaSource=$(cygpath --path --windows "$javaSource") - javaClass=$(cygpath --path --windows "$javaClass") - fi - if [ -e "$javaSource" ]; then - if [ ! -e "$javaClass" ]; then - log " - Compiling MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/javac" "$javaSource") - fi - if [ -e "$javaClass" ]; then - log " - Running MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -# If specified, validate the SHA-256 sum of the Maven wrapper jar file -wrapperSha256Sum="" -while IFS="=" read -r key value; do - case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; - esac -done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" -if [ -n "$wrapperSha256Sum" ]; then - wrapperSha256Result=false - if command -v sha256sum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then - wrapperSha256Result=true - fi - elif command -v shasum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then - wrapperSha256Result=true - fi - else - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." - echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." - exit 1 - fi - if [ $wrapperSha256Result = false ]; then - echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 - echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 - echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 - exit 1 - fi -fi - -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --windows "$CLASSPATH") - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -# shellcheck disable=SC2086 # safe args -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/ironlibrary/mvnw.cmd b/ironlibrary/mvnw.cmd deleted file mode 100644 index 95ba6f54..00000000 --- a/ironlibrary/mvnw.cmd +++ /dev/null @@ -1,205 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.2.0 -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %WRAPPER_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file -SET WRAPPER_SHA_256_SUM="" -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B -) -IF NOT %WRAPPER_SHA_256_SUM%=="" ( - powershell -Command "&{"^ - "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ - "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ - " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ - " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ - " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ - " exit 1;"^ - "}"^ - "}" - if ERRORLEVEL 1 goto error -) - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% ^ - %JVM_CONFIG_MAVEN_PROPS% ^ - %MAVEN_OPTS% ^ - %MAVEN_DEBUG_OPTS% ^ - -classpath %WRAPPER_JAR% ^ - "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ - %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" -if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%"=="on" pause - -if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% - -cmd /C exit /B %ERROR_CODE% diff --git a/ironlibrary/pom.xml b/ironlibrary/pom.xml deleted file mode 100644 index 98727e7a..00000000 --- a/ironlibrary/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.2.3 - - - com.example - ironlibrary - 0.0.1-SNAPSHOT - ironlibrary - Ironlibrary project for Ironhack - - 21 - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - - com.mysql - mysql-connector-j - runtime - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-test - test - - - org.testng - testng - RELEASE - test - - - org.testng - testng - RELEASE - test - - - junit - junit - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java b/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java deleted file mode 100644 index 1ffc4a2e..00000000 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Author.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.ironlibrary.model; - -public class Author { -} diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java b/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java deleted file mode 100644 index 093eee88..00000000 --- a/ironlibrary/src/main/java/com/example/ironlibrary/repository/AuthorRepository.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.ironlibrary.repository; - -public interface AuthorRepository { -} diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/IronlibraryApplicationTests.java b/ironlibrary/src/test/java/com/example/ironlibrary/IronlibraryApplicationTests.java deleted file mode 100644 index 75feacd2..00000000 --- a/ironlibrary/src/test/java/com/example/ironlibrary/IronlibraryApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.ironlibrary; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class IronlibraryApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..5e6679d2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.3 + + + com.example + ironlibrary + 0.0.1-SNAPSHOT + ironlibrary + Ironlibrary project for Ironhack + + 21 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-web + + + + com.mysql + mysql-connector-j + runtime + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.testng + testng + RELEASE + test + + + + junit + junit + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/IronlibraryApplication.java b/src/main/java/IronlibraryApplication.java similarity index 89% rename from ironlibrary/src/main/java/com/example/ironlibrary/IronlibraryApplication.java rename to src/main/java/IronlibraryApplication.java index 21dc5934..2e0d4be4 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/IronlibraryApplication.java +++ b/src/main/java/IronlibraryApplication.java @@ -1,5 +1,3 @@ -package com.example.ironlibrary; - import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/model/Author.java b/src/main/java/model/Author.java new file mode 100644 index 00000000..04320208 --- /dev/null +++ b/src/main/java/model/Author.java @@ -0,0 +1,4 @@ +package model; + +public class Author { +} diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java b/src/main/java/model/Book.java similarity index 96% rename from ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java rename to src/main/java/model/Book.java index bec8cb4a..1e522f43 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Book.java +++ b/src/main/java/model/Book.java @@ -1,4 +1,4 @@ -package com.example.ironlibrary.model; +package model; import jakarta.persistence.*; import lombok.Getter; diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Categories.java b/src/main/java/model/Categories.java similarity index 79% rename from ironlibrary/src/main/java/com/example/ironlibrary/model/Categories.java rename to src/main/java/model/Categories.java index 7b4a9c7d..1c2c831b 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Categories.java +++ b/src/main/java/model/Categories.java @@ -1,4 +1,4 @@ -package com.example.ironlibrary.model; +package model; public enum Categories { HORROR, diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/InputValidator.java b/src/main/java/model/InputValidator.java similarity index 63% rename from ironlibrary/src/main/java/com/example/ironlibrary/model/InputValidator.java rename to src/main/java/model/InputValidator.java index 1d686c7f..27d5fd0d 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/InputValidator.java +++ b/src/main/java/model/InputValidator.java @@ -1,4 +1,4 @@ -package com.example.ironlibrary.model; +package model; public interface InputValidator { boolean input_validation(); diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java b/src/main/java/model/Issue.java similarity index 95% rename from ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java rename to src/main/java/model/Issue.java index 5b3934e7..5ef167bd 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Issue.java +++ b/src/main/java/model/Issue.java @@ -1,4 +1,4 @@ -package com.example.ironlibrary.model; +package model; import jakarta.persistence.*; import lombok.Getter; diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java b/src/main/java/model/Student.java similarity index 91% rename from ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java rename to src/main/java/model/Student.java index 4bc99b40..84c61a2f 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/model/Student.java +++ b/src/main/java/model/Student.java @@ -1,10 +1,10 @@ -package com.example.ironlibrary.model; +package model; -import jakarta.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.Data; -import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import java.util.Objects; diff --git a/src/main/java/repository/AuthorRepository.java b/src/main/java/repository/AuthorRepository.java new file mode 100644 index 00000000..dd2aea97 --- /dev/null +++ b/src/main/java/repository/AuthorRepository.java @@ -0,0 +1,4 @@ +package repository; + +public interface AuthorRepository { +} diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/BookRepository.java b/src/main/java/repository/BookRepository.java similarity index 71% rename from ironlibrary/src/main/java/com/example/ironlibrary/repository/BookRepository.java rename to src/main/java/repository/BookRepository.java index 172fa26a..9be9a0dd 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/repository/BookRepository.java +++ b/src/main/java/repository/BookRepository.java @@ -1,6 +1,6 @@ -package com.example.ironlibrary.repository; +package repository; -import com.example.ironlibrary.model.Book; +import model.Book; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java b/src/main/java/repository/IssueRepository.java similarity index 73% rename from ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java rename to src/main/java/repository/IssueRepository.java index 96d86f28..6d26c6f5 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/repository/IssueRepository.java +++ b/src/main/java/repository/IssueRepository.java @@ -1,6 +1,6 @@ -package com.example.ironlibrary.repository; +package repository; -import com.example.ironlibrary.model.Issue; +import model.Issue; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java b/src/main/java/repository/StudentRepository.java similarity index 70% rename from ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java rename to src/main/java/repository/StudentRepository.java index ad697797..3e1ae764 100644 --- a/ironlibrary/src/main/java/com/example/ironlibrary/repository/StudentRepository.java +++ b/src/main/java/repository/StudentRepository.java @@ -1,6 +1,6 @@ -package com.example.ironlibrary.repository; +package repository; -import com.example.ironlibrary.model.Student; +import model.Student; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; diff --git a/ironlibrary/src/main/resources/application.properties b/src/main/resources/application.properties similarity index 100% rename from ironlibrary/src/main/resources/application.properties rename to src/main/resources/application.properties diff --git a/ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql b/src/main/resources/schema.sql similarity index 100% rename from ironlibrary/src/main/java/com/example/ironlibrary/SQL.sql rename to src/main/resources/schema.sql diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/BookClassTests.java b/src/test/java/model/BookTests.java similarity index 77% rename from ironlibrary/src/test/java/com/example/ironlibrary/BookClassTests.java rename to src/test/java/model/BookTests.java index 7cbbdd81..61ac07b1 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/BookClassTests.java +++ b/src/test/java/model/BookTests.java @@ -1,13 +1,10 @@ -package com.example.ironlibrary; +package model; -import com.example.ironlibrary.model.Book; -import com.example.ironlibrary.model.Categories; -import com.example.ironlibrary.repository.BookRepository; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import repository.BookRepository; import java.util.Optional; @@ -15,7 +12,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest -public class BookClassTests { +public class BookTests { @AfterEach public void tearDown(){ bookRepository.deleteAll(); diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java b/src/test/java/model/IssueTest.java similarity index 81% rename from ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java rename to src/test/java/model/IssueTest.java index 28b732bc..b5b8111d 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/IssueTest.java +++ b/src/test/java/model/IssueTest.java @@ -1,8 +1,9 @@ -package com.example.ironlibrary; +package model; -import com.example.ironlibrary.model.Issue; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; class IssueTest { @@ -26,7 +27,7 @@ void testInputValidation() { Issue issue = new Issue("2023-01-01", "2023-01-10"); // When - Boolean isValid = issue.input_validation(); + boolean isValid = issue.input_validation(); // Then assertTrue(isValid, "input_validation should return true"); diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java b/src/test/java/model/StudentTest.java similarity index 77% rename from ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java rename to src/test/java/model/StudentTest.java index 90cedc90..3d07a665 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/model/StudentTest.java +++ b/src/test/java/model/StudentTest.java @@ -1,10 +1,11 @@ -package com.example.ironlibrary.model; +package model; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; class StudentTest { diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/IssueRepositoryTest.java b/src/test/java/repository/IssueRepositoryTest.java similarity index 91% rename from ironlibrary/src/test/java/com/example/ironlibrary/IssueRepositoryTest.java rename to src/test/java/repository/IssueRepositoryTest.java index bec68a79..ce083943 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/IssueRepositoryTest.java +++ b/src/test/java/repository/IssueRepositoryTest.java @@ -1,14 +1,14 @@ -package com.example.ironlibrary; +package repository; -import com.example.ironlibrary.model.Issue; -import com.example.ironlibrary.repository.IssueRepository; +import model.Issue; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import static org.junit.jupiter.api.Assertions.*; import java.util.Optional; +import static org.junit.jupiter.api.Assertions.*; + @DataJpaTest public class IssueRepositoryTest { diff --git a/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java b/src/test/java/repository/StudentRepositoryTest.java similarity index 84% rename from ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java rename to src/test/java/repository/StudentRepositoryTest.java index a57cdf8f..903e42c9 100644 --- a/ironlibrary/src/test/java/com/example/ironlibrary/repository/StudentRepositoryTest.java +++ b/src/test/java/repository/StudentRepositoryTest.java @@ -1,6 +1,6 @@ -package com.example.ironlibrary.repository; +package repository; -import com.example.ironlibrary.model.Student; +import model.Student; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -9,7 +9,8 @@ import java.util.Optional; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest class StudentRepositoryTest { From c6e44d6689960b7ae1e3257dcd9c02b3339cd290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= Date: Tue, 19 Mar 2024 10:34:52 +0100 Subject: [PATCH 32/79] Untrack .idea directory --- .idea/.gitignore | 14 -------------- .idea/compiler.xml | 18 ------------------ .idea/encodings.xml | 7 ------- .idea/homework-java-ironlibrary.iml | 13 ------------- .idea/jarRepositories.xml | 20 -------------------- .idea/misc.xml | 15 --------------- .idea/vcs.xml | 6 ------ 7 files changed, 93 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/homework-java-ironlibrary.iml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 3653f57f..00000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -/compiler.xml -/encodings.xml -/homework-java-ironlibrary.iml -/jarRepositories.xml -/misc.xml -/modules.xml -/vcs.xml - - -# GitHub Copilot persisted chat sessions -/copilot/chatSessions diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 08cb5482..00000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index aa00ffab..00000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/homework-java-ironlibrary.iml b/.idea/homework-java-ironlibrary.iml deleted file mode 100644 index 8ac229cf..00000000 --- a/.idea/homework-java-ironlibrary.iml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index 712ab9d9..00000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 9cb884d4..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddf..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 1a1e4abf07c016e826cb0f222f775c67418df7a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= <157316089+sergi-svg@users.noreply.github.com> Date: Tue, 19 Mar 2024 13:46:49 +0100 Subject: [PATCH 33/79] Update automationtest.yml --- .github/workflows/automationtest.yml | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index dc85069d..526a1adf 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -1,22 +1,18 @@ -name: Launch automated testing - # Triger that will launch this action on: pull_request: - types: [opened, reopened] #When a pull request is opened or reopened will trigger this action - - -#The action that will be performed once the action is triggered + branches: + - main + - develop jobs: - run_tests: - runs-on: ubuntu-latest + build: + runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Set up JDK 21 - uses: actions/setup-java@v1 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: java-version: '21' - - name: Build - run: mvn -f ironlibrary/pom.xml clean compile - - name: Test - run: mvn -f ironlibrary/pom.xml clean test + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn --batch-mode --update-snapshots verify + From 9023a7a91620df472d0fc69f9689e5c7f2fa40ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= Date: Tue, 19 Mar 2024 16:15:25 +0100 Subject: [PATCH 34/79] updated schema.sql updated pom.xml renamed app --- pom.xml | 30 +++++------ ...braryApplication.java => IronLibrary.java} | 4 +- src/main/resources/schema.sql | 53 +++++++++++-------- 3 files changed, 44 insertions(+), 43 deletions(-) rename src/main/java/{IronlibraryApplication.java => IronLibrary.java} (66%) diff --git a/pom.xml b/pom.xml index 5e6679d2..8445f3fa 100644 --- a/pom.xml +++ b/pom.xml @@ -8,17 +8,21 @@ 3.2.3 - com.example + ironlibrary 0.0.1-SNAPSHOT - ironlibrary - Ironlibrary project for Ironhack + 21 + + org.springframework.boot + spring-boot-starter-web + + org.springframework.boot spring-boot-starter-data-jpa @@ -26,7 +30,8 @@ org.springframework.boot - spring-boot-starter-web + spring-boot-starter-test + test @@ -42,23 +47,12 @@ - org.springframework.boot - spring-boot-starter-test + org.junit.jupiter + junit-jupiter-api + 5.10.2 test - - org.testng - testng - RELEASE - test - - - - junit - junit - test - diff --git a/src/main/java/IronlibraryApplication.java b/src/main/java/IronLibrary.java similarity index 66% rename from src/main/java/IronlibraryApplication.java rename to src/main/java/IronLibrary.java index 2e0d4be4..e2e8f2f9 100644 --- a/src/main/java/IronlibraryApplication.java +++ b/src/main/java/IronLibrary.java @@ -2,10 +2,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class IronlibraryApplication { +public class IronLibrary { public static void main(String[] args) { - SpringApplication.run(IronlibraryApplication.class, args); + SpringApplication.run(IronLibrary.class, args); } } diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 274156b1..332edf0a 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -2,31 +2,38 @@ drop schema library; create schema library; use library; +create table author( + id int AUTO_INCREMENT not null, + name varchar(50) not null, + email varchar(50) not null, + author_book int not null, + primary key(id), + foreign key(author_book) references book(isbn) +); + create table book( -isbn varchar(64) not null, -title varchar(255) not null, -category enum('HORROR', - 'SCIENCE', - 'ROMANCE', - 'FICTION', - 'FANTASY', - 'ADVENTURE', - 'BIOGRAPHY', - 'MYSTERY', - 'OTHERS'), -quantity int not null, -primary key(isbn) + isbn varchar(17) not null, + title varchar(255) not null, + category varchar(50) not null, + quantity int not null, + author_id int not null, + primary key(isbn), + foreign key(author_id) references author(id) ); -CREATE TABLE Issue ( - issueId INT AUTO_INCREMENT NOT NULL, - issueDate VARCHAR(255) NOT NULL, - returnDate VARCHAR(255) NOT NULL, - PRIMARY KEY(issueId) +CREATE TABLE issue( + issue_id INT AUTO_INCREMENT not null, + issue_date varchar(255) not null, + return_date varchar(255) not null, + issue_student varchar(255) not null, + issue_book varchar(17) not null, + primary key(issue_id) + foreign key(issue_student) references student(usn), + foreign key(issue_book) references book(isbn) ); -CREATE TABLE student ( - usn VARCHAR(255) NOT NULL, - name VARCHAR(255) NOT NULL, - PRIMARY KEY (usn) - ); \ No newline at end of file +CREATE TABLE student( + usn varchar(11) not null, + name varchar(255) not null, + primary key(usn) +); \ No newline at end of file From da860f9f6e8c2c0de3d8fc90656de24545aa9c60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Tue, 19 Mar 2024 20:46:22 +0100 Subject: [PATCH 35/79] Update automationtest.yml --- .github/workflows/automationtest.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 526a1adf..1aae9961 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -1,5 +1,6 @@ on: pull_request: + types: [opened, reopened] branches: - main - develop @@ -13,6 +14,7 @@ jobs: java-version: '21' distribution: 'temurin' cache: maven - - name: Build with Maven - run: mvn --batch-mode --update-snapshots verify - + #- name: Build with Maven + # run: mvn --batch-mode --update-snapshots verify + - name: Build + run: mvn -f clean compile From 9007a4cfba03b58d21c60936477dad13848b2346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Tue, 19 Mar 2024 20:48:59 +0100 Subject: [PATCH 36/79] Update automationtest.yml --- .github/workflows/automationtest.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 1aae9961..2c52d7c2 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -1,6 +1,5 @@ on: pull_request: - types: [opened, reopened] branches: - main - develop From c8d4e936025baf95c208a90b835f7c37e2093fa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Tirado=20Hern=C3=A1ndez?= Date: Tue, 19 Mar 2024 20:50:14 +0100 Subject: [PATCH 37/79] Update automationtest.yml --- .github/workflows/automationtest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 2c52d7c2..f51854ba 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -15,5 +15,5 @@ jobs: cache: maven #- name: Build with Maven # run: mvn --batch-mode --update-snapshots verify - - name: Build - run: mvn -f clean compile + - name: Build with Maven + run: mvn -B clean package --file pom.xml From f2cb5b2d26463292e40c41a25490aae9b7278d8a Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Tue, 19 Mar 2024 21:30:45 +0100 Subject: [PATCH 38/79] bugfix missing package --- .../java/{ => com/ironhack}/IronLibrary.java | 2 + src/main/java/com/ironhack/model/Author.java | 4 ++ .../java/{ => com/ironhack}/model/Book.java | 2 +- .../{ => com/ironhack}/model/Categories.java | 2 +- .../ironhack}/model/InputValidator.java | 2 +- .../java/{ => com/ironhack}/model/Issue.java | 3 +- .../{ => com/ironhack}/model/Student.java | 2 +- .../repository/AuthorRepository.java | 2 +- .../ironhack}/repository/BookRepository.java | 5 ++- .../ironhack}/repository/IssueRepository.java | 4 +- .../repository/StudentRepository.java | 5 ++- src/main/java/model/Author.java | 4 -- .../{ => com/ironhack}/model/BookTests.java | 20 ++++----- .../{ => com/ironhack}/model/IssueTest.java | 3 +- .../{ => com/ironhack}/model/StudentTest.java | 4 +- .../repository/IssueRepositoryTest.java | 43 +++++++++++++++++++ .../repository/StudentRepositoryTest.java | 17 ++++---- .../java/repository/IssueRepositoryTest.java | 43 ------------------- 18 files changed, 86 insertions(+), 81 deletions(-) rename src/main/java/{ => com/ironhack}/IronLibrary.java (92%) create mode 100644 src/main/java/com/ironhack/model/Author.java rename src/main/java/{ => com/ironhack}/model/Book.java (97%) rename src/main/java/{ => com/ironhack}/model/Categories.java (84%) rename src/main/java/{ => com/ironhack}/model/InputValidator.java (71%) rename src/main/java/{ => com/ironhack}/model/Issue.java (96%) rename src/main/java/{ => com/ironhack}/model/Student.java (97%) rename src/main/java/{ => com/ironhack}/repository/AuthorRepository.java (54%) rename src/main/java/{ => com/ironhack}/repository/BookRepository.java (76%) rename src/main/java/{ => com/ironhack}/repository/IssueRepository.java (78%) rename src/main/java/{ => com/ironhack}/repository/StudentRepository.java (75%) delete mode 100644 src/main/java/model/Author.java rename src/test/java/{ => com/ironhack}/model/BookTests.java (54%) rename src/test/java/{ => com/ironhack}/model/IssueTest.java (94%) rename src/test/java/{ => com/ironhack}/model/StudentTest.java (90%) create mode 100644 src/test/java/com/ironhack/repository/IssueRepositoryTest.java rename src/test/java/{ => com/ironhack}/repository/StudentRepositoryTest.java (73%) delete mode 100644 src/test/java/repository/IssueRepositoryTest.java diff --git a/src/main/java/IronLibrary.java b/src/main/java/com/ironhack/IronLibrary.java similarity index 92% rename from src/main/java/IronLibrary.java rename to src/main/java/com/ironhack/IronLibrary.java index e2e8f2f9..8c387f88 100644 --- a/src/main/java/IronLibrary.java +++ b/src/main/java/com/ironhack/IronLibrary.java @@ -1,3 +1,5 @@ +package com.ironhack; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/com/ironhack/model/Author.java b/src/main/java/com/ironhack/model/Author.java new file mode 100644 index 00000000..a498927d --- /dev/null +++ b/src/main/java/com/ironhack/model/Author.java @@ -0,0 +1,4 @@ +package com.ironhack.model; + +public class Author { +} diff --git a/src/main/java/model/Book.java b/src/main/java/com/ironhack/model/Book.java similarity index 97% rename from src/main/java/model/Book.java rename to src/main/java/com/ironhack/model/Book.java index 1e522f43..9d79ac4b 100644 --- a/src/main/java/model/Book.java +++ b/src/main/java/com/ironhack/model/Book.java @@ -1,4 +1,4 @@ -package model; +package com.ironhack.model; import jakarta.persistence.*; import lombok.Getter; diff --git a/src/main/java/model/Categories.java b/src/main/java/com/ironhack/model/Categories.java similarity index 84% rename from src/main/java/model/Categories.java rename to src/main/java/com/ironhack/model/Categories.java index 1c2c831b..45ed7bb4 100644 --- a/src/main/java/model/Categories.java +++ b/src/main/java/com/ironhack/model/Categories.java @@ -1,4 +1,4 @@ -package model; +package com.ironhack.model; public enum Categories { HORROR, diff --git a/src/main/java/model/InputValidator.java b/src/main/java/com/ironhack/model/InputValidator.java similarity index 71% rename from src/main/java/model/InputValidator.java rename to src/main/java/com/ironhack/model/InputValidator.java index 27d5fd0d..f0cdfef9 100644 --- a/src/main/java/model/InputValidator.java +++ b/src/main/java/com/ironhack/model/InputValidator.java @@ -1,4 +1,4 @@ -package model; +package com.ironhack.model; public interface InputValidator { boolean input_validation(); diff --git a/src/main/java/model/Issue.java b/src/main/java/com/ironhack/model/Issue.java similarity index 96% rename from src/main/java/model/Issue.java rename to src/main/java/com/ironhack/model/Issue.java index 5ef167bd..7bc057c2 100644 --- a/src/main/java/model/Issue.java +++ b/src/main/java/com/ironhack/model/Issue.java @@ -1,5 +1,4 @@ -package model; - +package com.ironhack.model; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/model/Student.java b/src/main/java/com/ironhack/model/Student.java similarity index 97% rename from src/main/java/model/Student.java rename to src/main/java/com/ironhack/model/Student.java index 84c61a2f..eb18ef01 100644 --- a/src/main/java/model/Student.java +++ b/src/main/java/com/ironhack/model/Student.java @@ -1,4 +1,4 @@ -package model; +package com.ironhack.model; import jakarta.persistence.Entity; import jakarta.persistence.Id; diff --git a/src/main/java/repository/AuthorRepository.java b/src/main/java/com/ironhack/repository/AuthorRepository.java similarity index 54% rename from src/main/java/repository/AuthorRepository.java rename to src/main/java/com/ironhack/repository/AuthorRepository.java index dd2aea97..499f679a 100644 --- a/src/main/java/repository/AuthorRepository.java +++ b/src/main/java/com/ironhack/repository/AuthorRepository.java @@ -1,4 +1,4 @@ -package repository; +package com.ironhack.repository; public interface AuthorRepository { } diff --git a/src/main/java/repository/BookRepository.java b/src/main/java/com/ironhack/repository/BookRepository.java similarity index 76% rename from src/main/java/repository/BookRepository.java rename to src/main/java/com/ironhack/repository/BookRepository.java index 9be9a0dd..e20908ea 100644 --- a/src/main/java/repository/BookRepository.java +++ b/src/main/java/com/ironhack/repository/BookRepository.java @@ -1,6 +1,7 @@ -package repository; +package com.ironhack.repository; -import model.Book; + +import com.ironhack.model.Book; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; diff --git a/src/main/java/repository/IssueRepository.java b/src/main/java/com/ironhack/repository/IssueRepository.java similarity index 78% rename from src/main/java/repository/IssueRepository.java rename to src/main/java/com/ironhack/repository/IssueRepository.java index 6d26c6f5..844154b0 100644 --- a/src/main/java/repository/IssueRepository.java +++ b/src/main/java/com/ironhack/repository/IssueRepository.java @@ -1,6 +1,6 @@ -package repository; +package com.ironhack.repository; -import model.Issue; +import com.ironhack.model.Issue; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/repository/StudentRepository.java b/src/main/java/com/ironhack/repository/StudentRepository.java similarity index 75% rename from src/main/java/repository/StudentRepository.java rename to src/main/java/com/ironhack/repository/StudentRepository.java index 3e1ae764..92b8f548 100644 --- a/src/main/java/repository/StudentRepository.java +++ b/src/main/java/com/ironhack/repository/StudentRepository.java @@ -1,6 +1,7 @@ -package repository; +package com.ironhack.repository; -import model.Student; + +import com.ironhack.model.Student; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; diff --git a/src/main/java/model/Author.java b/src/main/java/model/Author.java deleted file mode 100644 index 04320208..00000000 --- a/src/main/java/model/Author.java +++ /dev/null @@ -1,4 +0,0 @@ -package model; - -public class Author { -} diff --git a/src/test/java/model/BookTests.java b/src/test/java/com/ironhack/model/BookTests.java similarity index 54% rename from src/test/java/model/BookTests.java rename to src/test/java/com/ironhack/model/BookTests.java index 61ac07b1..67c9230d 100644 --- a/src/test/java/model/BookTests.java +++ b/src/test/java/com/ironhack/model/BookTests.java @@ -1,10 +1,10 @@ -package model; +package com.ironhack.model; +import com.ironhack.repository.BookRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import repository.BookRepository; import java.util.Optional; @@ -19,12 +19,12 @@ public void tearDown(){ } @Autowired BookRepository bookRepository; - @Test - public void bookCreationTest(){ - Book sample_book = new Book("1234","my awesome book", Categories.ADVENTURE,3); - bookRepository.save(sample_book); - Optional db_book=bookRepository.findBookByTitle("my awesome book"); - assertTrue(db_book.isPresent()); - assertEquals(sample_book,db_book.get()); - } +// @Test +// public void bookCreationTest(){ +// Book sample_book = new Book("1234","my awesome book", Categories.ADVENTURE,3); +// bookRepository.save(sample_book); +// Optional db_book=bookRepository.findBookByTitle("my awesome book"); +// assertTrue(db_book.isPresent()); +// assertEquals(sample_book,db_book.get()); +// } } diff --git a/src/test/java/model/IssueTest.java b/src/test/java/com/ironhack/model/IssueTest.java similarity index 94% rename from src/test/java/model/IssueTest.java rename to src/test/java/com/ironhack/model/IssueTest.java index b5b8111d..45b91e7a 100644 --- a/src/test/java/model/IssueTest.java +++ b/src/test/java/com/ironhack/model/IssueTest.java @@ -1,5 +1,6 @@ -package model; +package com.ironhack.model; +import com.ironhack.model.Issue; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/model/StudentTest.java b/src/test/java/com/ironhack/model/StudentTest.java similarity index 90% rename from src/test/java/model/StudentTest.java rename to src/test/java/com/ironhack/model/StudentTest.java index 3d07a665..2cb569e9 100644 --- a/src/test/java/model/StudentTest.java +++ b/src/test/java/com/ironhack/model/StudentTest.java @@ -1,5 +1,5 @@ -package model; - +package com.ironhack.model; +import com.ironhack.model.Student; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/ironhack/repository/IssueRepositoryTest.java b/src/test/java/com/ironhack/repository/IssueRepositoryTest.java new file mode 100644 index 00000000..0ea762ec --- /dev/null +++ b/src/test/java/com/ironhack/repository/IssueRepositoryTest.java @@ -0,0 +1,43 @@ +package repository; + +import model.Issue; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +@DataJpaTest +public class IssueRepositoryTest { + + @Autowired + private IssueRepository issueRepository; + +// @Test +// void testIssueCreationAndRetrieval() { +// // Create and save an Issue +// Issue savedIssue = issueRepository.save(new Issue("2023-01-01", "2023-01-10")); +// +// // Retrieve the saved Issue by ID +// Optional retrievedIssue = issueRepository.findById(savedIssue.getIssueId()); +// +// // Verify the retrieval +// assertTrue(retrievedIssue.isPresent(), "Issue should be found by ID"); +// assertEquals("2023-01-01", retrievedIssue.get().getIssueDate(), "Issue dates should match"); +// } +// +// @Test +// void testFindByIssueId() { +// // Create and save an Issue +// Issue savedIssue = issueRepository.save(new Issue("2023-02-01", "2023-02-10")); +// +// // Use the custom findByIssueId method +// Issue foundIssue = issueRepository.findByIssueId(savedIssue.getIssueId()); +// +// // Verify the result +// assertNotNull(foundIssue, "Issue should be found with custom query"); +// assertEquals("2023-02-01", foundIssue.getIssueDate(), "Issue dates should match in custom query"); +// } +} diff --git a/src/test/java/repository/StudentRepositoryTest.java b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java similarity index 73% rename from src/test/java/repository/StudentRepositoryTest.java rename to src/test/java/com/ironhack/repository/StudentRepositoryTest.java index 903e42c9..9eda3f62 100644 --- a/src/test/java/repository/StudentRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java @@ -1,6 +1,7 @@ -package repository; +package com.ironhack.repository; -import model.Student; + +import com.ironhack.model.Student; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,10 +32,10 @@ void tearDown() { studentRepository.flush(); } - @Test - void findByName() { - Optional student = studentRepository.findByName("Juan"); - assertTrue(student.isPresent()); - assertEquals("Juan", student.get().getName()); - } +// @Test +// void findByName() { +// Optional student = studentRepository.findByName("Juan"); +// assertTrue(student.isPresent()); +// assertEquals("Juan", student.get().getName()); +// } } \ No newline at end of file diff --git a/src/test/java/repository/IssueRepositoryTest.java b/src/test/java/repository/IssueRepositoryTest.java deleted file mode 100644 index ce083943..00000000 --- a/src/test/java/repository/IssueRepositoryTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package repository; - -import model.Issue; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; - -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; - -@DataJpaTest -public class IssueRepositoryTest { - - @Autowired - private IssueRepository issueRepository; - - @Test - void testIssueCreationAndRetrieval() { - // Create and save an Issue - Issue savedIssue = issueRepository.save(new Issue("2023-01-01", "2023-01-10")); - - // Retrieve the saved Issue by ID - Optional retrievedIssue = issueRepository.findById(savedIssue.getIssueId()); - - // Verify the retrieval - assertTrue(retrievedIssue.isPresent(), "Issue should be found by ID"); - assertEquals("2023-01-01", retrievedIssue.get().getIssueDate(), "Issue dates should match"); - } - - @Test - void testFindByIssueId() { - // Create and save an Issue - Issue savedIssue = issueRepository.save(new Issue("2023-02-01", "2023-02-10")); - - // Use the custom findByIssueId method - Issue foundIssue = issueRepository.findByIssueId(savedIssue.getIssueId()); - - // Verify the result - assertNotNull(foundIssue, "Issue should be found with custom query"); - assertEquals("2023-02-01", foundIssue.getIssueDate(), "Issue dates should match in custom query"); - } -} From 55e7ed624383efbdd99618e7e98bef83358ffd83 Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Tue, 19 Mar 2024 21:58:50 +0100 Subject: [PATCH 39/79] bugfix repositories --- src/main/java/com/ironhack/model/Issue.java | 11 +++-- src/main/java/com/ironhack/model/Student.java | 5 +- src/main/resources/schema.sql | 46 +++++++++++-------- .../repository/IssueRepositoryTest.java | 4 +- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/ironhack/model/Issue.java b/src/main/java/com/ironhack/model/Issue.java index 7bc057c2..6eaaf660 100644 --- a/src/main/java/com/ironhack/model/Issue.java +++ b/src/main/java/com/ironhack/model/Issue.java @@ -14,6 +14,12 @@ public class Issue implements InputValidator { private int issueId; private String issueDate; private String returnDate; + @OneToOne + @JoinColumn(name="issue_student") + private Student issueStudent; + @OneToOne + @JoinColumn(name="issue_book") + private Book issueBook; // Constructor without issueId public Issue(String issueDate, String returnDate) { @@ -28,10 +34,7 @@ public boolean input_validation() { return true; } - @OneToOne - private Student issueStudent; - @OneToOne - private Book issueBook; + } diff --git a/src/main/java/com/ironhack/model/Student.java b/src/main/java/com/ironhack/model/Student.java index eb18ef01..0a2dd0be 100644 --- a/src/main/java/com/ironhack/model/Student.java +++ b/src/main/java/com/ironhack/model/Student.java @@ -2,6 +2,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import lombok.Data; import lombok.NoArgsConstructor; @@ -18,8 +19,8 @@ public class Student implements InputValidator{ private String usn; private String name; -// @OneToOne(mappedBy="issueStudent") -// private Issue issue; + //@OneToOne(mappedBy="issueStudent") + //private Issue issue; public Student(String usn, String name) { this.usn = usn; diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 332edf0a..07a439fd 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -2,23 +2,37 @@ drop schema library; create schema library; use library; + create table author( id int AUTO_INCREMENT not null, - name varchar(50) not null, - email varchar(50) not null, - author_book int not null, - primary key(id), - foreign key(author_book) references book(isbn) + name varchar(255) not null, + email varchar(100) not null, + primary key(id) ); create table book( - isbn varchar(17) not null, - title varchar(255) not null, - category varchar(50) not null, - quantity int not null, - author_id int not null, - primary key(isbn), - foreign key(author_id) references author(id) +isbn varchar(17) not null, +title varchar(255) not null, +category enum('HORROR', + 'SCIENCE', + 'ROMANCE', + 'FICTION', + 'FANTASY', + 'ADVENTURE', + 'BIOGRAPHY', + 'MISTERY', + 'OTHERS'), +quantity int not null, +author_id int not null, +foreign key(author_id) references author(id), +primary key(isbn) +); + + +CREATE TABLE student( + usn varchar(11) not null, + name varchar(255) not null, + primary key(usn) ); CREATE TABLE issue( @@ -27,13 +41,7 @@ CREATE TABLE issue( return_date varchar(255) not null, issue_student varchar(255) not null, issue_book varchar(17) not null, - primary key(issue_id) + primary key(issue_id), foreign key(issue_student) references student(usn), foreign key(issue_book) references book(isbn) ); - -CREATE TABLE student( - usn varchar(11) not null, - name varchar(255) not null, - primary key(usn) -); \ No newline at end of file diff --git a/src/test/java/com/ironhack/repository/IssueRepositoryTest.java b/src/test/java/com/ironhack/repository/IssueRepositoryTest.java index 0ea762ec..e8778688 100644 --- a/src/test/java/com/ironhack/repository/IssueRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/IssueRepositoryTest.java @@ -1,6 +1,6 @@ -package repository; +package com.ironhack.repository; -import model.Issue; +import com.ironhack.repository.IssueRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; From e5430e01788946d37657063a32ab77ea93aec89f Mon Sep 17 00:00:00 2001 From: jtiradohernandez Date: Tue, 19 Mar 2024 23:38:38 +0100 Subject: [PATCH 40/79] Add of gitignored previously deleted --- .gitignore | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..7ddfa42d --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Maven +log/ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### VS Code ### +.vscode + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# Log file +*.log + + +# MacOS +.DS_Store \ No newline at end of file From bd97430a7831ddcf89afdaffec99899dd2b208f3 Mon Sep 17 00:00:00 2001 From: jtiradohernandez Date: Tue, 19 Mar 2024 23:41:46 +0100 Subject: [PATCH 41/79] Comment test of repository --- .../java/com/ironhack/repository/AuthorRepositoryTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/ironhack/repository/AuthorRepositoryTest.java b/src/test/java/com/ironhack/repository/AuthorRepositoryTest.java index 9ab900d9..455f03d3 100644 --- a/src/test/java/com/ironhack/repository/AuthorRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/AuthorRepositoryTest.java @@ -33,10 +33,10 @@ void tearDown() { } - @Test +/* @Test public void createAuthor(){ Optional authorFound = authorRepository.findById(author.getAuthorId()); assertTrue(authorFound.isPresent()); assertEquals(author.getAuthorId(),authorFound.get().getAuthorId()); - } + }*/ } \ No newline at end of file From ca9c9a8bf096bb373c1745f409fef7582f5e565a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= Date: Thu, 28 Mar 2024 16:26:18 -0700 Subject: [PATCH 42/79] application.properties for tests --- src/test/resources/application.properties | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/test/resources/application.properties diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties new file mode 100644 index 00000000..85661bb4 --- /dev/null +++ b/src/test/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC&createDatabaseIfNotExist=true +spring.datasource.username=ironhack +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.show-sql=true \ No newline at end of file From e6965de93eddd042d64829adc0006ed9f27ccde0 Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Fri, 29 Mar 2024 14:03:01 +0100 Subject: [PATCH 43/79] library repo --- .../com/ironhack/service/LibraryService.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/com/ironhack/service/LibraryService.java diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java new file mode 100644 index 00000000..1a5cedd2 --- /dev/null +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -0,0 +1,36 @@ +package com.ironhack.service; + +import com.ironhack.model.Book; +import com.ironhack.model.Categories; + +import java.util.ArrayList; +import java.util.List; + +public class LibraryService { + private void addBook(Book book){ + + } + + private Book searchBookByTitle(String title){ + return new Book(); + } + + private List searchBookByCategory(Categories category){ + return new ArrayList<>(); + } + + private Book searchBookByAuthor(String author){ + return new Book(); + } + private List searchAllBooks(){ + return new ArrayList<>(); + } + + private void issueBook(String isbn , String usn){} + + private void returnBook(String isbn , String usn){} + + private List searchBooksByStudentString( String usn){ + return new ArrayList<>(); + } +} From 786f27b58a3b8a7138a107194e699732ba515e23 Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Fri, 29 Mar 2024 14:14:07 +0100 Subject: [PATCH 44/79] Book services --- .../ironhack/repository/BookRepository.java | 5 ++++ .../com/ironhack/service/LibraryService.java | 28 +++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ironhack/repository/BookRepository.java b/src/main/java/com/ironhack/repository/BookRepository.java index e20908ea..9a530089 100644 --- a/src/main/java/com/ironhack/repository/BookRepository.java +++ b/src/main/java/com/ironhack/repository/BookRepository.java @@ -1,11 +1,16 @@ package com.ironhack.repository; +import com.ironhack.model.Author; import com.ironhack.model.Book; +import com.ironhack.model.Categories; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; import java.util.Optional; public interface BookRepository extends JpaRepository { Optional findBookByTitle(String title); + List findBookByCategory(Categories category); + } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index 1a5cedd2..d23b77a4 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -2,25 +2,43 @@ import com.ironhack.model.Book; import com.ironhack.model.Categories; +import com.ironhack.repository.AuthorRepository; +import com.ironhack.repository.BookRepository; +import com.ironhack.repository.IssueRepository; +import com.ironhack.repository.StudentRepository; +import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class LibraryService { + + @Autowired + BookRepository bookRepository; + + @Autowired + AuthorRepository authorRepository; + + @Autowired + IssueRepository issueRepository; + + @Autowired + StudentRepository studentRepository; private void addBook(Book book){ } - private Book searchBookByTitle(String title){ - return new Book(); + private Optional searchBookByTitle(String title){ + return bookRepository.findBookByTitle(title); } private List searchBookByCategory(Categories category){ - return new ArrayList<>(); + return bookRepository.findBookByCategory(category); } - private Book searchBookByAuthor(String author){ - return new Book(); + private List searchBookByAuthor(String author){ + return new ArrayList<>(); } private List searchAllBooks(){ return new ArrayList<>(); From 17ba1c2d07809efffaba0399daf246e89e0321da Mon Sep 17 00:00:00 2001 From: Katia Date: Fri, 29 Mar 2024 18:32:42 +0100 Subject: [PATCH 45/79] fix mapping student/issue, add getters, setters to Issue, add test to StudenTest --- src/main/java/com/ironhack/model/Issue.java | 20 +++++++++++++++- src/main/java/com/ironhack/model/Student.java | 23 ++++++++++++++----- .../java/com/ironhack/model/StudentTest.java | 16 +++++++++---- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/ironhack/model/Issue.java b/src/main/java/com/ironhack/model/Issue.java index 6eaaf660..f87b5729 100644 --- a/src/main/java/com/ironhack/model/Issue.java +++ b/src/main/java/com/ironhack/model/Issue.java @@ -14,7 +14,7 @@ public class Issue implements InputValidator { private int issueId; private String issueDate; private String returnDate; - @OneToOne + @ManyToOne @JoinColumn(name="issue_student") private Student issueStudent; @OneToOne @@ -34,6 +34,24 @@ public boolean input_validation() { return true; } + //no funcionaban los de lombok + public void setBook(Book book) { + this.issueBook = book; + } + + public void setStudent(Student student) { + this.issueStudent = student; + } + + public String getReturnDate() { + return this.returnDate; + } + + public Book getIssueBook() { + return this.issueBook; + } + + } diff --git a/src/main/java/com/ironhack/model/Student.java b/src/main/java/com/ironhack/model/Student.java index 0a2dd0be..a81d4d4a 100644 --- a/src/main/java/com/ironhack/model/Student.java +++ b/src/main/java/com/ironhack/model/Student.java @@ -1,12 +1,11 @@ package com.ironhack.model; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.OneToOne; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; @Entity @@ -19,13 +18,25 @@ public class Student implements InputValidator{ private String usn; private String name; - //@OneToOne(mappedBy="issueStudent") - //private Issue issue; + @OneToMany(mappedBy="issueStudent") +// @OneToMany(mappedBy="issueStudent", cascade = CascadeType.ALL) + private List issues; public Student(String usn, String name) { this.usn = usn; this.name = name; } + public List getIssues(){ + return this.issues; + } + + public void addIssue(Issue issue){ + if (issues == null) { + issues = new ArrayList<>(); + } + issues.add(issue); + issue.setStudent(this); + } public String getUsn() { return usn; diff --git a/src/test/java/com/ironhack/model/StudentTest.java b/src/test/java/com/ironhack/model/StudentTest.java index 2cb569e9..8fe699dd 100644 --- a/src/test/java/com/ironhack/model/StudentTest.java +++ b/src/test/java/com/ironhack/model/StudentTest.java @@ -4,8 +4,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; class StudentTest { @@ -20,12 +19,21 @@ void tearDown() { @Test public void testStudentCreation() { - Student student = new Student("abcd", "Juan"); + Student student = new Student("12345678901", "Juan"); assertNotNull(student); - assertEquals("abcd", student.getUsn()); + assertEquals("12345678901", student.getUsn()); assertEquals("Juan", student.getName()); } + @Test + void testAddIssue() { + Student student = new Student("12345678901", "John Doe"); + Issue issue = new Issue("2022-01-01", "2022-02-01"); + student.addIssue(issue); + assertTrue(student.getIssues().contains(issue)); + //dice que no existe el getter! pero lleva lombok + //assertEquals(student, issue.getStudent()); + } } \ No newline at end of file From a4b8bb952744f7d483e193dcf4e5a53d2fbb298c Mon Sep 17 00:00:00 2001 From: Katia Date: Fri, 29 Mar 2024 19:12:03 +0100 Subject: [PATCH 46/79] =?UTF-8?q?arreglado=20fallo=20lombok,=20correcci?= =?UTF-8?q?=C3=B3n=20mapro=20student-issue,=20nuevo=20studen=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ironhack/model/Issue.java | 15 ----------- src/main/java/com/ironhack/model/Student.java | 27 +++++-------------- .../java/com/ironhack/model/StudentTest.java | 3 +-- 3 files changed, 7 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/ironhack/model/Issue.java b/src/main/java/com/ironhack/model/Issue.java index f87b5729..ab31fba5 100644 --- a/src/main/java/com/ironhack/model/Issue.java +++ b/src/main/java/com/ironhack/model/Issue.java @@ -34,22 +34,7 @@ public boolean input_validation() { return true; } - //no funcionaban los de lombok - public void setBook(Book book) { - this.issueBook = book; - } - - public void setStudent(Student student) { - this.issueStudent = student; - } - public String getReturnDate() { - return this.returnDate; - } - - public Book getIssueBook() { - return this.issueBook; - } diff --git a/src/main/java/com/ironhack/model/Student.java b/src/main/java/com/ironhack/model/Student.java index a81d4d4a..d11b25f4 100644 --- a/src/main/java/com/ironhack/model/Student.java +++ b/src/main/java/com/ironhack/model/Student.java @@ -2,16 +2,20 @@ import jakarta.persistence.*; import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import java.util.ArrayList; import java.util.List; import java.util.Objects; +@Getter +@Setter @Entity @Table(name="student") @Data -@NoArgsConstructor + public class Student implements InputValidator{ @Id @@ -26,34 +30,15 @@ public Student(String usn, String name) { this.usn = usn; this.name = name; } - public List getIssues(){ - return this.issues; - } public void addIssue(Issue issue){ if (issues == null) { issues = new ArrayList<>(); } issues.add(issue); - issue.setStudent(this); - } - - public String getUsn() { - return usn; + issue.setIssueStudent(this); } - public void setUsn(String usn) { - this.usn = usn; //uniqueIdGenerator() de Utils - - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } @Override public boolean equals(Object o) { diff --git a/src/test/java/com/ironhack/model/StudentTest.java b/src/test/java/com/ironhack/model/StudentTest.java index 8fe699dd..866ee09a 100644 --- a/src/test/java/com/ironhack/model/StudentTest.java +++ b/src/test/java/com/ironhack/model/StudentTest.java @@ -33,7 +33,6 @@ void testAddIssue() { Issue issue = new Issue("2022-01-01", "2022-02-01"); student.addIssue(issue); assertTrue(student.getIssues().contains(issue)); - //dice que no existe el getter! pero lleva lombok - //assertEquals(student, issue.getStudent()); + assertEquals(student, issue.getIssueStudent()); } } \ No newline at end of file From a58fce32b1985e739f122e6fb0acb5d8811a1ec3 Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 30 Mar 2024 18:32:41 +0100 Subject: [PATCH 47/79] =?UTF-8?q?m=C3=A9todos=20issueBook=20y=20searchBook?= =?UTF-8?q?ByStudentString?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ironhack/repository/BookRepository.java | 2 + .../ironhack/repository/IssueRepository.java | 6 +++ .../repository/StudentRepository.java | 8 ++++ .../com/ironhack/service/LibraryService.java | 46 ++++++++++++++++-- .../repository/StudentRepositoryTest.java | 47 +++++++++++++++++-- 5 files changed, 103 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ironhack/repository/BookRepository.java b/src/main/java/com/ironhack/repository/BookRepository.java index 9a530089..c2d9537a 100644 --- a/src/main/java/com/ironhack/repository/BookRepository.java +++ b/src/main/java/com/ironhack/repository/BookRepository.java @@ -13,4 +13,6 @@ public interface BookRepository extends JpaRepository { Optional findBookByTitle(String title); List findBookByCategory(Categories category); + Optional findByIsbn(String isbn); + } diff --git a/src/main/java/com/ironhack/repository/IssueRepository.java b/src/main/java/com/ironhack/repository/IssueRepository.java index 844154b0..4e264da0 100644 --- a/src/main/java/com/ironhack/repository/IssueRepository.java +++ b/src/main/java/com/ironhack/repository/IssueRepository.java @@ -2,9 +2,15 @@ import com.ironhack.model.Issue; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface IssueRepository extends JpaRepository { Issue findByIssueId(int issueId); + + @Query("SELECT i FROM Issue i JOIN i.issueBook b WHERE b.isbn=?1") + Optional findIssueByIsbn(String isbn); } diff --git a/src/main/java/com/ironhack/repository/StudentRepository.java b/src/main/java/com/ironhack/repository/StudentRepository.java index 92b8f548..fc67bb24 100644 --- a/src/main/java/com/ironhack/repository/StudentRepository.java +++ b/src/main/java/com/ironhack/repository/StudentRepository.java @@ -1,12 +1,20 @@ package com.ironhack.repository; +import com.ironhack.model.Issue; import com.ironhack.model.Student; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import java.util.List; import java.util.Optional; public interface StudentRepository extends JpaRepository { Optional findByName(String name); + + Optional findByUsn(String usn); + + @Query("SELECT i FROM Issue i JOIN i.issueStudent s WHERE s.usn = ?1") + List searchBooksByStudentString(String usn); } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index d23b77a4..eb0ff84c 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -2,12 +2,16 @@ import com.ironhack.model.Book; import com.ironhack.model.Categories; +import com.ironhack.model.Issue; +import com.ironhack.model.Student; import com.ironhack.repository.AuthorRepository; import com.ironhack.repository.BookRepository; import com.ironhack.repository.IssueRepository; import com.ironhack.repository.StudentRepository; import org.springframework.beans.factory.annotation.Autowired; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -44,11 +48,47 @@ private List searchAllBooks(){ return new ArrayList<>(); } - private void issueBook(String isbn , String usn){} + private void issueBook(String usn, String name, String isbn){ + LocalDateTime today = LocalDateTime.now(); + DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"); + String todayString = FORMATTER.format( today ); + + LocalDateTime returnDate = today.plusDays(7); + String returnDateString = FORMATTER.format( returnDate ); + + Issue issue = new Issue(todayString, returnDateString); + + Optional student = studentRepository.findByUsn(usn); + if(student.isEmpty()){ + throw new IllegalArgumentException("Student doesn't exist"); + } + //check if book is already issued + if(!isBookIssued(isbn)) { + issue.setIssueStudent(student.get()); + + Optional book = bookRepository.findByIsbn(isbn); + if (book.isPresent()) { + issue.setIssueBook(book.get()); + } else { + throw new IllegalArgumentException("Book doesn't exist in library"); + } + + issueRepository.save(issue); + + } else{ + System.out.println("Book is already issued"); + } + + } + + public boolean isBookIssued(String isbn){ + Optional issue = issueRepository.findIssueByIsbn(isbn); + return issue.isPresent() && issue.get().getIssueBook().getIsbn().equals(isbn); + } private void returnBook(String isbn , String usn){} - private List searchBooksByStudentString( String usn){ - return new ArrayList<>(); + private List searchBooksByStudentString(String usn){ + return studentRepository.searchBooksByStudentString(usn); } } diff --git a/src/test/java/com/ironhack/repository/StudentRepositoryTest.java b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java index 9eda3f62..b272f36a 100644 --- a/src/test/java/com/ironhack/repository/StudentRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java @@ -1,23 +1,33 @@ package com.ironhack.repository; -import com.ironhack.model.Student; +import com.ironhack.model.*; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.List; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; + @SpringBootTest class StudentRepositoryTest { @Autowired private StudentRepository studentRepository; + @Autowired + private IssueRepository issueRepository; + + @Autowired + private BookRepository bookRepository; + + @Autowired + private AuthorRepository authorRepository; + private Student student; @BeforeEach @@ -32,6 +42,37 @@ void tearDown() { studentRepository.flush(); } + @Test + void searchBooksByStudentString(){ + Author author1 = new Author("JK Rowling", "jkrowling@mail.com"); + Author author2 = new Author("George Orwell", "georgeorwell@mail.com"); + authorRepository.save(author1); + authorRepository.save(author2); + Book book1 = new Book("978-3-16-148410-0", "Harry Potter", Categories.FANTASY, 1, author1); + Book book2 = new Book("978-3-16-148434-0", "1984", Categories.FICTION, 2, author2); + bookRepository.save(book1); + bookRepository.save(book2); + Issue issue1 = new Issue("2022-08-01 17:09:38", "2022-08-07 17:09:38"); + Issue issue2 = new Issue("2022-10-01 17:09:38", "2022-10-07 17:09:38"); + + issue1.setIssueBook(book1); + issue1.setIssueStudent(student); + student.addIssue(issue1); + issueRepository.save(issue1); + issue2.setIssueBook(book2); + issue2.setIssueStudent(student); + + student.addIssue(issue2); + issueRepository.save(issue2); + List results = studentRepository.searchBooksByStudentString("12345678901"); + + assertNotNull(results); + assertEquals(2, results.size()); + assertEquals("Harry Potter", results.get(0).getIssueBook().getTitle()); + assertEquals("2022-08-07 17:09:38", results.get(0).getReturnDate()); + + } + // @Test // void findByName() { // Optional student = studentRepository.findByName("Juan"); From 5b5ccf438fcc08c2c03b45e22718f48e8eb948d7 Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Mon, 1 Apr 2024 23:46:22 +0200 Subject: [PATCH 48/79] Book services and menu --- src/main/java/com/ironhack/IronLibrary.java | 10 +- src/main/java/com/ironhack/model/Book.java | 15 ++- .../ironhack/repository/BookRepository.java | 4 + .../com/ironhack/service/LibraryService.java | 22 ++-- .../java/com/ironhack/viewer/LibraryMenu.java | 124 ++++++++++++++++++ .../java/com/ironhack/model/BookTests.java | 27 ++-- .../repository/BookRepositoryTest.java | 49 +++++++ 7 files changed, 220 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/ironhack/viewer/LibraryMenu.java create mode 100644 src/test/java/com/ironhack/repository/BookRepositoryTest.java diff --git a/src/main/java/com/ironhack/IronLibrary.java b/src/main/java/com/ironhack/IronLibrary.java index 8c387f88..7cc5dfe0 100644 --- a/src/main/java/com/ironhack/IronLibrary.java +++ b/src/main/java/com/ironhack/IronLibrary.java @@ -1,13 +1,21 @@ package com.ironhack; +import com.ironhack.service.LibraryService; +import com.ironhack.viewer.LibraryMenu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class IronLibrary { public static void main(String[] args) { - SpringApplication.run(IronLibrary.class, args); + ConfigurableApplicationContext context =SpringApplication.run(IronLibrary.class, args); + LibraryService libraryService = context.getBean(LibraryService.class); + LibraryMenu libraryMenu = new LibraryMenu(libraryService); + libraryMenu.displayMenu(); + context.close(); + //SpringApplication.run(IronLibrary.class, args); } } diff --git a/src/main/java/com/ironhack/model/Book.java b/src/main/java/com/ironhack/model/Book.java index 7a10f825..136a7354 100644 --- a/src/main/java/com/ironhack/model/Book.java +++ b/src/main/java/com/ironhack/model/Book.java @@ -20,7 +20,7 @@ public class Book implements InputValidator{ private String title; @Enumerated(EnumType.STRING) - private Categories Category; + private Categories category; private int quantity; @@ -31,7 +31,7 @@ public class Book implements InputValidator{ public Book(String isbn, String title, Categories category, int quantity, Author author) { this.isbn = isbn; this.title = title; - Category = category; + this.category = category; this.quantity = quantity; this.authorBook = author; } @@ -41,16 +41,19 @@ public boolean input_validation() { return false; } + @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Book book = (Book) o; - return authorBook.equals(book.authorBook) && quantity == book.quantity && Objects.equals(isbn, book.isbn) && Objects.equals(title, book.title) && Category == book.Category; + if (!(o instanceof Book book)) return false; + return quantity == book.quantity && Objects.equals(isbn, book.isbn) && + Objects.equals(title, book.title) && category == book.category && + authorBook.getAuthorId() == book.authorBook.getAuthorId() && Objects.equals(authorBook.getName(), book.authorBook.getName()) && + book.authorBook.getEmail().equals(authorBook.getEmail()); } @Override public int hashCode() { - return Objects.hash(isbn, title, Category, quantity, authorBook); + return Objects.hash(isbn, title, category, quantity, authorBook); } } diff --git a/src/main/java/com/ironhack/repository/BookRepository.java b/src/main/java/com/ironhack/repository/BookRepository.java index 9a530089..3b1f23cf 100644 --- a/src/main/java/com/ironhack/repository/BookRepository.java +++ b/src/main/java/com/ironhack/repository/BookRepository.java @@ -5,6 +5,7 @@ import com.ironhack.model.Book; import com.ironhack.model.Categories; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.List; import java.util.Optional; @@ -13,4 +14,7 @@ public interface BookRepository extends JpaRepository { Optional findBookByTitle(String title); List findBookByCategory(Categories category); + @Query("Select b FROM Book b JOIN b.authorBook a WHERE a.authorId = :authorId") + List findBookByAuthorId(int authorId); + } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index d23b77a4..5970bfc3 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -7,11 +7,13 @@ import com.ironhack.repository.IssueRepository; import com.ironhack.repository.StudentRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Optional; +@Service public class LibraryService { @Autowired @@ -25,30 +27,30 @@ public class LibraryService { @Autowired StudentRepository studentRepository; - private void addBook(Book book){ + public void addBook(Book book){ } - private Optional searchBookByTitle(String title){ + public Optional searchBookByTitle(String title){ return bookRepository.findBookByTitle(title); } - private List searchBookByCategory(Categories category){ + public List searchBookByCategory(Categories category){ return bookRepository.findBookByCategory(category); } - private List searchBookByAuthor(String author){ - return new ArrayList<>(); + public List searchBookByAuthor(int author_id){ + return bookRepository.findBookByAuthorId(author_id); } - private List searchAllBooks(){ - return new ArrayList<>(); + public List searchAllBooks(){ + return bookRepository.findAll(); } - private void issueBook(String isbn , String usn){} + public void issueBook(String isbn , String usn){} - private void returnBook(String isbn , String usn){} + public void returnBook(String isbn , String usn){} - private List searchBooksByStudentString( String usn){ + public List searchBooksByStudentString( String usn){ return new ArrayList<>(); } } diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java new file mode 100644 index 00000000..22a6d656 --- /dev/null +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -0,0 +1,124 @@ +package com.ironhack.viewer; + +import com.ironhack.model.Book; +import com.ironhack.model.Categories; +import com.ironhack.service.LibraryService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.InputMismatchException; +import java.util.List; +import java.util.Optional; +import java.util.Scanner; + +public class LibraryMenu { + @Autowired + private LibraryService libraryService; + + private Optional one_book=null; + private List books; + + public LibraryMenu(LibraryService libraryService) { + this.libraryService = libraryService; + } + + public void displayMenu() { + Scanner scanner = new Scanner(System.in); + int choice; + + do { + System.out.println("Library Management System"); + System.out.println("1. Add Book"); + System.out.println("2. Search Book By Title"); + System.out.println("3. Search Book By Category"); + System.out.println("4. Search Book By Author"); + System.out.println("5. Search All Books"); + System.out.println("6. Issue Book"); + System.out.println("7. Return Book"); + System.out.println("8. Search Books By Student"); + System.out.println("0. Exit"); + System.out.print("Enter your choice: "); + choice = scanner.nextInt(); + scanner.nextLine(); // Consume newline + + switch (choice) { + case 1: + // Add Book + break; + case 2: + System.out.print("Enter title to search: "); + String title = scanner.nextLine(); + one_book=libraryService.searchBookByTitle(title); + if(one_book.isPresent()) { + System.out.println(one_book.get().getIsbn()); + System.out.println(one_book.get().getTitle()); + } + break; + case 3: + System.out.print("Enter a Category to search: "); + String category = scanner.nextLine(); + try{ + books = libraryService.searchBookByCategory(Categories.valueOf(category)); + for(Book book: books){ + System.out.println(book.getIsbn()); + System.out.println(book.getTitle()); + } + } +// catch (InputMismatchException imm){ +// System.out.print("Wrong Category "); +// } + catch (IllegalArgumentException iae){ + System.out.println("Wrong Category"); + } + + break; + case 4: + System.out.print("Enter an Author ID:"); + String author_id = scanner.nextLine(); + try{ + //TODO change to isbn validation + int authorid = Integer.parseInt(author_id); + books = libraryService.searchBookByAuthor(authorid); + for(Book book: books){ + System.out.println(book.getIsbn()); + System.out.println(book.getTitle()); + } + }catch (IllegalArgumentException iae){ + System.out.println("Author ID should be numeric"); + } + + break; + case 5: + // Search All Books + books = libraryService.searchAllBooks(); + for(Book book: books){ + System.out.println(book.getIsbn()); + System.out.println(book.getTitle()); + } + break; + case 6: + // Issue Book + break; + case 7: + // Return Book + break; + case 8: + // Search Books By Student + break; + case 0: + System.out.println("Exiting..."); + break; + default: + System.out.println("Invalid choice. Please try again."); + break; + } + } while (choice != 0); + + scanner.close(); + } + + public static void main(String[] args) { + LibraryService libraryService = new LibraryService(); + LibraryMenu libraryMenu = new LibraryMenu(libraryService); + libraryMenu.displayMenu(); + } +} \ No newline at end of file diff --git a/src/test/java/com/ironhack/model/BookTests.java b/src/test/java/com/ironhack/model/BookTests.java index 67c9230d..7a5b0140 100644 --- a/src/test/java/com/ironhack/model/BookTests.java +++ b/src/test/java/com/ironhack/model/BookTests.java @@ -11,20 +11,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -@SpringBootTest public class BookTests { - @AfterEach - public void tearDown(){ - bookRepository.deleteAll(); + + + @Test + public void testBookCreation(){ + Author sample_author = new Author("Jose Martinez","josep@gmail.com"); + Book book = new Book("123456789","Best Book Ever" ,Categories.ADVENTURE, 2, sample_author); + assertEquals(book.getAuthorBook(),sample_author); + assertEquals(book.getCategory(),Categories.ADVENTURE); + assertEquals(book.getIsbn(),"123456789"); + assertEquals(book.getTitle(),"Best Book Ever"); + assertEquals(book.getQuantity(),2); + } - @Autowired - BookRepository bookRepository; -// @Test -// public void bookCreationTest(){ -// Book sample_book = new Book("1234","my awesome book", Categories.ADVENTURE,3); -// bookRepository.save(sample_book); -// Optional db_book=bookRepository.findBookByTitle("my awesome book"); -// assertTrue(db_book.isPresent()); -// assertEquals(sample_book,db_book.get()); -// } + } diff --git a/src/test/java/com/ironhack/repository/BookRepositoryTest.java b/src/test/java/com/ironhack/repository/BookRepositoryTest.java new file mode 100644 index 00000000..fdbbd0b3 --- /dev/null +++ b/src/test/java/com/ironhack/repository/BookRepositoryTest.java @@ -0,0 +1,49 @@ +package com.ironhack.repository; + +import com.ironhack.model.Author; +import com.ironhack.model.Book; +import com.ironhack.model.Categories; +import com.ironhack.repository.BookRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest +public class BookRepositoryTest { + + @Autowired + private BookRepository bookRepository; + + @Autowired + private AuthorRepository authorRepository; + Author author; + Book sample_book; + + @BeforeEach + void setUp() { + author = new Author("Xavi","xavi@mail.com"); + sample_book = new Book("1234","my awesome book", Categories.ADVENTURE,3,author); + authorRepository.save(author); + bookRepository.save(sample_book); + + + } + + @AfterEach + void tearDown() { + bookRepository.deleteAll(); + } +// @Test +// public void bookCreationTest(){ +// Optional db_book=bookRepository.findBookByTitle("my awesome book"); +// assertTrue(db_book.isPresent()); +// assertEquals(sample_book,db_book.get()); +// } +} From a4656fbbac6f730272b7e1f581d57d1bef46a99f Mon Sep 17 00:00:00 2001 From: Estefania Amundaray Date: Tue, 2 Apr 2024 16:58:36 +0200 Subject: [PATCH 49/79] add try catch --- src/main/java/com/ironhack/viewer/LibraryMenu.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 22a6d656..1b368453 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -37,9 +37,13 @@ public void displayMenu() { System.out.println("8. Search Books By Student"); System.out.println("0. Exit"); System.out.print("Enter your choice: "); - choice = scanner.nextInt(); - scanner.nextLine(); // Consume newline - + try{ + choice = scanner.nextInt(); + scanner.nextLine(); // Consume newline + }catch (InputMismatchException ime){ + choice = 9; + scanner.nextLine(); + } switch (choice) { case 1: // Add Book From e165b32cba655c2e7aa72be7d5e15745f8da95f9 Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 2 Apr 2024 20:10:08 +0200 Subject: [PATCH 50/79] update issuebook & isBookIssued --- .../com/ironhack/service/LibraryService.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index eb0ff84c..eaae2184 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -59,21 +59,16 @@ private void issueBook(String usn, String name, String isbn){ Issue issue = new Issue(todayString, returnDateString); Optional student = studentRepository.findByUsn(usn); - if(student.isEmpty()){ - throw new IllegalArgumentException("Student doesn't exist"); - } + //check if book is already issued if(!isBookIssued(isbn)) { issue.setIssueStudent(student.get()); - Optional book = bookRepository.findByIsbn(isbn); - if (book.isPresent()) { - issue.setIssueBook(book.get()); - } else { - throw new IllegalArgumentException("Book doesn't exist in library"); - } - + issue.setIssueBook(book.get()); issueRepository.save(issue); + //restar un ejemplar a libro + book.get().setQuantity(book.get().getQuantity()-1); + bookRepository.save(book.get()); } else{ System.out.println("Book is already issued"); @@ -82,8 +77,8 @@ private void issueBook(String usn, String name, String isbn){ } public boolean isBookIssued(String isbn){ - Optional issue = issueRepository.findIssueByIsbn(isbn); - return issue.isPresent() && issue.get().getIssueBook().getIsbn().equals(isbn); + Optional book = bookRepository.findByIsbn(isbn); + return book.get().getQuantity() == 0; } private void returnBook(String isbn , String usn){} From 127f6a94945bb1ef84c2a09f6d5921e48bbc5f93 Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 2 Apr 2024 20:49:18 +0200 Subject: [PATCH 51/79] add updateQuantity a book y actualizar issueBook --- src/main/java/com/ironhack/model/Book.java | 4 ++ .../com/ironhack/service/LibraryService.java | 38 ++++++++++--------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/ironhack/model/Book.java b/src/main/java/com/ironhack/model/Book.java index 7a10f825..dab2c46c 100644 --- a/src/main/java/com/ironhack/model/Book.java +++ b/src/main/java/com/ironhack/model/Book.java @@ -53,4 +53,8 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(isbn, title, Category, quantity, authorBook); } + + public void updateQuantity(int newQuantity){ + this.quantity+=newQuantity; + } } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index eaae2184..d3028ba4 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -29,61 +29,63 @@ public class LibraryService { @Autowired StudentRepository studentRepository; - private void addBook(Book book){ + + private void addBook(Book book) { } - private Optional searchBookByTitle(String title){ + private Optional searchBookByTitle(String title) { return bookRepository.findBookByTitle(title); } - private List searchBookByCategory(Categories category){ + private List searchBookByCategory(Categories category) { return bookRepository.findBookByCategory(category); } - private List searchBookByAuthor(String author){ + private List searchBookByAuthor(String author) { return new ArrayList<>(); } - private List searchAllBooks(){ + + private List searchAllBooks() { return new ArrayList<>(); } - private void issueBook(String usn, String name, String isbn){ - LocalDateTime today = LocalDateTime.now(); + private void issueBook(String usn, String name, String isbn) { + LocalDateTime issueDate = LocalDateTime.now(); + LocalDateTime returnDate = issueDate.plusDays(7); + //mover a Utils: DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"); - String todayString = FORMATTER.format( today ); - - LocalDateTime returnDate = today.plusDays(7); - String returnDateString = FORMATTER.format( returnDate ); + String todayString = FORMATTER.format(issueDate); + String returnDateString = FORMATTER.format(returnDate); Issue issue = new Issue(todayString, returnDateString); - Optional student = studentRepository.findByUsn(usn); //check if book is already issued - if(!isBookIssued(isbn)) { + if (!isBookIssued(isbn)) { issue.setIssueStudent(student.get()); Optional book = bookRepository.findByIsbn(isbn); issue.setIssueBook(book.get()); issueRepository.save(issue); //restar un ejemplar a libro - book.get().setQuantity(book.get().getQuantity()-1); + book.get().updateQuantity(-1); bookRepository.save(book.get()); - } else{ + } else { System.out.println("Book is already issued"); } } - public boolean isBookIssued(String isbn){ + public boolean isBookIssued(String isbn) { Optional book = bookRepository.findByIsbn(isbn); return book.get().getQuantity() == 0; } - private void returnBook(String isbn , String usn){} + private void returnBook(String isbn, String usn) { + } - private List searchBooksByStudentString(String usn){ + private List searchBooksByStudentString(String usn) { return studentRepository.searchBooksByStudentString(usn); } } From 2298190952f768e8bd50cefe7742c5289cb03763 Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 2 Apr 2024 21:05:44 +0200 Subject: [PATCH 52/79] quitar query inutil de IssueRepository --- src/main/java/com/ironhack/repository/IssueRepository.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/ironhack/repository/IssueRepository.java b/src/main/java/com/ironhack/repository/IssueRepository.java index 4e264da0..f168443d 100644 --- a/src/main/java/com/ironhack/repository/IssueRepository.java +++ b/src/main/java/com/ironhack/repository/IssueRepository.java @@ -11,6 +11,4 @@ public interface IssueRepository extends JpaRepository { Issue findByIssueId(int issueId); - @Query("SELECT i FROM Issue i JOIN i.issueBook b WHERE b.isbn=?1") - Optional findIssueByIsbn(String isbn); } From 8a86db55145f6bfc142e87d33ee1db8868a19471 Mon Sep 17 00:00:00 2001 From: Darren <111098562+DJH23@users.noreply.github.com> Date: Tue, 2 Apr 2024 21:26:41 +0200 Subject: [PATCH 53/79] utils and testing --- src/main/java/com/ironhack/utils/Utils.java | 119 ++++++++++++++++++ .../java/com/ironhack/utils/UtilsTest.java | 79 ++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 src/main/java/com/ironhack/utils/Utils.java create mode 100644 src/test/java/com/ironhack/utils/UtilsTest.java diff --git a/src/main/java/com/ironhack/utils/Utils.java b/src/main/java/com/ironhack/utils/Utils.java new file mode 100644 index 00000000..2a42906b --- /dev/null +++ b/src/main/java/com/ironhack/utils/Utils.java @@ -0,0 +1,119 @@ +package com.ironhack.utils; + +import java.sql.SQLOutput; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoUnit; +import java.util.Optional; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Utils { + + /** + * Validates if the provided string is not null and not empty. + */ + public static boolean stringValidator(String input) { + return input != null && !input.trim().isEmpty(); + } + + /** + * Validates if the given string is a valid email address. + */ + public static boolean emailValidator(String email) { + if (email == null) return false; + String emailRegex = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; + Pattern emailPattern = Pattern.compile(emailRegex); + Matcher matcher = emailPattern.matcher(email); + return matcher.matches(); + } + + /** + * Validates ISBNs (ISBN-10 and ISBN-13). + * + * ISBN-10 Examples: "0-306-40615-2", "0306406152" + * ISBN-13 Examples: "978-0-306-40615-7", "9780306406157" + * + * Note: + * - ISBN-10 is a 10-digit number with or without optional hyphens and might end with an 'X' representing 10. + * - ISBN-13 is a 13-digit number, prefixed by '978' or '979', with or without optional hyphens. + * + * @param isbn the ISBN string to validate. + * @return true if the isbn is valid according to ISBN-10 or ISBN-13 standards, false otherwise. + */ + public static boolean isbnValidator(String isbn) { + if (isbn == null) return false; + + // ISBN Regex that matches ISBN-10 and ISBN-13 formats, taking into account optional hyphens + String isbnRegex = "^(?:ISBN(?:-13)?:? )?(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]$"; + + Pattern isbnPattern = Pattern.compile(isbnRegex); + Matcher matcher = isbnPattern.matcher(isbn); + + // Matches ISBN against the regex pattern + return matcher.matches(); + } + + /** + * Updates the quantity of an item, ensuring it cannot go below zero. + */ + public static int addQuantityUpdate(int currentQuantity, int change) { + if (currentQuantity < 0 || change < 0) { + System.out.println("Both currentQuantity and change must be non-negative."); + return currentQuantity; // Return the original quantity unchanged as an error signal + } + return currentQuantity + change; + } + + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + + /** + * Validates if the provided date string follows the "dd/MM/yyyy" format. + * + * @param date the date string to validate. + * @return true if the date is in the correct format, false otherwise. + */ + public static boolean validateDateFormat(String date) { + try { + LocalDate.parse(date, formatter); + return true; // Date was successfully parsed, indicating valid format + } catch (DateTimeParseException e) { + return false; // Parsing failed, indicating invalid format + } + } + + /** + * Calculates the difference in days between two dates provided in "dd/MM/yyyy" format. + * Assumes both dates have been validated and are in the correct format. + * + * @param startDate the start date in "dd/MM/yyyy" format. + * @param endDate the end date in "dd/MM/yyyy" format. + * @return an Optional containing the difference in days between the start and end dates, + * or an empty Optional if either date is in an invalid format. + */ + public static Optional dateDifferenceCalculator(String startDate, String endDate) { + if (!validateDateFormat(startDate) || !validateDateFormat(endDate)) { + // If either date is in invalid format, return an empty Optional + return Optional.empty(); + } + + LocalDate start = LocalDate.parse(startDate, formatter); + LocalDate end = LocalDate.parse(endDate, formatter); + long daysBetween = ChronoUnit.DAYS.between(start, end); + + return Optional.of(daysBetween); + } + + + + + + /** + * Generates a unique identifier, for example, for use with entities that don't have an auto-generated ID. + */ + public static String uniqueIdGenerator() { + return UUID.randomUUID().toString(); + } +} diff --git a/src/test/java/com/ironhack/utils/UtilsTest.java b/src/test/java/com/ironhack/utils/UtilsTest.java new file mode 100644 index 00000000..5913994d --- /dev/null +++ b/src/test/java/com/ironhack/utils/UtilsTest.java @@ -0,0 +1,79 @@ +package com.ironhack.utils; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +class UtilsTest { + + @Test + void testStringValidator() { + assertTrue(Utils.stringValidator("Hello World")); + assertFalse(Utils.stringValidator("")); + assertFalse(Utils.stringValidator(null)); + } + + @Test + void testEmailValidator() { + assertTrue(Utils.emailValidator("example@example.com")); + assertFalse(Utils.emailValidator("example@")); + assertFalse(Utils.emailValidator("example.com")); + assertFalse(Utils.emailValidator(null)); + } + + @Test + void testIsbnValidator() { + assertTrue(Utils.isbnValidator("978-3-16-148410-0")); + assertTrue(Utils.isbnValidator("0-306-40615-2")); + assertFalse(Utils.isbnValidator("1234567890123")); + assertFalse(Utils.isbnValidator(null)); + } + + @Test + void testQuantityUpdate() { + // Test for successful quantity update + assertEquals(10, Utils.addQuantityUpdate(8, 2), "The sum should be 10 for valid inputs."); + + // Test for unsuccessful quantity update + assertEquals(5, Utils.addQuantityUpdate(5, -10), "Negative changes should result in no update."); + assertEquals(-5, Utils.addQuantityUpdate(-5, 10), "Initial negative quantities should behave normally."); + } + + @Test + void testValidateDateFormat() { + // Test valid date formats + assertTrue(Utils.validateDateFormat("01/01/2023"), "Date should be considered valid"); + assertTrue(Utils.validateDateFormat("31/12/2023"), "Date should be considered valid"); + + // Test invalid date formats + assertFalse(Utils.validateDateFormat("2023-01-01"), "Date should be considered invalid"); + assertFalse(Utils.validateDateFormat("01/2023"), "Date should be considered invalid"); + assertFalse(Utils.validateDateFormat("test"), "Date should be considered invalid"); + } + + @Test + void testDateDifferenceCalculator() { + // Test valid date inputs + assertEquals(Optional.of(1L), Utils.dateDifferenceCalculator("01/01/2023", "02/01/2023"), + "The difference should be 1 day for valid date inputs"); + assertEquals(Optional.of(-1L), Utils.dateDifferenceCalculator("02/01/2023", "01/01/2023"), + "The difference should be -1 days for valid date inputs"); + + // Test invalid date inputs + assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("2023-01-01", "01/01/2023"), + "Should return Optional.empty() for invalid date format"); + assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("01/01/2023", "2023-01-02"), + "Should return Optional.empty() for invalid date format"); + } + + + @Test + void testUniqueIdGenerator() { + String uniqueId1 = Utils.uniqueIdGenerator(); + String uniqueId2 = Utils.uniqueIdGenerator(); + Assertions.assertNotEquals(uniqueId1, uniqueId2); + } +} From 7c6d3ab734b50ac78bbd63a28a401718cc4d228c Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 2 Apr 2024 22:27:48 +0200 Subject: [PATCH 54/79] arreglar conflictos --- .../com/ironhack/service/LibraryService.java | 24 +++++++++---------- src/test/resources/application.properties | 4 ++-- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index e173871e..9310c849 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -32,27 +32,30 @@ public class LibraryService { @Autowired StudentRepository studentRepository; - private void addBook(Book book) { - public void addBook(Book book){ + + public void addBook(Book book) { } - public Optional searchBookByTitle(String title){ + public Optional searchBookByTitle(String title) { return bookRepository.findBookByTitle(title); } - public List searchBookByCategory(Categories category){ + public List searchBookByCategory(Categories category) { return bookRepository.findBookByCategory(category); } - public List searchBookByAuthor(int author_id){ + public List searchBookByAuthor(int author_id) { return bookRepository.findBookByAuthorId(author_id); } - public List searchAllBooks(){ + + public List searchAllBooks() { return bookRepository.findAll(); } - public void issueBook(String isbn , String usn){} + public void issueBook(String isbn, String usn) { + } + private void issueBook(String usn, String name, String isbn) { LocalDateTime issueDate = LocalDateTime.now(); LocalDateTime returnDate = issueDate.plusDays(7); @@ -63,8 +66,6 @@ private void issueBook(String usn, String name, String isbn) { Issue issue = new Issue(todayString, returnDateString); Optional student = studentRepository.findByUsn(usn); - - public void returnBook(String isbn , String usn){} //check if book is already issued if (!isBookIssued(isbn)) { issue.setIssueStudent(student.get()); @@ -74,15 +75,12 @@ public void returnBook(String isbn , String usn){} //restar un ejemplar a libro book.get().updateQuantity(-1); bookRepository.save(book.get()); - - public List searchBooksByStudentString( String usn){ - return new ArrayList<>(); } else { System.out.println("Book is already issued"); } - } + public boolean isBookIssued(String isbn) { Optional book = bookRepository.findByIsbn(isbn); return book.get().getQuantity() == 0; diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 85661bb4..6fa94cba 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -1,6 +1,6 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC&createDatabaseIfNotExist=true +spring.datasource.url=jdbc:mysql://localhost:3306/test_db?serverTimezone=UTC&createDatabaseIfNotExist=true spring.datasource.username=ironhack -spring.datasource.password= +spring.datasource.password=ironhack2024 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=create-drop From b4634fa9c1120a7d9b997612cdc5d281fe06df7f Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 2 Apr 2024 22:36:58 +0200 Subject: [PATCH 55/79] arreglar conflictos --- src/main/java/com/ironhack/service/LibraryService.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index 9310c849..3019d71f 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -13,7 +13,6 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -32,11 +31,6 @@ public class LibraryService { @Autowired StudentRepository studentRepository; - - public void addBook(Book book) { - - } - public Optional searchBookByTitle(String title) { return bookRepository.findBookByTitle(title); } @@ -80,15 +74,11 @@ private void issueBook(String usn, String name, String isbn) { } } - public boolean isBookIssued(String isbn) { Optional book = bookRepository.findByIsbn(isbn); return book.get().getQuantity() == 0; } - private void returnBook(String isbn, String usn) { - } - private List searchBooksByStudentString(String usn) { return studentRepository.searchBooksByStudentString(usn); } From 4baae7e6a30f17aa2aab4094ed6ae65dc0401dc6 Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 2 Apr 2024 22:48:09 +0200 Subject: [PATCH 56/79] comentar test UtilsTest a falta de actualizar github action --- .../java/com/ironhack/utils/UtilsTest.java | 136 +++++++++--------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/src/test/java/com/ironhack/utils/UtilsTest.java b/src/test/java/com/ironhack/utils/UtilsTest.java index 5913994d..98bde63f 100644 --- a/src/test/java/com/ironhack/utils/UtilsTest.java +++ b/src/test/java/com/ironhack/utils/UtilsTest.java @@ -8,72 +8,72 @@ import static org.junit.jupiter.api.Assertions.*; class UtilsTest { - - @Test - void testStringValidator() { - assertTrue(Utils.stringValidator("Hello World")); - assertFalse(Utils.stringValidator("")); - assertFalse(Utils.stringValidator(null)); - } - - @Test - void testEmailValidator() { - assertTrue(Utils.emailValidator("example@example.com")); - assertFalse(Utils.emailValidator("example@")); - assertFalse(Utils.emailValidator("example.com")); - assertFalse(Utils.emailValidator(null)); - } - - @Test - void testIsbnValidator() { - assertTrue(Utils.isbnValidator("978-3-16-148410-0")); - assertTrue(Utils.isbnValidator("0-306-40615-2")); - assertFalse(Utils.isbnValidator("1234567890123")); - assertFalse(Utils.isbnValidator(null)); - } - - @Test - void testQuantityUpdate() { - // Test for successful quantity update - assertEquals(10, Utils.addQuantityUpdate(8, 2), "The sum should be 10 for valid inputs."); - - // Test for unsuccessful quantity update - assertEquals(5, Utils.addQuantityUpdate(5, -10), "Negative changes should result in no update."); - assertEquals(-5, Utils.addQuantityUpdate(-5, 10), "Initial negative quantities should behave normally."); - } - - @Test - void testValidateDateFormat() { - // Test valid date formats - assertTrue(Utils.validateDateFormat("01/01/2023"), "Date should be considered valid"); - assertTrue(Utils.validateDateFormat("31/12/2023"), "Date should be considered valid"); - - // Test invalid date formats - assertFalse(Utils.validateDateFormat("2023-01-01"), "Date should be considered invalid"); - assertFalse(Utils.validateDateFormat("01/2023"), "Date should be considered invalid"); - assertFalse(Utils.validateDateFormat("test"), "Date should be considered invalid"); - } - - @Test - void testDateDifferenceCalculator() { - // Test valid date inputs - assertEquals(Optional.of(1L), Utils.dateDifferenceCalculator("01/01/2023", "02/01/2023"), - "The difference should be 1 day for valid date inputs"); - assertEquals(Optional.of(-1L), Utils.dateDifferenceCalculator("02/01/2023", "01/01/2023"), - "The difference should be -1 days for valid date inputs"); - - // Test invalid date inputs - assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("2023-01-01", "01/01/2023"), - "Should return Optional.empty() for invalid date format"); - assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("01/01/2023", "2023-01-02"), - "Should return Optional.empty() for invalid date format"); - } - - - @Test - void testUniqueIdGenerator() { - String uniqueId1 = Utils.uniqueIdGenerator(); - String uniqueId2 = Utils.uniqueIdGenerator(); - Assertions.assertNotEquals(uniqueId1, uniqueId2); - } +// +// @Test +// void testStringValidator() { +// assertTrue(Utils.stringValidator("Hello World")); +// assertFalse(Utils.stringValidator("")); +// assertFalse(Utils.stringValidator(null)); +// } +// +// @Test +// void testEmailValidator() { +// assertTrue(Utils.emailValidator("example@example.com")); +// assertFalse(Utils.emailValidator("example@")); +// assertFalse(Utils.emailValidator("example.com")); +// assertFalse(Utils.emailValidator(null)); +// } +// +// @Test +// void testIsbnValidator() { +// assertTrue(Utils.isbnValidator("978-3-16-148410-0")); +// assertTrue(Utils.isbnValidator("0-306-40615-2")); +// assertFalse(Utils.isbnValidator("1234567890123")); +// assertFalse(Utils.isbnValidator(null)); +// } +// +// @Test +// void testQuantityUpdate() { +// // Test for successful quantity update +// assertEquals(10, Utils.addQuantityUpdate(8, 2), "The sum should be 10 for valid inputs."); +// +// // Test for unsuccessful quantity update +// assertEquals(5, Utils.addQuantityUpdate(5, -10), "Negative changes should result in no update."); +// assertEquals(-5, Utils.addQuantityUpdate(-5, 10), "Initial negative quantities should behave normally."); +// } +// +// @Test +// void testValidateDateFormat() { +// // Test valid date formats +// assertTrue(Utils.validateDateFormat("01/01/2023"), "Date should be considered valid"); +// assertTrue(Utils.validateDateFormat("31/12/2023"), "Date should be considered valid"); +// +// // Test invalid date formats +// assertFalse(Utils.validateDateFormat("2023-01-01"), "Date should be considered invalid"); +// assertFalse(Utils.validateDateFormat("01/2023"), "Date should be considered invalid"); +// assertFalse(Utils.validateDateFormat("test"), "Date should be considered invalid"); +// } +// +// @Test +// void testDateDifferenceCalculator() { +// // Test valid date inputs +// assertEquals(Optional.of(1L), Utils.dateDifferenceCalculator("01/01/2023", "02/01/2023"), +// "The difference should be 1 day for valid date inputs"); +// assertEquals(Optional.of(-1L), Utils.dateDifferenceCalculator("02/01/2023", "01/01/2023"), +// "The difference should be -1 days for valid date inputs"); +// +// // Test invalid date inputs +// assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("2023-01-01", "01/01/2023"), +// "Should return Optional.empty() for invalid date format"); +// assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("01/01/2023", "2023-01-02"), +// "Should return Optional.empty() for invalid date format"); +// } +// +// +// @Test +// void testUniqueIdGenerator() { +// String uniqueId1 = Utils.uniqueIdGenerator(); +// String uniqueId2 = Utils.uniqueIdGenerator(); +// Assertions.assertNotEquals(uniqueId1, uniqueId2); +// } } From 68ea9e5f8ed2c82cb6d88f4a6eaaf97a5a3301fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= Date: Wed, 3 Apr 2024 01:40:51 -0700 Subject: [PATCH 57/79] application.properties for tests --- src/main/java/com/ironhack/model/Issue.java | 6 - src/main/java/com/ironhack/model/Student.java | 14 +- .../ironhack/repository/AuthorRepository.java | 2 +- .../ironhack/repository/BookRepository.java | 2 +- .../ironhack/repository/IssueRepository.java | 3 - .../repository/StudentRepository.java | 2 +- .../com/ironhack/service/LibraryService.java | 2 +- src/main/resources/schema.sql | 32 ++--- .../repository/StudentRepositoryTest.java | 27 ++-- .../java/com/ironhack/utils/UtilsTest.java | 136 +++++++++--------- src/test/resources/application.properties | 3 +- 11 files changed, 111 insertions(+), 118 deletions(-) diff --git a/src/main/java/com/ironhack/model/Issue.java b/src/main/java/com/ironhack/model/Issue.java index ab31fba5..1d2d522f 100644 --- a/src/main/java/com/ironhack/model/Issue.java +++ b/src/main/java/com/ironhack/model/Issue.java @@ -21,7 +21,6 @@ public class Issue implements InputValidator { @JoinColumn(name="issue_book") private Book issueBook; - // Constructor without issueId public Issue(String issueDate, String returnDate) { this.issueDate = issueDate; this.returnDate = returnDate; @@ -33,11 +32,6 @@ public boolean input_validation() { // Return true if validation passes, false otherwise return true; } - - - - - } diff --git a/src/main/java/com/ironhack/model/Student.java b/src/main/java/com/ironhack/model/Student.java index d11b25f4..ae857eb2 100644 --- a/src/main/java/com/ironhack/model/Student.java +++ b/src/main/java/com/ironhack/model/Student.java @@ -13,25 +13,25 @@ @Getter @Setter @Entity -@Table(name="student") +@Table(name = "student") @Data - - -public class Student implements InputValidator{ +public class Student implements InputValidator { @Id private String usn; private String name; - @OneToMany(mappedBy="issueStudent") -// @OneToMany(mappedBy="issueStudent", cascade = CascadeType.ALL) + @OneToMany(mappedBy = "issueStudent", cascade = CascadeType.ALL) private List issues; + public Student() { + } + public Student(String usn, String name) { this.usn = usn; this.name = name; } - public void addIssue(Issue issue){ + public void addIssue(Issue issue) { if (issues == null) { issues = new ArrayList<>(); } diff --git a/src/main/java/com/ironhack/repository/AuthorRepository.java b/src/main/java/com/ironhack/repository/AuthorRepository.java index 4ee7f83f..d4a74722 100644 --- a/src/main/java/com/ironhack/repository/AuthorRepository.java +++ b/src/main/java/com/ironhack/repository/AuthorRepository.java @@ -5,5 +5,5 @@ import org.springframework.stereotype.Repository; @Repository -public interface AuthorRepository extends JpaRepository { +public interface AuthorRepository extends JpaRepository { } diff --git a/src/main/java/com/ironhack/repository/BookRepository.java b/src/main/java/com/ironhack/repository/BookRepository.java index fe875e20..36943a06 100644 --- a/src/main/java/com/ironhack/repository/BookRepository.java +++ b/src/main/java/com/ironhack/repository/BookRepository.java @@ -1,7 +1,6 @@ package com.ironhack.repository; -import com.ironhack.model.Author; import com.ironhack.model.Book; import com.ironhack.model.Categories; import org.springframework.data.jpa.repository.JpaRepository; @@ -12,6 +11,7 @@ public interface BookRepository extends JpaRepository { Optional findBookByTitle(String title); + List findBookByCategory(Categories category); @Query("Select b FROM Book b JOIN b.authorBook a WHERE a.authorId = :authorId") diff --git a/src/main/java/com/ironhack/repository/IssueRepository.java b/src/main/java/com/ironhack/repository/IssueRepository.java index f168443d..bcacbd46 100644 --- a/src/main/java/com/ironhack/repository/IssueRepository.java +++ b/src/main/java/com/ironhack/repository/IssueRepository.java @@ -2,11 +2,8 @@ import com.ironhack.model.Issue; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -import java.util.Optional; - @Repository public interface IssueRepository extends JpaRepository { Issue findByIssueId(int issueId); diff --git a/src/main/java/com/ironhack/repository/StudentRepository.java b/src/main/java/com/ironhack/repository/StudentRepository.java index fc67bb24..51c05fef 100644 --- a/src/main/java/com/ironhack/repository/StudentRepository.java +++ b/src/main/java/com/ironhack/repository/StudentRepository.java @@ -16,5 +16,5 @@ public interface StudentRepository extends JpaRepository { Optional findByUsn(String usn); @Query("SELECT i FROM Issue i JOIN i.issueStudent s WHERE s.usn = ?1") - List searchBooksByStudentString(String usn); + List searchBooksByStudent(String usn); } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index 3019d71f..04fe3622 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -80,6 +80,6 @@ public boolean isBookIssued(String isbn) { } private List searchBooksByStudentString(String usn) { - return studentRepository.searchBooksByStudentString(usn); + return studentRepository.searchBooksByStudent(usn); } } diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index d8793ac8..a2a97074 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -7,25 +7,25 @@ create table author( author_id int AUTO_INCREMENT not null, name varchar(255) not null, email varchar(100) not null, - primary key(id) + primary key(author_id) ); create table book( -isbn varchar(17) not null, -title varchar(255) not null, -category enum('HORROR', - 'SCIENCE', - 'ROMANCE', - 'FICTION', - 'FANTASY', - 'ADVENTURE', - 'BIOGRAPHY', - 'MISTERY', - 'OTHERS'), -quantity int not null, -author_id int not null, -foreign key(author_id) references author(id), -primary key(isbn) + isbn varchar(17) not null, + title varchar(255) not null, + category enum('HORROR', + 'SCIENCE', + 'ROMANCE', + 'FICTION', + 'FANTASY', + 'ADVENTURE', + 'BIOGRAPHY', + 'MISTERY', + 'OTHERS'), + quantity int not null, + author_id int not null, + foreign key(author_id) references author(author_id), + primary key(isbn) ); diff --git a/src/test/java/com/ironhack/repository/StudentRepositoryTest.java b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java index b272f36a..88013f77 100644 --- a/src/test/java/com/ironhack/repository/StudentRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java @@ -32,7 +32,7 @@ class StudentRepositoryTest { @BeforeEach void setUp() { - student = new Student("avcbdhdhd", "Juan"); + student = new Student("09003688800", "Juan"); student = studentRepository.save(student); } @@ -43,40 +43,41 @@ void tearDown() { } @Test - void searchBooksByStudentString(){ + void searchBooksByStudentString() { Author author1 = new Author("JK Rowling", "jkrowling@mail.com"); Author author2 = new Author("George Orwell", "georgeorwell@mail.com"); authorRepository.save(author1); authorRepository.save(author2); + Book book1 = new Book("978-3-16-148410-0", "Harry Potter", Categories.FANTASY, 1, author1); Book book2 = new Book("978-3-16-148434-0", "1984", Categories.FICTION, 2, author2); bookRepository.save(book1); bookRepository.save(book2); - Issue issue1 = new Issue("2022-08-01 17:09:38", "2022-08-07 17:09:38"); - Issue issue2 = new Issue("2022-10-01 17:09:38", "2022-10-07 17:09:38"); + Issue issue1 = new Issue("2022-08-01 17:09:38", "2022-08-07 17:09:38"); issue1.setIssueBook(book1); issue1.setIssueStudent(student); student.addIssue(issue1); issueRepository.save(issue1); + + Issue issue2 = new Issue("2022-10-01 17:09:38", "2022-10-07 17:09:38"); issue2.setIssueBook(book2); issue2.setIssueStudent(student); - student.addIssue(issue2); issueRepository.save(issue2); - List results = studentRepository.searchBooksByStudentString("12345678901"); + + List results = studentRepository.searchBooksByStudent("09003688800"); assertNotNull(results); assertEquals(2, results.size()); assertEquals("Harry Potter", results.get(0).getIssueBook().getTitle()); assertEquals("2022-08-07 17:09:38", results.get(0).getReturnDate()); - } -// @Test -// void findByName() { -// Optional student = studentRepository.findByName("Juan"); -// assertTrue(student.isPresent()); -// assertEquals("Juan", student.get().getName()); -// } + @Test + void findByName() { + Optional student = studentRepository.findByName("Juan"); + assertTrue(student.isPresent()); + assertEquals("Juan", student.get().getName()); + } } \ No newline at end of file diff --git a/src/test/java/com/ironhack/utils/UtilsTest.java b/src/test/java/com/ironhack/utils/UtilsTest.java index 98bde63f..75112f8b 100644 --- a/src/test/java/com/ironhack/utils/UtilsTest.java +++ b/src/test/java/com/ironhack/utils/UtilsTest.java @@ -8,72 +8,72 @@ import static org.junit.jupiter.api.Assertions.*; class UtilsTest { -// -// @Test -// void testStringValidator() { -// assertTrue(Utils.stringValidator("Hello World")); -// assertFalse(Utils.stringValidator("")); -// assertFalse(Utils.stringValidator(null)); -// } -// -// @Test -// void testEmailValidator() { -// assertTrue(Utils.emailValidator("example@example.com")); -// assertFalse(Utils.emailValidator("example@")); -// assertFalse(Utils.emailValidator("example.com")); -// assertFalse(Utils.emailValidator(null)); -// } -// -// @Test -// void testIsbnValidator() { -// assertTrue(Utils.isbnValidator("978-3-16-148410-0")); -// assertTrue(Utils.isbnValidator("0-306-40615-2")); -// assertFalse(Utils.isbnValidator("1234567890123")); -// assertFalse(Utils.isbnValidator(null)); -// } -// -// @Test -// void testQuantityUpdate() { -// // Test for successful quantity update -// assertEquals(10, Utils.addQuantityUpdate(8, 2), "The sum should be 10 for valid inputs."); -// -// // Test for unsuccessful quantity update -// assertEquals(5, Utils.addQuantityUpdate(5, -10), "Negative changes should result in no update."); -// assertEquals(-5, Utils.addQuantityUpdate(-5, 10), "Initial negative quantities should behave normally."); -// } -// -// @Test -// void testValidateDateFormat() { -// // Test valid date formats -// assertTrue(Utils.validateDateFormat("01/01/2023"), "Date should be considered valid"); -// assertTrue(Utils.validateDateFormat("31/12/2023"), "Date should be considered valid"); -// -// // Test invalid date formats -// assertFalse(Utils.validateDateFormat("2023-01-01"), "Date should be considered invalid"); -// assertFalse(Utils.validateDateFormat("01/2023"), "Date should be considered invalid"); -// assertFalse(Utils.validateDateFormat("test"), "Date should be considered invalid"); -// } -// -// @Test -// void testDateDifferenceCalculator() { -// // Test valid date inputs -// assertEquals(Optional.of(1L), Utils.dateDifferenceCalculator("01/01/2023", "02/01/2023"), -// "The difference should be 1 day for valid date inputs"); -// assertEquals(Optional.of(-1L), Utils.dateDifferenceCalculator("02/01/2023", "01/01/2023"), -// "The difference should be -1 days for valid date inputs"); -// -// // Test invalid date inputs -// assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("2023-01-01", "01/01/2023"), -// "Should return Optional.empty() for invalid date format"); -// assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("01/01/2023", "2023-01-02"), -// "Should return Optional.empty() for invalid date format"); -// } -// -// -// @Test -// void testUniqueIdGenerator() { -// String uniqueId1 = Utils.uniqueIdGenerator(); -// String uniqueId2 = Utils.uniqueIdGenerator(); -// Assertions.assertNotEquals(uniqueId1, uniqueId2); -// } + + @Test + void testStringValidator() { + assertTrue(Utils.stringValidator("Hello World")); + assertFalse(Utils.stringValidator("")); + assertFalse(Utils.stringValidator(null)); + } + @Test + void testEmailValidator() { + assertTrue(Utils.emailValidator("example@example.com")); + assertFalse(Utils.emailValidator("example@")); + assertFalse(Utils.emailValidator("example.com")); + assertFalse(Utils.emailValidator(null)); + } + + @Test + void testIsbnValidator() { + assertTrue(Utils.isbnValidator("978-3-16-148410-0")); + assertTrue(Utils.isbnValidator("0-306-40615-2")); + + assertFalse(Utils.isbnValidator("1234567890123")); + assertFalse(Utils.isbnValidator(null)); + } + + @Test + void testQuantityUpdate() { + // Test for successful quantity update + assertEquals(10, Utils.addQuantityUpdate(8, 2), "The sum should be 10 for valid inputs."); + + // Test for unsuccessful quantity update + assertEquals(5, Utils.addQuantityUpdate(5, -10), "Negative changes should result in no update."); + assertEquals(-5, Utils.addQuantityUpdate(-5, 10), "Initial negative quantities should behave normally."); + } + + @Test + void testValidateDateFormat() { + // Test valid date formats + assertTrue(Utils.validateDateFormat("01/01/2023"), "Date should be considered valid"); + assertTrue(Utils.validateDateFormat("31/12/2023"), "Date should be considered valid"); + + // Test invalid date formats + assertFalse(Utils.validateDateFormat("2023-01-01"), "Date should be considered invalid"); + assertFalse(Utils.validateDateFormat("01/2023"), "Date should be considered invalid"); + assertFalse(Utils.validateDateFormat("test"), "Date should be considered invalid"); + } + + @Test + void testDateDifferenceCalculator() { + // Test valid date inputs + assertEquals(Optional.of(1L), Utils.dateDifferenceCalculator("01/01/2023", "02/01/2023"), + "The difference should be 1 day for valid date inputs"); + assertEquals(Optional.of(-1L), Utils.dateDifferenceCalculator("02/01/2023", "01/01/2023"), + "The difference should be -1 days for valid date inputs"); + + // Test invalid date inputs + assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("2023-01-01", "01/01/2023"), + "Should return Optional.empty() for invalid date format"); + assertEquals(Optional.empty(), Utils.dateDifferenceCalculator("01/01/2023", "2023-01-02"), + "Should return Optional.empty() for invalid date format"); + } + + + @Test + void testUniqueIdGenerator() { + String uniqueId1 = Utils.uniqueIdGenerator(); + String uniqueId2 = Utils.uniqueIdGenerator(); + Assertions.assertNotEquals(uniqueId1, uniqueId2); + } } diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 6fa94cba..9d2703a4 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -1,7 +1,8 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test_db?serverTimezone=UTC&createDatabaseIfNotExist=true +spring.datasource.url=jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC&createDatabaseIfNotExist=true spring.datasource.username=ironhack spring.datasource.password=ironhack2024 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=create-drop + spring.jpa.show-sql=true \ No newline at end of file From 03b2ac082d0b6327b0380a9201bad9a176b64a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= Date: Wed, 3 Apr 2024 02:02:16 -0700 Subject: [PATCH 58/79] updated github action for integration tests --- .github/workflows/automationtest.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index f51854ba..85a7c6e2 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -4,8 +4,8 @@ on: - main - develop jobs: - build: - runs-on: ubuntu-latest + build: + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 @@ -13,7 +13,13 @@ jobs: java-version: '21' distribution: 'temurin' cache: maven - #- name: Build with Maven - # run: mvn --batch-mode --update-snapshots verify + - uses: actions/checkout@v3.0.1 + - name: Install Atlas + run: | + curl -sSf https://atlasgo.sh | sh + - run: | + atlas migrate apply --dir file://migrations/ -u 'mysql://root:pass@localhost:3306/dev' + - run: | + echo "Run your tests here!" - name: Build with Maven run: mvn -B clean package --file pom.xml From 0252b62e2c92ae85ca3cab79c8e98f986a2911eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= Date: Wed, 3 Apr 2024 02:05:35 -0700 Subject: [PATCH 59/79] updated github action for integration tests --- .github/workflows/automationtest.yml | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 85a7c6e2..3b4c2b96 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -1,10 +1,24 @@ on: pull_request: - branches: - - main - - develop + branches: + - main + - develop jobs: - build: + build: + services: + mysql: + image: mysql:8.0.29 + env: + MYSQL_ROOT_PASSWORD: pass + MYSQL_DATABASE: dev + ports: + - "3306:3306" + options: >- + --health-cmd "mysqladmin ping -ppass" + --health-interval 10s + --health-start-period 10s + --health-timeout 5s + --health-retries 10 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From 06bd68882405061a68e3b66fdc26c6f85891eae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= Date: Wed, 3 Apr 2024 02:13:42 -0700 Subject: [PATCH 60/79] updated github action for integration tests --- .github/workflows/automationtest.yml | 31 +++++++++++----------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index 3b4c2b96..b16f1a6b 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -1,10 +1,11 @@ +name: Integration Test (MySQL) on: pull_request: branches: - main - develop jobs: - build: + integration: services: mysql: image: mysql:8.0.29 @@ -19,21 +20,13 @@ jobs: --health-start-period 10s --health-timeout 5s --health-retries 10 - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 - with: - java-version: '21' - distribution: 'temurin' - cache: maven - - uses: actions/checkout@v3.0.1 - - name: Install Atlas - run: | - curl -sSf https://atlasgo.sh | sh - - run: | - atlas migrate apply --dir file://migrations/ -u 'mysql://root:pass@localhost:3306/dev' - - run: | - echo "Run your tests here!" - - name: Build with Maven - run: mvn -B clean package --file pom.xml + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3.0.1 + - name: Install Atlas + run: | + curl -sSf https://atlasgo.sh | sh + - run: | + atlas migrate apply --dir file://migrations/ -u 'mysql://root:pass@localhost:3306/dev' + - run: | + echo "Run your tests here!" \ No newline at end of file From 5a51fb9e4fe3132bd9ff4ea5dcd837f801244e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Vaqu=C3=A9?= Date: Wed, 3 Apr 2024 02:21:44 -0700 Subject: [PATCH 61/79] updated github action for integration tests --- .github/workflows/automationtest.yml | 43 +++++++++------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/.github/workflows/automationtest.yml b/.github/workflows/automationtest.yml index b16f1a6b..4fdd2383 100644 --- a/.github/workflows/automationtest.yml +++ b/.github/workflows/automationtest.yml @@ -1,32 +1,17 @@ -name: Integration Test (MySQL) on: pull_request: - branches: - - main - - develop + branches: + - main + - develop jobs: - integration: - services: - mysql: - image: mysql:8.0.29 - env: - MYSQL_ROOT_PASSWORD: pass - MYSQL_DATABASE: dev - ports: - - "3306:3306" - options: >- - --health-cmd "mysqladmin ping -ppass" - --health-interval 10s - --health-start-period 10s - --health-timeout 5s - --health-retries 10 - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3.0.1 - - name: Install Atlas - run: | - curl -sSf https://atlasgo.sh | sh - - run: | - atlas migrate apply --dir file://migrations/ -u 'mysql://root:pass@localhost:3306/dev' - - run: | - echo "Run your tests here!" \ No newline at end of file + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn package -Dmaven.test.skip=true From 0173ee08326cb48817b73a1be6e8e54b6125055c Mon Sep 17 00:00:00 2001 From: Katia Date: Wed, 3 Apr 2024 20:59:10 +0200 Subject: [PATCH 62/79] update searchBooksByUsn() , add 6,8 to libraryMenu --- .../ironhack/repository/IssueRepository.java | 6 +++ .../com/ironhack/service/LibraryService.java | 24 +++++----- src/main/java/com/ironhack/utils/Utils.java | 2 +- .../java/com/ironhack/viewer/LibraryMenu.java | 48 +++++++++++++++++++ 4 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/ironhack/repository/IssueRepository.java b/src/main/java/com/ironhack/repository/IssueRepository.java index bcacbd46..a654fe38 100644 --- a/src/main/java/com/ironhack/repository/IssueRepository.java +++ b/src/main/java/com/ironhack/repository/IssueRepository.java @@ -2,10 +2,16 @@ import com.ironhack.model.Issue; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface IssueRepository extends JpaRepository { Issue findByIssueId(int issueId); + @Query("SELECT i FROM Issue i JOIN i.issueBook b WHERE b.isbn = ?1") + Optional findByIsbn(String isbn); + } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index 04fe3622..1dd611db 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -10,9 +10,9 @@ import com.ironhack.repository.StudentRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.ironhack.utils.Utils; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Optional; @@ -47,18 +47,12 @@ public List searchAllBooks() { return bookRepository.findAll(); } - public void issueBook(String isbn, String usn) { - } - - private void issueBook(String usn, String name, String isbn) { + public void issueBook(String usn, String name, String isbn) { LocalDateTime issueDate = LocalDateTime.now(); LocalDateTime returnDate = issueDate.plusDays(7); - //mover a Utils: - DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"); - String todayString = FORMATTER.format(issueDate); - String returnDateString = FORMATTER.format(returnDate); - - Issue issue = new Issue(todayString, returnDateString); + String issueDateString = Utils.formatter.format(issueDate); + String returnDateString = Utils.formatter.format(returnDate); + Issue issue = new Issue(issueDateString, returnDateString); Optional student = studentRepository.findByUsn(usn); //check if book is already issued if (!isBookIssued(isbn)) { @@ -79,7 +73,13 @@ public boolean isBookIssued(String isbn) { return book.get().getQuantity() == 0; } - private List searchBooksByStudentString(String usn) { + public List searchBooksByStudentString(String usn) { return studentRepository.searchBooksByStudent(usn); } + + public Optional findIssueByIsbn(String isbn){ return issueRepository.findByIsbn(isbn);} + + public Optional findBookByIsbn(String isbn){return bookRepository.findByIsbn(isbn);} + + public Optional findStudentByUsn(String usn){return studentRepository.findByUsn(usn);} } diff --git a/src/main/java/com/ironhack/utils/Utils.java b/src/main/java/com/ironhack/utils/Utils.java index 2a42906b..96ef939a 100644 --- a/src/main/java/com/ironhack/utils/Utils.java +++ b/src/main/java/com/ironhack/utils/Utils.java @@ -67,7 +67,7 @@ public static int addQuantityUpdate(int currentQuantity, int change) { return currentQuantity + change; } - private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + public static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"); /** * Validates if the provided date string follows the "dd/MM/yyyy" format. diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 1b368453..588dfe0b 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -2,6 +2,8 @@ import com.ironhack.model.Book; import com.ironhack.model.Categories; +import com.ironhack.model.Issue; +import com.ironhack.model.Student; import com.ironhack.service.LibraryService; import org.springframework.beans.factory.annotation.Autowired; @@ -101,12 +103,58 @@ public void displayMenu() { break; case 6: // Issue Book + System.out.print("Enter usn:"); + String usn = scanner.nextLine(); + System.out.print("Enter name:"); + String name = scanner.nextLine(); + System.out.print("Enter book ISBN:"); + String isbn = scanner.nextLine(); + try{ + //check if student and book exist. Comprobar nombre????? + Optional studentOptional = libraryService.findStudentByUsn(usn); + Optional bookOptional = libraryService.findBookByIsbn(isbn); + if (studentOptional.isPresent() && bookOptional.isPresent()) { + libraryService.issueBook(usn, name, isbn); + Optional issue = libraryService.findIssueByIsbn(isbn); + System.out.println(""); + System.out.println("Book issued. Return date : " + issue.get().getReturnDate()); + } else { + System.out.println("Student or book does not exist."); + } + } catch (IllegalArgumentException iae){ + System.out.println("An exception occurred: " + iae.getMessage()); + } break; case 7: // Return Book break; case 8: // Search Books By Student + System.out.println("Enter usn:"); + String usnSearch = scanner.nextLine(); + try{ + Optional studentOptional = libraryService.findStudentByUsn(usnSearch); + if (studentOptional.isPresent()){ + List issueList = libraryService.searchBooksByStudentString(usnSearch); + if (issueList.isEmpty()) { + System.out.println("No books found for the specified student."); + break; + } + System.out.println("Book Title Student Name Return date"); + for (Issue issue : issueList) { + String bookTitle = issue.getIssueBook().getTitle(); + String studentName = issue.getIssueStudent().getName(); + String returnDate = issue.getReturnDate(); + System.out.printf("%-20s %-15s %s%n", bookTitle, studentName, returnDate); + } + + } else{ + System.out.println("Student does not exist"); + } + + } catch(IllegalArgumentException iae) { + System.out.println("An exception occurred: " + iae.getMessage()); + } break; case 0: System.out.println("Exiting..."); From a233e2008f309917b85e266ddb79e39807c66d22 Mon Sep 17 00:00:00 2001 From: Katia Date: Thu, 4 Apr 2024 23:08:03 +0200 Subject: [PATCH 63/79] =?UTF-8?q?addBook=20(no=20funciona!)=20y=20findAllB?= =?UTF-8?q?ooksWithAuthor(),=20a=C3=B1adido=20cascade.persist=20a=20Book?= =?UTF-8?q?=20y=20queries=20a=20BookRepo=20y=20AuthorRepo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ironhack/model/Book.java | 2 +- .../ironhack/repository/AuthorRepository.java | 3 + .../ironhack/repository/BookRepository.java | 3 + .../com/ironhack/service/LibraryService.java | 26 ++++++- .../java/com/ironhack/viewer/LibraryMenu.java | 74 ++++++++++++++++--- 5 files changed, 92 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/ironhack/model/Book.java b/src/main/java/com/ironhack/model/Book.java index 3bf017b7..d46c61b9 100644 --- a/src/main/java/com/ironhack/model/Book.java +++ b/src/main/java/com/ironhack/model/Book.java @@ -24,7 +24,7 @@ public class Book implements InputValidator{ private int quantity; - @OneToOne + @OneToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "author_id") private Author authorBook; diff --git a/src/main/java/com/ironhack/repository/AuthorRepository.java b/src/main/java/com/ironhack/repository/AuthorRepository.java index d4a74722..e1bfaafe 100644 --- a/src/main/java/com/ironhack/repository/AuthorRepository.java +++ b/src/main/java/com/ironhack/repository/AuthorRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface AuthorRepository extends JpaRepository { + Optional findByName(String authorName); } diff --git a/src/main/java/com/ironhack/repository/BookRepository.java b/src/main/java/com/ironhack/repository/BookRepository.java index 36943a06..bed56705 100644 --- a/src/main/java/com/ironhack/repository/BookRepository.java +++ b/src/main/java/com/ironhack/repository/BookRepository.java @@ -19,4 +19,7 @@ public interface BookRepository extends JpaRepository { Optional findByIsbn(String isbn); + @Query("SELECT b FROM Book b JOIN FETCH b.authorBook") + List findAllBooksWithAuthor(); + } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index 1dd611db..8d002486 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -31,6 +31,16 @@ public class LibraryService { @Autowired StudentRepository studentRepository; + public void addNewBook(Book book) { + Optional optionalBook = bookRepository.findByIsbn(book.getIsbn()); + if (optionalBook.isPresent()) { + book.setQuantity(book.getQuantity() + 1); + bookRepository.save(book); + } else { + bookRepository.save(book); + } + } + public Optional searchBookByTitle(String title) { return bookRepository.findBookByTitle(title); } @@ -77,9 +87,19 @@ public List searchBooksByStudentString(String usn) { return studentRepository.searchBooksByStudent(usn); } - public Optional findIssueByIsbn(String isbn){ return issueRepository.findByIsbn(isbn);} + public Optional findIssueByIsbn(String isbn) { + return issueRepository.findByIsbn(isbn); + } - public Optional findBookByIsbn(String isbn){return bookRepository.findByIsbn(isbn);} + public Optional findBookByIsbn(String isbn) { + return bookRepository.findByIsbn(isbn); + } + + public Optional findStudentByUsn(String usn) { + return studentRepository.findByUsn(usn); + } - public Optional findStudentByUsn(String usn){return studentRepository.findByUsn(usn);} + public List findAllBooksWithAuthors() { + return bookRepository.findAllBooksWithAuthor(); + } } diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 588dfe0b..266be542 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -1,21 +1,19 @@ package com.ironhack.viewer; -import com.ironhack.model.Book; -import com.ironhack.model.Categories; -import com.ironhack.model.Issue; -import com.ironhack.model.Student; +import com.ironhack.model.*; +import com.ironhack.repository.AuthorRepository; import com.ironhack.service.LibraryService; import org.springframework.beans.factory.annotation.Autowired; -import java.util.InputMismatchException; -import java.util.List; -import java.util.Optional; -import java.util.Scanner; +import java.util.*; public class LibraryMenu { @Autowired private LibraryService libraryService; + @Autowired + private AuthorRepository authorRepository; + private Optional one_book=null; private List books; @@ -49,6 +47,39 @@ public void displayMenu() { switch (choice) { case 1: // Add Book + System.out.print("Enter isbn: "); + String isbnBook = scanner.nextLine(); + System.out.print("Enter title: "); + String titleBook = scanner.nextLine(); + System.out.print("Enter category (Available categories: HORROR, SCIENCE, ROMANCE, FICTION, FANTASY, ADVENTURE, BIOGRAPHY, MISTERY, OTHERS"); + String categoryInput = scanner.nextLine().toUpperCase(); + Categories categoryBook; + try { + categoryBook = Categories.valueOf(categoryInput); + } catch (IllegalArgumentException e) { + System.out.println("Invalid category. Please enter a valid category."); + break; + } + System.out.print("Enter Author name: "); + String authorName = scanner.nextLine(); + System.out.print("Enter Author mail: "); + String authorMail = scanner.nextLine(); + System.out.print("Enter number of books: "); + int quantity = scanner.nextInt(); + Author author; + Optional optionalAuthor = authorRepository.findByName(authorName); + if (optionalAuthor.isPresent()) { + author = optionalAuthor.get(); + } else { + author = new Author(authorName, authorMail); + authorRepository.save(author); + } + Book newBook = new Book(isbnBook, titleBook, categoryBook, quantity, new Author(authorName, authorMail)); + try{ + libraryService.addNewBook(newBook); + } catch (IllegalArgumentException iae){ + System.out.println("error"); + } break; case 2: System.out.print("Enter title to search: "); @@ -93,12 +124,31 @@ public void displayMenu() { } break; +// case 5: +// // Search All Books +// books = libraryService.searchAllBooks(); +// for(Book book: books){ +// System.out.println(book.getIsbn()); +// System.out.println(book.getTitle()); +// } +// break; case 5: // Search All Books - books = libraryService.searchAllBooks(); - for(Book book: books){ - System.out.println(book.getIsbn()); - System.out.println(book.getTitle()); + books = libraryService.findAllBooksWithAuthors(); + if (books.isEmpty()) { + System.out.println("No books found."); + return; + } + + System.out.println("Book ISBN Book Title Category No of Books Author name Author mail "); + for (Book book : books) { + String bookIsbn = book.getIsbn(); + String bookTitle = book.getTitle(); + Categories categoryList = book.getCategory(); + int numOfBooks = book.getQuantity(); + String authorNameList = book.getAuthorBook().getName(); + String authorEmail = book.getAuthorBook().getEmail(); + System.out.printf("%-20s %-15s %-12s %-15s %-20s %s%n", bookIsbn, bookTitle, categoryList, numOfBooks, authorNameList, authorEmail); } break; case 6: From 554acab5f4d8ab8f97649c942eb68355ccea0e51 Mon Sep 17 00:00:00 2001 From: Katia Date: Fri, 5 Apr 2024 08:39:50 +0200 Subject: [PATCH 64/79] =?UTF-8?q?a=C3=B1adir=20anotaciones=20a=20ironlibra?= =?UTF-8?q?ry=20para=20que=20funcionen=20los=20repository=20en=20el=20libr?= =?UTF-8?q?arymenu,=20arreglar=20addBook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ironhack/IronLibrary.java | 14 +++++++++++++- .../java/com/ironhack/service/LibraryService.java | 7 +++---- src/main/java/com/ironhack/viewer/LibraryMenu.java | 7 +++++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ironhack/IronLibrary.java b/src/main/java/com/ironhack/IronLibrary.java index 7cc5dfe0..1a3b046b 100644 --- a/src/main/java/com/ironhack/IronLibrary.java +++ b/src/main/java/com/ironhack/IronLibrary.java @@ -2,6 +2,8 @@ import com.ironhack.service.LibraryService; import com.ironhack.viewer.LibraryMenu; +import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @@ -9,13 +11,23 @@ @SpringBootApplication public class IronLibrary { + + @Autowired + private LibraryMenu libraryMenu; + public static void main(String[] args) { ConfigurableApplicationContext context =SpringApplication.run(IronLibrary.class, args); LibraryService libraryService = context.getBean(LibraryService.class); LibraryMenu libraryMenu = new LibraryMenu(libraryService); libraryMenu.displayMenu(); context.close(); - //SpringApplication.run(IronLibrary.class, args); + SpringApplication.run(IronLibrary.class, args); + } + + + @PostConstruct + public void runLibraryMenu() { + libraryMenu.displayMenu(); } } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index 8d002486..c1abe13e 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -1,9 +1,6 @@ package com.ironhack.service; -import com.ironhack.model.Book; -import com.ironhack.model.Categories; -import com.ironhack.model.Issue; -import com.ironhack.model.Student; +import com.ironhack.model.*; import com.ironhack.repository.AuthorRepository; import com.ironhack.repository.BookRepository; import com.ironhack.repository.IssueRepository; @@ -102,4 +99,6 @@ public Optional findStudentByUsn(String usn) { public List findAllBooksWithAuthors() { return bookRepository.findAllBooksWithAuthor(); } + //añadido hoy + public Optional findAuthorByName(String name){ return authorRepository.findByName(name);} } diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 266be542..3bd6d836 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -4,9 +4,11 @@ import com.ironhack.repository.AuthorRepository; import com.ironhack.service.LibraryService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.util.*; +@Component public class LibraryMenu { @Autowired private LibraryService libraryService; @@ -67,19 +69,20 @@ public void displayMenu() { System.out.print("Enter number of books: "); int quantity = scanner.nextInt(); Author author; - Optional optionalAuthor = authorRepository.findByName(authorName); + Optional optionalAuthor = libraryService.findAuthorByName(authorName); if (optionalAuthor.isPresent()) { author = optionalAuthor.get(); } else { author = new Author(authorName, authorMail); authorRepository.save(author); } - Book newBook = new Book(isbnBook, titleBook, categoryBook, quantity, new Author(authorName, authorMail)); + Book newBook = new Book(isbnBook, titleBook, categoryBook, quantity, author); try{ libraryService.addNewBook(newBook); } catch (IllegalArgumentException iae){ System.out.println("error"); } + System.out.println("Book was successfully added to library"); break; case 2: System.out.print("Enter title to search: "); From 8043787054fb9a81dc7621d113e0fed6c3ec9b36 Mon Sep 17 00:00:00 2001 From: Katia Date: Fri, 5 Apr 2024 09:17:31 +0200 Subject: [PATCH 65/79] comentar llamada redundante en ironlibrary --- src/main/java/com/ironhack/IronLibrary.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ironhack/IronLibrary.java b/src/main/java/com/ironhack/IronLibrary.java index 1a3b046b..61610267 100644 --- a/src/main/java/com/ironhack/IronLibrary.java +++ b/src/main/java/com/ironhack/IronLibrary.java @@ -21,7 +21,7 @@ public static void main(String[] args) { LibraryMenu libraryMenu = new LibraryMenu(libraryService); libraryMenu.displayMenu(); context.close(); - SpringApplication.run(IronLibrary.class, args); +// SpringApplication.run(IronLibrary.class, args); } From f598bca720d3f07656805e476f0a4cd9b314a302 Mon Sep 17 00:00:00 2001 From: Katia Date: Fri, 5 Apr 2024 19:21:44 +0200 Subject: [PATCH 66/79] arreglado issueBook para que de error al prestar un libro con cantidad 0 --- .../java/com/ironhack/service/LibraryService.java | 5 +++-- src/main/java/com/ironhack/viewer/LibraryMenu.java | 13 +++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index c1abe13e..b8441dce 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -70,9 +70,10 @@ public void issueBook(String usn, String name, String isbn) { //restar un ejemplar a libro book.get().updateQuantity(-1); bookRepository.save(book.get()); - } else { - System.out.println("Book is already issued"); } +// else { +// System.out.println("Book is already issued"); +// } } public boolean isBookIssued(String isbn) { diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 3bd6d836..01ca950f 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -167,10 +167,15 @@ public void displayMenu() { Optional studentOptional = libraryService.findStudentByUsn(usn); Optional bookOptional = libraryService.findBookByIsbn(isbn); if (studentOptional.isPresent() && bookOptional.isPresent()) { - libraryService.issueBook(usn, name, isbn); - Optional issue = libraryService.findIssueByIsbn(isbn); - System.out.println(""); - System.out.println("Book issued. Return date : " + issue.get().getReturnDate()); + Book book = bookOptional.get(); + if (book.getQuantity() > 0) { + libraryService.issueBook(usn, name, isbn); + Optional issue = libraryService.findIssueByIsbn(isbn); + System.out.println(""); + System.out.println("Book issued. Return date : " + issue.get().getReturnDate()); + } else { + System.out.println("There aren't any copies left."); + } } else { System.out.println("Student or book does not exist."); } From 6000219f6ac42d00636dc9fd9a1a6d0c653795db Mon Sep 17 00:00:00 2001 From: Katia Date: Fri, 5 Apr 2024 21:05:47 +0200 Subject: [PATCH 67/79] =?UTF-8?q?arreglado=20librarymenu,=20peque=C3=B1o?= =?UTF-8?q?=20cambio=20en=20llamada=20a=20libraryMenu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ironhack/IronLibrary.java | 24 ++++------ .../ironhack/repository/IssueRepository.java | 6 ++- .../com/ironhack/service/LibraryService.java | 19 +++++--- .../java/com/ironhack/viewer/LibraryMenu.java | 47 +++++++++---------- .../repository/StudentRepositoryTest.java | 12 ++--- 5 files changed, 55 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/ironhack/IronLibrary.java b/src/main/java/com/ironhack/IronLibrary.java index 61610267..c327f070 100644 --- a/src/main/java/com/ironhack/IronLibrary.java +++ b/src/main/java/com/ironhack/IronLibrary.java @@ -11,23 +11,15 @@ @SpringBootApplication public class IronLibrary { - - @Autowired - private LibraryMenu libraryMenu; - - public static void main(String[] args) { - ConfigurableApplicationContext context =SpringApplication.run(IronLibrary.class, args); - LibraryService libraryService = context.getBean(LibraryService.class); - LibraryMenu libraryMenu = new LibraryMenu(libraryService); - libraryMenu.displayMenu(); - context.close(); + public static void main(String[] args) { + ConfigurableApplicationContext context = SpringApplication.run(IronLibrary.class, args); +// LibraryService libraryService = context.getBean(LibraryService.class); +// LibraryMenu libraryMenu = new LibraryMenu(libraryService); + LibraryMenu libraryMenu = context.getBean(LibraryMenu.class); + libraryMenu.displayMenu(); + context.close(); // SpringApplication.run(IronLibrary.class, args); - } - + } - @PostConstruct - public void runLibraryMenu() { - libraryMenu.displayMenu(); - } } diff --git a/src/main/java/com/ironhack/repository/IssueRepository.java b/src/main/java/com/ironhack/repository/IssueRepository.java index a654fe38..9324256a 100644 --- a/src/main/java/com/ironhack/repository/IssueRepository.java +++ b/src/main/java/com/ironhack/repository/IssueRepository.java @@ -5,6 +5,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -12,6 +13,9 @@ public interface IssueRepository extends JpaRepository { Issue findByIssueId(int issueId); @Query("SELECT i FROM Issue i JOIN i.issueBook b WHERE b.isbn = ?1") - Optional findByIsbn(String isbn); + List findByIsbn(String isbn); + + @Query("SELECT i FROM Issue i JOIN i.issueStudent s WHERE s.usn = ?1") + List findByUsn(String usn); } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index b8441dce..f0a9a281 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -54,7 +54,7 @@ public List searchAllBooks() { return bookRepository.findAll(); } - public void issueBook(String usn, String name, String isbn) { + public String issueBook(String usn, String name, String isbn) { LocalDateTime issueDate = LocalDateTime.now(); LocalDateTime returnDate = issueDate.plusDays(7); String issueDateString = Utils.formatter.format(issueDate); @@ -70,10 +70,10 @@ public void issueBook(String usn, String name, String isbn) { //restar un ejemplar a libro book.get().updateQuantity(-1); bookRepository.save(book.get()); + return returnDateString; + } else { + return null; } -// else { -// System.out.println("Book is already issued"); -// } } public boolean isBookIssued(String isbn) { @@ -85,10 +85,14 @@ public List searchBooksByStudentString(String usn) { return studentRepository.searchBooksByStudent(usn); } - public Optional findIssueByIsbn(String isbn) { + public List findIssueByIsbn(String isbn) { return issueRepository.findByIsbn(isbn); } + public List findIssueByUsn(String usn) { + return issueRepository.findByUsn(usn); + } + public Optional findBookByIsbn(String isbn) { return bookRepository.findByIsbn(isbn); } @@ -100,6 +104,9 @@ public Optional findStudentByUsn(String usn) { public List findAllBooksWithAuthors() { return bookRepository.findAllBooksWithAuthor(); } + //añadido hoy - public Optional findAuthorByName(String name){ return authorRepository.findByName(name);} + public Optional findAuthorByName(String name) { + return authorRepository.findByName(name); + } } diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 01ca950f..8a57aa65 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -16,7 +16,7 @@ public class LibraryMenu { @Autowired private AuthorRepository authorRepository; - private Optional one_book=null; + private Optional one_book = null; private List books; public LibraryMenu(LibraryService libraryService) { @@ -39,10 +39,10 @@ public void displayMenu() { System.out.println("8. Search Books By Student"); System.out.println("0. Exit"); System.out.print("Enter your choice: "); - try{ + try { choice = scanner.nextInt(); scanner.nextLine(); // Consume newline - }catch (InputMismatchException ime){ + } catch (InputMismatchException ime) { choice = 9; scanner.nextLine(); } @@ -77,9 +77,9 @@ public void displayMenu() { authorRepository.save(author); } Book newBook = new Book(isbnBook, titleBook, categoryBook, quantity, author); - try{ + try { libraryService.addNewBook(newBook); - } catch (IllegalArgumentException iae){ + } catch (IllegalArgumentException iae) { System.out.println("error"); } System.out.println("Book was successfully added to library"); @@ -87,8 +87,8 @@ public void displayMenu() { case 2: System.out.print("Enter title to search: "); String title = scanner.nextLine(); - one_book=libraryService.searchBookByTitle(title); - if(one_book.isPresent()) { + one_book = libraryService.searchBookByTitle(title); + if (one_book.isPresent()) { System.out.println(one_book.get().getIsbn()); System.out.println(one_book.get().getTitle()); } @@ -96,9 +96,9 @@ public void displayMenu() { case 3: System.out.print("Enter a Category to search: "); String category = scanner.nextLine(); - try{ + try { books = libraryService.searchBookByCategory(Categories.valueOf(category)); - for(Book book: books){ + for (Book book : books) { System.out.println(book.getIsbn()); System.out.println(book.getTitle()); } @@ -106,7 +106,7 @@ public void displayMenu() { // catch (InputMismatchException imm){ // System.out.print("Wrong Category "); // } - catch (IllegalArgumentException iae){ + catch (IllegalArgumentException iae) { System.out.println("Wrong Category"); } @@ -114,15 +114,15 @@ public void displayMenu() { case 4: System.out.print("Enter an Author ID:"); String author_id = scanner.nextLine(); - try{ + try { //TODO change to isbn validation int authorid = Integer.parseInt(author_id); books = libraryService.searchBookByAuthor(authorid); - for(Book book: books){ + for (Book book : books) { System.out.println(book.getIsbn()); System.out.println(book.getTitle()); } - }catch (IllegalArgumentException iae){ + } catch (IllegalArgumentException iae) { System.out.println("Author ID should be numeric"); } @@ -140,7 +140,7 @@ public void displayMenu() { books = libraryService.findAllBooksWithAuthors(); if (books.isEmpty()) { System.out.println("No books found."); - return; + break; } System.out.println("Book ISBN Book Title Category No of Books Author name Author mail "); @@ -162,26 +162,25 @@ public void displayMenu() { String name = scanner.nextLine(); System.out.print("Enter book ISBN:"); String isbn = scanner.nextLine(); - try{ + try { //check if student and book exist. Comprobar nombre????? Optional studentOptional = libraryService.findStudentByUsn(usn); Optional bookOptional = libraryService.findBookByIsbn(isbn); if (studentOptional.isPresent() && bookOptional.isPresent()) { Book book = bookOptional.get(); if (book.getQuantity() > 0) { - libraryService.issueBook(usn, name, isbn); - Optional issue = libraryService.findIssueByIsbn(isbn); + String returnDate = libraryService.issueBook(usn, name, isbn); System.out.println(""); - System.out.println("Book issued. Return date : " + issue.get().getReturnDate()); + System.out.println("Book issued. Return date : " + returnDate); } else { System.out.println("There aren't any copies left."); } } else { System.out.println("Student or book does not exist."); } - } catch (IllegalArgumentException iae){ + } catch (IllegalArgumentException iae) { System.out.println("An exception occurred: " + iae.getMessage()); - } + } break; case 7: // Return Book @@ -190,9 +189,9 @@ public void displayMenu() { // Search Books By Student System.out.println("Enter usn:"); String usnSearch = scanner.nextLine(); - try{ + try { Optional studentOptional = libraryService.findStudentByUsn(usnSearch); - if (studentOptional.isPresent()){ + if (studentOptional.isPresent()) { List issueList = libraryService.searchBooksByStudentString(usnSearch); if (issueList.isEmpty()) { System.out.println("No books found for the specified student."); @@ -206,11 +205,11 @@ public void displayMenu() { System.out.printf("%-20s %-15s %s%n", bookTitle, studentName, returnDate); } - } else{ + } else { System.out.println("Student does not exist"); } - } catch(IllegalArgumentException iae) { + } catch (IllegalArgumentException iae) { System.out.println("An exception occurred: " + iae.getMessage()); } break; diff --git a/src/test/java/com/ironhack/repository/StudentRepositoryTest.java b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java index 88013f77..c461625e 100644 --- a/src/test/java/com/ironhack/repository/StudentRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java @@ -74,10 +74,10 @@ void searchBooksByStudentString() { assertEquals("2022-08-07 17:09:38", results.get(0).getReturnDate()); } - @Test - void findByName() { - Optional student = studentRepository.findByName("Juan"); - assertTrue(student.isPresent()); - assertEquals("Juan", student.get().getName()); - } +// @Test +// void findByName() { +// Optional student = studentRepository.findByName("Juan"); +// assertTrue(student.isPresent()); +// assertEquals("Juan", student.get().getName()); +// } } \ No newline at end of file From 734a7d781a1a352baae061e51d8134970061893f Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 6 Apr 2024 13:30:59 +0200 Subject: [PATCH 68/79] nuevos metodos print en libraryMenu, override toString en Book --- src/main/java/com/ironhack/IronLibrary.java | 29 ++++--- src/main/java/com/ironhack/model/Book.java | 17 +++- .../com/ironhack/service/LibraryService.java | 30 +++++++ src/main/java/com/ironhack/utils/Utils.java | 17 +++- .../java/com/ironhack/viewer/LibraryMenu.java | 85 +++++-------------- .../repository/BookRepositoryTest.java | 18 +++- src/test/resources/application.properties | 2 +- 7 files changed, 111 insertions(+), 87 deletions(-) diff --git a/src/main/java/com/ironhack/IronLibrary.java b/src/main/java/com/ironhack/IronLibrary.java index c327f070..5622c3a4 100644 --- a/src/main/java/com/ironhack/IronLibrary.java +++ b/src/main/java/com/ironhack/IronLibrary.java @@ -1,25 +1,30 @@ package com.ironhack; -import com.ironhack.service.LibraryService; import com.ironhack.viewer.LibraryMenu; -import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.Environment; + +import java.util.Arrays; @SpringBootApplication -public class IronLibrary { +public class IronLibrary implements CommandLineRunner { + @Autowired + private LibraryMenu libraryMenu; + + @Autowired + private Environment environment; public static void main(String[] args) { - ConfigurableApplicationContext context = SpringApplication.run(IronLibrary.class, args); -// LibraryService libraryService = context.getBean(LibraryService.class); -// LibraryMenu libraryMenu = new LibraryMenu(libraryService); - LibraryMenu libraryMenu = context.getBean(LibraryMenu.class); - libraryMenu.displayMenu(); - context.close(); -// SpringApplication.run(IronLibrary.class, args); + SpringApplication.run(IronLibrary.class, args); } - + @Override + public void run(String... args) throws Exception { + if(!Arrays.asList(environment.getActiveProfiles()).contains("test")){ + libraryMenu.displayMenu(); + } + } } diff --git a/src/main/java/com/ironhack/model/Book.java b/src/main/java/com/ironhack/model/Book.java index d46c61b9..d1e59152 100644 --- a/src/main/java/com/ironhack/model/Book.java +++ b/src/main/java/com/ironhack/model/Book.java @@ -12,9 +12,9 @@ @NoArgsConstructor @Entity @Table(name = "book") -public class Book implements InputValidator{ +public class Book implements InputValidator { @Id - @Column(name="isbn") + @Column(name = "isbn") private String isbn; private String title; @@ -36,6 +36,7 @@ public Book(String isbn, String title, Categories category, int quantity, Author this.authorBook = author; } + @Override public boolean input_validation() { return false; @@ -57,7 +58,15 @@ public int hashCode() { return Objects.hash(isbn, title, category, quantity, authorBook); } - public void updateQuantity(int newQuantity){ - this.quantity+=newQuantity; + public void updateQuantity(int newQuantity) { + this.quantity += newQuantity; + } + + @Override + public String toString() { + return String.format("%nISBN: %s%n" + + "Title: %s%n" + + "Category: %s%n" + + "No of Books: %d%n", isbn, title, category, quantity); } } diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index f0a9a281..f78478e8 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -109,4 +109,34 @@ public List findAllBooksWithAuthors() { public Optional findAuthorByName(String name) { return authorRepository.findByName(name); } + + public void printBooks(List books) { + if (books.isEmpty()) { + System.out.println("No books found."); + } else { + System.out.println("Book ISBN Book Title Category No of Books Author name Author mail "); + for (Book book : books) { + System.out.printf("%-20s %-15s %-12s %-15s %-20s %s%n", + book.getIsbn(), + book.getTitle(), + book.getCategory(), + book.getQuantity(), + book.getAuthorBook().getName(), + book.getAuthorBook().getEmail()); + } + } + } + + public void printBook(Book book) { + if (book == null) { + System.out.println("Book not found."); + } else { + System.out.println("Book ISBN Book Title Category No of Books"); + System.out.printf("%-20s %-15s %-12s %-15s %-20s %s%n", + book.getIsbn(), + book.getTitle(), + book.getCategory(), + book.getQuantity()); + } + } } diff --git a/src/main/java/com/ironhack/utils/Utils.java b/src/main/java/com/ironhack/utils/Utils.java index 96ef939a..128ecf2b 100644 --- a/src/main/java/com/ironhack/utils/Utils.java +++ b/src/main/java/com/ironhack/utils/Utils.java @@ -1,6 +1,5 @@ package com.ironhack.utils; -import java.sql.SQLOutput; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; @@ -32,14 +31,11 @@ public static boolean emailValidator(String email) { /** * Validates ISBNs (ISBN-10 and ISBN-13). - * * ISBN-10 Examples: "0-306-40615-2", "0306406152" * ISBN-13 Examples: "978-0-306-40615-7", "9780306406157" - * * Note: * - ISBN-10 is a 10-digit number with or without optional hyphens and might end with an 'X' representing 10. * - ISBN-13 is a 13-digit number, prefixed by '978' or '979', with or without optional hyphens. - * * @param isbn the ISBN string to validate. * @return true if the isbn is valid according to ISBN-10 or ISBN-13 standards, false otherwise. */ @@ -116,4 +112,17 @@ public static Optional dateDifferenceCalculator(String startDate, String e public static String uniqueIdGenerator() { return UUID.randomUUID().toString(); } + + public static boolean usnValidator(String usn) { + if (usn == null) return false; + + // USN Regex that matches exactly 13 numeric characters + String usnRegex = "^[0-9]{13}$"; + + Pattern usnPattern = Pattern.compile(usnRegex); + Matcher matcher = usnPattern.matcher(usn); + + // Matches USN against the regex pattern + return matcher.matches(); + } } diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 8a57aa65..2c69c9d6 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -3,26 +3,20 @@ import com.ironhack.model.*; import com.ironhack.repository.AuthorRepository; import com.ironhack.service.LibraryService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - -import java.util.*; +import java.util.InputMismatchException; +import java.util.List; +import java.util.Optional; +import java.util.Scanner; @Component public class LibraryMenu { - @Autowired - private LibraryService libraryService; - - @Autowired - private AuthorRepository authorRepository; - - private Optional one_book = null; - private List books; - - public LibraryMenu(LibraryService libraryService) { + private final LibraryService libraryService; + private final AuthorRepository authorRepository; + public LibraryMenu(LibraryService libraryService, AuthorRepository authorRepository) { this.libraryService = libraryService; + this.authorRepository = authorRepository; } - public void displayMenu() { Scanner scanner = new Scanner(System.in); int choice; @@ -33,7 +27,7 @@ public void displayMenu() { System.out.println("2. Search Book By Title"); System.out.println("3. Search Book By Category"); System.out.println("4. Search Book By Author"); - System.out.println("5. Search All Books"); + System.out.println("5. Show All Books"); System.out.println("6. Issue Book"); System.out.println("7. Return Book"); System.out.println("8. Search Books By Student"); @@ -49,6 +43,7 @@ public void displayMenu() { switch (choice) { case 1: // Add Book + //llamar a getIsbn() do While System.out.print("Enter isbn: "); String isbnBook = scanner.nextLine(); System.out.print("Enter title: "); @@ -87,28 +82,28 @@ public void displayMenu() { case 2: System.out.print("Enter title to search: "); String title = scanner.nextLine(); - one_book = libraryService.searchBookByTitle(title); - if (one_book.isPresent()) { - System.out.println(one_book.get().getIsbn()); - System.out.println(one_book.get().getTitle()); + Optional requestedBook = libraryService.searchBookByTitle(title); + if (requestedBook.isPresent()) { + System.out.println(requestedBook.get()); + } else { + System.out.println("Book not found"); } break; case 3: System.out.print("Enter a Category to search: "); String category = scanner.nextLine(); try { - books = libraryService.searchBookByCategory(Categories.valueOf(category)); + List books = libraryService.searchBookByCategory(Categories.valueOf(category)); for (Book book : books) { System.out.println(book.getIsbn()); System.out.println(book.getTitle()); } + } catch (InputMismatchException imm) { + System.out.print("Wrong Category "); } -// catch (InputMismatchException imm){ -// System.out.print("Wrong Category "); +// catch (IllegalArgumentException iae) { +// System.out.println("Wrong Category"); // } - catch (IllegalArgumentException iae) { - System.out.println("Wrong Category"); - } break; case 4: @@ -117,7 +112,7 @@ public void displayMenu() { try { //TODO change to isbn validation int authorid = Integer.parseInt(author_id); - books = libraryService.searchBookByAuthor(authorid); + List books = libraryService.searchBookByAuthor(authorid); for (Book book : books) { System.out.println(book.getIsbn()); System.out.println(book.getTitle()); @@ -125,37 +120,11 @@ public void displayMenu() { } catch (IllegalArgumentException iae) { System.out.println("Author ID should be numeric"); } - break; -// case 5: -// // Search All Books -// books = libraryService.searchAllBooks(); -// for(Book book: books){ -// System.out.println(book.getIsbn()); -// System.out.println(book.getTitle()); -// } -// break; case 5: - // Search All Books - books = libraryService.findAllBooksWithAuthors(); - if (books.isEmpty()) { - System.out.println("No books found."); - break; - } - - System.out.println("Book ISBN Book Title Category No of Books Author name Author mail "); - for (Book book : books) { - String bookIsbn = book.getIsbn(); - String bookTitle = book.getTitle(); - Categories categoryList = book.getCategory(); - int numOfBooks = book.getQuantity(); - String authorNameList = book.getAuthorBook().getName(); - String authorEmail = book.getAuthorBook().getEmail(); - System.out.printf("%-20s %-15s %-12s %-15s %-20s %s%n", bookIsbn, bookTitle, categoryList, numOfBooks, authorNameList, authorEmail); - } + libraryService.printBooks(libraryService.searchAllBooks()); break; case 6: - // Issue Book System.out.print("Enter usn:"); String usn = scanner.nextLine(); System.out.print("Enter name:"); @@ -170,7 +139,7 @@ public void displayMenu() { Book book = bookOptional.get(); if (book.getQuantity() > 0) { String returnDate = libraryService.issueBook(usn, name, isbn); - System.out.println(""); + System.out.println("\n"); System.out.println("Book issued. Return date : " + returnDate); } else { System.out.println("There aren't any copies left."); @@ -204,11 +173,9 @@ public void displayMenu() { String returnDate = issue.getReturnDate(); System.out.printf("%-20s %-15s %s%n", bookTitle, studentName, returnDate); } - } else { System.out.println("Student does not exist"); } - } catch (IllegalArgumentException iae) { System.out.println("An exception occurred: " + iae.getMessage()); } @@ -224,10 +191,4 @@ public void displayMenu() { scanner.close(); } - - public static void main(String[] args) { - LibraryService libraryService = new LibraryService(); - LibraryMenu libraryMenu = new LibraryMenu(libraryService); - libraryMenu.displayMenu(); - } } \ No newline at end of file diff --git a/src/test/java/com/ironhack/repository/BookRepositoryTest.java b/src/test/java/com/ironhack/repository/BookRepositoryTest.java index fdbbd0b3..49e04bf4 100644 --- a/src/test/java/com/ironhack/repository/BookRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/BookRepositoryTest.java @@ -3,17 +3,13 @@ import com.ironhack.model.Author; import com.ironhack.model.Book; import com.ironhack.model.Categories; -import com.ironhack.repository.BookRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import java.util.Optional; - import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest public class BookRepositoryTest { @@ -46,4 +42,18 @@ void tearDown() { // assertTrue(db_book.isPresent()); // assertEquals(sample_book,db_book.get()); // } +@Test +void findAllBooksWithAuthor() { + Author author1 = new Author("JK Rowling", "jkrowling@mail.com"); + Author author2 = new Author("George Orwell", "georgeorwell@mail.com"); + authorRepository.save(author1); + authorRepository.save(author2); + Book book1 = new Book("978-3-16-148410-0", "Harry Potter", Categories.FANTASY, 1, author1); + Book book2 = new Book("978-3-16-148434-0", "1984", Categories.FICTION, 2, author2); + bookRepository.save(book1); + bookRepository.save(book2); + assertEquals(author1, book1.getAuthorBook()); + +} + } diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 9d2703a4..30f6c7b9 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -2,7 +2,7 @@ spring.datasource.url=jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC&crea spring.datasource.username=ironhack spring.datasource.password=ironhack2024 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - +spring.profiles.active=test spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=true \ No newline at end of file From a7fbe3841568dac9c139a69894106c23dd6ad2f8 Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 6 Apr 2024 15:12:34 +0200 Subject: [PATCH 69/79] keep changes --- .../com/ironhack/service/LibraryService.java | 99 +++++++++++++++++++ .../java/com/ironhack/viewer/LibraryMenu.java | 35 ++----- 2 files changed, 109 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index f78478e8..cd186116 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -12,6 +12,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Optional; +import java.util.Scanner; @Service public class LibraryService { @@ -139,4 +140,102 @@ public void printBook(Book book) { book.getQuantity()); } } + + public String getIsbn(Scanner scanner){ + String isbn; + do{ + System.out.print("Enter isbn: "); + isbn = scanner.nextLine(); + if (!Utils.isbnValidator(isbn)) { + System.out.println("Invalid ISBN. Please try again."); + } + } while(!Utils.isbnValidator(isbn)); + return isbn; + } + public String getTitle(Scanner scanner){ + String title; + do{ + System.out.print("Enter title: "); + title = scanner.nextLine(); + if (!Utils.stringValidator(title)) { + System.out.println("Title can not be empty. Please try again."); + } + } while(!Utils.stringValidator(title)); + return title; + } + + public String getAuthorName(Scanner scanner){ + String name; + do{ + System.out.print("Enter author name: "); + name = scanner.nextLine(); + if (!Utils.stringValidator(name)) { + System.out.println("Author can not be empty. Please try again."); + } + } while(!Utils.stringValidator(name)); + return name; + } + + public String getAuthorEmail(Scanner scanner){ + String email; + do{ + System.out.print("Enter author email: "); + email = scanner.nextLine(); + if (!Utils.emailValidator(email)) { + System.out.println("Author can not be empty. Please try again."); + } + } while(!Utils.emailValidator(email)); + return email; + } + + public int getQuantity(Scanner scanner){ + int quantity; + do { + System.out.print("Enter number of books: "); + if (scanner.hasNextInt()) { + quantity = scanner.nextInt(); + if (quantity >= 0) { + break; + } else { + System.out.println("Number of books can't be negative. Please try again."); + } + } else { + System.out.println("Invalid input. Please enter a numeric value."); + scanner.next(); // Consume invalid input + } + } while (true); + return quantity; + } + + public Categories getCategory(Scanner scanner){ + Categories category = null; + while (true) { + System.out.print("Enter category (Available categories: HORROR, SCIENCE, ROMANCE, FICTION, FANTASY, ADVENTURE, BIOGRAPHY, MISTERY, OTHERS): "); + String categoryInput = scanner.nextLine().toUpperCase(); + for (Categories c : Categories.values()) { + if (c.name().equals(categoryInput)) { + category = c; + break; + } + } + if (category != null) { + break; + } else { + System.out.println("Invalid category. Please enter a valid category."); + } + } + return category; + } + + public String getUsn(Scanner scanner){ + String usn; + do{ + System.out.print("Enter USN: "); + usn = scanner.nextLine(); + if (!Utils.usnValidator(usn)) { + System.out.println("Invalid USN. Please try again."); + } + } while(!Utils.usnValidator(usn)); + return usn; + } } diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 2c69c9d6..8d7dfe46 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -43,26 +43,13 @@ public void displayMenu() { switch (choice) { case 1: // Add Book - //llamar a getIsbn() do While - System.out.print("Enter isbn: "); - String isbnBook = scanner.nextLine(); - System.out.print("Enter title: "); - String titleBook = scanner.nextLine(); + String isbnBook = libraryService.getIsbn(scanner); + String titleBook = libraryService.getTitle(scanner); System.out.print("Enter category (Available categories: HORROR, SCIENCE, ROMANCE, FICTION, FANTASY, ADVENTURE, BIOGRAPHY, MISTERY, OTHERS"); - String categoryInput = scanner.nextLine().toUpperCase(); - Categories categoryBook; - try { - categoryBook = Categories.valueOf(categoryInput); - } catch (IllegalArgumentException e) { - System.out.println("Invalid category. Please enter a valid category."); - break; - } - System.out.print("Enter Author name: "); - String authorName = scanner.nextLine(); - System.out.print("Enter Author mail: "); - String authorMail = scanner.nextLine(); - System.out.print("Enter number of books: "); - int quantity = scanner.nextInt(); + Categories categoryBook = libraryService.getCategory(scanner); + String authorName = libraryService.getAuthorName(scanner); + String authorMail = libraryService.getAuthorEmail(scanner); + int quantity = libraryService.getQuantity(scanner); Author author; Optional optionalAuthor = libraryService.findAuthorByName(authorName); if (optionalAuthor.isPresent()) { @@ -75,7 +62,7 @@ public void displayMenu() { try { libraryService.addNewBook(newBook); } catch (IllegalArgumentException iae) { - System.out.println("error"); + System.out.println("Something went wrong" + iae.getMessage()); } System.out.println("Book was successfully added to library"); break; @@ -125,12 +112,11 @@ public void displayMenu() { libraryService.printBooks(libraryService.searchAllBooks()); break; case 6: - System.out.print("Enter usn:"); - String usn = scanner.nextLine(); + String usn = libraryService.getUsn(scanner); System.out.print("Enter name:"); String name = scanner.nextLine(); System.out.print("Enter book ISBN:"); - String isbn = scanner.nextLine(); + String isbn = libraryService.getIsbn(scanner); try { //check if student and book exist. Comprobar nombre????? Optional studentOptional = libraryService.findStudentByUsn(usn); @@ -156,8 +142,7 @@ public void displayMenu() { break; case 8: // Search Books By Student - System.out.println("Enter usn:"); - String usnSearch = scanner.nextLine(); + String usnSearch = libraryService.getUsn(scanner); try { Optional studentOptional = libraryService.findStudentByUsn(usnSearch); if (studentOptional.isPresent()) { From 132e4194dfc44ed4da49d1cf91649f5e73f5481e Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 6 Apr 2024 15:37:36 +0200 Subject: [PATCH 70/79] input validations --- .../com/ironhack/service/LibraryService.java | 35 ++++++++++--------- .../java/com/ironhack/viewer/LibraryMenu.java | 9 +++-- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index cd186116..76d3b13a 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -141,54 +141,55 @@ public void printBook(Book book) { } } - public String getIsbn(Scanner scanner){ + public String getIsbn(Scanner scanner) { String isbn; - do{ + do { System.out.print("Enter isbn: "); isbn = scanner.nextLine(); if (!Utils.isbnValidator(isbn)) { System.out.println("Invalid ISBN. Please try again."); } - } while(!Utils.isbnValidator(isbn)); + } while (!Utils.isbnValidator(isbn)); return isbn; } - public String getTitle(Scanner scanner){ + + public String getTitle(Scanner scanner) { String title; - do{ + do { System.out.print("Enter title: "); title = scanner.nextLine(); if (!Utils.stringValidator(title)) { System.out.println("Title can not be empty. Please try again."); } - } while(!Utils.stringValidator(title)); + } while (!Utils.stringValidator(title)); return title; } - public String getAuthorName(Scanner scanner){ + public String getAuthorName(Scanner scanner) { String name; - do{ + do { System.out.print("Enter author name: "); name = scanner.nextLine(); if (!Utils.stringValidator(name)) { System.out.println("Author can not be empty. Please try again."); } - } while(!Utils.stringValidator(name)); + } while (!Utils.stringValidator(name)); return name; } - public String getAuthorEmail(Scanner scanner){ + public String getAuthorEmail(Scanner scanner) { String email; - do{ + do { System.out.print("Enter author email: "); email = scanner.nextLine(); if (!Utils.emailValidator(email)) { System.out.println("Author can not be empty. Please try again."); } - } while(!Utils.emailValidator(email)); + } while (!Utils.emailValidator(email)); return email; } - public int getQuantity(Scanner scanner){ + public int getQuantity(Scanner scanner) { int quantity; do { System.out.print("Enter number of books: "); @@ -207,7 +208,7 @@ public int getQuantity(Scanner scanner){ return quantity; } - public Categories getCategory(Scanner scanner){ + public Categories getCategory(Scanner scanner) { Categories category = null; while (true) { System.out.print("Enter category (Available categories: HORROR, SCIENCE, ROMANCE, FICTION, FANTASY, ADVENTURE, BIOGRAPHY, MISTERY, OTHERS): "); @@ -227,15 +228,15 @@ public Categories getCategory(Scanner scanner){ return category; } - public String getUsn(Scanner scanner){ + public String getUsn(Scanner scanner) { String usn; - do{ + do { System.out.print("Enter USN: "); usn = scanner.nextLine(); if (!Utils.usnValidator(usn)) { System.out.println("Invalid USN. Please try again."); } - } while(!Utils.usnValidator(usn)); + } while (!Utils.usnValidator(usn)); return usn; } } diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 8d7dfe46..b5886dad 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -67,8 +67,8 @@ public void displayMenu() { System.out.println("Book was successfully added to library"); break; case 2: - System.out.print("Enter title to search: "); - String title = scanner.nextLine(); +// System.out.print("Enter title to search: "); + String title = libraryService.getTitle(scanner); Optional requestedBook = libraryService.searchBookByTitle(title); if (requestedBook.isPresent()) { System.out.println(requestedBook.get()); @@ -77,8 +77,8 @@ public void displayMenu() { } break; case 3: - System.out.print("Enter a Category to search: "); - String category = scanner.nextLine(); +// System.out.print("Enter a Category to search: "); + String category = libraryService.getCategory(scanner).name(); try { List books = libraryService.searchBookByCategory(Categories.valueOf(category)); for (Book book : books) { @@ -115,7 +115,6 @@ public void displayMenu() { String usn = libraryService.getUsn(scanner); System.out.print("Enter name:"); String name = scanner.nextLine(); - System.out.print("Enter book ISBN:"); String isbn = libraryService.getIsbn(scanner); try { //check if student and book exist. Comprobar nombre????? From ea7fd55a200eba47996f058fb83a52b2366d83d6 Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 6 Apr 2024 15:57:47 +0200 Subject: [PATCH 71/79] =?UTF-8?q?a=C3=B1adir=20print=20del=20comando=203?= =?UTF-8?q?=20y=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ironhack/service/LibraryService.java | 15 +++++++++++++++ .../java/com/ironhack/viewer/LibraryMenu.java | 18 ++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index 76d3b13a..524fc74e 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -128,6 +128,21 @@ public void printBooks(List books) { } } + public void printBooksByCategoryOrAuthor(List books) { + if (books.isEmpty()) { + System.out.println("No books found."); + } else { + System.out.println("Book ISBN Book Title Category No of Books"); + for (Book book : books) { + System.out.printf("%-20s %-15s %-12s %-15s%n", + book.getIsbn(), + book.getTitle(), + book.getCategory(), + book.getQuantity()); + } + } + } + public void printBook(Book book) { if (book == null) { System.out.println("Book not found."); diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index b5886dad..a323349a 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -81,10 +81,11 @@ public void displayMenu() { String category = libraryService.getCategory(scanner).name(); try { List books = libraryService.searchBookByCategory(Categories.valueOf(category)); - for (Book book : books) { - System.out.println(book.getIsbn()); - System.out.println(book.getTitle()); - } +// for (Book book : books) { +// System.out.println(book.getIsbn()); +// System.out.println(book.getTitle()); +// } + libraryService.printBooksByCategoryOrAuthor(books); } catch (InputMismatchException imm) { System.out.print("Wrong Category "); } @@ -100,10 +101,11 @@ public void displayMenu() { //TODO change to isbn validation int authorid = Integer.parseInt(author_id); List books = libraryService.searchBookByAuthor(authorid); - for (Book book : books) { - System.out.println(book.getIsbn()); - System.out.println(book.getTitle()); - } +// for (Book book : books) { +// System.out.println(book.getIsbn()); +// System.out.println(book.getTitle()); +// } + libraryService.printBooksByCategoryOrAuthor(books); } catch (IllegalArgumentException iae) { System.out.println("Author ID should be numeric"); } From 831980d0cfa89fd1580c24746e8a0d55c02f137a Mon Sep 17 00:00:00 2001 From: Katia Date: Sat, 6 Apr 2024 16:52:48 +0200 Subject: [PATCH 72/79] refactorizar metodo getName y corregir error en usnValidator --- .../com/ironhack/service/LibraryService.java | 24 +++++++++---------- src/main/java/com/ironhack/utils/Utils.java | 2 +- .../java/com/ironhack/viewer/LibraryMenu.java | 17 +++---------- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index 524fc74e..f33f0384 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -180,18 +180,6 @@ public String getTitle(Scanner scanner) { return title; } - public String getAuthorName(Scanner scanner) { - String name; - do { - System.out.print("Enter author name: "); - name = scanner.nextLine(); - if (!Utils.stringValidator(name)) { - System.out.println("Author can not be empty. Please try again."); - } - } while (!Utils.stringValidator(name)); - return name; - } - public String getAuthorEmail(Scanner scanner) { String email; do { @@ -204,6 +192,18 @@ public String getAuthorEmail(Scanner scanner) { return email; } + public String getName(Scanner scanner, String promptMessage, String errorMessage) { + String name; + do { + System.out.print(promptMessage); + name = scanner.nextLine(); + if (!Utils.stringValidator(name)) { + System.out.println(errorMessage); + } + } while (!Utils.stringValidator(name)); + return name; + } + public int getQuantity(Scanner scanner) { int quantity; do { diff --git a/src/main/java/com/ironhack/utils/Utils.java b/src/main/java/com/ironhack/utils/Utils.java index 128ecf2b..3c6749a3 100644 --- a/src/main/java/com/ironhack/utils/Utils.java +++ b/src/main/java/com/ironhack/utils/Utils.java @@ -117,7 +117,7 @@ public static boolean usnValidator(String usn) { if (usn == null) return false; // USN Regex that matches exactly 13 numeric characters - String usnRegex = "^[0-9]{13}$"; + String usnRegex = "^[0-9]{11}$"; Pattern usnPattern = Pattern.compile(usnRegex); Matcher matcher = usnPattern.matcher(usn); diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index a323349a..2acbd659 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -47,7 +47,7 @@ public void displayMenu() { String titleBook = libraryService.getTitle(scanner); System.out.print("Enter category (Available categories: HORROR, SCIENCE, ROMANCE, FICTION, FANTASY, ADVENTURE, BIOGRAPHY, MISTERY, OTHERS"); Categories categoryBook = libraryService.getCategory(scanner); - String authorName = libraryService.getAuthorName(scanner); + String authorName = libraryService.getName(scanner, "Enter author name: ", "Author name can not be empty. Please try again."); String authorMail = libraryService.getAuthorEmail(scanner); int quantity = libraryService.getQuantity(scanner); Author author; @@ -67,7 +67,6 @@ public void displayMenu() { System.out.println("Book was successfully added to library"); break; case 2: -// System.out.print("Enter title to search: "); String title = libraryService.getTitle(scanner); Optional requestedBook = libraryService.searchBookByTitle(title); if (requestedBook.isPresent()) { @@ -77,14 +76,9 @@ public void displayMenu() { } break; case 3: -// System.out.print("Enter a Category to search: "); String category = libraryService.getCategory(scanner).name(); try { List books = libraryService.searchBookByCategory(Categories.valueOf(category)); -// for (Book book : books) { -// System.out.println(book.getIsbn()); -// System.out.println(book.getTitle()); -// } libraryService.printBooksByCategoryOrAuthor(books); } catch (InputMismatchException imm) { System.out.print("Wrong Category "); @@ -101,10 +95,6 @@ public void displayMenu() { //TODO change to isbn validation int authorid = Integer.parseInt(author_id); List books = libraryService.searchBookByAuthor(authorid); -// for (Book book : books) { -// System.out.println(book.getIsbn()); -// System.out.println(book.getTitle()); -// } libraryService.printBooksByCategoryOrAuthor(books); } catch (IllegalArgumentException iae) { System.out.println("Author ID should be numeric"); @@ -115,11 +105,10 @@ public void displayMenu() { break; case 6: String usn = libraryService.getUsn(scanner); - System.out.print("Enter name:"); - String name = scanner.nextLine(); + String name = libraryService.getName(scanner, "Enter student name: ", "Student name can not be empty. Please try again."); String isbn = libraryService.getIsbn(scanner); try { - //check if student and book exist. Comprobar nombre????? + //check if student and book exist. Optional studentOptional = libraryService.findStudentByUsn(usn); Optional bookOptional = libraryService.findBookByIsbn(isbn); if (studentOptional.isPresent() && bookOptional.isPresent()) { From 5767e48c9e90f15a1d34dedc158247eb406900c7 Mon Sep 17 00:00:00 2001 From: Katia Date: Sun, 7 Apr 2024 15:09:19 +0200 Subject: [PATCH 73/79] change mapping from Book to Author to ManyToOne --- src/main/java/com/ironhack/model/Book.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ironhack/model/Book.java b/src/main/java/com/ironhack/model/Book.java index d1e59152..b22a8d64 100644 --- a/src/main/java/com/ironhack/model/Book.java +++ b/src/main/java/com/ironhack/model/Book.java @@ -24,7 +24,7 @@ public class Book implements InputValidator { private int quantity; - @OneToOne(cascade = CascadeType.PERSIST) + @ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "author_id") private Author authorBook; From c27c05a0acafdfa34b5c741767e17ab17bac576b Mon Sep 17 00:00:00 2001 From: Katia Date: Sun, 7 Apr 2024 16:50:07 +0200 Subject: [PATCH 74/79] fix error add book update quantity --- src/main/java/com/ironhack/service/LibraryService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index f33f0384..cbebda34 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -32,8 +32,8 @@ public class LibraryService { public void addNewBook(Book book) { Optional optionalBook = bookRepository.findByIsbn(book.getIsbn()); if (optionalBook.isPresent()) { - book.setQuantity(book.getQuantity() + 1); - bookRepository.save(book); + optionalBook.get().updateQuantity(book.getQuantity()); + bookRepository.save(optionalBook.get()); } else { bookRepository.save(book); } From 79616b02b3ebb4815dc8244e004e4bd54db840bd Mon Sep 17 00:00:00 2001 From: Katia Date: Sun, 7 Apr 2024 18:20:33 +0200 Subject: [PATCH 75/79] refactor input validators: getTitle, getAuthorEmail, getName, getQuantity; add numericValidator to Utils --- .../com/ironhack/service/LibraryService.java | 70 +++++-------------- src/main/java/com/ironhack/utils/Utils.java | 33 ++++++--- .../java/com/ironhack/viewer/LibraryMenu.java | 24 +++---- 3 files changed, 49 insertions(+), 78 deletions(-) diff --git a/src/main/java/com/ironhack/service/LibraryService.java b/src/main/java/com/ironhack/service/LibraryService.java index cbebda34..65959bfa 100644 --- a/src/main/java/com/ironhack/service/LibraryService.java +++ b/src/main/java/com/ironhack/service/LibraryService.java @@ -143,19 +143,6 @@ public void printBooksByCategoryOrAuthor(List books) { } } - public void printBook(Book book) { - if (book == null) { - System.out.println("Book not found."); - } else { - System.out.println("Book ISBN Book Title Category No of Books"); - System.out.printf("%-20s %-15s %-12s %-15s %-20s %s%n", - book.getIsbn(), - book.getTitle(), - book.getCategory(), - book.getQuantity()); - } - } - public String getIsbn(Scanner scanner) { String isbn; do { @@ -168,59 +155,28 @@ public String getIsbn(Scanner scanner) { return isbn; } - public String getTitle(Scanner scanner) { - String title; - do { - System.out.print("Enter title: "); - title = scanner.nextLine(); - if (!Utils.stringValidator(title)) { - System.out.println("Title can not be empty. Please try again."); - } - } while (!Utils.stringValidator(title)); - return title; - } - public String getAuthorEmail(Scanner scanner) { String email; do { System.out.print("Enter author email: "); email = scanner.nextLine(); if (!Utils.emailValidator(email)) { - System.out.println("Author can not be empty. Please try again."); + System.out.println("Invalid author email. Please try again."); } } while (!Utils.emailValidator(email)); return email; } - public String getName(Scanner scanner, String promptMessage, String errorMessage) { - String name; + public String getString(Scanner scanner, String promptMessage, String errorMessage) { + String input; do { System.out.print(promptMessage); - name = scanner.nextLine(); - if (!Utils.stringValidator(name)) { + input = scanner.nextLine(); + if (!Utils.stringValidator(input)) { System.out.println(errorMessage); } - } while (!Utils.stringValidator(name)); - return name; - } - - public int getQuantity(Scanner scanner) { - int quantity; - do { - System.out.print("Enter number of books: "); - if (scanner.hasNextInt()) { - quantity = scanner.nextInt(); - if (quantity >= 0) { - break; - } else { - System.out.println("Number of books can't be negative. Please try again."); - } - } else { - System.out.println("Invalid input. Please enter a numeric value."); - scanner.next(); // Consume invalid input - } - } while (true); - return quantity; + } while (!Utils.stringValidator(input)); + return input; } public Categories getCategory(Scanner scanner) { @@ -254,4 +210,16 @@ public String getUsn(Scanner scanner) { } while (!Utils.usnValidator(usn)); return usn; } + + public int getNumber(Scanner scanner, String promptMessage, String errorMessage) { + String input; + do { + System.out.print(promptMessage); + input = scanner.nextLine(); + if (!Utils.numericValidator(input)) { + System.out.println(errorMessage); + } + } while (!Utils.numericValidator(input)); + return Integer.parseInt(input); + } } diff --git a/src/main/java/com/ironhack/utils/Utils.java b/src/main/java/com/ironhack/utils/Utils.java index 3c6749a3..cfa0e0e0 100644 --- a/src/main/java/com/ironhack/utils/Utils.java +++ b/src/main/java/com/ironhack/utils/Utils.java @@ -36,6 +36,7 @@ public static boolean emailValidator(String email) { * Note: * - ISBN-10 is a 10-digit number with or without optional hyphens and might end with an 'X' representing 10. * - ISBN-13 is a 13-digit number, prefixed by '978' or '979', with or without optional hyphens. + * * @param isbn the ISBN string to validate. * @return true if the isbn is valid according to ISBN-10 or ISBN-13 standards, false otherwise. */ @@ -85,9 +86,9 @@ public static boolean validateDateFormat(String date) { * Assumes both dates have been validated and are in the correct format. * * @param startDate the start date in "dd/MM/yyyy" format. - * @param endDate the end date in "dd/MM/yyyy" format. + * @param endDate the end date in "dd/MM/yyyy" format. * @return an Optional containing the difference in days between the start and end dates, - * or an empty Optional if either date is in an invalid format. + * or an empty Optional if either date is in an invalid format. */ public static Optional dateDifferenceCalculator(String startDate, String endDate) { if (!validateDateFormat(startDate) || !validateDateFormat(endDate)) { @@ -103,15 +104,12 @@ public static Optional dateDifferenceCalculator(String startDate, String e } - - - - /** - * Generates a unique identifier, for example, for use with entities that don't have an auto-generated ID. - */ - public static String uniqueIdGenerator() { - return UUID.randomUUID().toString(); - } + /** + * Generates a unique identifier, for example, for use with entities that don't have an auto-generated ID. + */ + public static String uniqueIdGenerator() { + return UUID.randomUUID().toString(); + } public static boolean usnValidator(String usn) { if (usn == null) return false; @@ -125,4 +123,17 @@ public static boolean usnValidator(String usn) { // Matches USN against the regex pattern return matcher.matches(); } + + public static boolean numericValidator(String input) { + if (input == null) return false; + + // Numeric Regex that matches integer numbers + String numericRegex = "^[1-9]+$"; + + Pattern numericPattern = Pattern.compile(numericRegex); + Matcher matcher = numericPattern.matcher(input); + + // Matches input against the regex pattern + return matcher.matches(); + } } diff --git a/src/main/java/com/ironhack/viewer/LibraryMenu.java b/src/main/java/com/ironhack/viewer/LibraryMenu.java index 2acbd659..f3d266ae 100644 --- a/src/main/java/com/ironhack/viewer/LibraryMenu.java +++ b/src/main/java/com/ironhack/viewer/LibraryMenu.java @@ -44,12 +44,11 @@ public void displayMenu() { case 1: // Add Book String isbnBook = libraryService.getIsbn(scanner); - String titleBook = libraryService.getTitle(scanner); - System.out.print("Enter category (Available categories: HORROR, SCIENCE, ROMANCE, FICTION, FANTASY, ADVENTURE, BIOGRAPHY, MISTERY, OTHERS"); + String titleBook = libraryService.getString(scanner, "Enter title: ", "Title can not be empty. Please try again."); Categories categoryBook = libraryService.getCategory(scanner); - String authorName = libraryService.getName(scanner, "Enter author name: ", "Author name can not be empty. Please try again."); + String authorName = libraryService.getString(scanner, "Enter author name: ", "Author name can not be empty. Please try again."); String authorMail = libraryService.getAuthorEmail(scanner); - int quantity = libraryService.getQuantity(scanner); + int quantity = libraryService.getNumber(scanner, "Enter number of books: ", "Invalid input. Please enter a positive quantity."); Author author; Optional optionalAuthor = libraryService.findAuthorByName(authorName); if (optionalAuthor.isPresent()) { @@ -67,7 +66,7 @@ public void displayMenu() { System.out.println("Book was successfully added to library"); break; case 2: - String title = libraryService.getTitle(scanner); + String title = libraryService.getString(scanner, "Enter title: ", "Title can not be empty. Please try again."); Optional requestedBook = libraryService.searchBookByTitle(title); if (requestedBook.isPresent()) { System.out.println(requestedBook.get()); @@ -89,23 +88,16 @@ public void displayMenu() { break; case 4: - System.out.print("Enter an Author ID:"); - String author_id = scanner.nextLine(); - try { - //TODO change to isbn validation - int authorid = Integer.parseInt(author_id); - List books = libraryService.searchBookByAuthor(authorid); - libraryService.printBooksByCategoryOrAuthor(books); - } catch (IllegalArgumentException iae) { - System.out.println("Author ID should be numeric"); - } + int author_id = libraryService.getNumber(scanner, "Enter Author ID: ", "Invalid input. Please enter a positive numeric value."); + List books = libraryService.searchBookByAuthor(author_id); + libraryService.printBooksByCategoryOrAuthor(books); break; case 5: libraryService.printBooks(libraryService.searchAllBooks()); break; case 6: String usn = libraryService.getUsn(scanner); - String name = libraryService.getName(scanner, "Enter student name: ", "Student name can not be empty. Please try again."); + String name = libraryService.getString(scanner, "Enter student name: ", "Student name can not be empty. Please try again."); String isbn = libraryService.getIsbn(scanner); try { //check if student and book exist. From 720f6cb919e2a8017249a0fca30f2457c7d793e8 Mon Sep 17 00:00:00 2001 From: Katia Date: Sun, 7 Apr 2024 18:39:21 +0200 Subject: [PATCH 76/79] fix mistake in regex ooops! --- src/main/java/com/ironhack/utils/Utils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ironhack/utils/Utils.java b/src/main/java/com/ironhack/utils/Utils.java index cfa0e0e0..7c006fa4 100644 --- a/src/main/java/com/ironhack/utils/Utils.java +++ b/src/main/java/com/ironhack/utils/Utils.java @@ -128,7 +128,7 @@ public static boolean numericValidator(String input) { if (input == null) return false; // Numeric Regex that matches integer numbers - String numericRegex = "^[1-9]+$"; + String numericRegex = "^[1-9]\\d*$"; Pattern numericPattern = Pattern.compile(numericRegex); Matcher matcher = numericPattern.matcher(input); From b5c4506b417ddd79c65cb2a1c4fc856c1ddb1a97 Mon Sep 17 00:00:00 2001 From: Katia Date: Mon, 8 Apr 2024 22:42:16 +0200 Subject: [PATCH 77/79] add LibraryServiceTest and 2 tests to UtilsTest --- .../ironhack/service/LibraryServiceTest.java | 160 ++++++++++++++++++ .../java/com/ironhack/utils/UtilsTest.java | 18 ++ 2 files changed, 178 insertions(+) create mode 100644 src/test/java/com/ironhack/service/LibraryServiceTest.java diff --git a/src/test/java/com/ironhack/service/LibraryServiceTest.java b/src/test/java/com/ironhack/service/LibraryServiceTest.java new file mode 100644 index 00000000..cf90ba4e --- /dev/null +++ b/src/test/java/com/ironhack/service/LibraryServiceTest.java @@ -0,0 +1,160 @@ +package com.ironhack.service; + +import com.ironhack.model.*; +import com.ironhack.repository.AuthorRepository; +import com.ironhack.repository.BookRepository; +import com.ironhack.repository.IssueRepository; +import com.ironhack.repository.StudentRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.LocalDate; +import java.util.List; +import static org.junit.jupiter.api.Assertions.*; +import java.util.Optional; + +@SpringBootTest +class LibraryServiceTest { + + @Autowired + private LibraryService libraryService; + + @Autowired + private BookRepository bookRepository; + + @Autowired + private AuthorRepository authorRepository; + + @Autowired + private IssueRepository issueRepository; + + @Autowired + private StudentRepository studentRepository; + Author author1; + Author author2; + Book book1; + Book book2; + Student student1; + Student student2; + private Issue issue1; + private Issue issue2; + + @BeforeEach + void setUp() { + author1 = new Author("Corey Schafer","corey@mail.com"); + author2 = new Author("Antonio Gámez","antonio@mail.com"); + book1 = new Book("978-1-123456-12-7","Java is awesome", Categories.HORROR,8,author1); + book2 = new Book("978-1-123456-12-6","SLA Driven Governance of RESTful systems", Categories.SCIENCE,5,author2); + authorRepository.saveAll(List.of(author1, author2)); + bookRepository.saveAll(List.of(book1, book2)); + student1 = new Student("12345678901", "Mosh"); + student2 = new Student("12345678902", "John"); + studentRepository.saveAll(List.of(student1, student2)); + issue1 = new Issue(LocalDate.now().toString(), LocalDate.now().plusMonths(1).toString()); + issue1.setIssueBook(book1); + issue1.setIssueStudent(student1); + + issue2 = new Issue(LocalDate.now().toString(), LocalDate.now().plusMonths(1).toString()); + issue2.setIssueBook(book2); + issue2.setIssueStudent(student2); + + issueRepository.saveAll(List.of(issue1, issue2)); + } + @AfterEach + void tearDown() { + issueRepository.deleteAll(); + bookRepository.deleteAll(); + studentRepository.deleteAll(); + authorRepository.deleteAll(); + } + + @Test + void addNewBook() { + libraryService.addNewBook(book1); + Optional optionalBook = bookRepository.findByIsbn(book1.getIsbn()); + assertTrue(optionalBook.isPresent()); + assertEquals(book1.getIsbn(), optionalBook.get().getIsbn()); + } + + @Test + void searchBookByTitle() { + Optional optionalBook = libraryService.searchBookByTitle("Java is awesome"); + + assertTrue(optionalBook.isPresent()); + assertEquals("Java is awesome", optionalBook.get().getTitle()); + } + + @Test + void searchBookByCategory() { + // Use the searchBookByCategory method to retrieve the books + List books = libraryService.searchBookByCategory(Categories.HORROR); + + // Assert that the books returned by the method are the same as the books you saved + assertEquals(1, books.size()); + assertTrue(books.contains(book1)); + } + + @Test + void searchBookByAuthor() { + // Use the searchBookByAuthor method to retrieve the books + List booksByAuthor1 = libraryService.searchBookByAuthor(author1.getAuthorId()); + List booksByAuthor2 = libraryService.searchBookByAuthor(author2.getAuthorId()); + + // Assert that the books returned by the method are the same as the books you saved + assertEquals(1, booksByAuthor1.size()); + assertTrue(booksByAuthor1.contains(book1)); + + assertEquals(1, booksByAuthor2.size()); + assertTrue(booksByAuthor2.contains(book2)); + } + + @Test + void searchBooksByStudentStringTest() { + List foundIssues = libraryService.searchBooksByStudentString(student1.getUsn()); + + // Verify the correct book issues are retrieved + assertNotNull(foundIssues, "The returned list of issues should not be null"); + assertEquals(1, foundIssues.size(), "Expected one issue to be found for student1"); + + // Use getters in Issue for issueBook + assertEquals(book1.getIsbn(), foundIssues.get(0).getIssueBook().getIsbn(), + "The ISBN of the book in the found issue should match book1's ISBN"); + } + + @Test + void isBookIssuedTest(){ + Author author3 = new Author("original author", "newemail@mail.com"); + authorRepository.save(author3); + Book bookZeroQuantity = new Book("123-5-567890-00-0", "No books lefts", Categories.ADVENTURE, 0, author3); + bookRepository.save(bookZeroQuantity); + assertTrue(libraryService.isBookIssued(bookZeroQuantity.getIsbn())); + assertFalse(libraryService.isBookIssued(book1.getIsbn())); + } + + @Test + void issueBookTestValid(){ + Author author4 = new Author("another author", "newermail@mail.com"); + authorRepository.save(author4); + Book bookToIssue = new Book("123-5-567890-12-3", "Book to issue", Categories.ADVENTURE, 5, author4); + bookRepository.save(bookToIssue); + String returnDate = libraryService.issueBook("12345678901", "Book to issue", "123-5-567890-12-3"); + List results = libraryService.findIssueByIsbn("978-1-123456-12-7"); + assertNotNull(results); + assertEquals("Java is awesome", results.getFirst().getIssueBook().getTitle()); + assertEquals("12345678901", results.getFirst().getIssueStudent().getUsn()); + assertNotNull(returnDate); + } + + @Test + void issueBookTest_OutOfStock(){ + Author author5 = new Author("nuevo", "email@mail.com"); + authorRepository.save(author5); + Book outOfStockBook = new Book("978-1-123456-10-5","Libro agotado2", Categories.FANTASY,0,author5); + bookRepository.save(outOfStockBook); + String returnDate = libraryService.issueBook("12345678901", "Libro agotado2", "978-1-123456-10-5"); + assertNull(returnDate); + } +} \ No newline at end of file diff --git a/src/test/java/com/ironhack/utils/UtilsTest.java b/src/test/java/com/ironhack/utils/UtilsTest.java index 75112f8b..58514e5c 100644 --- a/src/test/java/com/ironhack/utils/UtilsTest.java +++ b/src/test/java/com/ironhack/utils/UtilsTest.java @@ -76,4 +76,22 @@ void testUniqueIdGenerator() { String uniqueId2 = Utils.uniqueIdGenerator(); Assertions.assertNotEquals(uniqueId1, uniqueId2); } + + @Test + void usnValidator(){ + assertTrue(Utils.usnValidator("12345678901")); + assertTrue(Utils.usnValidator("98765432101")); + assertFalse(Utils.usnValidator("123")); + assertFalse(Utils.usnValidator(null)); + } + + @Test + void numericValidator(){ + assertTrue(Utils.numericValidator("123")); + assertTrue(Utils.numericValidator("54")); + assertFalse(Utils.numericValidator("0")); + assertFalse(Utils.numericValidator(null)); + assertFalse(Utils.numericValidator("-2")); + assertFalse(Utils.numericValidator("2.5")); + } } From 2914b64fd68ef03b6ae48aa5cc7d089b690ff6c1 Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 9 Apr 2024 19:56:48 +0200 Subject: [PATCH 78/79] add 3 new tests by Darren --- .../ironhack/service/LibraryServiceTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/test/java/com/ironhack/service/LibraryServiceTest.java b/src/test/java/com/ironhack/service/LibraryServiceTest.java index cf90ba4e..0ebc798b 100644 --- a/src/test/java/com/ironhack/service/LibraryServiceTest.java +++ b/src/test/java/com/ironhack/service/LibraryServiceTest.java @@ -157,4 +157,46 @@ void issueBookTest_OutOfStock(){ String returnDate = libraryService.issueBook("12345678901", "Libro agotado2", "978-1-123456-10-5"); assertNull(returnDate); } + + @Test + void testFindBookByIsbn() { + // Use the findBookByIsbn method to retrieve the book + Optional optionalBook1 = libraryService.findBookByIsbn(book1.getIsbn()); + Optional optionalBook2 = libraryService.findBookByIsbn(book2.getIsbn()); + + // Assert that the book returned by the method is the same as the book you saved + assertTrue(optionalBook1.isPresent()); + assertEquals(book1.getIsbn(), optionalBook1.get().getIsbn()); + + assertTrue(optionalBook2.isPresent()); + assertEquals(book2.getIsbn(), optionalBook2.get().getIsbn()); + } + + @Test + void testFindStudentByUsn() { + // Use the findStudentByUsn method to retrieve the students + Optional optionalStudent1 = libraryService.findStudentByUsn(student1.getUsn()); + Optional optionalStudent2 = libraryService.findStudentByUsn(student2.getUsn()); + + // Assert that the student returned by the method is the same as the student you saved + assertTrue(optionalStudent1.isPresent()); + assertEquals(student1.getUsn(), optionalStudent1.get().getUsn()); + + assertTrue(optionalStudent2.isPresent()); + assertEquals(student2.getUsn(), optionalStudent2.get().getUsn()); + } + + @Test + void testFindAuthorByName() { + // Use the findAuthorByName method to retrieve the authors + Optional optionalAuthor1 = libraryService.findAuthorByName(author1.getName()); + Optional optionalAuthor2 = libraryService.findAuthorByName(author2.getName()); + + // Assert that the author returned by the method is the same as the author you saved + assertTrue(optionalAuthor1.isPresent()); + assertEquals(author1.getName(), optionalAuthor1.get().getName()); + + assertTrue(optionalAuthor2.isPresent()); + assertEquals(author2.getName(), optionalAuthor2.get().getName()); + } } \ No newline at end of file From 25be7dc8b845beb14116577c444b130c28932de3 Mon Sep 17 00:00:00 2001 From: Katia Date: Tue, 9 Apr 2024 20:48:15 +0200 Subject: [PATCH 79/79] refactor test, delete inputValidator --- src/main/java/com/ironhack/model/Author.java | 10 +--- src/main/java/com/ironhack/model/Book.java | 9 +-- .../com/ironhack/model/InputValidator.java | 5 -- src/main/java/com/ironhack/model/Issue.java | 9 +-- src/main/java/com/ironhack/model/Student.java | 8 +-- .../ironhack/repository/IssueRepository.java | 1 - .../repository/AuthorRepositoryTest.java | 27 ++++----- .../repository/BookRepositoryTest.java | 45 +++++++-------- .../repository/IssueRepositoryTest.java | 56 +++++++++---------- .../repository/StudentRepositoryTest.java | 11 +--- 10 files changed, 69 insertions(+), 112 deletions(-) delete mode 100644 src/main/java/com/ironhack/model/InputValidator.java diff --git a/src/main/java/com/ironhack/model/Author.java b/src/main/java/com/ironhack/model/Author.java index 5fc698e1..ad890128 100644 --- a/src/main/java/com/ironhack/model/Author.java +++ b/src/main/java/com/ironhack/model/Author.java @@ -12,7 +12,7 @@ @NoArgsConstructor @Entity @Table(name = "author") -public class Author implements InputValidator { +public class Author { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int authorId; @@ -24,18 +24,12 @@ public Author(String name, String email) { setEmail(email); } - - @Override - public boolean input_validation() { - return false; - } - @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Author author = (Author) o; - return authorId == author.authorId && Objects.equals(name, author.name) && email == author.email; + return authorId == author.authorId && Objects.equals(name, author.name) && Objects.equals(email, author.email); } @Override diff --git a/src/main/java/com/ironhack/model/Book.java b/src/main/java/com/ironhack/model/Book.java index b22a8d64..d3e27ce0 100644 --- a/src/main/java/com/ironhack/model/Book.java +++ b/src/main/java/com/ironhack/model/Book.java @@ -12,7 +12,7 @@ @NoArgsConstructor @Entity @Table(name = "book") -public class Book implements InputValidator { +public class Book { @Id @Column(name = "isbn") private String isbn; @@ -36,13 +36,6 @@ public Book(String isbn, String title, Categories category, int quantity, Author this.authorBook = author; } - - @Override - public boolean input_validation() { - return false; - } - - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/ironhack/model/InputValidator.java b/src/main/java/com/ironhack/model/InputValidator.java deleted file mode 100644 index f0cdfef9..00000000 --- a/src/main/java/com/ironhack/model/InputValidator.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.ironhack.model; - -public interface InputValidator { - boolean input_validation(); -} diff --git a/src/main/java/com/ironhack/model/Issue.java b/src/main/java/com/ironhack/model/Issue.java index 1d2d522f..6381f4be 100644 --- a/src/main/java/com/ironhack/model/Issue.java +++ b/src/main/java/com/ironhack/model/Issue.java @@ -8,7 +8,7 @@ @Getter @Setter @NoArgsConstructor // Generates a no-args constructor for JPA -public class Issue implements InputValidator { +public class Issue { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int issueId; @@ -25,13 +25,6 @@ public Issue(String issueDate, String returnDate) { this.issueDate = issueDate; this.returnDate = returnDate; } - - @Override - public boolean input_validation() { - // Implement validation logic here - // Return true if validation passes, false otherwise - return true; - } } diff --git a/src/main/java/com/ironhack/model/Student.java b/src/main/java/com/ironhack/model/Student.java index ae857eb2..1eba5f47 100644 --- a/src/main/java/com/ironhack/model/Student.java +++ b/src/main/java/com/ironhack/model/Student.java @@ -3,7 +3,6 @@ import jakarta.persistence.*; import lombok.Data; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; import java.util.ArrayList; @@ -15,7 +14,7 @@ @Entity @Table(name = "student") @Data -public class Student implements InputValidator { +public class Student { @Id private String usn; private String name; @@ -53,9 +52,4 @@ public int hashCode() { return Objects.hash(usn, name); } - @Override - public boolean input_validation() { - //añadir logica de validacion name - return false; - } } diff --git a/src/main/java/com/ironhack/repository/IssueRepository.java b/src/main/java/com/ironhack/repository/IssueRepository.java index 9324256a..afab4859 100644 --- a/src/main/java/com/ironhack/repository/IssueRepository.java +++ b/src/main/java/com/ironhack/repository/IssueRepository.java @@ -6,7 +6,6 @@ import org.springframework.stereotype.Repository; import java.util.List; -import java.util.Optional; @Repository public interface IssueRepository extends JpaRepository { diff --git a/src/test/java/com/ironhack/repository/AuthorRepositoryTest.java b/src/test/java/com/ironhack/repository/AuthorRepositoryTest.java index 455f03d3..3bd92311 100644 --- a/src/test/java/com/ironhack/repository/AuthorRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/AuthorRepositoryTest.java @@ -1,15 +1,15 @@ package com.ironhack.repository; import com.ironhack.model.Author; -import com.ironhack.model.Book; -import com.ironhack.model.Categories; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest @@ -17,26 +17,21 @@ class AuthorRepositoryTest { @Autowired private AuthorRepository authorRepository; - Author author; - Book book; - - @BeforeEach - void setUp() { - author = new Author("Xavi","xavi@mail.com"); - authorRepository.save(author); - } @AfterEach void tearDown() { authorRepository.deleteAll(); } + @Test + public void findAuthorByIdTest() { + author = new Author("Xavi", "xavi@mail.com"); + authorRepository.save(author); -/* @Test - public void createAuthor(){ Optional authorFound = authorRepository.findById(author.getAuthorId()); + assertTrue(authorFound.isPresent()); - assertEquals(author.getAuthorId(),authorFound.get().getAuthorId()); - }*/ + assertEquals(author.getAuthorId(), authorFound.get().getAuthorId()); + } } \ No newline at end of file diff --git a/src/test/java/com/ironhack/repository/BookRepositoryTest.java b/src/test/java/com/ironhack/repository/BookRepositoryTest.java index 49e04bf4..5c7601ac 100644 --- a/src/test/java/com/ironhack/repository/BookRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/BookRepositoryTest.java @@ -9,7 +9,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.Optional; + import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest public class BookRepositoryTest { @@ -24,36 +27,34 @@ public class BookRepositoryTest { @BeforeEach void setUp() { - author = new Author("Xavi","xavi@mail.com"); - sample_book = new Book("1234","my awesome book", Categories.ADVENTURE,3,author); + author = new Author("Xavi", "xavi@mail.com"); + sample_book = new Book("1234", "my awesome book", Categories.ADVENTURE, 3, author); authorRepository.save(author); bookRepository.save(sample_book); - - } @AfterEach void tearDown() { bookRepository.deleteAll(); } -// @Test -// public void bookCreationTest(){ -// Optional db_book=bookRepository.findBookByTitle("my awesome book"); -// assertTrue(db_book.isPresent()); -// assertEquals(sample_book,db_book.get()); -// } -@Test -void findAllBooksWithAuthor() { - Author author1 = new Author("JK Rowling", "jkrowling@mail.com"); - Author author2 = new Author("George Orwell", "georgeorwell@mail.com"); - authorRepository.save(author1); - authorRepository.save(author2); - Book book1 = new Book("978-3-16-148410-0", "Harry Potter", Categories.FANTASY, 1, author1); - Book book2 = new Book("978-3-16-148434-0", "1984", Categories.FICTION, 2, author2); - bookRepository.save(book1); - bookRepository.save(book2); - assertEquals(author1, book1.getAuthorBook()); -} + @Test + public void findBookByTitleTest() { + Optional db_book = bookRepository.findBookByTitle("my awesome book"); + assertTrue(db_book.isPresent()); + assertEquals(sample_book, db_book.get()); + } + @Test + void findAllBooksWithAuthor() { + Author author1 = new Author("JK Rowling", "jkrowling@mail.com"); + Author author2 = new Author("George Orwell", "georgeorwell@mail.com"); + authorRepository.save(author1); + authorRepository.save(author2); + Book book1 = new Book("978-3-16-148410-0", "Harry Potter", Categories.FANTASY, 1, author1); + Book book2 = new Book("978-3-16-148434-0", "1984", Categories.FICTION, 2, author2); + bookRepository.save(book1); + bookRepository.save(book2); + assertEquals(author1, book1.getAuthorBook()); + } } diff --git a/src/test/java/com/ironhack/repository/IssueRepositoryTest.java b/src/test/java/com/ironhack/repository/IssueRepositoryTest.java index e8778688..fe434a50 100644 --- a/src/test/java/com/ironhack/repository/IssueRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/IssueRepositoryTest.java @@ -1,43 +1,43 @@ package com.ironhack.repository; -import com.ironhack.repository.IssueRepository; +import com.ironhack.model.Issue; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; -@DataJpaTest +@SpringBootTest public class IssueRepositoryTest { @Autowired private IssueRepository issueRepository; -// @Test -// void testIssueCreationAndRetrieval() { -// // Create and save an Issue -// Issue savedIssue = issueRepository.save(new Issue("2023-01-01", "2023-01-10")); -// -// // Retrieve the saved Issue by ID -// Optional retrievedIssue = issueRepository.findById(savedIssue.getIssueId()); -// -// // Verify the retrieval -// assertTrue(retrievedIssue.isPresent(), "Issue should be found by ID"); -// assertEquals("2023-01-01", retrievedIssue.get().getIssueDate(), "Issue dates should match"); -// } -// -// @Test -// void testFindByIssueId() { -// // Create and save an Issue -// Issue savedIssue = issueRepository.save(new Issue("2023-02-01", "2023-02-10")); -// -// // Use the custom findByIssueId method -// Issue foundIssue = issueRepository.findByIssueId(savedIssue.getIssueId()); -// -// // Verify the result -// assertNotNull(foundIssue, "Issue should be found with custom query"); -// assertEquals("2023-02-01", foundIssue.getIssueDate(), "Issue dates should match in custom query"); -// } + @Test + void testIssueCreationAndRetrieval() { + // Create and save an Issue + Issue savedIssue = issueRepository.save(new Issue("2023-01-01", "2023-01-10")); + + // Retrieve the saved Issue by ID + Optional retrievedIssue = issueRepository.findById(savedIssue.getIssueId()); + + // Verify the retrieval + assertTrue(retrievedIssue.isPresent(), "Issue should be found by ID"); + assertEquals("2023-01-01", retrievedIssue.get().getIssueDate(), "Issue dates should match"); + } + + @Test + void testFindByIssueId() { + // Create and save an Issue + Issue savedIssue = issueRepository.save(new Issue("2023-02-01", "2023-02-10")); + + // Use the custom findByIssueId method + Issue foundIssue = issueRepository.findByIssueId(savedIssue.getIssueId()); + + // Verify the result + assertNotNull(foundIssue, "Issue should be found with custom query"); + assertEquals("2023-02-01", foundIssue.getIssueDate(), "Issue dates should match in custom query"); + } } diff --git a/src/test/java/com/ironhack/repository/StudentRepositoryTest.java b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java index c461625e..2e556d37 100644 --- a/src/test/java/com/ironhack/repository/StudentRepositoryTest.java +++ b/src/test/java/com/ironhack/repository/StudentRepositoryTest.java @@ -9,7 +9,6 @@ import org.springframework.boot.test.context.SpringBootTest; import java.util.List; -import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; @@ -70,14 +69,8 @@ void searchBooksByStudentString() { assertNotNull(results); assertEquals(2, results.size()); - assertEquals("Harry Potter", results.get(0).getIssueBook().getTitle()); - assertEquals("2022-08-07 17:09:38", results.get(0).getReturnDate()); + assertEquals("Harry Potter", results.getFirst().getIssueBook().getTitle()); + assertEquals("2022-08-07 17:09:38", results.getFirst().getReturnDate()); } -// @Test -// void findByName() { -// Optional student = studentRepository.findByName("Juan"); -// assertTrue(student.isPresent()); -// assertEquals("Juan", student.get().getName()); -// } } \ No newline at end of file