From d2477ea667f37658b9f1f06dbca827e26be345de Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Tue, 22 Apr 2025 15:29:14 +0200 Subject: [PATCH 01/38] commit inicial --- .idea/.gitignore | 3 + .idea/homework-java-ironlibrary.iml | 9 + .idea/misc.xml | 13 + .idea/modules.xml | 9 + .idea/vcs.xml | 6 + IronLibrary.iml | 9 + IronLibrary/.gitattributes | 2 + IronLibrary/.gitignore | 33 +++ .../.mvn/wrapper/maven-wrapper.properties | 19 ++ IronLibrary/mvnw | 259 ++++++++++++++++++ IronLibrary/mvnw.cmd | 149 ++++++++++ IronLibrary/pom.xml | 63 +++++ .../demo/IronLibraryApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../demo/IronLibraryApplicationTests.java | 13 + 15 files changed, 601 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/homework-java-ironlibrary.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 IronLibrary.iml create mode 100644 IronLibrary/.gitattributes create mode 100644 IronLibrary/.gitignore create mode 100644 IronLibrary/.mvn/wrapper/maven-wrapper.properties create mode 100644 IronLibrary/mvnw create mode 100644 IronLibrary/mvnw.cmd create mode 100644 IronLibrary/pom.xml create mode 100644 IronLibrary/src/main/java/IronLibrary/demo/IronLibraryApplication.java create mode 100644 IronLibrary/src/main/resources/application.properties create mode 100644 IronLibrary/src/test/java/IronLibrary/demo/IronLibraryApplicationTests.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml 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/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..74eef623 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..2258534e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ 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.iml b/IronLibrary.iml new file mode 100644 index 00000000..beb7bded --- /dev/null +++ b/IronLibrary.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/IronLibrary/.gitattributes b/IronLibrary/.gitattributes new file mode 100644 index 00000000..3b41682a --- /dev/null +++ b/IronLibrary/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/IronLibrary/.gitignore b/IronLibrary/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/IronLibrary/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/IronLibrary/.mvn/wrapper/maven-wrapper.properties b/IronLibrary/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..d58dfb70 --- /dev/null +++ b/IronLibrary/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/IronLibrary/mvnw b/IronLibrary/mvnw new file mode 100644 index 00000000..19529ddf --- /dev/null +++ b/IronLibrary/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/IronLibrary/mvnw.cmd b/IronLibrary/mvnw.cmd new file mode 100644 index 00000000..249bdf38 --- /dev/null +++ b/IronLibrary/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/IronLibrary/pom.xml b/IronLibrary/pom.xml new file mode 100644 index 00000000..f558215b --- /dev/null +++ b/IronLibrary/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.4 + + + IronLibrary + demo + 0.0.1-SNAPSHOT + IronLibrary + Demo project for Spring Boot + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + com.mysql + mysql-connector-j + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/IronLibrary/src/main/java/IronLibrary/demo/IronLibraryApplication.java b/IronLibrary/src/main/java/IronLibrary/demo/IronLibraryApplication.java new file mode 100644 index 00000000..f44d3760 --- /dev/null +++ b/IronLibrary/src/main/java/IronLibrary/demo/IronLibraryApplication.java @@ -0,0 +1,13 @@ +package IronLibrary.demo; + +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/resources/application.properties b/IronLibrary/src/main/resources/application.properties new file mode 100644 index 00000000..9361c15e --- /dev/null +++ b/IronLibrary/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=IronLibrary diff --git a/IronLibrary/src/test/java/IronLibrary/demo/IronLibraryApplicationTests.java b/IronLibrary/src/test/java/IronLibrary/demo/IronLibraryApplicationTests.java new file mode 100644 index 00000000..6a506a3e --- /dev/null +++ b/IronLibrary/src/test/java/IronLibrary/demo/IronLibraryApplicationTests.java @@ -0,0 +1,13 @@ +package IronLibrary.demo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class IronLibraryApplicationTests { + + @Test + void contextLoads() { + } + +} From 6cbd7360dcb878dd9bb09c90469a09f0db06df8e Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Tue, 22 Apr 2025 15:40:56 +0200 Subject: [PATCH 02/38] gitignore --- IronLibrary/.gitignore => .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename IronLibrary/.gitignore => .gitignore (95%) diff --git a/IronLibrary/.gitignore b/.gitignore similarity index 95% rename from IronLibrary/.gitignore rename to .gitignore index 549e00a2..c970a953 100644 --- a/IronLibrary/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -HELP.md +IronLibrary/HELP.md target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ From 63c53c1a6b5902dd914d763d4639fe432a2cb461 Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Wed, 23 Apr 2025 12:16:43 +0200 Subject: [PATCH 03/38] application properties ex --- .gitignore | 2 ++ .idea/misc.xml | 1 + .idea/modules.xml | 1 - IronLibrary.iml | 9 --------- IronLibrary/src/main/resources/application.properties | 1 - .../src/main/resources/application.properties.example | 8 ++++++++ 6 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 IronLibrary.iml delete mode 100644 IronLibrary/src/main/resources/application.properties create mode 100644 IronLibrary/src/main/resources/application.properties.example diff --git a/.gitignore b/.gitignore index c970a953..d285297e 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ build/ ### VS Code ### .vscode/ +.application.properties + diff --git a/.idea/misc.xml b/.idea/misc.xml index 74eef623..7dc60031 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,6 @@ + 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/src/main/java/IronLibrary/demo/models/Author.java b/src/main/java/IronLibrary/demo/models/Author.java new file mode 100644 index 00000000..051c24a5 --- /dev/null +++ b/src/main/java/IronLibrary/demo/models/Author.java @@ -0,0 +1,58 @@ +package IronLibrary.demo.models; + +import jakarta.persistence.*; + +@Entity +@Table(name = "Author") + +public class Author { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "author_id") + private int authorId; + + private String name; + + private String email; + + public Author() { + } + + public Author(String name, String email) { + this.name = name; + this.email = email; + } + + public int getAuthorId() { + return authorId; + } + + public void setAuthorId(int authorId) { + this.authorId = authorId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "Author{" + + "authorId=" + authorId + + ", name='" + name + '\'' + + ", email='" + email + '\'' + + '}'; + } +} diff --git a/src/main/java/IronLibrary/demo/models/Issue.java b/src/main/java/IronLibrary/demo/models/Issue.java new file mode 100644 index 00000000..0bc2cf08 --- /dev/null +++ b/src/main/java/IronLibrary/demo/models/Issue.java @@ -0,0 +1,88 @@ +package IronLibrary.demo.models; + +import jakarta.persistence.*; + +import java.util.Date; + +@Entity +@Table(name = "Issue") + +public class Issue { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "issue_id") + private int issueId; + + @Column(name = "issue_date") + private Date issueDate; + + @Column(name = "return_date") + private Date returnDate; + + @Column(name = "issue_student") + private String issueStudent; + + @Column(name = "issue_book") + private String issueBook; + + public Issue() { + } + + public Issue(Date issueDate, Date returnDate, String issueStudent, String issueBook) { + this.issueDate = issueDate; + this.returnDate = returnDate; + this.issueStudent = issueStudent; + this.issueBook = issueBook; + } + + public int getIssueId() { + return issueId; + } + + public void setIssueId(int issueId) { + this.issueId = issueId; + } + + public Date getIssueDate() { + return issueDate; + } + + public void setIssueDate(Date issueDate) { + this.issueDate = issueDate; + } + + public Date getReturnDate() { + return returnDate; + } + + public void setReturnDate(Date returnDate) { + this.returnDate = returnDate; + } + + public String getIssueStudent() { + return issueStudent; + } + + public void setIssueStudent(String issueStudent) { + this.issueStudent = issueStudent; + } + + public String getIssueBook() { + return issueBook; + } + + public void setIssueBook(String issueBook) { + this.issueBook = issueBook; + } + + @Override + public String toString() { + return "Issue{" + + "issueId=" + issueId + + ", issueDate=" + issueDate + + ", returnDate=" + returnDate + + ", issueStudent='" + issueStudent + '\'' + + ", issueBook='" + issueBook + '\'' + + '}'; + } +} From 2653d488302b500f0ed2ce009b91646d2bc18eec Mon Sep 17 00:00:00 2001 From: Angela Ruiz Date: Wed, 23 Apr 2025 18:07:10 +0200 Subject: [PATCH 13/38] metodos repositorio angela --- src/main/java/IronLibrary/demo/models/Book.java | 5 ++++- .../demo/repositories/BookRepositoryAngela.java | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/IronLibrary/demo/models/Book.java b/src/main/java/IronLibrary/demo/models/Book.java index 98798a0f..7828eed6 100644 --- a/src/main/java/IronLibrary/demo/models/Book.java +++ b/src/main/java/IronLibrary/demo/models/Book.java @@ -5,12 +5,15 @@ import jakarta.persistence.Table; @Entity -@Table(name = "books") +@Table(name = "Book") public class Book { @Id private String isbn; + private String title; + private String category; + private int quantity; public Book() { diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java index 102efd4f..ca76dbdf 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java @@ -1,10 +1,18 @@ package IronLibrary.demo.repositories; - import IronLibrary.demo.models.Book; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; public interface BookRepositoryAngela extends JpaRepository { -// Search book by title -// Search book by category -//List all books along with author +// Search book by title: This action is responsible for searching a book by title. + Book findBookByTitle(String title); + +// Search book by category: This action is responsible for searching a book by category. + Book findBookByCategory(String category); + +//List all books along with author: This action is responsible for listing all the books available and there corresponding authors. + List findAllByAuthor(String author); + + + } From 9a5f275d34bff3f2e58f3a0b5b6339952885278e Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Wed, 23 Apr 2025 18:11:02 +0200 Subject: [PATCH 14/38] =?UTF-8?q?primeros=20m=C3=A9todos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 1 + .idea/modules.xml | 8 ---- .../java/IronLibrary/demo/models/Student.java | 41 ++++++++++++++++++- .../repositories/BookRepositoryIrene.java | 32 ++++++++++++++- 4 files changed, 72 insertions(+), 10 deletions(-) delete mode 100644 .idea/modules.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 7dc60031..8a0c2be0 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/src/main/java/IronLibrary/demo/models/Student.java b/src/main/java/IronLibrary/demo/models/Student.java index f73904a9..d95f87fd 100644 --- a/src/main/java/IronLibrary/demo/models/Student.java +++ b/src/main/java/IronLibrary/demo/models/Student.java @@ -2,5 +2,44 @@ import jakarta.persistence.*; @Entity -public class Student { +@Table (name= "student") +public class Student { //lo de inherot? + + @Id + private String usn; //Universal Student Number-unique identifier + + private String name; + + public Student(){ + + } + + 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; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Student{" + + "usn='" + usn + '\'' + + ", name='" + name + '\'' + + '}'; + } } diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java index e133fe21..2ea56afd 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java @@ -1,7 +1,37 @@ package IronLibrary.demo.repositories; import IronLibrary.demo.models.Book; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface BookRepositoryIrene extends JpaRepository { + @Modifying //oblig al hacer INSERT + @Transactional //pq es dinamico + @Query(value= "INSERT INTO Book (isbn, title, category, quantity) VALUES (:isbn, :title, :category, :quantity)", nativeQuery = true) + //nativeQuery = true indica que es SQL nativo, no JPQL + void addBook( + @Param("isbn") String isbn, + @Param("title") String title, + @Param("category") String category, + @Param("quantity") int quantity + ); //como uno esto al add author? + + @Modifying + @Transactional + @Query(value= "INSERT INTO Author (name, email, author_book) VALUES (:name, :email, :author_book)", nativeQuery = true) + //nativeQuery = true indica que es SQL nativo, no JPQL + void addAuthor( + @Param("name") String name, + @Param("email") String email, + @Param("authorBook") Book authorBook //mirar esto + ); + //search book by author + public Book findByAuthor(Author author); + -public interface BookRepositoryIrene extends JpaRepository { } From bdb27beed4678a4192d54e88b835696a97f58f50 Mon Sep 17 00:00:00 2001 From: Pacheca Date: Wed, 23 Apr 2025 19:48:47 +0200 Subject: [PATCH 15/38] findBooksByUsn --- .../IronLibrary/demo/repositories/BookRepositoryMiguel.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java index d824049d..0ac89ad2 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java @@ -3,5 +3,9 @@ import IronLibrary.demo.models.Book; import org.springframework.data.jpa.repository.JpaRepository; -public interface BookRepositoryMiguel extends JpaRepository { +import java.util.List; + +public interface BookRepositoryMiguel extends JpaRepository { + // List books by usn: + List findBooksByUsn (String usn); } From fe3b843a3493940154317bebfa5d7b355b8f4317 Mon Sep 17 00:00:00 2001 From: Pacheca Date: Wed, 23 Apr 2025 20:06:35 +0200 Subject: [PATCH 16/38] BookRepositoryMiguel --- .../demo/repositories/BookRepositoryMiguel.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java index 0ac89ad2..fcd32286 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java @@ -2,10 +2,16 @@ import IronLibrary.demo.models.Book; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; public interface BookRepositoryMiguel extends JpaRepository { // List books by usn: - List findBooksByUsn (String usn); + @Query(value = "SELECT Book.tittle FROM Book " + + "INNER JOIN Issue ON Book.isbn = Issue.issue_book " + + "WHERE Issue.issue_student = :usn", + nativeQuery = true) + List findBookTitlesByStudentUsn(@Param("usn") String usn); } From f14d62af3589a96a9ecddeaeef902ca8ba1af2b9 Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Thu, 24 Apr 2025 16:42:14 +0200 Subject: [PATCH 17/38] metodo --- .../IronLibrary/demo/repositories/BookRepositoryIrene.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java index 2ea56afd..b5be529d 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java @@ -31,7 +31,11 @@ void addAuthor( @Param("authorBook") Book authorBook //mirar esto ); //search book by author - public Book findByAuthor(Author author); + Book findByAuthor(Author author); + @Modifying + @Transactional + @Query(value = "INSERT INTO Student (usn, name) VALUES (:usn, :name)", nativeQuery = true) + void insertStudent(@Param("usn") String usn, @Param("name") String name); } From 2be23ece15ffbf05b028f9a99c545d0ac622aafa Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Thu, 24 Apr 2025 17:17:58 +0200 Subject: [PATCH 18/38] changes --- .../java/IronLibrary/demo/repositories/BookRepositoryIrene.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java index b5be529d..da1359d1 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java @@ -10,6 +10,7 @@ @Repository public interface BookRepositoryIrene extends JpaRepository { + @Modifying //oblig al hacer INSERT @Transactional //pq es dinamico @Query(value= "INSERT INTO Book (isbn, title, category, quantity) VALUES (:isbn, :title, :category, :quantity)", nativeQuery = true) @@ -33,6 +34,7 @@ void addAuthor( //search book by author Book findByAuthor(Author author); + //Issue book to student @Modifying @Transactional @Query(value = "INSERT INTO Student (usn, name) VALUES (:usn, :name)", nativeQuery = true) From c39c1d41c85ff97e8bdbe00fe51a7ed309552b9d Mon Sep 17 00:00:00 2001 From: Angela Ruiz Date: Thu, 24 Apr 2025 17:42:03 +0200 Subject: [PATCH 19/38] uniendo metodos en archivos de repositorios --- .../controllers/IronLibraryController.java | 4 -- .../java/IronLibrary/demo/menu/Scanner.java | 4 -- .../demo/repositories/AuthorRepository.java | 32 +++++++++++++ .../demo/repositories/BookRepository.java | 47 +++++++++++++++++++ .../repositories/BookRepositoryAngela.java | 2 - .../repositories/BookRepositoryIrene.java | 27 ++++++----- .../IronLibrary/demo/services/Scanner.java | 27 +++++++++++ 7 files changed, 122 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/IronLibrary/demo/controllers/IronLibraryController.java delete mode 100644 src/main/java/IronLibrary/demo/menu/Scanner.java create mode 100644 src/main/java/IronLibrary/demo/repositories/AuthorRepository.java create mode 100644 src/main/java/IronLibrary/demo/repositories/BookRepository.java create mode 100644 src/main/java/IronLibrary/demo/services/Scanner.java diff --git a/src/main/java/IronLibrary/demo/controllers/IronLibraryController.java b/src/main/java/IronLibrary/demo/controllers/IronLibraryController.java deleted file mode 100644 index 571e2695..00000000 --- a/src/main/java/IronLibrary/demo/controllers/IronLibraryController.java +++ /dev/null @@ -1,4 +0,0 @@ -package IronLibrary.demo.controllers; - -public class IronLibraryController { -} diff --git a/src/main/java/IronLibrary/demo/menu/Scanner.java b/src/main/java/IronLibrary/demo/menu/Scanner.java deleted file mode 100644 index ecff0252..00000000 --- a/src/main/java/IronLibrary/demo/menu/Scanner.java +++ /dev/null @@ -1,4 +0,0 @@ -package IronLibrary.demo.menu; - -public class Scanner { -} diff --git a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java new file mode 100644 index 00000000..9e0cb90b --- /dev/null +++ b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java @@ -0,0 +1,32 @@ +package IronLibrary.demo.repositories; + +import IronLibrary.demo.models.Author; +import IronLibrary.demo.models.Book; +import jakarta.transaction.Transactional; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface AuthorRepository extends JpaRepository { + + //search book by author + Book findByAuthor(Author author); + + //List all books along with author: This action is responsible for listing all the books available and there corresponding authors. + List findAllByAuthor(String author); + + @Modifying + @Transactional + @Query(value= "INSERT INTO Author (name, email, author_book) VALUES (:name, :email, :author_book)", nativeQuery = true) + //nativeQuery = true indica que es SQL nativo, no JPQL + void addAuthor( + @Param("name") String name, + @Param("email") String email, + @Param("authorBook") Book authorBook //mirar esto + ); +} diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepository.java b/src/main/java/IronLibrary/demo/repositories/BookRepository.java new file mode 100644 index 00000000..86bd52ca --- /dev/null +++ b/src/main/java/IronLibrary/demo/repositories/BookRepository.java @@ -0,0 +1,47 @@ +package IronLibrary.demo.repositories; + +import IronLibrary.demo.models.Book; +import jakarta.transaction.Transactional; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface BookRepository extends JpaRepository { + + //Add book + @Modifying + @Transactional + @Query(value= "INSERT INTO Book (isbn, title, category, quantity) VALUES (:isbn, :title, :category, :quantity)", nativeQuery = true) + + void addBook( + @Param("isbn") String isbn, + @Param("title") String title, + @Param("category") String category, + @Param("quantity") int quantity + ); + + // Search book by title: This action is responsible for searching a book by title. + Book findBookByTitle(String title); + + //Search book by category: This action is responsible for searching a book by category. + Book findBookByCategory(String category); + + //Issue book to student + @Modifying + @Transactional + @Query(value = "INSERT INTO Student (usn, name) VALUES (:usn, :name)", nativeQuery = true) + void insertStudent(@Param("usn") String usn, @Param("name") String name); + + // List books by usn: + @Query(value = "SELECT Book.tittle FROM Book " + + "INNER JOIN Issue ON Book.isbn = Issue.issue_book " + + "WHERE Issue.issue_student = :usn", + nativeQuery = true) + List findBookTitlesByStudentUsn(@Param("usn") String usn); + +} diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java index ca76dbdf..d43c45c2 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java @@ -10,8 +10,6 @@ public interface BookRepositoryAngela extends JpaRepository { // Search book by category: This action is responsible for searching a book by category. Book findBookByCategory(String category); -//List all books along with author: This action is responsible for listing all the books available and there corresponding authors. - List findAllByAuthor(String author); diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java index da1359d1..bbc1255d 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java @@ -8,6 +8,8 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface BookRepositoryIrene extends JpaRepository { @@ -22,17 +24,6 @@ void addBook( @Param("quantity") int quantity ); //como uno esto al add author? - @Modifying - @Transactional - @Query(value= "INSERT INTO Author (name, email, author_book) VALUES (:name, :email, :author_book)", nativeQuery = true) - //nativeQuery = true indica que es SQL nativo, no JPQL - void addAuthor( - @Param("name") String name, - @Param("email") String email, - @Param("authorBook") Book authorBook //mirar esto - ); - //search book by author - Book findByAuthor(Author author); //Issue book to student @Modifying @@ -40,4 +31,18 @@ void addAuthor( @Query(value = "INSERT INTO Student (usn, name) VALUES (:usn, :name)", nativeQuery = true) void insertStudent(@Param("usn") String usn, @Param("name") String name); + // Search book by title: This action is responsible for searching a book by title. + Book findBookByTitle(String title); + + // Search book by category: This action is responsible for searching a book by category. + Book findBookByCategory(String category); + + // List books by usn: + @Query(value = "SELECT Book.tittle FROM Book " + + "INNER JOIN Issue ON Book.isbn = Issue.issue_book " + + "WHERE Issue.issue_student = :usn", + nativeQuery = true) + List findBookTitlesByStudentUsn(@Param("usn") String usn); + + } diff --git a/src/main/java/IronLibrary/demo/services/Scanner.java b/src/main/java/IronLibrary/demo/services/Scanner.java new file mode 100644 index 00000000..b259fe16 --- /dev/null +++ b/src/main/java/IronLibrary/demo/services/Scanner.java @@ -0,0 +1,27 @@ +package IronLibrary.demo.services; + +import IronLibrary.demo.IronLibraryApplication; +import IronLibrary.demo.repositories.BookRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication + +public class Scanner implements CommandLineRunner { + @Autowired + private BookRepository bookRepository; + public static void main(String[] args) { + SpringApplication.run(IronLibraryApplication.class, args); +} + +@Override +public void run(String... args) { // también podemos recibir NINGUN argumento + // es donde ponemos el WHILE LOOP para nuestro menú + System.out.println("Bienvenido a nuestra app de libros"); // toda la parte de scanner la ponemos por aquí. + // para que aquí no tengamos toda la lógica metida en 400 líneas. Podemos crear un package de services que gestione partes de la lógica + // puedo usar el bookRepository o cualquiera de las BEANS de spring framework + // para salir del proceso: + System.exit(0); +}} \ No newline at end of file From d824bcf8a90ec717a1e96b4d2188450efde947a8 Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Fri, 25 Apr 2025 14:38:15 +0200 Subject: [PATCH 20/38] library service --- .../demo/repositories/AuthorRepository.java | 2 +- .../demo/services/LibraryService.java | 28 ++++++ .../demo/RepositoryTestsIrene.java | 86 +++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/main/java/IronLibrary/demo/services/LibraryService.java create mode 100644 src/test/java/IronLibrary/demo/RepositoryTestsIrene.java diff --git a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java index 9e0cb90b..2444e78a 100644 --- a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java @@ -15,7 +15,7 @@ public interface AuthorRepository extends JpaRepository { //search book by author - Book findByAuthor(Author author); + public Book findByAuthor(Author author); //List all books along with author: This action is responsible for listing all the books available and there corresponding authors. List findAllByAuthor(String author); diff --git a/src/main/java/IronLibrary/demo/services/LibraryService.java b/src/main/java/IronLibrary/demo/services/LibraryService.java new file mode 100644 index 00000000..e9e795fe --- /dev/null +++ b/src/main/java/IronLibrary/demo/services/LibraryService.java @@ -0,0 +1,28 @@ +package IronLibrary.demo.services; + +import IronLibrary.demo.repositories.AuthorRepository; +import IronLibrary.demo.repositories.BookRepository; +import jakarta.transaction.Transactional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.Query; + +public class LibraryService { + + @Autowired + BookRepository bookRepository; + + @Autowired + AuthorRepository authorRepository; + + @Transactional + public void addBookAndAuthor(String isbn, String title, String category, int quantity, String authorName, String authorEmail) { + //insertar libro + bookRepository.addBook(isbn, title, category, quantity); + //insertar autor + authorRepository.addAuthor(authorName, authorEmail, authorBook); //como lo enlazo a book? + //como hacemos que se conecten con la foreign key? existe tabla author book + + + System.out.println("Book and author had been added correctly"); + } +} diff --git a/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java b/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java new file mode 100644 index 00000000..b2460b81 --- /dev/null +++ b/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java @@ -0,0 +1,86 @@ +package IronLibrary.demo; + +import IronLibrary.demo.models.Student; +import IronLibrary.demo.repositories.BookRepository; +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import IronLibrary.demo.models.Author; +import IronLibrary.demo.models.Book; +import IronLibrary.demo.repositories.AuthorRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // usa tu DB o H2 si configuras una +@Transactional + +public class RepositoryTestsIrene { + private static final Logger log = LoggerFactory.getLogger(RepositoryTestsIrene.class); + @Autowired + private BookRepository bookRepository; + + @Autowired + private AuthorRepository authorRepository; + + @Autowired + private EntityManager entityManager; + + @Test + @DisplayName("añade un libro") + public void addBookCorrectly(){ + Book book = new Book("895-755-121", "El Quijote", "Drama", 5); + List bookList = new ArrayList<>(); + bookList.add(book); //addBook o add? + System.out.println("New book added: " + book); + } + @Test + @DisplayName("añade un autor") + public void addAuthorCorrectly(){ + Author author = new Author("Isabel Allende", "isabel.allende@example.com"); + List authorList = new ArrayList<>(); + authorList.add(author); //addBook o add? + System.out.println("New book added: " + author); + } + + @Test + @DisplayName("comprobando si encuentra un libro por su autor") + public void findByAuthorReturnsCorrectBook(){ + authorRepository.findByAuthor(new Author("Isabel Allende", "isabel.allende@example.com")); + // System.out.println("");//? + } + @Test + @DisplayName("comprobando si se añade el libro al estudiante") + public void testIssueBookToStudent(){ + String usn = "123ABC"; + String name = "John Doe"; + + bookRepository.insertStudent(usn, name); + + entityManager.flush(); //esto es para que JPA lea de la base y no de cache + entityManager.clear(); + + Student result = entityManager.find(Student.class, usn); + + assertNotNull(result); + assertEquals(usn, result.getUsn()); + assertEquals(name, result.getName()); + } + /* + @Query(value = "INSERT INTO Student (usn, name) VALUES (:usn, :name)", nativeQuery = true) + void insertStudent(@Param("usn") String usn, @Param("name") String name); + */ + +} From 1f7e0c4d11c01857b27e42ab3a31e62067677a7e Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Fri, 25 Apr 2025 15:12:55 +0200 Subject: [PATCH 21/38] scanner 5 y 6 --- .../demo/repositories/AuthorRepository.java | 3 +- .../demo/repositories/BookRepository.java | 12 +++- .../demo/services/LibraryService.java | 23 +++++++ .../demo/services/ScannerIrene.java | 64 +++++++++++++++++++ .../demo/RepositoryTestsIrene.java | 2 + 5 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 src/main/java/IronLibrary/demo/services/ScannerIrene.java diff --git a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java index 2444e78a..63b20e07 100644 --- a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java @@ -17,7 +17,8 @@ public interface AuthorRepository extends JpaRepository { //search book by author public Book findByAuthor(Author author); - //List all books along with author: This action is responsible for listing all the books available and there corresponding authors. + //msj de Irene: este método deberia mostrar una lista con autores, pero SIN meter autor de parametro + //List all books along with author: This action is responsible for listing all the books available and their corresponding authors. List findAllByAuthor(String author); @Modifying diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepository.java b/src/main/java/IronLibrary/demo/repositories/BookRepository.java index 86bd52ca..8764c33f 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepository.java @@ -12,7 +12,7 @@ @Repository public interface BookRepository extends JpaRepository { - + //Add book @Modifying @Transactional @@ -37,6 +37,16 @@ void addBook( @Query(value = "INSERT INTO Student (usn, name) VALUES (:usn, :name)", nativeQuery = true) void insertStudent(@Param("usn") String usn, @Param("name") String name); + @Modifying + @Transactional + @Query(value = "INSERT INTO Issue (issue_date, return_date, issue_student_usn, issue_book_isbn) VALUES (:issueDate, :returnDate, :studentUsn, :bookIsbn)", nativeQuery = true) + void insertIssue( + @Param("issueDate") String issueDate, + @Param("returnDate") String returnDate, + @Param("studentUsn") String studentUsn, + @Param("bookIsbn") String bookIsbn + ); + // List books by usn: @Query(value = "SELECT Book.tittle FROM Book " + "INNER JOIN Issue ON Book.isbn = Issue.issue_book " + diff --git a/src/main/java/IronLibrary/demo/services/LibraryService.java b/src/main/java/IronLibrary/demo/services/LibraryService.java index e9e795fe..751adaa7 100644 --- a/src/main/java/IronLibrary/demo/services/LibraryService.java +++ b/src/main/java/IronLibrary/demo/services/LibraryService.java @@ -6,6 +6,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.Query; +import java.time.LocalDate; + public class LibraryService { @Autowired @@ -14,6 +16,27 @@ public class LibraryService { @Autowired AuthorRepository authorRepository; + public LibraryService(BookRepository bookRepository, AuthorRepository authorRepository) { + this.bookRepository = bookRepository; + this.authorRepository = authorRepository; + } + + public void issueBookToStudent (String usn, String name, String isbn) { + bookRepository.insertStudent(usn, name); + + LocalDate issueDate = LocalDate.now(); + LocalDate returnDate = issueDate.plusDays(30); + + bookRepository.insertIssue( + issueDate.toString(), + returnDate.toString(), + usn, + isbn + ); + + } + + @Transactional public void addBookAndAuthor(String isbn, String title, String category, int quantity, String authorName, String authorEmail) { //insertar libro diff --git a/src/main/java/IronLibrary/demo/services/ScannerIrene.java b/src/main/java/IronLibrary/demo/services/ScannerIrene.java new file mode 100644 index 00000000..a00b58a0 --- /dev/null +++ b/src/main/java/IronLibrary/demo/services/ScannerIrene.java @@ -0,0 +1,64 @@ +package IronLibrary.demo.services; +import IronLibrary.demo.IronLibraryApplication; +import IronLibrary.demo.repositories.AuthorRepository; +import IronLibrary.demo.repositories.BookRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.time.LocalDate; +import java.util.Scanner; + +@SpringBootApplication +public class ScannerIrene implements CommandLineRunner { + + @Autowired + BookRepository bookRepository; + @Autowired + AuthorRepository authorRepository; + @Autowired + LibraryService libraryService; + + public static void main(String[] args) { + SpringApplication.run(ScannerIrene.class, args); + } + + @Override + public void run(String... args) throws Exception { + //aqui ponemos while loop menu + Scanner scanner = new Scanner(System.in); + boolean continueRunning = true; + + while (continueRunning) { + System.out.println("5.List all books along with author"); + System.out.println("6. Issue book to student"); + + int choice = scanner.nextInt(); + scanner.nextLine(); + + switch (choice) { + case 5: + System.out.println("This is the list for all books available and their corresponding authors: " + authorRepository.findAllByAuthor()); + //hay que corregir el metodo + break; + case 6: + System.out.println("You chose to issue a book to a student"); + System.out.println("Please enter the student's usn: "); + String usn = scanner.nextLine(); + + System.out.println("Enter name: "); + String name = scanner.nextLine(); + + System.out.println("Enter book ISBN: "); + String isbn = scanner.nextLine(); + + libraryService.issueBookToStudent(usn, name, isbn); + break; + } + } //metamos default con invalid choice + //habra que cerrar el bucle con un running = false en el exit + scanner.close(); + System.exit(0); + } +} diff --git a/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java b/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java index b2460b81..0c9c8bb6 100644 --- a/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java +++ b/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java @@ -64,6 +64,8 @@ public void findByAuthorReturnsCorrectBook(){ @Test @DisplayName("comprobando si se añade el libro al estudiante") public void testIssueBookToStudent(){ + + //tengo que hacer la parte de insert book y luego insert student String usn = "123ABC"; String name = "John Doe"; From e5adc7a249cb7181815a3daa081f4e6917569236 Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Fri, 25 Apr 2025 15:14:37 +0200 Subject: [PATCH 22/38] onetoone student --- src/main/java/IronLibrary/demo/models/Student.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/IronLibrary/demo/models/Student.java b/src/main/java/IronLibrary/demo/models/Student.java index d95f87fd..640702e2 100644 --- a/src/main/java/IronLibrary/demo/models/Student.java +++ b/src/main/java/IronLibrary/demo/models/Student.java @@ -10,6 +10,14 @@ public class Student { //lo de inherot? private String name; + @OneToOne(mappedBy = "issueStudent") + /* PARA CLASE ISSUE + @OneToOne + @JoinColumn(name = "student_usn", referencedColumnName = "usn") + private Student issueStudent; + */ + private Issue issue; + public Student(){ } From cf1b605920a79b03ddc427012fcf265b3be2f251 Mon Sep 17 00:00:00 2001 From: Pacheca Date: Sun, 27 Apr 2025 19:05:04 +0200 Subject: [PATCH 23/38] One to One Miguel --- src/main/java/IronLibrary/demo/models/Author.java | 5 +++++ src/main/java/IronLibrary/demo/models/Issue.java | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/IronLibrary/demo/models/Author.java b/src/main/java/IronLibrary/demo/models/Author.java index 051c24a5..4d6441a2 100644 --- a/src/main/java/IronLibrary/demo/models/Author.java +++ b/src/main/java/IronLibrary/demo/models/Author.java @@ -2,6 +2,8 @@ import jakarta.persistence.*; +import java.sql.Blob; + @Entity @Table(name = "Author") @@ -15,6 +17,9 @@ public class Author { private String email; + @OneToOne + private Book bookAuthor; + public Author() { } diff --git a/src/main/java/IronLibrary/demo/models/Issue.java b/src/main/java/IronLibrary/demo/models/Issue.java index 0bc2cf08..320bcf86 100644 --- a/src/main/java/IronLibrary/demo/models/Issue.java +++ b/src/main/java/IronLibrary/demo/models/Issue.java @@ -25,6 +25,9 @@ public class Issue { @Column(name = "issue_book") private String issueBook; + @OneToOne + private Student studentIssue; + public Issue() { } From 451560463ed8eca3e2eabce49d12b862a553ca97 Mon Sep 17 00:00:00 2001 From: Pacheca Date: Mon, 28 Apr 2025 08:20:40 +0200 Subject: [PATCH 24/38] Methods and test (not finished) --- .../demo/repositories/AuthorRepository.java | 3 + .../demo/repositories/BookRepository.java | 7 ++ .../demo/services/LibraryService.java | 51 --------------- .../demo/services/ScannerIrene.java | 64 ------------------- .../demo/services/ServiceMiguel.java | 44 +++++++++++++ .../java/IronLibrary/demo/TestMiguel.java | 33 ++++++++++ 6 files changed, 87 insertions(+), 115 deletions(-) delete mode 100644 src/main/java/IronLibrary/demo/services/LibraryService.java delete mode 100644 src/main/java/IronLibrary/demo/services/ScannerIrene.java create mode 100644 src/main/java/IronLibrary/demo/services/ServiceMiguel.java create mode 100644 src/test/java/IronLibrary/demo/TestMiguel.java diff --git a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java index 63b20e07..d56f564f 100644 --- a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java @@ -30,4 +30,7 @@ void addAuthor( @Param("email") String email, @Param("authorBook") Book authorBook //mirar esto ); + + Author findByName(String authorName); + } diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepository.java b/src/main/java/IronLibrary/demo/repositories/BookRepository.java index 8764c33f..d97b5ce2 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepository.java @@ -1,5 +1,6 @@ package IronLibrary.demo.repositories; +import IronLibrary.demo.models.Author; import IronLibrary.demo.models.Book; import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; @@ -54,4 +55,10 @@ void insertIssue( nativeQuery = true) List findBookTitlesByStudentUsn(@Param("usn") String usn); + List findByAuthor(Author author); + + List findByCategory(String category); + + List findByTitle(String title); + } diff --git a/src/main/java/IronLibrary/demo/services/LibraryService.java b/src/main/java/IronLibrary/demo/services/LibraryService.java deleted file mode 100644 index 751adaa7..00000000 --- a/src/main/java/IronLibrary/demo/services/LibraryService.java +++ /dev/null @@ -1,51 +0,0 @@ -package IronLibrary.demo.services; - -import IronLibrary.demo.repositories.AuthorRepository; -import IronLibrary.demo.repositories.BookRepository; -import jakarta.transaction.Transactional; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.Query; - -import java.time.LocalDate; - -public class LibraryService { - - @Autowired - BookRepository bookRepository; - - @Autowired - AuthorRepository authorRepository; - - public LibraryService(BookRepository bookRepository, AuthorRepository authorRepository) { - this.bookRepository = bookRepository; - this.authorRepository = authorRepository; - } - - public void issueBookToStudent (String usn, String name, String isbn) { - bookRepository.insertStudent(usn, name); - - LocalDate issueDate = LocalDate.now(); - LocalDate returnDate = issueDate.plusDays(30); - - bookRepository.insertIssue( - issueDate.toString(), - returnDate.toString(), - usn, - isbn - ); - - } - - - @Transactional - public void addBookAndAuthor(String isbn, String title, String category, int quantity, String authorName, String authorEmail) { - //insertar libro - bookRepository.addBook(isbn, title, category, quantity); - //insertar autor - authorRepository.addAuthor(authorName, authorEmail, authorBook); //como lo enlazo a book? - //como hacemos que se conecten con la foreign key? existe tabla author book - - - System.out.println("Book and author had been added correctly"); - } -} diff --git a/src/main/java/IronLibrary/demo/services/ScannerIrene.java b/src/main/java/IronLibrary/demo/services/ScannerIrene.java deleted file mode 100644 index a00b58a0..00000000 --- a/src/main/java/IronLibrary/demo/services/ScannerIrene.java +++ /dev/null @@ -1,64 +0,0 @@ -package IronLibrary.demo.services; -import IronLibrary.demo.IronLibraryApplication; -import IronLibrary.demo.repositories.AuthorRepository; -import IronLibrary.demo.repositories.BookRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -import java.time.LocalDate; -import java.util.Scanner; - -@SpringBootApplication -public class ScannerIrene implements CommandLineRunner { - - @Autowired - BookRepository bookRepository; - @Autowired - AuthorRepository authorRepository; - @Autowired - LibraryService libraryService; - - public static void main(String[] args) { - SpringApplication.run(ScannerIrene.class, args); - } - - @Override - public void run(String... args) throws Exception { - //aqui ponemos while loop menu - Scanner scanner = new Scanner(System.in); - boolean continueRunning = true; - - while (continueRunning) { - System.out.println("5.List all books along with author"); - System.out.println("6. Issue book to student"); - - int choice = scanner.nextInt(); - scanner.nextLine(); - - switch (choice) { - case 5: - System.out.println("This is the list for all books available and their corresponding authors: " + authorRepository.findAllByAuthor()); - //hay que corregir el metodo - break; - case 6: - System.out.println("You chose to issue a book to a student"); - System.out.println("Please enter the student's usn: "); - String usn = scanner.nextLine(); - - System.out.println("Enter name: "); - String name = scanner.nextLine(); - - System.out.println("Enter book ISBN: "); - String isbn = scanner.nextLine(); - - libraryService.issueBookToStudent(usn, name, isbn); - break; - } - } //metamos default con invalid choice - //habra que cerrar el bucle con un running = false en el exit - scanner.close(); - System.exit(0); - } -} diff --git a/src/main/java/IronLibrary/demo/services/ServiceMiguel.java b/src/main/java/IronLibrary/demo/services/ServiceMiguel.java new file mode 100644 index 00000000..98e797ab --- /dev/null +++ b/src/main/java/IronLibrary/demo/services/ServiceMiguel.java @@ -0,0 +1,44 @@ +package IronLibrary.demo.services; +import IronLibrary.demo.models.Author; +import IronLibrary.demo.models.Book; +import IronLibrary.demo.repositories.AuthorRepository; +import IronLibrary.demo.repositories.BookRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.util.List; + +@SpringBootApplication +public class ServiceMiguel { + + @Autowired + BookRepository bookRepository; + @Autowired + AuthorRepository authorRepository; + + //Agregar un libro + public void addBook(Book book) { + bookRepository.save(book); + } + + //Buscar libro por título + public List findBooksByTitle(String title) { + return bookRepository.findByTitle(title); + } + + //Buscar libro por categoría + public List findBooksByCategory(String category) { + return bookRepository.findByCategory(category); + } + + //Buscar libro por autor + public List findBooksByAuthor(String authorName) { + Author author = authorRepository.findByName(authorName); + if (author != null) { + return bookRepository.findByAuthor(author); + } else { + return null; + } + } +} diff --git a/src/test/java/IronLibrary/demo/TestMiguel.java b/src/test/java/IronLibrary/demo/TestMiguel.java new file mode 100644 index 00000000..7ac6272b --- /dev/null +++ b/src/test/java/IronLibrary/demo/TestMiguel.java @@ -0,0 +1,33 @@ +package IronLibrary.demo; +import static org.junit.jupiter.api.Assertions.*; + +import IronLibrary.demo.models.Book; +import IronLibrary.demo.models.Issue; +import IronLibrary.demo.repositories.BookRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class TestMiguel { + @Autowired + private BookRepository bookRepository; + //private IssueRepository issueRepository; + + + @Test + @DisplayName("Buscar Libro por USN") + public void testFindByStudentUsn() { + Book book1 = new Book(); + book1.setTitle("El mago"); + book1.setIsbn("252"); + bookRepository.save(book1); + + Issue issue = new Issue(); + issue.setIssueBook("252"); // + issue.setIssueStudent("USN123"); + //issueRepository.save + + } +} From 0b24f30dd354d309263ff3d8e3bd3de42398886c Mon Sep 17 00:00:00 2001 From: Pacheca Date: Mon, 28 Apr 2025 11:59:05 +0200 Subject: [PATCH 25/38] Add --- src/test/java/IronLibrary/demo/TestMiguel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/IronLibrary/demo/TestMiguel.java b/src/test/java/IronLibrary/demo/TestMiguel.java index 7ac6272b..e9e112a1 100644 --- a/src/test/java/IronLibrary/demo/TestMiguel.java +++ b/src/test/java/IronLibrary/demo/TestMiguel.java @@ -25,7 +25,7 @@ public void testFindByStudentUsn() { bookRepository.save(book1); Issue issue = new Issue(); - issue.setIssueBook("252"); // + issue.setIssueBook("252"); issue.setIssueStudent("USN123"); //issueRepository.save From 9831f70947f6f38dc72f93503c12324ab504a64e Mon Sep 17 00:00:00 2001 From: Angela Ruiz Date: Mon, 28 Apr 2025 12:10:46 +0200 Subject: [PATCH 26/38] scaner metodpos angela y cambios en author --- .../java/IronLibrary/demo/models/Author.java | 14 +++- .../demo/repositories/AuthorRepository.java | 8 +- .../demo/repositories/BookRepository.java | 2 +- .../demo/repositories/StudentRepository.java | 11 +++ .../demo/services/ScannerAngela.java | 78 +++++++++++++++++++ .../demo/RepositoryTestAngela.java | 32 ++++++++ 6 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 src/main/java/IronLibrary/demo/repositories/StudentRepository.java create mode 100644 src/main/java/IronLibrary/demo/services/ScannerAngela.java create mode 100644 src/test/java/IronLibrary/demo/RepositoryTestAngela.java diff --git a/src/main/java/IronLibrary/demo/models/Author.java b/src/main/java/IronLibrary/demo/models/Author.java index 4d6441a2..dd6fc4a9 100644 --- a/src/main/java/IronLibrary/demo/models/Author.java +++ b/src/main/java/IronLibrary/demo/models/Author.java @@ -17,8 +17,9 @@ public class Author { private String email; - @OneToOne - private Book bookAuthor; + @OneToOne + @JoinColumn(name = "author_book") + private Book authorBook; public Author() { } @@ -52,12 +53,21 @@ public void setEmail(String email) { this.email = email; } + public Book getAuthorBook() { + return authorBook; + } + + public void setAuthorBook(Book authorBook) { + this.authorBook = authorBook; + } + @Override public String toString() { return "Author{" + "authorId=" + authorId + ", name='" + name + '\'' + ", email='" + email + '\'' + + ", authorBook=" + authorBook + '}'; } } diff --git a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java index 63b20e07..6b9c510a 100644 --- a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java @@ -18,8 +18,14 @@ public interface AuthorRepository extends JpaRepository { public Book findByAuthor(Author author); //msj de Irene: este método deberia mostrar una lista con autores, pero SIN meter autor de parametro + //List findAllByAuthor(String author) + // 🔶 MSJ ANGELA: CIERTO! ESTE METODO YA NO VALE, NUEVO METODO CORREGIDO ABAJO ⬇⬇⬇ + //List all books along with author: This action is responsible for listing all the books available and their corresponding authors. - List findAllByAuthor(String author); + @Query(value = "SELECT book.isbn, book.title, book.category, book.quantity, author.name, author.email " + + "FROM author " + + "JOIN book ON author.author_book = book.isbn", nativeQuery = true) + List findAllBooksWithAuthor(); @Modifying @Transactional diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepository.java b/src/main/java/IronLibrary/demo/repositories/BookRepository.java index 8764c33f..573bd508 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepository.java @@ -52,6 +52,6 @@ void insertIssue( "INNER JOIN Issue ON Book.isbn = Issue.issue_book " + "WHERE Issue.issue_student = :usn", nativeQuery = true) - List findBookTitlesByStudentUsn(@Param("usn") String usn); + List findBookTitlesByStudentUsn(@Param("usn") String usn); } diff --git a/src/main/java/IronLibrary/demo/repositories/StudentRepository.java b/src/main/java/IronLibrary/demo/repositories/StudentRepository.java new file mode 100644 index 00000000..ada595bb --- /dev/null +++ b/src/main/java/IronLibrary/demo/repositories/StudentRepository.java @@ -0,0 +1,11 @@ +package IronLibrary.demo.repositories; + +import IronLibrary.demo.models.Book; +import IronLibrary.demo.models.Student; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StudentRepository extends JpaRepository { + Student findStudentByUsn(String usn); +} diff --git a/src/main/java/IronLibrary/demo/services/ScannerAngela.java b/src/main/java/IronLibrary/demo/services/ScannerAngela.java new file mode 100644 index 00000000..c14113c2 --- /dev/null +++ b/src/main/java/IronLibrary/demo/services/ScannerAngela.java @@ -0,0 +1,78 @@ +package IronLibrary.demo.services; + +import IronLibrary.demo.IronLibraryApplication; +import IronLibrary.demo.models.Book; +import IronLibrary.demo.models.Student; +import IronLibrary.demo.repositories.BookRepository; +import IronLibrary.demo.repositories.StudentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.util.List; +import java.util.Scanner; + +@SpringBootApplication + +public class ScannerAngela implements CommandLineRunner { + @Autowired + private BookRepository bookRepository; + @Autowired + private StudentRepository studentRepository; + + public static void main(String[] args) { + SpringApplication.run(IronLibraryApplication.class, args); + } + + @Override + public void run(String... args) { + System.out.println("Bienvenido a nuestra app de libros"); + + java.util.Scanner scanner = new Scanner(System.in); + boolean continueRunning = true; + + while (continueRunning) { + System.out.println("7.List books by USN"); + System.out.println("8. Exit"); + + System.out.println("Enter your choice:"); + int choice = scanner.nextInt(); + scanner.nextLine(); + + switch (choice) { + case 7: + System.out.println("You choosed searching books by USN."); + System.out.println("Please, enter a USN number:"); + String usn = scanner.nextLine(); + List books = bookRepository.findBookTitlesByStudentUsn(usn); + Student student = studentRepository.findStudentByUsn(usn); + if (books.isEmpty()) { + + } else { + for(Book book: books) { + System.out.println("Book Title Student Name Return date\n" + + book.getTitle() + " " + student.getName() ); + + + } + } + break; +// me falta coger la return date de issue !!! +// Enter your choice: 7 +// Enter usn : 09003688800 +// +// Book Title Student Name Return date +// Da Vinci Code John Doe 2022-08-01 16:45:40.636000 +// + + case 8: + System.out.println("Exiting program..."); + continueRunning = false; + break; + } + } + scanner.close(); + System.exit(0); + } +} \ No newline at end of file diff --git a/src/test/java/IronLibrary/demo/RepositoryTestAngela.java b/src/test/java/IronLibrary/demo/RepositoryTestAngela.java new file mode 100644 index 00000000..9f906277 --- /dev/null +++ b/src/test/java/IronLibrary/demo/RepositoryTestAngela.java @@ -0,0 +1,32 @@ +package IronLibrary.demo; + + +import IronLibrary.demo.repositories.AuthorRepository; +import IronLibrary.demo.repositories.BookRepository; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // usa tu DB o H2 si configuras una +@Transactional + +public class RepositoryTestAngela { + @Autowired + private BookRepository bookRepository; + + @Autowired + private AuthorRepository authorRepository; + + @Test + @DisplayName("Search book by title") + + @Test + @DisplayName("Search book by category") + + @Test + @DisplayName("List all books along with author") +} From 6d665924975780c3c447bdb963efb08bef30615e Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Mon, 28 Apr 2025 12:11:41 +0200 Subject: [PATCH 27/38] cambios --- src/test/java/IronLibrary/demo/RepositoryTestsIrene.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java b/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java index 0c9c8bb6..514be833 100644 --- a/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java +++ b/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java @@ -24,7 +24,7 @@ @DataJpaTest -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // usa tu DB o H2 si configuras una +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) @Transactional public class RepositoryTestsIrene { From fefcc8d25e99a4f591ddb5a4b0bcd5b313b04b7c Mon Sep 17 00:00:00 2001 From: Angela Ruiz Date: Mon, 28 Apr 2025 12:30:13 +0200 Subject: [PATCH 28/38] Prueba archivos Irene --- src/main/java/IronLibrary/demo/services/LibraryService.java | 1 + src/main/java/IronLibrary/demo/services/ScannerIrene.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/IronLibrary/demo/services/LibraryService.java b/src/main/java/IronLibrary/demo/services/LibraryService.java index 751adaa7..60fda5e5 100644 --- a/src/main/java/IronLibrary/demo/services/LibraryService.java +++ b/src/main/java/IronLibrary/demo/services/LibraryService.java @@ -47,5 +47,6 @@ public void addBookAndAuthor(String isbn, String title, String category, int qua System.out.println("Book and author had been added correctly"); + //PROBANDO SI DESHACE EL BORRADO DEL ARCHIVO } } diff --git a/src/main/java/IronLibrary/demo/services/ScannerIrene.java b/src/main/java/IronLibrary/demo/services/ScannerIrene.java index a00b58a0..265ef1fd 100644 --- a/src/main/java/IronLibrary/demo/services/ScannerIrene.java +++ b/src/main/java/IronLibrary/demo/services/ScannerIrene.java @@ -60,5 +60,7 @@ public void run(String... args) throws Exception { //habra que cerrar el bucle con un running = false en el exit scanner.close(); System.exit(0); + + //PROBANDO SI DESHACE EL BORRADO DEL ARCHIVO } } From 4c02a1fceb0bbaa35d74396f6a561a08a73406a7 Mon Sep 17 00:00:00 2001 From: Angela Ruiz Date: Mon, 28 Apr 2025 13:36:19 +0200 Subject: [PATCH 29/38] duplicados archivos Irene --- LibraryService1.java | 51 +++++++++++++++++++++++++++++++++++ ScannerIrene1.java | 64 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 LibraryService1.java create mode 100644 ScannerIrene1.java diff --git a/LibraryService1.java b/LibraryService1.java new file mode 100644 index 00000000..751adaa7 --- /dev/null +++ b/LibraryService1.java @@ -0,0 +1,51 @@ +package IronLibrary.demo.services; + +import IronLibrary.demo.repositories.AuthorRepository; +import IronLibrary.demo.repositories.BookRepository; +import jakarta.transaction.Transactional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.Query; + +import java.time.LocalDate; + +public class LibraryService { + + @Autowired + BookRepository bookRepository; + + @Autowired + AuthorRepository authorRepository; + + public LibraryService(BookRepository bookRepository, AuthorRepository authorRepository) { + this.bookRepository = bookRepository; + this.authorRepository = authorRepository; + } + + public void issueBookToStudent (String usn, String name, String isbn) { + bookRepository.insertStudent(usn, name); + + LocalDate issueDate = LocalDate.now(); + LocalDate returnDate = issueDate.plusDays(30); + + bookRepository.insertIssue( + issueDate.toString(), + returnDate.toString(), + usn, + isbn + ); + + } + + + @Transactional + public void addBookAndAuthor(String isbn, String title, String category, int quantity, String authorName, String authorEmail) { + //insertar libro + bookRepository.addBook(isbn, title, category, quantity); + //insertar autor + authorRepository.addAuthor(authorName, authorEmail, authorBook); //como lo enlazo a book? + //como hacemos que se conecten con la foreign key? existe tabla author book + + + System.out.println("Book and author had been added correctly"); + } +} diff --git a/ScannerIrene1.java b/ScannerIrene1.java new file mode 100644 index 00000000..a00b58a0 --- /dev/null +++ b/ScannerIrene1.java @@ -0,0 +1,64 @@ +package IronLibrary.demo.services; +import IronLibrary.demo.IronLibraryApplication; +import IronLibrary.demo.repositories.AuthorRepository; +import IronLibrary.demo.repositories.BookRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.time.LocalDate; +import java.util.Scanner; + +@SpringBootApplication +public class ScannerIrene implements CommandLineRunner { + + @Autowired + BookRepository bookRepository; + @Autowired + AuthorRepository authorRepository; + @Autowired + LibraryService libraryService; + + public static void main(String[] args) { + SpringApplication.run(ScannerIrene.class, args); + } + + @Override + public void run(String... args) throws Exception { + //aqui ponemos while loop menu + Scanner scanner = new Scanner(System.in); + boolean continueRunning = true; + + while (continueRunning) { + System.out.println("5.List all books along with author"); + System.out.println("6. Issue book to student"); + + int choice = scanner.nextInt(); + scanner.nextLine(); + + switch (choice) { + case 5: + System.out.println("This is the list for all books available and their corresponding authors: " + authorRepository.findAllByAuthor()); + //hay que corregir el metodo + break; + case 6: + System.out.println("You chose to issue a book to a student"); + System.out.println("Please enter the student's usn: "); + String usn = scanner.nextLine(); + + System.out.println("Enter name: "); + String name = scanner.nextLine(); + + System.out.println("Enter book ISBN: "); + String isbn = scanner.nextLine(); + + libraryService.issueBookToStudent(usn, name, isbn); + break; + } + } //metamos default con invalid choice + //habra que cerrar el bucle con un running = false en el exit + scanner.close(); + System.exit(0); + } +} From 442d2f1662e831924c9c4a45738faeebb6192e53 Mon Sep 17 00:00:00 2001 From: Angela Ruiz Date: Mon, 28 Apr 2025 13:45:38 +0200 Subject: [PATCH 30/38] =?UTF-8?q?archivos=20perdidos=20de=20irene=20a?= =?UTF-8?q?=C3=B1adidos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/IronLibrary/demo/services/LibraryService1.java | 1 - .../main/java/IronLibrary/demo/services/ScannerIrene1.java | 2 -- 2 files changed, 3 deletions(-) rename LibraryService1.java => src/main/java/IronLibrary/demo/services/LibraryService1.java (96%) rename ScannerIrene1.java => src/main/java/IronLibrary/demo/services/ScannerIrene1.java (96%) diff --git a/LibraryService1.java b/src/main/java/IronLibrary/demo/services/LibraryService1.java similarity index 96% rename from LibraryService1.java rename to src/main/java/IronLibrary/demo/services/LibraryService1.java index 751adaa7..1c5e4d9b 100644 --- a/LibraryService1.java +++ b/src/main/java/IronLibrary/demo/services/LibraryService1.java @@ -4,7 +4,6 @@ import IronLibrary.demo.repositories.BookRepository; import jakarta.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.Query; import java.time.LocalDate; diff --git a/ScannerIrene1.java b/src/main/java/IronLibrary/demo/services/ScannerIrene1.java similarity index 96% rename from ScannerIrene1.java rename to src/main/java/IronLibrary/demo/services/ScannerIrene1.java index a00b58a0..4fe10c99 100644 --- a/ScannerIrene1.java +++ b/src/main/java/IronLibrary/demo/services/ScannerIrene1.java @@ -1,5 +1,4 @@ package IronLibrary.demo.services; -import IronLibrary.demo.IronLibraryApplication; import IronLibrary.demo.repositories.AuthorRepository; import IronLibrary.demo.repositories.BookRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -7,7 +6,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import java.time.LocalDate; import java.util.Scanner; @SpringBootApplication From 3d07dad9fcb9b839c505bab346f0949ca389dafd Mon Sep 17 00:00:00 2001 From: Angela Ruiz Date: Mon, 28 Apr 2025 14:17:21 +0200 Subject: [PATCH 31/38] scanner angela, cambios en find by usn --- .../IronLibrary/demo/repositories/IssueRepository.java | 9 +++++++++ .../IronLibrary/demo/services/LibraryService1.java | 7 ++++--- .../java/IronLibrary/demo/services/ScannerAngela.java | 7 ++++++- .../java/IronLibrary/demo/services/ScannerIrene1.java | 10 +++++----- 4 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 src/main/java/IronLibrary/demo/repositories/IssueRepository.java diff --git a/src/main/java/IronLibrary/demo/repositories/IssueRepository.java b/src/main/java/IronLibrary/demo/repositories/IssueRepository.java new file mode 100644 index 00000000..20ad6cbf --- /dev/null +++ b/src/main/java/IronLibrary/demo/repositories/IssueRepository.java @@ -0,0 +1,9 @@ +package IronLibrary.demo.repositories; + +import IronLibrary.demo.models.Issue; +import IronLibrary.demo.models.Student; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface IssueRepository extends JpaRepository { + Issue findByStudentIssue (Student studentIssue); +} diff --git a/src/main/java/IronLibrary/demo/services/LibraryService1.java b/src/main/java/IronLibrary/demo/services/LibraryService1.java index 1c5e4d9b..eae895d0 100644 --- a/src/main/java/IronLibrary/demo/services/LibraryService1.java +++ b/src/main/java/IronLibrary/demo/services/LibraryService1.java @@ -7,7 +7,7 @@ import java.time.LocalDate; -public class LibraryService { +public class LibraryService1 { @Autowired BookRepository bookRepository; @@ -15,7 +15,7 @@ public class LibraryService { @Autowired AuthorRepository authorRepository; - public LibraryService(BookRepository bookRepository, AuthorRepository authorRepository) { + public LibraryService1(BookRepository bookRepository, AuthorRepository authorRepository) { this.bookRepository = bookRepository; this.authorRepository = authorRepository; } @@ -41,7 +41,8 @@ public void addBookAndAuthor(String isbn, String title, String category, int qua //insertar libro bookRepository.addBook(isbn, title, category, quantity); //insertar autor - authorRepository.addAuthor(authorName, authorEmail, authorBook); //como lo enlazo a book? +// authorRepository.addAuthor(authorName, authorEmail, authorBook); //como lo enlazo a book? + //te he comentado esta linea porque me daba fallo //como hacemos que se conecten con la foreign key? existe tabla author book diff --git a/src/main/java/IronLibrary/demo/services/ScannerAngela.java b/src/main/java/IronLibrary/demo/services/ScannerAngela.java index c14113c2..0d078217 100644 --- a/src/main/java/IronLibrary/demo/services/ScannerAngela.java +++ b/src/main/java/IronLibrary/demo/services/ScannerAngela.java @@ -2,8 +2,10 @@ import IronLibrary.demo.IronLibraryApplication; import IronLibrary.demo.models.Book; +import IronLibrary.demo.models.Issue; import IronLibrary.demo.models.Student; import IronLibrary.demo.repositories.BookRepository; +import IronLibrary.demo.repositories.IssueRepository; import IronLibrary.demo.repositories.StudentRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; @@ -20,6 +22,8 @@ public class ScannerAngela implements CommandLineRunner { private BookRepository bookRepository; @Autowired private StudentRepository studentRepository; + @Autowired + private IssueRepository issueRepository; public static void main(String[] args) { SpringApplication.run(IronLibraryApplication.class, args); @@ -47,12 +51,13 @@ public void run(String... args) { String usn = scanner.nextLine(); List books = bookRepository.findBookTitlesByStudentUsn(usn); Student student = studentRepository.findStudentByUsn(usn); + Issue issue = issueRepository.findByStudentIssue(student); if (books.isEmpty()) { } else { for(Book book: books) { System.out.println("Book Title Student Name Return date\n" + - book.getTitle() + " " + student.getName() ); + book.getTitle() + " " + student.getName() + " " + issue.getReturnDate()); } diff --git a/src/main/java/IronLibrary/demo/services/ScannerIrene1.java b/src/main/java/IronLibrary/demo/services/ScannerIrene1.java index 4fe10c99..45e34632 100644 --- a/src/main/java/IronLibrary/demo/services/ScannerIrene1.java +++ b/src/main/java/IronLibrary/demo/services/ScannerIrene1.java @@ -9,17 +9,17 @@ import java.util.Scanner; @SpringBootApplication -public class ScannerIrene implements CommandLineRunner { +public class ScannerIrene1 implements CommandLineRunner { @Autowired BookRepository bookRepository; @Autowired AuthorRepository authorRepository; @Autowired - LibraryService libraryService; + LibraryService1 libraryService1; public static void main(String[] args) { - SpringApplication.run(ScannerIrene.class, args); + SpringApplication.run(ScannerIrene1.class, args); } @Override @@ -37,7 +37,7 @@ public void run(String... args) throws Exception { switch (choice) { case 5: - System.out.println("This is the list for all books available and their corresponding authors: " + authorRepository.findAllByAuthor()); + System.out.println("This is the list for all books available and their corresponding authors: " + authorRepository.findAllBooksWithAuthor()); //hay que corregir el metodo break; case 6: @@ -51,7 +51,7 @@ public void run(String... args) throws Exception { System.out.println("Enter book ISBN: "); String isbn = scanner.nextLine(); - libraryService.issueBookToStudent(usn, name, isbn); + libraryService1.issueBookToStudent(usn, name, isbn); break; } } //metamos default con invalid choice From eb6b31b82ce63e75d4db003e70fdc460e03b412e Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Tue, 29 Apr 2025 09:08:51 +0200 Subject: [PATCH 32/38] authorBook corregido --- src/main/java/IronLibrary/demo/models/Author.java | 3 ++- .../java/IronLibrary/demo/services/LibraryService1.java | 9 +++++---- src/main/java/IronLibrary/demo/services/Scanner.java | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/IronLibrary/demo/models/Author.java b/src/main/java/IronLibrary/demo/models/Author.java index dd6fc4a9..fb711274 100644 --- a/src/main/java/IronLibrary/demo/models/Author.java +++ b/src/main/java/IronLibrary/demo/models/Author.java @@ -24,9 +24,10 @@ public class Author { public Author() { } - public Author(String name, String email) { + public Author(String name, String email, Book authorBook) { this.name = name; this.email = email; + this.authorBook = authorBook; } public int getAuthorId() { diff --git a/src/main/java/IronLibrary/demo/services/LibraryService1.java b/src/main/java/IronLibrary/demo/services/LibraryService1.java index eae895d0..704c911e 100644 --- a/src/main/java/IronLibrary/demo/services/LibraryService1.java +++ b/src/main/java/IronLibrary/demo/services/LibraryService1.java @@ -1,5 +1,6 @@ package IronLibrary.demo.services; +import IronLibrary.demo.models.Book; import IronLibrary.demo.repositories.AuthorRepository; import IronLibrary.demo.repositories.BookRepository; import jakarta.transaction.Transactional; @@ -14,6 +15,8 @@ public class LibraryService1 { @Autowired AuthorRepository authorRepository; + @Autowired + Book book; public LibraryService1(BookRepository bookRepository, AuthorRepository authorRepository) { this.bookRepository = bookRepository; @@ -37,13 +40,11 @@ public void issueBookToStudent (String usn, String name, String isbn) { @Transactional - public void addBookAndAuthor(String isbn, String title, String category, int quantity, String authorName, String authorEmail) { + public void addBookAndAuthor(String isbn, String title, String category, int quantity, String authorName, String authorEmail, Book authorBook) { //insertar libro bookRepository.addBook(isbn, title, category, quantity); //insertar autor -// authorRepository.addAuthor(authorName, authorEmail, authorBook); //como lo enlazo a book? - //te he comentado esta linea porque me daba fallo - //como hacemos que se conecten con la foreign key? existe tabla author book + authorRepository.addAuthor(authorName, authorEmail, authorBook); System.out.println("Book and author had been added correctly"); diff --git a/src/main/java/IronLibrary/demo/services/Scanner.java b/src/main/java/IronLibrary/demo/services/Scanner.java index b259fe16..6fbf68cf 100644 --- a/src/main/java/IronLibrary/demo/services/Scanner.java +++ b/src/main/java/IronLibrary/demo/services/Scanner.java @@ -24,4 +24,5 @@ public void run(String... args) { // también podemos recibir NINGUN argumento // puedo usar el bookRepository o cualquiera de las BEANS de spring framework // para salir del proceso: System.exit(0); -}} \ No newline at end of file +} +} \ No newline at end of file From 76df0ed3061b1b900ec9a481840bb83df490f468 Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Tue, 29 Apr 2025 11:06:43 +0200 Subject: [PATCH 33/38] cambios sql --- .../java/IronLibrary/demo/models/Author.java | 4 +-- .../java/IronLibrary/demo/models/Book.java | 1 + .../java/IronLibrary/demo/models/Issue.java | 25 +++++++++++-------- .../demo/RepositoryTestAngela.java | 4 +-- .../demo/RepositoryTestsIrene.java | 14 +++-------- .../java/IronLibrary/demo/TestMiguel.java | 4 +-- 6 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/main/java/IronLibrary/demo/models/Author.java b/src/main/java/IronLibrary/demo/models/Author.java index fb711274..b4f86174 100644 --- a/src/main/java/IronLibrary/demo/models/Author.java +++ b/src/main/java/IronLibrary/demo/models/Author.java @@ -18,8 +18,8 @@ public class Author { private String email; @OneToOne - @JoinColumn(name = "author_book") - private Book authorBook; + @JoinColumn(name = "author_book", referencedColumnName = "isbn") + private Book authorBook; public Author() { } diff --git a/src/main/java/IronLibrary/demo/models/Book.java b/src/main/java/IronLibrary/demo/models/Book.java index 7828eed6..cc915803 100644 --- a/src/main/java/IronLibrary/demo/models/Book.java +++ b/src/main/java/IronLibrary/demo/models/Book.java @@ -8,6 +8,7 @@ @Table(name = "Book") public class Book { @Id + private String isbn; private String title; diff --git a/src/main/java/IronLibrary/demo/models/Issue.java b/src/main/java/IronLibrary/demo/models/Issue.java index 320bcf86..7e519bfd 100644 --- a/src/main/java/IronLibrary/demo/models/Issue.java +++ b/src/main/java/IronLibrary/demo/models/Issue.java @@ -19,19 +19,22 @@ public class Issue { @Column(name = "return_date") private Date returnDate; - @Column(name = "issue_student") - private String issueStudent; - - @Column(name = "issue_book") - private String issueBook; + //he añadido la relación + @OneToOne + @JoinColumn(name = "issue_student", referencedColumnName = "usn") + private Student issueStudent; @OneToOne - private Student studentIssue; + @JoinColumn(name = "issue_book", referencedColumnName = "isbn") + private Book issueBook; + + /*@OneToOne + private Student studentIssue;*/ public Issue() { } - public Issue(Date issueDate, Date returnDate, String issueStudent, String issueBook) { + public Issue(Date issueDate, Date returnDate, Student issueStudent, Book issueBook) { this.issueDate = issueDate; this.returnDate = returnDate; this.issueStudent = issueStudent; @@ -62,19 +65,19 @@ public void setReturnDate(Date returnDate) { this.returnDate = returnDate; } - public String getIssueStudent() { + public Student getIssueStudent() { return issueStudent; } - public void setIssueStudent(String issueStudent) { + public void setIssueStudent(Student issueStudent) { this.issueStudent = issueStudent; } - public String getIssueBook() { + public Book getIssueBook() { return issueBook; } - public void setIssueBook(String issueBook) { + public void setIssueBook(Book issueBook) { this.issueBook = issueBook; } diff --git a/src/test/java/IronLibrary/demo/RepositoryTestAngela.java b/src/test/java/IronLibrary/demo/RepositoryTestAngela.java index 9f906277..fd33d8e7 100644 --- a/src/test/java/IronLibrary/demo/RepositoryTestAngela.java +++ b/src/test/java/IronLibrary/demo/RepositoryTestAngela.java @@ -21,12 +21,12 @@ public class RepositoryTestAngela { @Autowired private AuthorRepository authorRepository; - @Test + /* @Test @DisplayName("Search book by title") @Test @DisplayName("Search book by category") @Test - @DisplayName("List all books along with author") + @DisplayName("List all books along with author")*/ } diff --git a/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java b/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java index 514be833..dd2b3a8e 100644 --- a/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java +++ b/src/test/java/IronLibrary/demo/RepositoryTestsIrene.java @@ -35,8 +35,6 @@ public class RepositoryTestsIrene { @Autowired private AuthorRepository authorRepository; - @Autowired - private EntityManager entityManager; @Test @DisplayName("añade un libro") @@ -49,7 +47,7 @@ public void addBookCorrectly(){ @Test @DisplayName("añade un autor") public void addAuthorCorrectly(){ - Author author = new Author("Isabel Allende", "isabel.allende@example.com"); + Author author = new Author("Isabel Allende", "isabel.allende@example.com", new Book("978-0061120060", "La casa de los espíritus", "Novela", 3)); List authorList = new ArrayList<>(); authorList.add(author); //addBook o add? System.out.println("New book added: " + author); @@ -58,7 +56,7 @@ public void addAuthorCorrectly(){ @Test @DisplayName("comprobando si encuentra un libro por su autor") public void findByAuthorReturnsCorrectBook(){ - authorRepository.findByAuthor(new Author("Isabel Allende", "isabel.allende@example.com")); + authorRepository.findByAuthor(new Author("Isabel Allende", "isabel.allende@example.com", new Book("978-0061120060", "La casa de los espíritus", "Novela", 3))); // System.out.println("");//? } @Test @@ -71,14 +69,10 @@ public void testIssueBookToStudent(){ bookRepository.insertStudent(usn, name); - entityManager.flush(); //esto es para que JPA lea de la base y no de cache - entityManager.clear(); + bookRepository.addBook("879998-45", "Biography", "Drama", 1); + - Student result = entityManager.find(Student.class, usn); - assertNotNull(result); - assertEquals(usn, result.getUsn()); - assertEquals(name, result.getName()); } /* @Query(value = "INSERT INTO Student (usn, name) VALUES (:usn, :name)", nativeQuery = true) diff --git a/src/test/java/IronLibrary/demo/TestMiguel.java b/src/test/java/IronLibrary/demo/TestMiguel.java index e9e112a1..3be8b574 100644 --- a/src/test/java/IronLibrary/demo/TestMiguel.java +++ b/src/test/java/IronLibrary/demo/TestMiguel.java @@ -25,8 +25,8 @@ public void testFindByStudentUsn() { bookRepository.save(book1); Issue issue = new Issue(); - issue.setIssueBook("252"); - issue.setIssueStudent("USN123"); + //issue.setIssueBook("252"); + //issue.setIssueStudent("USN123"); //issueRepository.save } From 3ef27c2179d8b204041c6f8cc258c02f818f7767 Mon Sep 17 00:00:00 2001 From: Angela Ruiz Date: Tue, 29 Apr 2025 11:06:50 +0200 Subject: [PATCH 34/38] modificacion scanner angela --- .../demo/services/ScannerAngela.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/IronLibrary/demo/services/ScannerAngela.java b/src/main/java/IronLibrary/demo/services/ScannerAngela.java index 0d078217..79dab3e4 100644 --- a/src/main/java/IronLibrary/demo/services/ScannerAngela.java +++ b/src/main/java/IronLibrary/demo/services/ScannerAngela.java @@ -25,6 +25,25 @@ public class ScannerAngela implements CommandLineRunner { @Autowired private IssueRepository issueRepository; + //PALETA DE COLORES TERMINAL + public static final String ANSI_RESET = "\u001B[0m"; + public static final String ANSI_BLACK = "\u001B[30m"; + public static final String ANSI_RED = "\u001B[31m"; + public static final String ANSI_GREEN = "\u001B[32m"; + public static final String ANSI_YELLOW = "\u001B[33m"; + public static final String ANSI_BLUE = "\u001B[34m"; + public static final String ANSI_PURPLE = "\u001B[35m"; + public static final String ANSI_CYAN = "\u001B[36m"; + public static final String ANSI_WHITE = "\u001B[37m"; + static final String ANSI_BLACK_BACKGROUND = "\u001B[40m"; + public static final String ANSI_RED_BACKGROUND = "\u001B[41m"; + public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m"; + public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m"; + public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m"; + public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m"; + public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m"; + public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m"; + public static void main(String[] args) { SpringApplication.run(IronLibraryApplication.class, args); } @@ -37,10 +56,11 @@ public void run(String... args) { boolean continueRunning = true; while (continueRunning) { - System.out.println("7.List books by USN"); + System.out.println(ANSI_PURPLE + "7.List books by USN" + ANSI_RESET); System.out.println("8. Exit"); - System.out.println("Enter your choice:"); + + System.out.println(ANSI_PURPLE_BACKGROUND + "Enter your choice:" + ANSI_RESET); int choice = scanner.nextInt(); scanner.nextLine(); @@ -58,8 +78,6 @@ public void run(String... args) { for(Book book: books) { System.out.println("Book Title Student Name Return date\n" + book.getTitle() + " " + student.getName() + " " + issue.getReturnDate()); - - } } break; From cb6702defe4da378bc0abda70a73f9e8e6628d3f Mon Sep 17 00:00:00 2001 From: Pacheca Date: Tue, 29 Apr 2025 11:09:19 +0200 Subject: [PATCH 35/38] add miguel --- .../java/IronLibrary/demo/models/Author.java | 2 +- .../java/IronLibrary/demo/models/Book.java | 1 + .../java/IronLibrary/demo/models/Issue.java | 3 +- .../demo/repositories/BookRepository.java | 1 + .../IronLibrary/demo/services/Scanner.java | 5 +- .../demo/services/ServiceMiguel.java | 93 ++++++++++++++----- .../java/IronLibrary/demo/TestMiguel.java | 24 ++--- 7 files changed, 94 insertions(+), 35 deletions(-) diff --git a/src/main/java/IronLibrary/demo/models/Author.java b/src/main/java/IronLibrary/demo/models/Author.java index dd6fc4a9..1a062bc6 100644 --- a/src/main/java/IronLibrary/demo/models/Author.java +++ b/src/main/java/IronLibrary/demo/models/Author.java @@ -18,7 +18,7 @@ public class Author { private String email; @OneToOne - @JoinColumn(name = "author_book") + @JoinColumn(name = "author_book", referencedColumnName = "isbn") private Book authorBook; public Author() { diff --git a/src/main/java/IronLibrary/demo/models/Book.java b/src/main/java/IronLibrary/demo/models/Book.java index 7828eed6..21703590 100644 --- a/src/main/java/IronLibrary/demo/models/Book.java +++ b/src/main/java/IronLibrary/demo/models/Book.java @@ -67,4 +67,5 @@ public String toString() { ", quantity=" + quantity + '}'; } + } diff --git a/src/main/java/IronLibrary/demo/models/Issue.java b/src/main/java/IronLibrary/demo/models/Issue.java index 320bcf86..94069a46 100644 --- a/src/main/java/IronLibrary/demo/models/Issue.java +++ b/src/main/java/IronLibrary/demo/models/Issue.java @@ -26,7 +26,8 @@ public class Issue { private String issueBook; @OneToOne - private Student studentIssue; + @JoinColumn(name= "usn") + private Student studentUsn; public Issue() { } diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepository.java b/src/main/java/IronLibrary/demo/repositories/BookRepository.java index a9ee6b0d..30360118 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepository.java @@ -61,4 +61,5 @@ void insertIssue( List findByTitle(String title); + } diff --git a/src/main/java/IronLibrary/demo/services/Scanner.java b/src/main/java/IronLibrary/demo/services/Scanner.java index b259fe16..936ae9de 100644 --- a/src/main/java/IronLibrary/demo/services/Scanner.java +++ b/src/main/java/IronLibrary/demo/services/Scanner.java @@ -24,4 +24,7 @@ public void run(String... args) { // también podemos recibir NINGUN argumento // puedo usar el bookRepository o cualquiera de las BEANS de spring framework // para salir del proceso: System.exit(0); -}} \ No newline at end of file +} + + +} \ No newline at end of file diff --git a/src/main/java/IronLibrary/demo/services/ServiceMiguel.java b/src/main/java/IronLibrary/demo/services/ServiceMiguel.java index 98e797ab..5baa1faa 100644 --- a/src/main/java/IronLibrary/demo/services/ServiceMiguel.java +++ b/src/main/java/IronLibrary/demo/services/ServiceMiguel.java @@ -4,41 +4,92 @@ import IronLibrary.demo.repositories.AuthorRepository; import IronLibrary.demo.repositories.BookRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.List; @SpringBootApplication -public class ServiceMiguel { +public class ServiceMiguel implements CommandLineRunner { @Autowired BookRepository bookRepository; + @Autowired AuthorRepository authorRepository; - //Agregar un libro - public void addBook(Book book) { - bookRepository.save(book); - } + @Override + public void run(String... args) { + Scanner sc = new Scanner(System.in); - //Buscar libro por título - public List findBooksByTitle(String title) { - return bookRepository.findByTitle(title); - } + while (true) { + System.out.println("\n1. Add Book"); + System.out.println("2. Search by title"); + System.out.println("3. Search by category"); + System.out.println("4. Search by author"); + System.out.println("0. Exit"); + System.out.print("Choose option: "); - //Buscar libro por categoría - public List findBooksByCategory(String category) { - return bookRepository.findByCategory(category); - } + String opcion = sc.nextLine(); + + if (opcion.equals("0")) break; + + switch (opcion) { + case "1" -> { + System.out.print("Title: "); + String title = sc.nextLine(); + + System.out.print("Category: "); + String category = sc.nextLine(); + + System.out.print("Author: "); + String authorName = sc.nextLine(); - //Buscar libro por autor - public List findBooksByAuthor(String authorName) { - Author author = authorRepository.findByName(authorName); - if (author != null) { - return bookRepository.findByAuthor(author); - } else { - return null; + Author author = authorRepository.findByName(authorName); + if (author == null) { + author = new Author(); + author.setName(authorName); + authorRepository.save(author); + } + + Book book = new Book(); + book.setTitle(title); + book.setCategory(category); + book.setAuthor(author); // falla por el ManyToOne + bookRepository.save(book); + + System.out.println("Book added"); + } + + case "2" -> { + System.out.print("Book title: "); + String title = sc.nextLine(); + bookRepository.findByTitle(title).forEach(System.out::println); + } + + case "3" -> { + System.out.print("Category: "); + String category = sc.nextLine(); + bookRepository.findByCategory(category).forEach(System.out::println); + } + + case "4" -> { + System.out.print("Author: "); + String authorName = sc.nextLine(); + Author author = authorRepository.findByName(authorName); + if (author != null) { + bookRepository.findByAuthor(author).forEach(System.out::println); + } else { + System.out.println("Author not found."); + } + } + + default -> System.out.println("Option not recognized."); + } } + + System.out.println("Library closed"); } -} + +} \ No newline at end of file diff --git a/src/test/java/IronLibrary/demo/TestMiguel.java b/src/test/java/IronLibrary/demo/TestMiguel.java index e9e112a1..d165d2e4 100644 --- a/src/test/java/IronLibrary/demo/TestMiguel.java +++ b/src/test/java/IronLibrary/demo/TestMiguel.java @@ -4,30 +4,32 @@ import IronLibrary.demo.models.Book; import IronLibrary.demo.models.Issue; import IronLibrary.demo.repositories.BookRepository; +import IronLibrary.demo.repositories.BookRepositoryMiguel; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.List; + @SpringBootTest public class TestMiguel { @Autowired - private BookRepository bookRepository; + private BookRepositoryMiguel bookRepositoryMiguel; //private IssueRepository issueRepository; @Test @DisplayName("Buscar Libro por USN") - public void testFindByStudentUsn() { - Book book1 = new Book(); - book1.setTitle("El mago"); - book1.setIsbn("252"); - bookRepository.save(book1); - - Issue issue = new Issue(); - issue.setIssueBook("252"); - issue.setIssueStudent("USN123"); - //issueRepository.save + public void testFindBookTitlesByStudentUsn() { + String usn = "978-0140449136"; + List titles = bookRepositoryMiguel.findBookTitlesByStudentUsn(usn); + assertNotNull(titles); + assertFalse(titles.isEmpty(), "No se encontraron libros emitidos para el USN dado"); + for (String title : titles) { + System.out.println(title); + } } + } From 23ce5fb5a6be0ce16cbdeb2ec90a5c4cef6ca586 Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Tue, 29 Apr 2025 11:55:03 +0200 Subject: [PATCH 36/38] juntando scanner --- .../java/IronLibrary/demo/models/Issue.java | 6 - .../demo/repositories/BookRepository.java | 2 +- .../repositories/BookRepositoryAngela.java | 16 -- .../repositories/BookRepositoryIrene.java | 48 ----- .../repositories/BookRepositoryMiguel.java | 17 -- .../IronLibrary/demo/services/Scanner.java | 30 ---- .../demo/services/ScannerMenu.java | 169 ++++++++++++++++++ .../java/IronLibrary/demo/TestMiguel.java | 6 +- 8 files changed, 173 insertions(+), 121 deletions(-) delete mode 100644 src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java delete mode 100644 src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java delete mode 100644 src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java delete mode 100644 src/main/java/IronLibrary/demo/services/Scanner.java create mode 100644 src/main/java/IronLibrary/demo/services/ScannerMenu.java diff --git a/src/main/java/IronLibrary/demo/models/Issue.java b/src/main/java/IronLibrary/demo/models/Issue.java index 1d529c95..076dff75 100644 --- a/src/main/java/IronLibrary/demo/models/Issue.java +++ b/src/main/java/IronLibrary/demo/models/Issue.java @@ -19,12 +19,6 @@ public class Issue { @Column(name = "return_date") private Date returnDate; - @Column(name = "issue_student") - private String issueStudent; - - @Column(name = "issue_book") - private String issueBook; - @OneToOne @JoinColumn(name = "issue_student", referencedColumnName = "usn") private Student issueStudent; diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepository.java b/src/main/java/IronLibrary/demo/repositories/BookRepository.java index 30360118..de1e800a 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepository.java @@ -55,7 +55,7 @@ void insertIssue( nativeQuery = true) List findBookTitlesByStudentUsn(@Param("usn") String usn); - List findByAuthor(Author author); + List findByAuthor(String authorName); List findByCategory(String category); diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java deleted file mode 100644 index d43c45c2..00000000 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryAngela.java +++ /dev/null @@ -1,16 +0,0 @@ -package IronLibrary.demo.repositories; -import IronLibrary.demo.models.Book; -import org.springframework.data.jpa.repository.JpaRepository; -import java.util.List; - -public interface BookRepositoryAngela extends JpaRepository { -// Search book by title: This action is responsible for searching a book by title. - Book findBookByTitle(String title); - -// Search book by category: This action is responsible for searching a book by category. - Book findBookByCategory(String category); - - - - -} diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java deleted file mode 100644 index bbc1255d..00000000 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryIrene.java +++ /dev/null @@ -1,48 +0,0 @@ -package IronLibrary.demo.repositories; - -import IronLibrary.demo.models.Book; -import jakarta.transaction.Transactional; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface BookRepositoryIrene extends JpaRepository { - - @Modifying //oblig al hacer INSERT - @Transactional //pq es dinamico - @Query(value= "INSERT INTO Book (isbn, title, category, quantity) VALUES (:isbn, :title, :category, :quantity)", nativeQuery = true) - //nativeQuery = true indica que es SQL nativo, no JPQL - void addBook( - @Param("isbn") String isbn, - @Param("title") String title, - @Param("category") String category, - @Param("quantity") int quantity - ); //como uno esto al add author? - - - //Issue book to student - @Modifying - @Transactional - @Query(value = "INSERT INTO Student (usn, name) VALUES (:usn, :name)", nativeQuery = true) - void insertStudent(@Param("usn") String usn, @Param("name") String name); - - // Search book by title: This action is responsible for searching a book by title. - Book findBookByTitle(String title); - - // Search book by category: This action is responsible for searching a book by category. - Book findBookByCategory(String category); - - // List books by usn: - @Query(value = "SELECT Book.tittle FROM Book " + - "INNER JOIN Issue ON Book.isbn = Issue.issue_book " + - "WHERE Issue.issue_student = :usn", - nativeQuery = true) - List findBookTitlesByStudentUsn(@Param("usn") String usn); - - -} diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java b/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java deleted file mode 100644 index fcd32286..00000000 --- a/src/main/java/IronLibrary/demo/repositories/BookRepositoryMiguel.java +++ /dev/null @@ -1,17 +0,0 @@ -package IronLibrary.demo.repositories; - -import IronLibrary.demo.models.Book; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -public interface BookRepositoryMiguel extends JpaRepository { - // List books by usn: - @Query(value = "SELECT Book.tittle FROM Book " + - "INNER JOIN Issue ON Book.isbn = Issue.issue_book " + - "WHERE Issue.issue_student = :usn", - nativeQuery = true) - List findBookTitlesByStudentUsn(@Param("usn") String usn); -} diff --git a/src/main/java/IronLibrary/demo/services/Scanner.java b/src/main/java/IronLibrary/demo/services/Scanner.java deleted file mode 100644 index 936ae9de..00000000 --- a/src/main/java/IronLibrary/demo/services/Scanner.java +++ /dev/null @@ -1,30 +0,0 @@ -package IronLibrary.demo.services; - -import IronLibrary.demo.IronLibraryApplication; -import IronLibrary.demo.repositories.BookRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication - -public class Scanner implements CommandLineRunner { - @Autowired - private BookRepository bookRepository; - public static void main(String[] args) { - SpringApplication.run(IronLibraryApplication.class, args); -} - -@Override -public void run(String... args) { // también podemos recibir NINGUN argumento - // es donde ponemos el WHILE LOOP para nuestro menú - System.out.println("Bienvenido a nuestra app de libros"); // toda la parte de scanner la ponemos por aquí. - // para que aquí no tengamos toda la lógica metida en 400 líneas. Podemos crear un package de services que gestione partes de la lógica - // puedo usar el bookRepository o cualquiera de las BEANS de spring framework - // para salir del proceso: - System.exit(0); -} - - -} \ No newline at end of file diff --git a/src/main/java/IronLibrary/demo/services/ScannerMenu.java b/src/main/java/IronLibrary/demo/services/ScannerMenu.java new file mode 100644 index 00000000..3eb88070 --- /dev/null +++ b/src/main/java/IronLibrary/demo/services/ScannerMenu.java @@ -0,0 +1,169 @@ +package IronLibrary.demo.services; +import IronLibrary.demo.models.Author; +import IronLibrary.demo.models.Book; +import IronLibrary.demo.models.Issue; +import IronLibrary.demo.models.Student; +import IronLibrary.demo.repositories.AuthorRepository; +import IronLibrary.demo.repositories.BookRepository; +import IronLibrary.demo.repositories.IssueRepository; +import IronLibrary.demo.repositories.StudentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.util.List; +import java.util.Scanner; + +@SpringBootApplication +public class ScannerMenu implements CommandLineRunner { + + @Autowired + BookRepository bookRepository; + @Autowired + AuthorRepository authorRepository; + @Autowired + LibraryService1 libraryService1; + @Autowired + IssueRepository issueRepository; + @Autowired + StudentRepository studentRepository; + + //PALETA DE COLORES TERMINAL + public static final String ANSI_RESET = "\u001B[0m"; + public static final String ANSI_BLACK = "\u001B[30m"; + public static final String ANSI_RED = "\u001B[31m"; + public static final String ANSI_GREEN = "\u001B[32m"; + public static final String ANSI_YELLOW = "\u001B[33m"; + public static final String ANSI_BLUE = "\u001B[34m"; + public static final String ANSI_PURPLE = "\u001B[35m"; + public static final String ANSI_CYAN = "\u001B[36m"; + public static final String ANSI_WHITE = "\u001B[37m"; + static final String ANSI_BLACK_BACKGROUND = "\u001B[40m"; + public static final String ANSI_RED_BACKGROUND = "\u001B[41m"; + public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m"; + public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m"; + public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m"; + public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m"; + public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m"; + public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m"; + + public static void main(String[] args) { + SpringApplication.run(Scanner.class, args); + } + + @Override + public void run(String... args) throws Exception { + //aqui ponemos while loop menu + Scanner scanner = new Scanner(System.in); + boolean continueRunning = true; + while (continueRunning) { + System.out.println("\n1. Add Book"); + System.out.println("2. Search by title"); + System.out.println("3. Search by category"); + System.out.println("4. Search by author"); + System.out.println("5.List all books along with author"); + System.out.println("6. Issue book to student"); + System.out.println(ANSI_PURPLE + "7.List books by USN" + ANSI_RESET); + System.out.println("8. Exit"); + + System.out.println(ANSI_PURPLE_BACKGROUND + "Enter your choice:" + ANSI_RESET); + + int choice = scanner.nextInt(); + scanner.nextLine(); + + switch (choice) { + + case 1: + System.out.print("Title: "); + String title = scanner.nextLine(); + + System.out.print("Category: "); + String category = scanner.nextLine(); + + System.out.print("Author: "); + String authorName = scanner.nextLine(); + + Author author = authorRepository.findByName(authorName); + if (author == null) { + author = new Author(); + author.setName(authorName); + authorRepository.save(author); + } + + Book book = new Book(); + book.setTitle(title); + book.setCategory(category); + author.setName(authorName); + bookRepository.save(book); + + System.out.println("Book added"); + + + case 2: + System.out.print("Book title: "); + title = scanner.nextLine(); + bookRepository.findByTitle(title).forEach(System.out::println); + + + case 3: + System.out.print("Category: "); + category = scanner.nextLine(); + bookRepository.findByCategory(category).forEach(System.out::println); + + case 4: + System.out.print("Author: "); + authorName = scanner.nextLine(); + if (authorName != null) { + bookRepository.findByAuthor(authorName).forEach(System.out::println); + } else { + System.out.println("Author not found."); + } + + case 5: + System.out.println("This is the list for all books available and their corresponding authors: " + authorRepository.findAllBooksWithAuthor()); + //hay que corregir el metodo + break; + + case 6: + System.out.println("You chose to issue a book to a student"); + System.out.println("Please enter the student's usn: "); + String usn = scanner.nextLine(); + + System.out.println("Enter name: "); + String name = scanner.nextLine(); + + System.out.println("Enter book ISBN: "); + String isbn = scanner.nextLine(); + + libraryService1.issueBookToStudent(usn, name, isbn); + break; + + case 7: + System.out.println("You choosed searching books by USN."); + System.out.println("Please, enter a USN number:"); + usn = scanner.nextLine(); + List books = bookRepository.findBookTitlesByStudentUsn(usn); + Student student = studentRepository.findStudentByUsn(usn); + Issue issue = issueRepository.findByStudentIssue(student); + if (books.isEmpty()) { + System.out.println("This student doesn't have any book issued"); + } else { + for(Book eachBook: books) { + System.out.println("Book Title Student Name Return date\n" + + eachBook.getTitle() + " " + student.getName() + " " + issue.getReturnDate()); + } + } + case 8: + System.out.println("Exiting program..."); + continueRunning = false; + break; + + default: System.out.println("Option not recognized."); + } + } + + scanner.close(); + System.exit(0); + } +} diff --git a/src/test/java/IronLibrary/demo/TestMiguel.java b/src/test/java/IronLibrary/demo/TestMiguel.java index 88b1135e..de9e5412 100644 --- a/src/test/java/IronLibrary/demo/TestMiguel.java +++ b/src/test/java/IronLibrary/demo/TestMiguel.java @@ -14,7 +14,7 @@ @SpringBootTest public class TestMiguel { @Autowired - private BookRepositoryMiguel bookRepositoryMiguel; + private BookRepository bookRepository; //private IssueRepository issueRepository; @@ -22,11 +22,11 @@ public class TestMiguel { @DisplayName("Buscar Libro por USN") public void testFindBookTitlesByStudentUsn() { String usn = "978-0140449136"; - List titles = bookRepositoryMiguel.findBookTitlesByStudentUsn(usn); + List titles = bookRepository.findBookTitlesByStudentUsn(usn); assertNotNull(titles); assertFalse(titles.isEmpty(), "No se encontraron libros emitidos para el USN dado"); - for (String title : titles) { + for (Book title : titles) { System.out.println(title); } } From ff56c744a1360109c0169953cc765bbc44084ba9 Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Tue, 29 Apr 2025 16:34:17 +0200 Subject: [PATCH 37/38] fallos en el menu --- .../demo/{services => }/ScannerMenu.java | 116 +++++++++++++----- .../java/IronLibrary/demo/models/Book.java | 1 - .../java/IronLibrary/demo/models/Issue.java | 21 ++-- .../java/IronLibrary/demo/models/Student.java | 2 +- .../demo/repositories/AuthorRepository.java | 10 +- .../demo/repositories/BookRepository.java | 12 +- .../demo/repositories/IssueRepository.java | 2 +- .../demo/repositories/StudentRepository.java | 1 + .../demo/services/LibraryService1.java | 16 +-- .../demo/services/ScannerAngela.java | 4 +- .../demo/services/ScannerIrene1.java | 4 +- .../demo/services/ServiceMiguel.java | 4 +- 12 files changed, 122 insertions(+), 71 deletions(-) rename src/main/java/IronLibrary/demo/{services => }/ScannerMenu.java (51%) diff --git a/src/main/java/IronLibrary/demo/services/ScannerMenu.java b/src/main/java/IronLibrary/demo/ScannerMenu.java similarity index 51% rename from src/main/java/IronLibrary/demo/services/ScannerMenu.java rename to src/main/java/IronLibrary/demo/ScannerMenu.java index 3eb88070..0f8fbf33 100644 --- a/src/main/java/IronLibrary/demo/services/ScannerMenu.java +++ b/src/main/java/IronLibrary/demo/ScannerMenu.java @@ -1,4 +1,4 @@ -package IronLibrary.demo.services; +package IronLibrary.demo; import IronLibrary.demo.models.Author; import IronLibrary.demo.models.Book; import IronLibrary.demo.models.Issue; @@ -7,12 +7,14 @@ import IronLibrary.demo.repositories.BookRepository; import IronLibrary.demo.repositories.IssueRepository; import IronLibrary.demo.repositories.StudentRepository; +import IronLibrary.demo.services.LibraryService1; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.List; +import java.util.Optional; import java.util.Scanner; @SpringBootApplication @@ -49,7 +51,7 @@ public class ScannerMenu implements CommandLineRunner { public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m"; public static void main(String[] args) { - SpringApplication.run(Scanner.class, args); + SpringApplication.run(ScannerMenu.class, args); } @Override @@ -58,16 +60,17 @@ public void run(String... args) throws Exception { Scanner scanner = new Scanner(System.in); boolean continueRunning = true; while (continueRunning) { - System.out.println("\n1. Add Book"); - System.out.println("2. Search by title"); - System.out.println("3. Search by category"); - System.out.println("4. Search by author"); - System.out.println("5.List all books along with author"); - System.out.println("6. Issue book to student"); - System.out.println(ANSI_PURPLE + "7.List books by USN" + ANSI_RESET); - System.out.println("8. Exit"); + System.out.println("Welcome to the Iron Library. \nEnter your choice from the menu below:"); + System.out.println(ANSI_PURPLE_BACKGROUND + "1. Add Book"+ ANSI_RESET); + System.out.println(ANSI_PURPLE_BACKGROUND + "2. Search by title"+ ANSI_RESET); + System.out.println(ANSI_PURPLE_BACKGROUND + "3. Search by category"+ ANSI_RESET); + System.out.println(ANSI_PURPLE_BACKGROUND + "4. Search by author"+ ANSI_RESET); + System.out.println(ANSI_PURPLE_BACKGROUND+ "5.List all books along with author"+ ANSI_RESET); + System.out.println(ANSI_PURPLE_BACKGROUND + "6. Issue book to student"+ ANSI_RESET); + System.out.println(ANSI_PURPLE_BACKGROUND + "7.List books by USN" + ANSI_RESET); + System.out.println("8. Exit"+ ANSI_RESET); + - System.out.println(ANSI_PURPLE_BACKGROUND + "Enter your choice:" + ANSI_RESET); int choice = scanner.nextInt(); scanner.nextLine(); @@ -75,54 +78,90 @@ public void run(String... args) throws Exception { switch (choice) { case 1: + System.out.println("\n1. Add a Book"); + System.out.print("ISBN: "); + String isbn = scanner.nextLine(); + System.out.print("Title: "); String title = scanner.nextLine(); System.out.print("Category: "); String category = scanner.nextLine(); - System.out.print("Author: "); - String authorName = scanner.nextLine(); - - Author author = authorRepository.findByName(authorName); - if (author == null) { - author = new Author(); - author.setName(authorName); - authorRepository.save(author); - } + System.out.println("How many books are you adding?: "); + int quantity = scanner.nextInt(); + scanner.nextLine(); - Book book = new Book(); + Book book = new Book(isbn, title, category, quantity); book.setTitle(title); book.setCategory(category); - author.setName(authorName); bookRepository.save(book); - System.out.println("Book added"); + System.out.print("Author name: "); + String authorName = scanner.nextLine(); + Optional author = Optional.ofNullable(authorRepository.findByName(authorName)); + + if (author.isEmpty()) { + System.out.println("Author email: "); + String email = scanner.nextLine(); + Author newAuthor = new Author(authorName, email, book); + /*author.setName(authorName); + author.setEmail(email); + author.setAuthorBook(book);*/ + authorRepository.save(newAuthor); + System.out.println("Book added: " + book.getIsbn() + " " + book.getTitle() + " " + book.getCategory() + " " + newAuthor.getName() + " " + newAuthor.getEmail()); + } else { + System.out.println("This author already exists"); + System.out.println("Book added to author: " + book.getIsbn() + " " + book.getTitle() + " " + book.getCategory() + " " + author.toString()); + } + + + System.out.println("Press any key to return to the main page"); + scanner.nextLine(); + break; case 2: + System.out.println("\n2. Search by title"); System.out.print("Book title: "); title = scanner.nextLine(); bookRepository.findByTitle(title).forEach(System.out::println); - + System.out.println("Press any key to return to the main page"); + scanner.nextLine(); + break; case 3: + System.out.println("\n3. Search by category"); System.out.print("Category: "); category = scanner.nextLine(); bookRepository.findByCategory(category).forEach(System.out::println); + System.out.println("Press any key to return to the main page"); + scanner.nextLine(); + break; case 4: + System.out.println("\n4. Search by author"); System.out.print("Author: "); authorName = scanner.nextLine(); if (authorName != null) { - bookRepository.findByAuthor(authorName).forEach(System.out::println); + Author author1 = authorRepository.findByName(authorName); + System.out.println("Author's book is: " + author1.getAuthorBook()); } else { System.out.println("Author not found."); } + System.out.println("Press any key to return to the main page"); + scanner.nextLine(); + break; case 5: - System.out.println("This is the list for all books available and their corresponding authors: " + authorRepository.findAllBooksWithAuthor()); - //hay que corregir el metodo + System.out.println("You chose to list all books along with their author: "); + List authorBookList = authorRepository.findAll(); + for (Author item: authorBookList ){ + System.out.println(item.getAuthorBook().getTitle()); + System.out.println(item.getName()); + } + System.out.println("Press any key to return to the main page"); + scanner.nextLine(); break; case 6: @@ -133,10 +172,18 @@ public void run(String... args) throws Exception { System.out.println("Enter name: "); String name = scanner.nextLine(); + Student student = new Student(usn, name); + studentRepository.save(student); + System.out.println("Enter book ISBN: "); - String isbn = scanner.nextLine(); + String isbnBook = scanner.nextLine(); + + Book bookSaved = bookRepository.findByIsbn(isbnBook); + Student studentSaved = studentRepository.findStudentByUsn(usn); + libraryService1.issueBookToStudent(studentSaved, name, bookSaved); - libraryService1.issueBookToStudent(usn, name, isbn); + System.out.println("Press any key to return to the main page"); + scanner.nextLine(); break; case 7: @@ -144,22 +191,27 @@ public void run(String... args) throws Exception { System.out.println("Please, enter a USN number:"); usn = scanner.nextLine(); List books = bookRepository.findBookTitlesByStudentUsn(usn); - Student student = studentRepository.findStudentByUsn(usn); - Issue issue = issueRepository.findByStudentIssue(student); + Student student1 = studentRepository.findStudentByUsn(usn); + Issue issue = issueRepository.findByIssueStudent(student1); if (books.isEmpty()) { System.out.println("This student doesn't have any book issued"); } else { for(Book eachBook: books) { System.out.println("Book Title Student Name Return date\n" + - eachBook.getTitle() + " " + student.getName() + " " + issue.getReturnDate()); + eachBook.getTitle() + " " + student1.getName() + " " + issue.getReturnLocalDate()); + System.out.println("prueba"); } } + System.out.println("Press any key to return to the main page"); + scanner.nextLine(); + break; case 8: System.out.println("Exiting program..."); continueRunning = false; break; default: System.out.println("Option not recognized."); + } } diff --git a/src/main/java/IronLibrary/demo/models/Book.java b/src/main/java/IronLibrary/demo/models/Book.java index 2bef2906..21703590 100644 --- a/src/main/java/IronLibrary/demo/models/Book.java +++ b/src/main/java/IronLibrary/demo/models/Book.java @@ -8,7 +8,6 @@ @Table(name = "Book") public class Book { @Id - private String isbn; private String title; diff --git a/src/main/java/IronLibrary/demo/models/Issue.java b/src/main/java/IronLibrary/demo/models/Issue.java index 076dff75..9275edb1 100644 --- a/src/main/java/IronLibrary/demo/models/Issue.java +++ b/src/main/java/IronLibrary/demo/models/Issue.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; +import java.time.LocalDate; import java.util.Date; @Entity @@ -14,10 +15,10 @@ public class Issue { private int issueId; @Column(name = "issue_date") - private Date issueDate; + private LocalDate issueDate; @Column(name = "return_date") - private Date returnDate; + private LocalDate returnDate; @OneToOne @JoinColumn(name = "issue_student", referencedColumnName = "usn") @@ -27,13 +28,11 @@ public class Issue { @JoinColumn(name = "issue_book", referencedColumnName = "isbn") private Book issueBook; - /*@OneToOne - private Student studentIssue;*/ public Issue() { } - public Issue(Date issueDate, Date returnDate, Student issueStudent, Book issueBook) { + public Issue(LocalDate issueDate, LocalDate returnDate, Student issueStudent, Book issueBook) { this.issueDate = issueDate; this.returnDate = returnDate; this.issueStudent = issueStudent; @@ -48,20 +47,20 @@ public void setIssueId(int issueId) { this.issueId = issueId; } - public Date getIssueDate() { + public LocalDate getIssueLocalDate() { return issueDate; } - public void setIssueDate(Date issueDate) { - this.issueDate = issueDate; + public void setIssueDate(LocalDate issueLocalDate) { + this.issueDate = issueLocalDate; } - public Date getReturnDate() { + public LocalDate getReturnLocalDate() { return returnDate; } - public void setReturnDate(Date returnDate) { - this.returnDate = returnDate; + public void setReturnDate(LocalDate returnLocalDate) { + this.returnDate = returnLocalDate; } public Student getIssueStudent() { diff --git a/src/main/java/IronLibrary/demo/models/Student.java b/src/main/java/IronLibrary/demo/models/Student.java index 640702e2..182105d6 100644 --- a/src/main/java/IronLibrary/demo/models/Student.java +++ b/src/main/java/IronLibrary/demo/models/Student.java @@ -3,7 +3,7 @@ @Entity @Table (name= "student") -public class Student { //lo de inherot? +public class Student { @Id private String usn; //Universal Student Number-unique identifier diff --git a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java index 1543e617..be7ca94d 100644 --- a/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/AuthorRepository.java @@ -13,13 +13,9 @@ @Repository public interface AuthorRepository extends JpaRepository { - + //Book findByAuthor(Author author); //search book by author - public Book findByAuthor(Author author); - - //msj de Irene: este método deberia mostrar una lista con autores, pero SIN meter autor de parametro - //List findAllByAuthor(String author) - // 🔶 MSJ ANGELA: CIERTO! ESTE METODO YA NO VALE, NUEVO METODO CORREGIDO ABAJO ⬇⬇⬇ + public Author findByName(String authorName); //List all books along with author: This action is responsible for listing all the books available and their corresponding authors. @Query(value = "SELECT book.isbn, book.title, book.category, book.quantity, author.name, author.email " + @@ -37,6 +33,6 @@ void addAuthor( @Param("authorBook") Book authorBook //mirar esto ); - Author findByName(String authorName); + } diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepository.java b/src/main/java/IronLibrary/demo/repositories/BookRepository.java index de1e800a..804f7bce 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepository.java @@ -2,6 +2,7 @@ import IronLibrary.demo.models.Author; import IronLibrary.demo.models.Book; +import IronLibrary.demo.models.Student; import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; @@ -40,26 +41,27 @@ void addBook( @Modifying @Transactional - @Query(value = "INSERT INTO Issue (issue_date, return_date, issue_student_usn, issue_book_isbn) VALUES (:issueDate, :returnDate, :studentUsn, :bookIsbn)", nativeQuery = true) + @Query(value = "INSERT INTO Issue (issue_date, return_date, issue_student, issue_book) VALUES (:issueDate, :returnDate, :issueStudent, :issueBook)", nativeQuery = true) void insertIssue( @Param("issueDate") String issueDate, @Param("returnDate") String returnDate, - @Param("studentUsn") String studentUsn, - @Param("bookIsbn") String bookIsbn + @Param("issueStudent") Student issueStudent, + @Param("issueBook") Book issueBook ); // List books by usn: - @Query(value = "SELECT Book.tittle FROM Book " + + @Query(value = "SELECT Book.title FROM Book " + "INNER JOIN Issue ON Book.isbn = Issue.issue_book " + "WHERE Issue.issue_student = :usn", nativeQuery = true) List findBookTitlesByStudentUsn(@Param("usn") String usn); - List findByAuthor(String authorName); + List findByCategory(String category); List findByTitle(String title); + Book findByIsbn(String isbn); } diff --git a/src/main/java/IronLibrary/demo/repositories/IssueRepository.java b/src/main/java/IronLibrary/demo/repositories/IssueRepository.java index 20ad6cbf..d57ce95e 100644 --- a/src/main/java/IronLibrary/demo/repositories/IssueRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/IssueRepository.java @@ -5,5 +5,5 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface IssueRepository extends JpaRepository { - Issue findByStudentIssue (Student studentIssue); + Issue findByIssueStudent (Student issueStudent); } diff --git a/src/main/java/IronLibrary/demo/repositories/StudentRepository.java b/src/main/java/IronLibrary/demo/repositories/StudentRepository.java index ada595bb..eb3d7c7a 100644 --- a/src/main/java/IronLibrary/demo/repositories/StudentRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/StudentRepository.java @@ -8,4 +8,5 @@ @Repository public interface StudentRepository extends JpaRepository { Student findStudentByUsn(String usn); + } diff --git a/src/main/java/IronLibrary/demo/services/LibraryService1.java b/src/main/java/IronLibrary/demo/services/LibraryService1.java index 704c911e..8e504bd4 100644 --- a/src/main/java/IronLibrary/demo/services/LibraryService1.java +++ b/src/main/java/IronLibrary/demo/services/LibraryService1.java @@ -1,13 +1,15 @@ package IronLibrary.demo.services; import IronLibrary.demo.models.Book; +import IronLibrary.demo.models.Student; import IronLibrary.demo.repositories.AuthorRepository; import IronLibrary.demo.repositories.BookRepository; import jakarta.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import java.time.LocalDate; - +@Service public class LibraryService1 { @Autowired @@ -15,16 +17,15 @@ public class LibraryService1 { @Autowired AuthorRepository authorRepository; - @Autowired - Book book; - public LibraryService1(BookRepository bookRepository, AuthorRepository authorRepository) { + + /* public LibraryService1(BookRepository bookRepository, AuthorRepository authorRepository) { this.bookRepository = bookRepository; this.authorRepository = authorRepository; - } + }*/ - public void issueBookToStudent (String usn, String name, String isbn) { - bookRepository.insertStudent(usn, name); + public void issueBookToStudent (Student usn, String name, Book isbn) { + //bookRepository.insertStudent(usn, name); LocalDate issueDate = LocalDate.now(); LocalDate returnDate = issueDate.plusDays(30); @@ -35,6 +36,7 @@ public void issueBookToStudent (String usn, String name, String isbn) { usn, isbn ); + System.out.println("Book issued. Return date " + returnDate); } diff --git a/src/main/java/IronLibrary/demo/services/ScannerAngela.java b/src/main/java/IronLibrary/demo/services/ScannerAngela.java index 79dab3e4..d4225d4b 100644 --- a/src/main/java/IronLibrary/demo/services/ScannerAngela.java +++ b/src/main/java/IronLibrary/demo/services/ScannerAngela.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.Scanner; - +/* @SpringBootApplication public class ScannerAngela implements CommandLineRunner { @@ -98,4 +98,4 @@ public void run(String... args) { scanner.close(); System.exit(0); } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/src/main/java/IronLibrary/demo/services/ScannerIrene1.java b/src/main/java/IronLibrary/demo/services/ScannerIrene1.java index 45e34632..e5a2512d 100644 --- a/src/main/java/IronLibrary/demo/services/ScannerIrene1.java +++ b/src/main/java/IronLibrary/demo/services/ScannerIrene1.java @@ -7,7 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.Scanner; - +/* @SpringBootApplication public class ScannerIrene1 implements CommandLineRunner { @@ -59,4 +59,4 @@ public void run(String... args) throws Exception { scanner.close(); System.exit(0); } -} +}*/ diff --git a/src/main/java/IronLibrary/demo/services/ServiceMiguel.java b/src/main/java/IronLibrary/demo/services/ServiceMiguel.java index 5baa1faa..82f2f13c 100644 --- a/src/main/java/IronLibrary/demo/services/ServiceMiguel.java +++ b/src/main/java/IronLibrary/demo/services/ServiceMiguel.java @@ -9,7 +9,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.List; - +/* @SpringBootApplication public class ServiceMiguel implements CommandLineRunner { @@ -92,4 +92,4 @@ public void run(String... args) { System.out.println("Library closed"); } -} \ No newline at end of file +}*/ \ No newline at end of file From ff85c6ad97404509c8f7c9df471ea8aaef3b8598 Mon Sep 17 00:00:00 2001 From: Irenevn16 Date: Wed, 30 Apr 2025 16:59:03 +0200 Subject: [PATCH 38/38] uml subido --- UML.png | Bin 0 -> 108110 bytes .../demo/repositories/BookRepository.java | 1 + .../demo/services/ScannerAngela.java | 101 ------------------ .../demo/services/ScannerIrene1.java | 62 ----------- .../demo/services/ServiceMiguel.java | 95 ---------------- 5 files changed, 1 insertion(+), 258 deletions(-) create mode 100644 UML.png delete mode 100644 src/main/java/IronLibrary/demo/services/ScannerAngela.java delete mode 100644 src/main/java/IronLibrary/demo/services/ScannerIrene1.java delete mode 100644 src/main/java/IronLibrary/demo/services/ServiceMiguel.java diff --git a/UML.png b/UML.png new file mode 100644 index 0000000000000000000000000000000000000000..e8853dbdeabae2ab6c2a7ebcf4d8b53229458bb9 GIT binary patch literal 108110 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 VX+(#0zg~QOZ9Cs4(Q0+ze*nYZ4}kyx literal 0 HcmV?d00001 diff --git a/src/main/java/IronLibrary/demo/repositories/BookRepository.java b/src/main/java/IronLibrary/demo/repositories/BookRepository.java index 804f7bce..9b663849 100644 --- a/src/main/java/IronLibrary/demo/repositories/BookRepository.java +++ b/src/main/java/IronLibrary/demo/repositories/BookRepository.java @@ -10,6 +10,7 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.sql.Timestamp; import java.util.List; @Repository diff --git a/src/main/java/IronLibrary/demo/services/ScannerAngela.java b/src/main/java/IronLibrary/demo/services/ScannerAngela.java deleted file mode 100644 index d4225d4b..00000000 --- a/src/main/java/IronLibrary/demo/services/ScannerAngela.java +++ /dev/null @@ -1,101 +0,0 @@ -package IronLibrary.demo.services; - -import IronLibrary.demo.IronLibraryApplication; -import IronLibrary.demo.models.Book; -import IronLibrary.demo.models.Issue; -import IronLibrary.demo.models.Student; -import IronLibrary.demo.repositories.BookRepository; -import IronLibrary.demo.repositories.IssueRepository; -import IronLibrary.demo.repositories.StudentRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -import java.util.List; -import java.util.Scanner; -/* -@SpringBootApplication - -public class ScannerAngela implements CommandLineRunner { - @Autowired - private BookRepository bookRepository; - @Autowired - private StudentRepository studentRepository; - @Autowired - private IssueRepository issueRepository; - - //PALETA DE COLORES TERMINAL - public static final String ANSI_RESET = "\u001B[0m"; - public static final String ANSI_BLACK = "\u001B[30m"; - public static final String ANSI_RED = "\u001B[31m"; - public static final String ANSI_GREEN = "\u001B[32m"; - public static final String ANSI_YELLOW = "\u001B[33m"; - public static final String ANSI_BLUE = "\u001B[34m"; - public static final String ANSI_PURPLE = "\u001B[35m"; - public static final String ANSI_CYAN = "\u001B[36m"; - public static final String ANSI_WHITE = "\u001B[37m"; - static final String ANSI_BLACK_BACKGROUND = "\u001B[40m"; - public static final String ANSI_RED_BACKGROUND = "\u001B[41m"; - public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m"; - public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m"; - public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m"; - public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m"; - public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m"; - public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m"; - - public static void main(String[] args) { - SpringApplication.run(IronLibraryApplication.class, args); - } - - @Override - public void run(String... args) { - System.out.println("Bienvenido a nuestra app de libros"); - - java.util.Scanner scanner = new Scanner(System.in); - boolean continueRunning = true; - - while (continueRunning) { - System.out.println(ANSI_PURPLE + "7.List books by USN" + ANSI_RESET); - System.out.println("8. Exit"); - - - System.out.println(ANSI_PURPLE_BACKGROUND + "Enter your choice:" + ANSI_RESET); - int choice = scanner.nextInt(); - scanner.nextLine(); - - switch (choice) { - case 7: - System.out.println("You choosed searching books by USN."); - System.out.println("Please, enter a USN number:"); - String usn = scanner.nextLine(); - List books = bookRepository.findBookTitlesByStudentUsn(usn); - Student student = studentRepository.findStudentByUsn(usn); - Issue issue = issueRepository.findByStudentIssue(student); - if (books.isEmpty()) { - - } else { - for(Book book: books) { - System.out.println("Book Title Student Name Return date\n" + - book.getTitle() + " " + student.getName() + " " + issue.getReturnDate()); - } - } - break; -// me falta coger la return date de issue !!! -// Enter your choice: 7 -// Enter usn : 09003688800 -// -// Book Title Student Name Return date -// Da Vinci Code John Doe 2022-08-01 16:45:40.636000 -// - - case 8: - System.out.println("Exiting program..."); - continueRunning = false; - break; - } - } - scanner.close(); - System.exit(0); - } -}*/ \ No newline at end of file diff --git a/src/main/java/IronLibrary/demo/services/ScannerIrene1.java b/src/main/java/IronLibrary/demo/services/ScannerIrene1.java deleted file mode 100644 index e5a2512d..00000000 --- a/src/main/java/IronLibrary/demo/services/ScannerIrene1.java +++ /dev/null @@ -1,62 +0,0 @@ -package IronLibrary.demo.services; -import IronLibrary.demo.repositories.AuthorRepository; -import IronLibrary.demo.repositories.BookRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -import java.util.Scanner; -/* -@SpringBootApplication -public class ScannerIrene1 implements CommandLineRunner { - - @Autowired - BookRepository bookRepository; - @Autowired - AuthorRepository authorRepository; - @Autowired - LibraryService1 libraryService1; - - public static void main(String[] args) { - SpringApplication.run(ScannerIrene1.class, args); - } - - @Override - public void run(String... args) throws Exception { - //aqui ponemos while loop menu - Scanner scanner = new Scanner(System.in); - boolean continueRunning = true; - - while (continueRunning) { - System.out.println("5.List all books along with author"); - System.out.println("6. Issue book to student"); - - int choice = scanner.nextInt(); - scanner.nextLine(); - - switch (choice) { - case 5: - System.out.println("This is the list for all books available and their corresponding authors: " + authorRepository.findAllBooksWithAuthor()); - //hay que corregir el metodo - break; - case 6: - System.out.println("You chose to issue a book to a student"); - System.out.println("Please enter the student's usn: "); - String usn = scanner.nextLine(); - - System.out.println("Enter name: "); - String name = scanner.nextLine(); - - System.out.println("Enter book ISBN: "); - String isbn = scanner.nextLine(); - - libraryService1.issueBookToStudent(usn, name, isbn); - break; - } - } //metamos default con invalid choice - //habra que cerrar el bucle con un running = false en el exit - scanner.close(); - System.exit(0); - } -}*/ diff --git a/src/main/java/IronLibrary/demo/services/ServiceMiguel.java b/src/main/java/IronLibrary/demo/services/ServiceMiguel.java deleted file mode 100644 index 82f2f13c..00000000 --- a/src/main/java/IronLibrary/demo/services/ServiceMiguel.java +++ /dev/null @@ -1,95 +0,0 @@ -package IronLibrary.demo.services; -import IronLibrary.demo.models.Author; -import IronLibrary.demo.models.Book; -import IronLibrary.demo.repositories.AuthorRepository; -import IronLibrary.demo.repositories.BookRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -import java.util.List; -/* -@SpringBootApplication -public class ServiceMiguel implements CommandLineRunner { - - @Autowired - BookRepository bookRepository; - - @Autowired - AuthorRepository authorRepository; - - @Override - public void run(String... args) { - Scanner sc = new Scanner(System.in); - - while (true) { - System.out.println("\n1. Add Book"); - System.out.println("2. Search by title"); - System.out.println("3. Search by category"); - System.out.println("4. Search by author"); - System.out.println("0. Exit"); - System.out.print("Choose option: "); - - String opcion = sc.nextLine(); - - if (opcion.equals("0")) break; - - switch (opcion) { - case "1" -> { - System.out.print("Title: "); - String title = sc.nextLine(); - - System.out.print("Category: "); - String category = sc.nextLine(); - - System.out.print("Author: "); - String authorName = sc.nextLine(); - - Author author = authorRepository.findByName(authorName); - if (author == null) { - author = new Author(); - author.setName(authorName); - authorRepository.save(author); - } - - Book book = new Book(); - book.setTitle(title); - book.setCategory(category); - book.setAuthor(author); // falla por el ManyToOne - bookRepository.save(book); - - System.out.println("Book added"); - } - - case "2" -> { - System.out.print("Book title: "); - String title = sc.nextLine(); - bookRepository.findByTitle(title).forEach(System.out::println); - } - - case "3" -> { - System.out.print("Category: "); - String category = sc.nextLine(); - bookRepository.findByCategory(category).forEach(System.out::println); - } - - case "4" -> { - System.out.print("Author: "); - String authorName = sc.nextLine(); - Author author = authorRepository.findByName(authorName); - if (author != null) { - bookRepository.findByAuthor(author).forEach(System.out::println); - } else { - System.out.println("Author not found."); - } - } - - default -> System.out.println("Option not recognized."); - } - } - - System.out.println("Library closed"); - } - -}*/ \ No newline at end of file