From 36608fb76bb397fd333563a11d287874e5a6ff24 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Mon, 28 Oct 2024 20:59:09 +0200 Subject: [PATCH 01/37] jpa --- .gitattributes | 2 + .gitignore | 33 +++ .mvn/wrapper/maven-wrapper.properties | 19 ++ mvnw | 259 ++++++++++++++++++ mvnw.cmd | 149 ++++++++++ pom.xml | 78 ++++++ .../java/com/example/jpa/JpaApplication.java | 13 + .../jpa/controllers/UserController.java | 52 ++++ .../java/com/example/jpa/models/Address.java | 26 ++ .../java/com/example/jpa/models/Order.java | 30 ++ .../java/com/example/jpa/models/User.java | 38 +++ .../jpa/repositories/AddressRepository.java | 7 + .../jpa/repositories/OrderRepository.java | 7 + .../jpa/repositories/UserJpaRepository.java | 39 +++ .../jpa/repositories/UserRepository.java | 7 + .../com/example/jpa/services/UserService.java | 35 +++ src/main/resources/application.properties | 9 + .../com/example/jpa/JpaApplicationTests.java | 13 + 18 files changed, 816 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/com/example/jpa/JpaApplication.java create mode 100644 src/main/java/com/example/jpa/controllers/UserController.java create mode 100644 src/main/java/com/example/jpa/models/Address.java create mode 100644 src/main/java/com/example/jpa/models/Order.java create mode 100644 src/main/java/com/example/jpa/models/User.java create mode 100644 src/main/java/com/example/jpa/repositories/AddressRepository.java create mode 100644 src/main/java/com/example/jpa/repositories/OrderRepository.java create mode 100644 src/main/java/com/example/jpa/repositories/UserJpaRepository.java create mode 100644 src/main/java/com/example/jpa/repositories/UserRepository.java create mode 100644 src/main/java/com/example/jpa/services/UserService.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/example/jpa/JpaApplicationTests.java diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..d58dfb7 --- /dev/null +++ b/.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/mvnw b/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/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/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/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/pom.xml b/pom.xml new file mode 100644 index 0000000..1fe8f99 --- /dev/null +++ b/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.5 + + + com.example + jpa + 0.0.1-SNAPSHOT + jpa + Demo project for Spring Boot + + + + + + + + + + + + + + + 23 + 23 + 23 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + org.postgresql + postgresql + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/example/jpa/JpaApplication.java b/src/main/java/com/example/jpa/JpaApplication.java new file mode 100644 index 0000000..ef14ebe --- /dev/null +++ b/src/main/java/com/example/jpa/JpaApplication.java @@ -0,0 +1,13 @@ +package com.example.jpa; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JpaApplication { + + public static void main(String[] args) { + SpringApplication.run(JpaApplication.class, args); + } + +} diff --git a/src/main/java/com/example/jpa/controllers/UserController.java b/src/main/java/com/example/jpa/controllers/UserController.java new file mode 100644 index 0000000..9e8108b --- /dev/null +++ b/src/main/java/com/example/jpa/controllers/UserController.java @@ -0,0 +1,52 @@ +package com.example.jpa.controllers; + +import com.example.jpa.models.User; +import com.example.jpa.services.UserService; +import org.apache.coyote.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping("/users") +public class UserController { + @Autowired + private UserService service; + + @PostMapping("/all") + public ResponseEntity> createUsers(@RequestBody List users) { + Iterable createdUsers = service.saveAll(users); + return ResponseEntity.status(HttpStatus.CREATED).body(createdUsers); + } + + @GetMapping + public ResponseEntity> getAllUsers() { + Iterable users = service.findAllUsers(); + return ResponseEntity.status(HttpStatus.OK).body(users); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteUser(@PathVariable Long id) { + service.deletUser(id); + return ResponseEntity.noContent().build(); + } + + @GetMapping("/{username}") + public ResponseEntity findByUsername(@PathVariable String username) { + Optional user = service.findUserByUsername(username); + if (user.isPresent()) { + return ResponseEntity.ok(user.get()); + } else + return ResponseEntity.notFound().build(); + } + + @PostMapping + public ResponseEntity addUser(@RequestBody User user){ + User savedUser = service.savedUser(user); + return ResponseEntity.ok(savedUser); + } +} diff --git a/src/main/java/com/example/jpa/models/Address.java b/src/main/java/com/example/jpa/models/Address.java new file mode 100644 index 0000000..3061bea --- /dev/null +++ b/src/main/java/com/example/jpa/models/Address.java @@ -0,0 +1,26 @@ +package com.example.jpa.models; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "addresses") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Address { + @Id + @GeneratedValue + private Long id; + + private String city; + private String street; + private String country; + private Integer numberOfStreet; + + @OneToOne(mappedBy = "address",fetch = FetchType.LAZY) + private User user; + +} diff --git a/src/main/java/com/example/jpa/models/Order.java b/src/main/java/com/example/jpa/models/Order.java new file mode 100644 index 0000000..edbf496 --- /dev/null +++ b/src/main/java/com/example/jpa/models/Order.java @@ -0,0 +1,30 @@ +package com.example.jpa.models; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Entity +@Table(name = "orders") +@Data +@NoArgsConstructor +@AllArgsConstructor + +public class Order { + @Id + @GeneratedValue + private Long id; + + private String product; + private Double price; + private LocalDate orderDate; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id",referencedColumnName ="id") + private User user; + + +} diff --git a/src/main/java/com/example/jpa/models/User.java b/src/main/java/com/example/jpa/models/User.java new file mode 100644 index 0000000..8b9940e --- /dev/null +++ b/src/main/java/com/example/jpa/models/User.java @@ -0,0 +1,38 @@ +package com.example.jpa.models; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "users") +public class User { + + + @Id + @GeneratedValue + + private Long id; + private String name; + private Integer age; + private LocalDate registrationDate; + private String email; + private String username; + private boolean active; + + @OneToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "address_id", referencedColumnName = "id") + private Address address; + + @OneToMany(mappedBy = "user",cascade = CascadeType.ALL,orphanRemoval = true) + private List orders; + + +} diff --git a/src/main/java/com/example/jpa/repositories/AddressRepository.java b/src/main/java/com/example/jpa/repositories/AddressRepository.java new file mode 100644 index 0000000..c72be54 --- /dev/null +++ b/src/main/java/com/example/jpa/repositories/AddressRepository.java @@ -0,0 +1,7 @@ +package com.example.jpa.repositories; + +import com.example.jpa.models.Address; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AddressRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/jpa/repositories/OrderRepository.java b/src/main/java/com/example/jpa/repositories/OrderRepository.java new file mode 100644 index 0000000..ce2b148 --- /dev/null +++ b/src/main/java/com/example/jpa/repositories/OrderRepository.java @@ -0,0 +1,7 @@ +package com.example.jpa.repositories; + +import com.example.jpa.models.Order; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/jpa/repositories/UserJpaRepository.java b/src/main/java/com/example/jpa/repositories/UserJpaRepository.java new file mode 100644 index 0000000..6df714c --- /dev/null +++ b/src/main/java/com/example/jpa/repositories/UserJpaRepository.java @@ -0,0 +1,39 @@ +package com.example.jpa.repositories; + +import com.example.jpa.models.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +public interface UserJpaRepository extends JpaRepository { + Optional findByUsername(String username); + + List findByActive(boolean active); + + //ia toti useri ordonati dupa username ascendent + List findAllByOrderByUsernameAsc(); + + List findByActiveOrderByUsernameDesc(boolean active); + + List findByRegistrationDateBetween(LocalDate start,LocalDate end); + + List findByNameIgnoreCase(String name); + + List findByAgeGreaterThanEqual(int age); + + List findByUsernameContaining(String text); + + List findByUsernameStartingWith(String text); + + + @Query("SELECT u From User u where u.age > 30") + List findUsersOver30(); + + + @Query(value = "select u from users u where u.age > 30",nativeQuery = true) + List findUsersOver30NativeQuery(); + +} diff --git a/src/main/java/com/example/jpa/repositories/UserRepository.java b/src/main/java/com/example/jpa/repositories/UserRepository.java new file mode 100644 index 0000000..1a328a6 --- /dev/null +++ b/src/main/java/com/example/jpa/repositories/UserRepository.java @@ -0,0 +1,7 @@ +package com.example.jpa.repositories; + +import com.example.jpa.models.User; +import org.springframework.data.repository.CrudRepository; + +public interface UserRepository extends CrudRepository { +} diff --git a/src/main/java/com/example/jpa/services/UserService.java b/src/main/java/com/example/jpa/services/UserService.java new file mode 100644 index 0000000..5c43199 --- /dev/null +++ b/src/main/java/com/example/jpa/services/UserService.java @@ -0,0 +1,35 @@ +package com.example.jpa.services; + +import com.example.jpa.models.User; +import com.example.jpa.repositories.UserJpaRepository; +import com.example.jpa.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class UserService { + @Autowired + private UserJpaRepository repository2; + + + private UserRepository repository; + + public Iterable saveAll(List users){return repository.saveAll(users);} + + public Iterable findAllUsers(){return repository.findAll();} + + public void deletUser(Long id){repository.deleteById(id);} + + public Optional findUserByUsername(String username) { + return jpaRepository.findByUsername(username); + } + + public User addUser(User user) { + return jpaRepository.save(user); + + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..559ec87 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,9 @@ +#Database connection prop +spring.datasource.url=jdbc:postgresql://localhost:5432/postgres +spring.datasource.username=postgres +spring.datasource.password=postgres + +#Jpa prop +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file diff --git a/src/test/java/com/example/jpa/JpaApplicationTests.java b/src/test/java/com/example/jpa/JpaApplicationTests.java new file mode 100644 index 0000000..d99adaf --- /dev/null +++ b/src/test/java/com/example/jpa/JpaApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.jpa; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class JpaApplicationTests { + + @Test + void contextLoads() { + } + +} From e459c54d6fce8486ba837621e89670a49dac3721 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Tue, 29 Oct 2024 21:26:51 +0200 Subject: [PATCH 02/37] jpa --- .../java/com/example/jpa/controllers/UserController.java | 2 +- src/main/java/com/example/jpa/services/UserService.java | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/jpa/controllers/UserController.java b/src/main/java/com/example/jpa/controllers/UserController.java index 9e8108b..9558360 100644 --- a/src/main/java/com/example/jpa/controllers/UserController.java +++ b/src/main/java/com/example/jpa/controllers/UserController.java @@ -46,7 +46,7 @@ public ResponseEntity findByUsername(@PathVariable String username) { @PostMapping public ResponseEntity addUser(@RequestBody User user){ - User savedUser = service.savedUser(user); + User savedUser = service.addUser(user); return ResponseEntity.ok(savedUser); } } diff --git a/src/main/java/com/example/jpa/services/UserService.java b/src/main/java/com/example/jpa/services/UserService.java index 5c43199..231e5c6 100644 --- a/src/main/java/com/example/jpa/services/UserService.java +++ b/src/main/java/com/example/jpa/services/UserService.java @@ -13,10 +13,9 @@ @Service public class UserService { @Autowired - private UserJpaRepository repository2; - - private UserRepository repository; + @Autowired + private UserJpaRepository jpaRepository; public Iterable saveAll(List users){return repository.saveAll(users);} @@ -29,7 +28,7 @@ public Optional findUserByUsername(String username) { } public User addUser(User user) { - return jpaRepository.save(user); - + // Save User + return jpaRepository.save(user); } } From fbed7fdd57051ac2a05b072fdb718ada576a0d0f Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Mon, 4 Nov 2024 12:13:25 +0200 Subject: [PATCH 03/37] jpa --- .../jpa/controllers/OrderController.java | 30 +++++++++++ .../jpa/controllers/UserController.java | 12 ++++- .../java/com/example/jpa/dtos/AddressDto.java | 14 +++++ .../com/example/jpa/dtos/CreateUserDto.java | 24 +++++++++ .../java/com/example/jpa/dtos/OrderDto.java | 12 +++++ .../java/com/example/jpa/models/Address.java | 6 ++- .../java/com/example/jpa/models/Order.java | 14 +++-- .../java/com/example/jpa/models/User.java | 7 ++- .../jpa/repositories/OrderRepository.java | 7 +++ .../jpa/repositories/UserJpaRepository.java | 4 +- .../example/jpa/services/OrderService.java | 54 +++++++++++++++++++ .../com/example/jpa/services/UserService.java | 10 ++++ src/main/resources/application.properties | 2 +- 13 files changed, 185 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/jpa/controllers/OrderController.java create mode 100644 src/main/java/com/example/jpa/dtos/AddressDto.java create mode 100644 src/main/java/com/example/jpa/dtos/CreateUserDto.java create mode 100644 src/main/java/com/example/jpa/dtos/OrderDto.java create mode 100644 src/main/java/com/example/jpa/services/OrderService.java diff --git a/src/main/java/com/example/jpa/controllers/OrderController.java b/src/main/java/com/example/jpa/controllers/OrderController.java new file mode 100644 index 0000000..8af8406 --- /dev/null +++ b/src/main/java/com/example/jpa/controllers/OrderController.java @@ -0,0 +1,30 @@ +package com.example.jpa.controllers; + +import com.example.jpa.models.Order; +import com.example.jpa.services.OrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/orders") +public class OrderController { + @Autowired + private OrderService service; + + @PostMapping + public ResponseEntity placeOrder(@RequestParam Long userId, @RequestParam String product, @RequestParam Double price) { + Order order = service.placeOrder(userId, product, price); + return ResponseEntity.ok(order); + } + @GetMapping + public ResponseEntity> ordersWithPagination(@RequestParam Long userId,@RequestParam int page,@RequestParam int size) { + List orders = service.getOrdersWithPagination(userId, page, size); + return ResponseEntity.ok(orders); + } + + + +} diff --git a/src/main/java/com/example/jpa/controllers/UserController.java b/src/main/java/com/example/jpa/controllers/UserController.java index 9558360..2c6df11 100644 --- a/src/main/java/com/example/jpa/controllers/UserController.java +++ b/src/main/java/com/example/jpa/controllers/UserController.java @@ -1,5 +1,6 @@ package com.example.jpa.controllers; +import com.example.jpa.dtos.CreateUserDto; import com.example.jpa.models.User; import com.example.jpa.services.UserService; import org.apache.coyote.Response; @@ -45,8 +46,17 @@ public ResponseEntity findByUsername(@PathVariable String username) { } @PostMapping - public ResponseEntity addUser(@RequestBody User user){ + public ResponseEntity addUser(@RequestBody User user) { User savedUser = service.addUser(user); return ResponseEntity.ok(savedUser); } + @PostMapping("/create-from-dto") + public ResponseEntity createUserFromDto(@RequestBody CreateUserDto userDto){ + User user = service.createUserFromDto(userDto); + return ResponseEntity.ok(user); + + + } + + } diff --git a/src/main/java/com/example/jpa/dtos/AddressDto.java b/src/main/java/com/example/jpa/dtos/AddressDto.java new file mode 100644 index 0000000..9d62e2f --- /dev/null +++ b/src/main/java/com/example/jpa/dtos/AddressDto.java @@ -0,0 +1,14 @@ +package com.example.jpa.dtos; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class AddressDto { + + private String city; + private String street; + private String country; + private Integer numberOfStreet; +} diff --git a/src/main/java/com/example/jpa/dtos/CreateUserDto.java b/src/main/java/com/example/jpa/dtos/CreateUserDto.java new file mode 100644 index 0000000..555f04f --- /dev/null +++ b/src/main/java/com/example/jpa/dtos/CreateUserDto.java @@ -0,0 +1,24 @@ +package com.example.jpa.dtos; + +import com.example.jpa.models.Order; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.io.Serializable; +import java.time.LocalDate; +import java.util.List; + +@Data +@ToString +public class CreateUserDto implements Serializable { + private String name; + private Integer age; + private LocalDate registrationDate; + private String email; + private String username; + private boolean active; + private AddressDto address; + private List orders; + +} diff --git a/src/main/java/com/example/jpa/dtos/OrderDto.java b/src/main/java/com/example/jpa/dtos/OrderDto.java new file mode 100644 index 0000000..5c21d13 --- /dev/null +++ b/src/main/java/com/example/jpa/dtos/OrderDto.java @@ -0,0 +1,12 @@ +package com.example.jpa.dtos; + +import java.io.Serializable; +import java.time.LocalDate; + +public class OrderDto implements Serializable { + + private String product; + private Double price; + private LocalDate orderDate; + +} diff --git a/src/main/java/com/example/jpa/models/Address.java b/src/main/java/com/example/jpa/models/Address.java index 3061bea..dda4950 100644 --- a/src/main/java/com/example/jpa/models/Address.java +++ b/src/main/java/com/example/jpa/models/Address.java @@ -1,5 +1,6 @@ package com.example.jpa.models; +import com.fasterxml.jackson.annotation.JsonBackReference; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; @@ -12,7 +13,7 @@ @AllArgsConstructor public class Address { @Id - @GeneratedValue + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String city; @@ -20,7 +21,8 @@ public class Address { private String country; private Integer numberOfStreet; - @OneToOne(mappedBy = "address",fetch = FetchType.LAZY) + @OneToOne(mappedBy = "address") + @JsonBackReference private User user; } diff --git a/src/main/java/com/example/jpa/models/Order.java b/src/main/java/com/example/jpa/models/Order.java index edbf496..b2cba3b 100644 --- a/src/main/java/com/example/jpa/models/Order.java +++ b/src/main/java/com/example/jpa/models/Order.java @@ -1,5 +1,6 @@ package com.example.jpa.models; +import com.fasterxml.jackson.annotation.JsonBackReference; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; @@ -15,16 +16,23 @@ public class Order { @Id - @GeneratedValue + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String product; private Double price; private LocalDate orderDate; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id",referencedColumnName ="id") + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name = "user_id", referencedColumnName = "id") + @JsonBackReference private User user; + public Order(String product, Double price,LocalDate orderDate,User user){ + this.product= product; + this.price = price; + this.orderDate= orderDate; + this.user = user; + } } diff --git a/src/main/java/com/example/jpa/models/User.java b/src/main/java/com/example/jpa/models/User.java index 8b9940e..31e3aeb 100644 --- a/src/main/java/com/example/jpa/models/User.java +++ b/src/main/java/com/example/jpa/models/User.java @@ -1,5 +1,6 @@ package com.example.jpa.models; +import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; @@ -17,7 +18,7 @@ public class User { @Id - @GeneratedValue + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @@ -29,9 +30,11 @@ public class User { @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "address_id", referencedColumnName = "id") + @JsonManagedReference private Address address; - @OneToMany(mappedBy = "user",cascade = CascadeType.ALL,orphanRemoval = true) + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonManagedReference private List orders; diff --git a/src/main/java/com/example/jpa/repositories/OrderRepository.java b/src/main/java/com/example/jpa/repositories/OrderRepository.java index ce2b148..8113f24 100644 --- a/src/main/java/com/example/jpa/repositories/OrderRepository.java +++ b/src/main/java/com/example/jpa/repositories/OrderRepository.java @@ -1,7 +1,14 @@ package com.example.jpa.repositories; import com.example.jpa.models.Order; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface OrderRepository extends JpaRepository { +List findByUserId(Long userId); +Page findByUserId(Long userId, Pageable pageable); + } diff --git a/src/main/java/com/example/jpa/repositories/UserJpaRepository.java b/src/main/java/com/example/jpa/repositories/UserJpaRepository.java index 6df714c..6c5bfb5 100644 --- a/src/main/java/com/example/jpa/repositories/UserJpaRepository.java +++ b/src/main/java/com/example/jpa/repositories/UserJpaRepository.java @@ -18,7 +18,7 @@ public interface UserJpaRepository extends JpaRepository { List findByActiveOrderByUsernameDesc(boolean active); - List findByRegistrationDateBetween(LocalDate start,LocalDate end); + List findByRegistrationDateBetween(LocalDate start, LocalDate end); List findByNameIgnoreCase(String name); @@ -33,7 +33,7 @@ public interface UserJpaRepository extends JpaRepository { List findUsersOver30(); - @Query(value = "select u from users u where u.age > 30",nativeQuery = true) + @Query(value = "select u from users u where u.age > 30", nativeQuery = true) List findUsersOver30NativeQuery(); } diff --git a/src/main/java/com/example/jpa/services/OrderService.java b/src/main/java/com/example/jpa/services/OrderService.java new file mode 100644 index 0000000..05a355b --- /dev/null +++ b/src/main/java/com/example/jpa/services/OrderService.java @@ -0,0 +1,54 @@ +package com.example.jpa.services; + +import com.example.jpa.models.Order; +import com.example.jpa.models.User; +import com.example.jpa.repositories.OrderRepository; +import com.example.jpa.repositories.UserJpaRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +@Service +public class OrderService { + @Autowired + private OrderRepository orderRepository; + @Autowired + private UserJpaRepository userRepository; + + /* + * Places an order for a specific user + */ + public Order placeOrder(Long userId, String product, Double price) { + Optional userOpt = userRepository.findById(userId); + Order order = null; + if (userOpt.isPresent()) { + User user = userOpt.get(); + order = new Order(product, price, LocalDate.now(), user); + + + + } else System.out.println("User with id: " + userId + "not found!"); + + return orderRepository.save(order); + } + + public List getOrdersWithPagination(Long userId, int page, int size) { +// int start = page == 1 ? 1 : page * size; +// List userOrders = orderRepository.findByUserId(userId); +// return userOrders.stream() +// .skip(start) +// .limit(size) +// .collect(Collectors.toList()); + + + + PageRequest pageRequest = PageRequest.of(page - 1, size); + Page orderPage = orderRepository.findByUserId(userId, pageRequest); + return orderPage.getContent(); + } +} diff --git a/src/main/java/com/example/jpa/services/UserService.java b/src/main/java/com/example/jpa/services/UserService.java index 231e5c6..2460dd3 100644 --- a/src/main/java/com/example/jpa/services/UserService.java +++ b/src/main/java/com/example/jpa/services/UserService.java @@ -1,8 +1,10 @@ package com.example.jpa.services; +import com.example.jpa.dtos.CreateUserDto; import com.example.jpa.models.User; import com.example.jpa.repositories.UserJpaRepository; import com.example.jpa.repositories.UserRepository; +import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; @@ -16,6 +18,8 @@ public class UserService { private UserRepository repository; @Autowired private UserJpaRepository jpaRepository; + @Autowired + private ObjectMapper mapper; public Iterable saveAll(List users){return repository.saveAll(users);} @@ -31,4 +35,10 @@ public User addUser(User user) { // Save User return jpaRepository.save(user); } + public User createUserFromDto(CreateUserDto userDto){ + User user = mapper.convertValue(userDto,User.class); + return jpaRepository.save(user); + + + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 559ec87..2340aa8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,5 +5,5 @@ spring.datasource.password=postgres #Jpa prop spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=create spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file From 6f77b7bc61d0918dd391aeebf97ec5cfd7399138 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Mon, 4 Nov 2024 18:32:29 +0200 Subject: [PATCH 04/37] jpa --- src/main/java/com/example/jpa/services/OrderService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/jpa/services/OrderService.java b/src/main/java/com/example/jpa/services/OrderService.java index 05a355b..304eed9 100644 --- a/src/main/java/com/example/jpa/services/OrderService.java +++ b/src/main/java/com/example/jpa/services/OrderService.java @@ -12,6 +12,7 @@ import java.time.LocalDate; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Service public class OrderService { From b01b19db5f5b4b1cfe20d09a10350800b26a2230 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Mon, 4 Nov 2024 21:24:44 +0200 Subject: [PATCH 05/37] jpa --- pom.xml | 5 +- .../com/example/jpa/ExceptionsExample.java | 67 +++++++++++++++++++ .../jpa/controllers/UserController.java | 10 ++- .../jpa/exceptions/EmailSendingException.java | 10 +++ .../jpa/exceptions/UserServiceException.java | 14 ++++ .../example/jpa/services/EmailService.java | 28 ++++++++ .../com/example/jpa/services/UserService.java | 37 ++++++++-- src/main/resources/application.properties | 10 ++- 8 files changed, 172 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/example/jpa/ExceptionsExample.java create mode 100644 src/main/java/com/example/jpa/exceptions/EmailSendingException.java create mode 100644 src/main/java/com/example/jpa/exceptions/UserServiceException.java create mode 100644 src/main/java/com/example/jpa/services/EmailService.java diff --git a/pom.xml b/pom.xml index 1fe8f99..5b05344 100644 --- a/pom.xml +++ b/pom.xml @@ -56,8 +56,11 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-mail + - diff --git a/src/main/java/com/example/jpa/ExceptionsExample.java b/src/main/java/com/example/jpa/ExceptionsExample.java new file mode 100644 index 0000000..3671568 --- /dev/null +++ b/src/main/java/com/example/jpa/ExceptionsExample.java @@ -0,0 +1,67 @@ +package com.example.jpa; + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class ExceptionsExample { + public static void main(String... args) { + // scannerExample1(); + // scannerExample2(); + stringExample(); + } + + private static void stringExample() { + String s = "Salut"; + int validIndex = 2; + int invalidIndex = 8; + printCharAt(s, validIndex); + printCharAt(s, invalidIndex); + + } + + private static void printCharAt(String text, int index) { + try { + System.out.println("Char at index :" + index + "is " + text.charAt(index)); + } catch (IndexOutOfBoundsException e) { + System.out.println(e.getMessage()); + // e.printStackTrace(); + } + + } + + + private static void scannerExample2() { + try (Scanner scanner = new Scanner(System.in)) { + System.out.println("Enter two numbers: "); + int num1 = scanner.nextInt(); + int num2 = scanner.nextInt(); + + int result = num1 / num2; + System.out.println("Result: " + result); + } catch (ArithmeticException ex) {// 4/0 + System.out.println("Error :cannot divide by 0!"); + } catch (InputMismatchException ex) {//10.2 + System.out.println("Error: Please insert a valid number!"); + } finally { + System.out.println("End of program!"); + + } + } + private static void scannerExample1() { + Scanner scanner = new Scanner(System.in); + + System.out.println("Enter 2 integers:"); + int num1 = scanner.nextInt(); + int num2 = scanner.nextInt(); + + try { + int rez = num1 / num2; //Pentru a obtine exceptia 4/0! + System.out.println("Result = " + rez); + } catch (ArithmeticException e) { + System.out.println("Error: cannot divide by 0!"); + } + + + scanner.close(); + } + } diff --git a/src/main/java/com/example/jpa/controllers/UserController.java b/src/main/java/com/example/jpa/controllers/UserController.java index 2c6df11..384c589 100644 --- a/src/main/java/com/example/jpa/controllers/UserController.java +++ b/src/main/java/com/example/jpa/controllers/UserController.java @@ -1,8 +1,10 @@ package com.example.jpa.controllers; import com.example.jpa.dtos.CreateUserDto; +import com.example.jpa.exceptions.UserServiceException; import com.example.jpa.models.User; import com.example.jpa.services.UserService; +import jdk.swing.interop.SwingInterOpUtils; import org.apache.coyote.Response; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -52,7 +54,13 @@ public ResponseEntity addUser(@RequestBody User user) { } @PostMapping("/create-from-dto") public ResponseEntity createUserFromDto(@RequestBody CreateUserDto userDto){ - User user = service.createUserFromDto(userDto); + User user = new User(); + try { + user = service.createUserFromDto(userDto); + }catch(UserServiceException ex){ + System.out.println(ex.getMessage()); + System.out.println(ex.getErrorCode()); + } return ResponseEntity.ok(user); diff --git a/src/main/java/com/example/jpa/exceptions/EmailSendingException.java b/src/main/java/com/example/jpa/exceptions/EmailSendingException.java new file mode 100644 index 0000000..8ef7214 --- /dev/null +++ b/src/main/java/com/example/jpa/exceptions/EmailSendingException.java @@ -0,0 +1,10 @@ +package com.example.jpa.exceptions; + +public class EmailSendingException extends Exception { + +public EmailSendingException(String message){ + super(message); + +} + +} diff --git a/src/main/java/com/example/jpa/exceptions/UserServiceException.java b/src/main/java/com/example/jpa/exceptions/UserServiceException.java new file mode 100644 index 0000000..a31b7f7 --- /dev/null +++ b/src/main/java/com/example/jpa/exceptions/UserServiceException.java @@ -0,0 +1,14 @@ +package com.example.jpa.exceptions; + +public class UserServiceException extends RuntimeException { + private String errorCode; + + public UserServiceException(String message,String codeError){ + super(message); + this.errorCode = codeError; + } +public String getErrorCode(){ + return errorCode; +} + +} diff --git a/src/main/java/com/example/jpa/services/EmailService.java b/src/main/java/com/example/jpa/services/EmailService.java new file mode 100644 index 0000000..ac51504 --- /dev/null +++ b/src/main/java/com/example/jpa/services/EmailService.java @@ -0,0 +1,28 @@ +package com.example.jpa.services; + +import com.example.jpa.exceptions.EmailSendingException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.MailException; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +@Service +public class EmailService { + @Autowired + private JavaMailSender mailSender; + + public void sendEmail(String to,String subject,String body) throws EmailSendingException { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(to); + message.setSubject(subject); + message.setText(body); + + try { + mailSender.send(message); + }catch (MailException ex){ + throw new EmailSendingException("Failed to send email: " + ex.getMessage()); + } + + } +} diff --git a/src/main/java/com/example/jpa/services/UserService.java b/src/main/java/com/example/jpa/services/UserService.java index 2460dd3..52cdc27 100644 --- a/src/main/java/com/example/jpa/services/UserService.java +++ b/src/main/java/com/example/jpa/services/UserService.java @@ -1,6 +1,8 @@ package com.example.jpa.services; import com.example.jpa.dtos.CreateUserDto; +import com.example.jpa.exceptions.EmailSendingException; +import com.example.jpa.exceptions.UserServiceException; import com.example.jpa.models.User; import com.example.jpa.repositories.UserJpaRepository; import com.example.jpa.repositories.UserRepository; @@ -20,12 +22,20 @@ public class UserService { private UserJpaRepository jpaRepository; @Autowired private ObjectMapper mapper; + @Autowired + private EmailService emailService; - public Iterable saveAll(List users){return repository.saveAll(users);} + public Iterable saveAll(List users) { + return repository.saveAll(users); + } - public Iterable findAllUsers(){return repository.findAll();} + public Iterable findAllUsers() { + return repository.findAll(); + } - public void deletUser(Long id){repository.deleteById(id);} + public void deletUser(Long id) { + repository.deleteById(id); + } public Optional findUserByUsername(String username) { return jpaRepository.findByUsername(username); @@ -35,9 +45,24 @@ public User addUser(User user) { // Save User return jpaRepository.save(user); } - public User createUserFromDto(CreateUserDto userDto){ - User user = mapper.convertValue(userDto,User.class); - return jpaRepository.save(user); + + public User createUserFromDto(CreateUserDto userDto) { + User user = mapper.convertValue(userDto, User.class); + + User savedUser = jpaRepository.save(user); + + String subject = "Welcome to our service!"; + String body = "Dear " + savedUser.getName() + "Thank you for registration! \n your username is " + savedUser.getUsername(); + + try { + emailService.sendEmail(savedUser.getEmail(), subject, body); + } catch (EmailSendingException e) { + System.out.println(e.getMessage()); + throw new UserServiceException("User created successfuly, but failed to send welcome email!", "ERROR_ON_MAIL_SENDING"); + // e.printStackTrace(); + } + + return savedUser; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2340aa8..9549b98 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,4 +6,12 @@ spring.datasource.password=postgres #Jpa prop spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +#Email config +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=samuel.palacean@itschool.ro +spring.mail.password=wjau znku zoyu laow +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true From dfa1e6a912de944da6e6e1d78bb4703d17feba8f Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Mon, 4 Nov 2024 21:36:09 +0200 Subject: [PATCH 06/37] jpa --- src/main/resources/application.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9549b98..c22077c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -11,7 +11,7 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect #Email config spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username=samuel.palacean@itschool.ro -spring.mail.password=wjau znku zoyu laow +spring.mail.username= +spring.mail.password= spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true From 5423d64c9251e4e49d63587a78f7e575c416f6b2 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Mon, 11 Nov 2024 21:08:49 +0200 Subject: [PATCH 07/37] jpa --- .../com/example/jpa/services/UserService.java | 6 +- src/main/resources/application.properties | 4 +- .../com/example/jpa/JpaApplicationTests.java | 13 -- .../java/com/example/jpa/UserServiceTest.java | 120 ++++++++++++++++++ 4 files changed, 125 insertions(+), 18 deletions(-) delete mode 100644 src/test/java/com/example/jpa/JpaApplicationTests.java create mode 100644 src/test/java/com/example/jpa/UserServiceTest.java diff --git a/src/main/java/com/example/jpa/services/UserService.java b/src/main/java/com/example/jpa/services/UserService.java index 52cdc27..60d12ea 100644 --- a/src/main/java/com/example/jpa/services/UserService.java +++ b/src/main/java/com/example/jpa/services/UserService.java @@ -26,15 +26,15 @@ public class UserService { private EmailService emailService; public Iterable saveAll(List users) { - return repository.saveAll(users); + return jpaRepository.saveAll(users); } public Iterable findAllUsers() { - return repository.findAll(); + return jpaRepository.findAll(); } public void deletUser(Long id) { - repository.deleteById(id); + jpaRepository.deleteById(id); } public Optional findUserByUsername(String username) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c22077c..5f49709 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -11,7 +11,7 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect #Email config spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username= -spring.mail.password= +spring.mail.username=angelosima25@gmail.com +spring.mail.password=yfij xxvu ombn cabg spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true diff --git a/src/test/java/com/example/jpa/JpaApplicationTests.java b/src/test/java/com/example/jpa/JpaApplicationTests.java deleted file mode 100644 index d99adaf..0000000 --- a/src/test/java/com/example/jpa/JpaApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.jpa; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class JpaApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/com/example/jpa/UserServiceTest.java b/src/test/java/com/example/jpa/UserServiceTest.java new file mode 100644 index 0000000..9299719 --- /dev/null +++ b/src/test/java/com/example/jpa/UserServiceTest.java @@ -0,0 +1,120 @@ +package com.example.jpa; + +import com.example.jpa.dtos.CreateUserDto; +import com.example.jpa.exceptions.EmailSendingException; +import com.example.jpa.exceptions.UserServiceException; +import com.example.jpa.models.User; +import com.example.jpa.repositories.UserJpaRepository; +import com.example.jpa.services.EmailService; +import com.example.jpa.services.UserService; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class UserServiceTest { + + @Mock + private UserJpaRepository jpaRepository; + + @InjectMocks + private UserService userService; + + @Mock + private ObjectMapper mapper; + + @Mock + private EmailService emailService; + + + private User testUser; + + private CreateUserDto testUserDto; + + + @BeforeEach + void setUp() { + testUser = new User(); + testUser.setId(1L); + testUser.setName("Sam"); + testUser.setUsername("userboss"); + testUser.setEmail("setboss@gmail.com"); + + testUserDto = new CreateUserDto(); + } + + + @Test + void saveAll_ShouldReturnSavedUsers() { + List users = Arrays.asList(testUser); + when(jpaRepository.saveAll(users)).thenReturn(users); + + Iterable savedUser = userService.saveAll(users); + + assertNotNull(savedUser); + verify(jpaRepository).saveAll(users); + + } + + @Test + void findAllUsers_ShouldReturnAllUsers() { + List users = Arrays.asList(testUser); + when(jpaRepository.findAll()).thenReturn(users); + + Iterable foundUsers = userService.findAllUsers(); + assertNotNull(foundUsers); + verify(jpaRepository).findAll(); + } + + @Test + void deletUser_ShouldDeleteUserById() { + Long userId = 1L; + doNothing().when(jpaRepository).deleteById(userId); + + userService.deletUser(userId); + + verify(jpaRepository).deleteById(userId); + + } + + @Test + void createUserFromDto_ShouldCreateAndSendEmail() throws EmailSendingException { + when(mapper.convertValue(testUserDto, User.class)).thenReturn(testUser); + when(jpaRepository.save(testUser)).thenReturn(testUser); + doNothing().when(emailService).sendEmail(anyString(), anyString(), anyString()); + + User savedUser = userService.createUserFromDto(testUserDto); + + assertNotNull(savedUser); + verify(mapper).convertValue(testUserDto, User.class); + verify(jpaRepository).save(any(User.class)); + verify(emailService).sendEmail(anyString(), anyString(), anyString()); + } + + @Test + void createUserFromDto_ShouldThrowException_WhenEmailFailed() throws EmailSendingException { + + when(mapper.convertValue(testUserDto, User.class)).thenReturn(testUser); + when(jpaRepository.save(testUser)).thenReturn(testUser); + doThrow(new EmailSendingException("Failed to send email !")).when(emailService).sendEmail(anyString(), anyString(), anyString()); + + assertThrows(UserServiceException.class, () -> userService.createUserFromDto(testUserDto)); + + verify(mapper).convertValue(testUserDto, User.class); + verify(jpaRepository).save(any(User.class)); + verify(emailService).sendEmail(anyString(), anyString(), anyString()); + + } + +} From ca7ad34562acedf32c64870a0397046086687563 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Fri, 15 Nov 2024 22:23:27 +0200 Subject: [PATCH 08/37] jpa --- pom.xml | 9 ++ .../example/jpa/services/OrderService.java | 8 +- .../resources/application-test.properties | 12 ++ .../jpa/Concurancy/AtomicExamples.java | 18 +++ .../jpa/Concurancy/CollectionExample.java | 22 ++++ .../com/example/jpa/Concurancy/Count.java | 19 ++++ .../jpa/Concurancy/CountObjectSync.java | 22 ++++ .../jpa/Concurancy/CountUsingLock.java | 29 +++++ .../jpa/Concurancy/DeadlockExample.java | 48 ++++++++ .../com/example/jpa/Concurancy/MyThread.java | 23 ++++ .../jpa/OrderControllerIntegrationTest.java | 103 ++++++++++++++++++ .../jpa/OrderServiceIntegrationTest.java | 83 ++++++++++++++ 12 files changed, 393 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/application-test.properties create mode 100644 src/test/java/com/example/jpa/Concurancy/AtomicExamples.java create mode 100644 src/test/java/com/example/jpa/Concurancy/CollectionExample.java create mode 100644 src/test/java/com/example/jpa/Concurancy/Count.java create mode 100644 src/test/java/com/example/jpa/Concurancy/CountObjectSync.java create mode 100644 src/test/java/com/example/jpa/Concurancy/CountUsingLock.java create mode 100644 src/test/java/com/example/jpa/Concurancy/DeadlockExample.java create mode 100644 src/test/java/com/example/jpa/Concurancy/MyThread.java create mode 100644 src/test/java/com/example/jpa/OrderControllerIntegrationTest.java create mode 100644 src/test/java/com/example/jpa/OrderServiceIntegrationTest.java diff --git a/pom.xml b/pom.xml index 5b05344..f13bd7f 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,9 @@ org.springframework.boot spring-boot-starter-data-jpa + + + org.springframework.boot spring-boot-starter-web @@ -51,6 +54,12 @@ lombok true + + com.h2database + h2 + test + + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/com/example/jpa/services/OrderService.java b/src/main/java/com/example/jpa/services/OrderService.java index 304eed9..d66671d 100644 --- a/src/main/java/com/example/jpa/services/OrderService.java +++ b/src/main/java/com/example/jpa/services/OrderService.java @@ -33,9 +33,11 @@ public Order placeOrder(Long userId, String product, Double price) { - } else System.out.println("User with id: " + userId + "not found!"); - - return orderRepository.save(order); + } else { + System.out.println("User with id: " + userId + "not found!"); + return null; + } + return orderRepository.save(order); } public List getOrdersWithPagination(Long userId, int page, int size) { diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties new file mode 100644 index 0000000..1c37463 --- /dev/null +++ b/src/main/resources/application-test.properties @@ -0,0 +1,12 @@ +# Configurare H2 pentru teste +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect + +# Configurare JPA/Hibernate +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +spring.h2.console.enabled=true \ No newline at end of file diff --git a/src/test/java/com/example/jpa/Concurancy/AtomicExamples.java b/src/test/java/com/example/jpa/Concurancy/AtomicExamples.java new file mode 100644 index 0000000..85d3f00 --- /dev/null +++ b/src/test/java/com/example/jpa/Concurancy/AtomicExamples.java @@ -0,0 +1,18 @@ +package com.example.jpa.Concurancy; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; + +public class AtomicExamples { + private static AtomicInteger atomicInteger = new AtomicInteger(0); + + public static void main(String... args) { + ExecutorService executorService = Executors.newFixedThreadPool(5); + for (int i = 0; i < 10; i++) { + executorService.submit(() -> System.out.println(atomicInteger.incrementAndGet() + " TreadId: " + Thread.currentThread().getId())); + } + + executorService.shutdown(); + } +} diff --git a/src/test/java/com/example/jpa/Concurancy/CollectionExample.java b/src/test/java/com/example/jpa/Concurancy/CollectionExample.java new file mode 100644 index 0000000..05406c8 --- /dev/null +++ b/src/test/java/com/example/jpa/Concurancy/CollectionExample.java @@ -0,0 +1,22 @@ +package com.example.jpa.Concurancy; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class CollectionExample { + public static void main(String... args) { + Map stringStringMap = new ConcurrentHashMap<>(); + stringStringMap.put("Sam", "Java"); + stringStringMap.put("Daniel", "typeScript"); + +// Set keys = new HashSet<>(stringStringMap.keySet()); + + for (String k : stringStringMap.keySet()) { + System.out.println(k + " loves coding in: " + stringStringMap.get(k)); + stringStringMap.remove(k); + } + + System.out.println("Size: " + stringStringMap.size()); + + } +} diff --git a/src/test/java/com/example/jpa/Concurancy/Count.java b/src/test/java/com/example/jpa/Concurancy/Count.java new file mode 100644 index 0000000..f59decd --- /dev/null +++ b/src/test/java/com/example/jpa/Concurancy/Count.java @@ -0,0 +1,19 @@ +package com.example.jpa.Concurancy; + +public class Count { + public static int count = 0; + + public static synchronized void incrementCounter() { + int current = count; + System.out.println("Before: " + current + " ThreadId: " + Thread.currentThread().getId()); + count = current + 1; + System.out.println("After: " + count + " ThreadId: " + Thread.currentThread().getId()); + } + + public static void main(String... args) { + for (int i = 0; i < 10; i++) { + Thread t = new Thread(Count::incrementCounter); + t.start(); + } + } +} diff --git a/src/test/java/com/example/jpa/Concurancy/CountObjectSync.java b/src/test/java/com/example/jpa/Concurancy/CountObjectSync.java new file mode 100644 index 0000000..82c5406 --- /dev/null +++ b/src/test/java/com/example/jpa/Concurancy/CountObjectSync.java @@ -0,0 +1,22 @@ +package com.example.jpa.Concurancy; + +public class CountObjectSync { + public static int count = 0; + public static Object lock = new Object(); + + public static void incrementCounter() { + synchronized (lock) { + int current = count; + System.out.println("Before: " + current + " ThreadId: " + Thread.currentThread().getId()); + count = current + 1; + System.out.println("After: " + count + " ThreadId: " + Thread.currentThread().getId()); + } + } + + public static void main(String... args) { + for (int i = 0; i < 10; i++) { + Thread t = new Thread(CountObjectSync::incrementCounter); + t.start(); + } + } +} diff --git a/src/test/java/com/example/jpa/Concurancy/CountUsingLock.java b/src/test/java/com/example/jpa/Concurancy/CountUsingLock.java new file mode 100644 index 0000000..d79e390 --- /dev/null +++ b/src/test/java/com/example/jpa/Concurancy/CountUsingLock.java @@ -0,0 +1,29 @@ +package com.example.jpa.Concurancy; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class CountUsingLock { + public static int count = 0; + public static Lock lock = new ReentrantLock(); + + public static void incrementCounter() { + if (lock.tryLock()) { + try { + int current = count; + System.out.println("Before: " + current + " ThreadId: " + Thread.currentThread().getId()); + count = current + 1; + System.out.println("After: " + count + " ThreadId: " + Thread.currentThread().getId()); + } finally { + lock.unlock(); + } + } else System.out.println("Thread failed to increment " + Thread.currentThread().getId()); + } + + public static void main(String... args) { + for (int i = 0; i < 10; i++) { + Thread t = new Thread(CountUsingLock::incrementCounter); + t.start(); + } + } +} diff --git a/src/test/java/com/example/jpa/Concurancy/DeadlockExample.java b/src/test/java/com/example/jpa/Concurancy/DeadlockExample.java new file mode 100644 index 0000000..2f1bdbd --- /dev/null +++ b/src/test/java/com/example/jpa/Concurancy/DeadlockExample.java @@ -0,0 +1,48 @@ +package com.example.jpa.Concurancy; + +public class DeadlockExample { + public static final Object RESOURCE1 = new Object(); + public static final Object RESOURCE2 = new Object(); + + public static void main(String... args) { + Thread t1 = new Thread(() -> { + System.out.println("T1: incerc sa obtin resursa1"); + synchronized (RESOURCE1) { + System.out.println("T1: am obtinut resursa1"); + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.println("T1: incerc sa obtin resursa2"); + synchronized (RESOURCE2) { + System.out.println("T1: am obtinut resursa2"); + } + } + }); + + Thread t2 = new Thread(() -> { + System.out.println("T2: Incerc saobtin resursa1"); + synchronized (RESOURCE1) { + System.out.println("T2: Am obtinut resursa1"); + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + System.out.println("T2: incerc sa obtin resursa2"); + synchronized (RESOURCE2) { + System.out.println("T2: am obtinut resursa2"); + } + } + }); + + t1.start(); + t2.start(); + } + +} diff --git a/src/test/java/com/example/jpa/Concurancy/MyThread.java b/src/test/java/com/example/jpa/Concurancy/MyThread.java new file mode 100644 index 0000000..36b0fc6 --- /dev/null +++ b/src/test/java/com/example/jpa/Concurancy/MyThread.java @@ -0,0 +1,23 @@ +package com.example.jpa.Concurancy; + +public class MyThread extends Thread { + @Override + public void run() { + for (int i = 0; i < 5; i++) { + System.out.println("Thread: " + i); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } +} + +class Main { + public static void main(String... args) { + MyThread t = new MyThread(); +// t.setDaemon(true); + t.start(); + } +} diff --git a/src/test/java/com/example/jpa/OrderControllerIntegrationTest.java b/src/test/java/com/example/jpa/OrderControllerIntegrationTest.java new file mode 100644 index 0000000..daca6f8 --- /dev/null +++ b/src/test/java/com/example/jpa/OrderControllerIntegrationTest.java @@ -0,0 +1,103 @@ +package com.example.jpa; + +import com.example.jpa.models.Order; +import com.example.jpa.models.User; +import com.example.jpa.repositories.OrderRepository; +import com.example.jpa.repositories.UserJpaRepository; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import java.time.LocalDate; +import java.util.List; + +import static org.hamcrest.Matchers.hasSize; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@ActiveProfiles("test") +@Transactional +@AutoConfigureMockMvc +public class OrderControllerIntegrationTest { + @Autowired + private MockMvc mockMvc; + + @Autowired + private UserJpaRepository userRepository; + + @Autowired + private OrderRepository orderRepository; + + private User testUser; + + @BeforeEach + void setUp() { + User u = new User(); + u.setName("sam"); + u.setUsername("test1"); + u.setEmail("user1@gmail.com"); + testUser = userRepository.save(u); + } + + @Test + void placeOrder_ShouldReturnCreatedOrder() throws Exception { + String product = "Test Product"; + double price = 99.9; + + mockMvc.perform(MockMvcRequestBuilders.post("/orders") + .param("userId", String.valueOf(testUser.getId())) + .param("product", product) + .param("price", String.valueOf(price)) + .contentType(MediaType.APPLICATION_FORM_URLENCODED)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.product").value(product)) + .andExpect(jsonPath("$.price").value(price)); + + List orders = orderRepository.findByUserId(testUser.getId()); + assertEquals(1, orders.size()); + + Order createdOrder = orders.get(0); + assertEquals(product, createdOrder.getProduct()); + assertEquals(price, createdOrder.getPrice()); + assertEquals(testUser.getId(), createdOrder.getUser().getId()); + } + + @Test + void ordersWithPagination_ShouldReturnPaginatedOrders() throws Exception { + createOrders(testUser, 10); + + mockMvc.perform(MockMvcRequestBuilders.get("/orders") + .param("userId", String.valueOf(testUser.getId())) + .param("page", "1") + .param("size", "5") + .contentType(MediaType.APPLICATION_FORM_URLENCODED)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", hasSize(5))); + + mockMvc.perform(MockMvcRequestBuilders.get("/orders") + .param("userId", String.valueOf(testUser.getId())) + .param("page", "2") + .param("size", "3") + .contentType(MediaType.APPLICATION_FORM_URLENCODED)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", hasSize(3))); + + } + + private void createOrders(User user, int count) { + for (int i = 0; i < count; i++) { + Order o = new Order("Product " + i, 100.0 + i, LocalDate.now(), user); + orderRepository.save(o); + } + } + +} \ No newline at end of file diff --git a/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java b/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java new file mode 100644 index 0000000..304b023 --- /dev/null +++ b/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java @@ -0,0 +1,83 @@ +package com.example.jpa; + +import com.example.jpa.models.Order; +import com.example.jpa.models.User; +import com.example.jpa.repositories.OrderRepository; +import com.example.jpa.repositories.UserJpaRepository; +import com.example.jpa.services.OrderService; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@ActiveProfiles("test") +@Transactional +public class OrderServiceIntegrationTest { + + @Autowired + private OrderService service; + + + @Autowired + private OrderRepository orderRepository; + + @Autowired + private UserJpaRepository userRepository; + + private User testUser; + private Order testOrder; + + @BeforeEach + void setUp() { + //curatare data base + orderRepository.deleteAll(); + userRepository.deleteAll(); + + //creaza user nou + User u = new User(); + u.setName("Angelo"); + u.setUsername("user 1"); + u.setEmail("user1@gmail.com"); + + testUser = userRepository.save(u); + //creaza order + Order o = new Order(); + o.setProduct("Test Product"); + o.setUser(testUser); + o.setPrice(100.0); + o.setOrderDate(LocalDate.now()); + testOrder = orderRepository.save(o); + } + + @Test + void placeOrder_ShouldCreateANewOrder() { + String product = "New Product"; + Double price = 150.0; + + Order placedOrder = service.placeOrder(testUser.getId(), product, price); + + assertNotNull(placedOrder); + assertNotNull(placedOrder.getId()); + assertEquals(product, placedOrder.getProduct()); + assertEquals(price, placedOrder.getPrice()); + assertEquals(testUser.getId(), placedOrder.getUser().getId()); + + assertTrue(orderRepository.findById(placedOrder.getId()).isPresent()); + + + } + + @Test + void placeOrder_ShouldReturnNull_WhenUserDoesNotExist(){ + Order placedOrder = service.placeOrder(9999L,"Same Product",50.0); + assertNull(placedOrder); + } + +} From fa30d637b4965f922bc12781a7f48973d5403497 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Fri, 15 Nov 2024 22:31:04 +0200 Subject: [PATCH 09/37] jpa --- src/test/java/com/example/jpa/Concurancy/DeadlockExample.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/example/jpa/Concurancy/DeadlockExample.java b/src/test/java/com/example/jpa/Concurancy/DeadlockExample.java index 2f1bdbd..de12afc 100644 --- a/src/test/java/com/example/jpa/Concurancy/DeadlockExample.java +++ b/src/test/java/com/example/jpa/Concurancy/DeadlockExample.java @@ -24,7 +24,7 @@ public static void main(String... args) { }); Thread t2 = new Thread(() -> { - System.out.println("T2: Incerc saobtin resursa1"); + System.out.println("T2: Incerc sa obtin resursa1"); synchronized (RESOURCE1) { System.out.println("T2: Am obtinut resursa1"); From 7f3c2af66ab3fccf33d63a68f25bc8127490e0ed Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Mon, 18 Nov 2024 20:42:36 +0200 Subject: [PATCH 10/37] jpa --- .../jpa/concurancy}/AtomicExamples.java | 2 +- .../jpa/concurancy}/CollectionExample.java | 2 +- .../com/example/jpa/concurancy}/Count.java | 2 +- .../jpa/concurancy}/CountObjectSync.java | 2 +- .../jpa/concurancy}/CountUsingLock.java | 2 +- .../jpa/concurancy}/DeadlockExample.java | 2 +- .../com/example/jpa/concurancy}/MyThread.java | 2 +- .../example/jpa/designpatterns/Builder.java | 103 ++++++++++++++++++ .../example/jpa/designpatterns/Facade.java | 46 ++++++++ .../example/jpa/designpatterns/Factory.java | 63 +++++++++++ .../jpa/designpatterns/Interpreter.java | 51 +++++++++ .../example/jpa/designpatterns/Observer.java | 49 +++++++++ .../jpa/designpatterns/Singletone.java | 38 +++++++ 13 files changed, 357 insertions(+), 7 deletions(-) rename src/{test/java/com/example/jpa/Concurancy => main/java/com/example/jpa/concurancy}/AtomicExamples.java (94%) rename src/{test/java/com/example/jpa/Concurancy => main/java/com/example/jpa/concurancy}/CollectionExample.java (94%) rename src/{test/java/com/example/jpa/Concurancy => main/java/com/example/jpa/concurancy}/Count.java (93%) rename src/{test/java/com/example/jpa/Concurancy => main/java/com/example/jpa/concurancy}/CountObjectSync.java (94%) rename src/{test/java/com/example/jpa/Concurancy => main/java/com/example/jpa/concurancy}/CountUsingLock.java (96%) rename src/{test/java/com/example/jpa/Concurancy => main/java/com/example/jpa/concurancy}/DeadlockExample.java (97%) rename src/{test/java/com/example/jpa/Concurancy => main/java/com/example/jpa/concurancy}/MyThread.java (93%) create mode 100644 src/main/java/com/example/jpa/designpatterns/Builder.java create mode 100644 src/main/java/com/example/jpa/designpatterns/Facade.java create mode 100644 src/main/java/com/example/jpa/designpatterns/Factory.java create mode 100644 src/main/java/com/example/jpa/designpatterns/Interpreter.java create mode 100644 src/main/java/com/example/jpa/designpatterns/Observer.java create mode 100644 src/main/java/com/example/jpa/designpatterns/Singletone.java diff --git a/src/test/java/com/example/jpa/Concurancy/AtomicExamples.java b/src/main/java/com/example/jpa/concurancy/AtomicExamples.java similarity index 94% rename from src/test/java/com/example/jpa/Concurancy/AtomicExamples.java rename to src/main/java/com/example/jpa/concurancy/AtomicExamples.java index 85d3f00..b5bc06c 100644 --- a/src/test/java/com/example/jpa/Concurancy/AtomicExamples.java +++ b/src/main/java/com/example/jpa/concurancy/AtomicExamples.java @@ -1,4 +1,4 @@ -package com.example.jpa.Concurancy; +package com.example.jpa.concurancy; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/src/test/java/com/example/jpa/Concurancy/CollectionExample.java b/src/main/java/com/example/jpa/concurancy/CollectionExample.java similarity index 94% rename from src/test/java/com/example/jpa/Concurancy/CollectionExample.java rename to src/main/java/com/example/jpa/concurancy/CollectionExample.java index 05406c8..a8f36ce 100644 --- a/src/test/java/com/example/jpa/Concurancy/CollectionExample.java +++ b/src/main/java/com/example/jpa/concurancy/CollectionExample.java @@ -1,4 +1,4 @@ -package com.example.jpa.Concurancy; +package com.example.jpa.concurancy; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/test/java/com/example/jpa/Concurancy/Count.java b/src/main/java/com/example/jpa/concurancy/Count.java similarity index 93% rename from src/test/java/com/example/jpa/Concurancy/Count.java rename to src/main/java/com/example/jpa/concurancy/Count.java index f59decd..d7a2cf6 100644 --- a/src/test/java/com/example/jpa/Concurancy/Count.java +++ b/src/main/java/com/example/jpa/concurancy/Count.java @@ -1,4 +1,4 @@ -package com.example.jpa.Concurancy; +package com.example.jpa.concurancy; public class Count { public static int count = 0; diff --git a/src/test/java/com/example/jpa/Concurancy/CountObjectSync.java b/src/main/java/com/example/jpa/concurancy/CountObjectSync.java similarity index 94% rename from src/test/java/com/example/jpa/Concurancy/CountObjectSync.java rename to src/main/java/com/example/jpa/concurancy/CountObjectSync.java index 82c5406..31cbeef 100644 --- a/src/test/java/com/example/jpa/Concurancy/CountObjectSync.java +++ b/src/main/java/com/example/jpa/concurancy/CountObjectSync.java @@ -1,4 +1,4 @@ -package com.example.jpa.Concurancy; +package com.example.jpa.concurancy; public class CountObjectSync { public static int count = 0; diff --git a/src/test/java/com/example/jpa/Concurancy/CountUsingLock.java b/src/main/java/com/example/jpa/concurancy/CountUsingLock.java similarity index 96% rename from src/test/java/com/example/jpa/Concurancy/CountUsingLock.java rename to src/main/java/com/example/jpa/concurancy/CountUsingLock.java index d79e390..cbc412b 100644 --- a/src/test/java/com/example/jpa/Concurancy/CountUsingLock.java +++ b/src/main/java/com/example/jpa/concurancy/CountUsingLock.java @@ -1,4 +1,4 @@ -package com.example.jpa.Concurancy; +package com.example.jpa.concurancy; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; diff --git a/src/test/java/com/example/jpa/Concurancy/DeadlockExample.java b/src/main/java/com/example/jpa/concurancy/DeadlockExample.java similarity index 97% rename from src/test/java/com/example/jpa/Concurancy/DeadlockExample.java rename to src/main/java/com/example/jpa/concurancy/DeadlockExample.java index de12afc..d976b63 100644 --- a/src/test/java/com/example/jpa/Concurancy/DeadlockExample.java +++ b/src/main/java/com/example/jpa/concurancy/DeadlockExample.java @@ -1,4 +1,4 @@ -package com.example.jpa.Concurancy; +package com.example.jpa.concurancy; public class DeadlockExample { public static final Object RESOURCE1 = new Object(); diff --git a/src/test/java/com/example/jpa/Concurancy/MyThread.java b/src/main/java/com/example/jpa/concurancy/MyThread.java similarity index 93% rename from src/test/java/com/example/jpa/Concurancy/MyThread.java rename to src/main/java/com/example/jpa/concurancy/MyThread.java index 36b0fc6..a1ae77f 100644 --- a/src/test/java/com/example/jpa/Concurancy/MyThread.java +++ b/src/main/java/com/example/jpa/concurancy/MyThread.java @@ -1,4 +1,4 @@ -package com.example.jpa.Concurancy; +package com.example.jpa.concurancy; public class MyThread extends Thread { @Override diff --git a/src/main/java/com/example/jpa/designpatterns/Builder.java b/src/main/java/com/example/jpa/designpatterns/Builder.java new file mode 100644 index 0000000..23f0bdc --- /dev/null +++ b/src/main/java/com/example/jpa/designpatterns/Builder.java @@ -0,0 +1,103 @@ +package com.example.jpa.designpatterns; + +import java.util.ArrayList; +import java.util.List; + +class Pizza { + + private String blat; + private String sos; + private List toppings; + + public static class PizzaBuilder { + private Pizza pizza; + + public PizzaBuilder() { + pizza = new Pizza(); + pizza.toppings = new ArrayList<>(); + } + + public PizzaBuilder blat(String blat) { + pizza.blat = blat; + return this; + } + + public PizzaBuilder sos(String sos) { + pizza.sos = sos; + return this; + } + + public PizzaBuilder addTopping(String topping) { + pizza.toppings.add(topping); + return this; + + } + + public Pizza buid() { + return pizza; + } + } + + @Override + public String toString() { + return "Pizza cy blat " + blat + ", sos " + sos + " si toppinguri: " + toppings; + } + +} + +class PizzaB { + private String blat; + private String sos; + private List toppings; + + + public PizzaB withBlat(String blat) { + this.blat = blat; + return this; + + } + + public PizzaB withSos(String sos) { + if (toppings == null) { + toppings = new ArrayList<>(); + } + this.sos = sos; + return this; + + } + + public PizzaB withTopping(String topping) { + toppings.add(topping); + return this; + } + + + @Override + public String toString() { + return "Pizza cy blat " + blat + ", sos " + sos + " si toppinguri: " + toppings; + } + +} + + +public class Builder { + public static void main(String... a) { + Pizza pizza1 = new Pizza.PizzaBuilder() + .blat("subtire") + .sos("rosii") + .addTopping("mozzarela") + .addTopping("busuioc") + .buid(); + + PizzaB pizza2 = new PizzaB() + .withBlat("gros") + .withSos("rosii") + .withTopping("sunca") + .withTopping("mozzarela"); + + + System.out.println(pizza1); + System.out.println(pizza2); + } + +} diff --git a/src/main/java/com/example/jpa/designpatterns/Facade.java b/src/main/java/com/example/jpa/designpatterns/Facade.java new file mode 100644 index 0000000..a1c30c9 --- /dev/null +++ b/src/main/java/com/example/jpa/designpatterns/Facade.java @@ -0,0 +1,46 @@ +package com.example.jpa.designpatterns; + +class SistemAudio{ + public void pornesteAudio(){ + System.out.println("Sistem audio pornit!"); + } +} +class SistemLumini{ + public void pornesteLumini(){ + System.out.println("Sistem lumini pornit!"); + } +} + +class SistemVideo{ + public void pornesteVideo(){ + System.out.println("Sistem video pornit!"); + } +} + +class HomeCinemaFacade { + private SistemLumini lumini; + private SistemAudio audio; + private SistemVideo video; + + public HomeCinemaFacade(){ + lumini = new SistemLumini(); + audio = new SistemAudio(); + video = new SistemVideo(); + } + + public void pornesteFilm(){ + lumini.pornesteLumini(); + audio.pornesteAudio(); + video.pornesteVideo(); + } + + +} + + +public class Facade { + public static void main(String... a){ +HomeCinemaFacade facade = new HomeCinemaFacade(); +facade.pornesteFilm(); + } +} diff --git a/src/main/java/com/example/jpa/designpatterns/Factory.java b/src/main/java/com/example/jpa/designpatterns/Factory.java new file mode 100644 index 0000000..9504a3e --- /dev/null +++ b/src/main/java/com/example/jpa/designpatterns/Factory.java @@ -0,0 +1,63 @@ +package com.example.jpa.designpatterns; + +import org.springframework.scheduling.support.SimpleTriggerContext; + +interface Animal { + void makeSound(); + +} + +class Dog implements Animal { + + + @Override + public void makeSound() { + System.out.println("Ham ham!"); + } + +} + +class Cat implements Animal { + + @Override + public void makeSound() { + System.out.println("Miau!"); + } +} + +class Lion implements Animal { + + @Override + public void makeSound() { + System.out.println("Roar!"); + } +} + +class AnimalFactory { + public Animal createAnimal(String type) { + if (type.equalsIgnoreCase("dog")) { + return new Dog(); + } else if (type.equalsIgnoreCase("cat")) { + return new Cat(); + } else if (type.equalsIgnoreCase("Lion")) { + return new Lion(); + + } + return null; + } +} + + +public class Factory { +public static void main(String... a){ + AnimalFactory factory = new AnimalFactory(); + + Animal dog = factory.createAnimal("dog"); + Animal cat = factory.createAnimal("Cat"); + Animal lion = factory.createAnimal("liOn"); + + dog.makeSound(); + cat.makeSound(); + lion.makeSound(); +} +} diff --git a/src/main/java/com/example/jpa/designpatterns/Interpreter.java b/src/main/java/com/example/jpa/designpatterns/Interpreter.java new file mode 100644 index 0000000..f778e1f --- /dev/null +++ b/src/main/java/com/example/jpa/designpatterns/Interpreter.java @@ -0,0 +1,51 @@ +package com.example.jpa.designpatterns; + +import jdk.swing.interop.SwingInterOpUtils; + +interface Expression { + int interpret(); + +} + +class NumberExpression implements Expression { + private int number; + + public NumberExpression(int number) { + this.number = number; + + } + + @Override + public int interpret() { + return number; + } +} + +class AddExpression implements Expression { + private Expression leftExpression; + private Expression rightExpression; + + public AddExpression(Expression e1, Expression e2) { + leftExpression = e1; + rightExpression = e2; + + } + + + @Override + public int interpret() { + return leftExpression.interpret() + rightExpression.interpret(); + } +} + +public class Interpreter { + public static void main(String... a) { + + Expression sum = new AddExpression(new NumberExpression(5), new NumberExpression(10)); + Expression sum2 = new AddExpression(sum,new NumberExpression(6)); + + + System.out.println("Sum2 " + sum2.interpret()); + System.out.println("Rez: " + sum.interpret()); + } +} diff --git a/src/main/java/com/example/jpa/designpatterns/Observer.java b/src/main/java/com/example/jpa/designpatterns/Observer.java new file mode 100644 index 0000000..b871684 --- /dev/null +++ b/src/main/java/com/example/jpa/designpatterns/Observer.java @@ -0,0 +1,49 @@ +package com.example.jpa.designpatterns; + + +import java.util.ArrayList; +import java.util.List; + +interface ObserverInt { + void update(String message); +} + +class NewSubscriber implements ObserverInt { + private String name; + + public NewSubscriber(String name) { + this.name = name; + } + + @Override + public void update(String message) { + System.out.println(name + " a primit stirea: " + message); + + } +} + +class NewAgency { + List observers = new ArrayList<>(); + + public void addObserver(ObserverInt o) { + observers.add(o); + } + + public void publishNews(String message) { + for (ObserverInt obs : observers) { + obs.update(message); + } + } +} + +public class Observer { + public static void main(String... a) { + NewAgency agency = new NewAgency(); + NewSubscriber s1 = new NewSubscriber("Sam"); + NewSubscriber s2 = new NewSubscriber("Ion"); + agency.addObserver(s1); + agency.addObserver(s2); + agency.publishNews("Trump a castigat!"); + + } +} diff --git a/src/main/java/com/example/jpa/designpatterns/Singletone.java b/src/main/java/com/example/jpa/designpatterns/Singletone.java new file mode 100644 index 0000000..7c9e8c5 --- /dev/null +++ b/src/main/java/com/example/jpa/designpatterns/Singletone.java @@ -0,0 +1,38 @@ +package com.example.jpa.designpatterns; + +class DatabaseConnection { + private static DatabaseConnection instance; + private String connectionString; + + + private DatabaseConnection() { + connectionString = "jdbc:myskl://localhost:3306/db"; + + } + + public static synchronized DatabaseConnection getInstance() { + + if (instance == null) + instance = new DatabaseConnection(); + return instance; + } + + public void connect() { + System.out.println("Conecteaza la : " + connectionString); + + } + + +} + + +public class Singletone { + public static void main(String... a) { + DatabaseConnection db = DatabaseConnection.getInstance(); + db.connect(); + System.out.println(db); + + DatabaseConnection db2 = DatabaseConnection.getInstance(); + System.out.println(db2); + } +} From 22f0ec674adf3c739b04d90fb7dbe4d93e158682 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 5 Dec 2024 18:27:19 +0200 Subject: [PATCH 11/37] jpa --- .../jpa/otherStuff/recap/Abstractizare.java | 65 ++++++++++++++ .../jpa/otherStuff/recap/ExceptionDemo.java | 67 ++++++++++++++ .../jpa/otherStuff/recap/Polimorfism.java | 49 ++++++++++ .../jpa/otherStuff/recap/UserService.java | 4 + .../recap}/concurancy/AtomicExamples.java | 2 +- .../recap}/concurancy/CollectionExample.java | 2 +- .../recap}/concurancy/Count.java | 2 +- .../recap}/concurancy/CountObjectSync.java | 2 +- .../recap}/concurancy/CountUsingLock.java | 2 +- .../recap}/concurancy/DeadlockExample.java | 2 +- .../recap}/concurancy/MyThread.java | 2 +- .../concurancy/solid/DPrincipleAfter.java | 50 +++++++++++ .../concurancy/solid/DPrincipleBefore.java | 28 ++++++ .../concurancy/solid/LPrincipleBefore.java | 89 +++++++++++++++++++ .../concurancy/solid/OPrincipleAfter.java | 78 ++++++++++++++++ .../concurancy/solid/OPrincipleBefore.java | 18 ++++ .../concurancy/solid/SPrincipaleBefore.java | 38 ++++++++ .../concurancy/solid/SPrincipleAfter.java | 71 +++++++++++++++ .../recap}/designpatterns/Builder.java | 2 +- .../recap}/designpatterns/Facade.java | 2 +- .../recap}/designpatterns/Factory.java | 4 +- .../recap}/designpatterns/Interpreter.java | 4 +- .../recap}/designpatterns/Observer.java | 2 +- .../recap}/designpatterns/Singletone.java | 2 +- 24 files changed, 570 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/Abstractizare.java create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/ExceptionDemo.java create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/Polimorfism.java create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/UserService.java rename src/main/java/com/example/jpa/{ => otherStuff/recap}/concurancy/AtomicExamples.java (91%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/concurancy/CollectionExample.java (92%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/concurancy/Count.java (91%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/concurancy/CountObjectSync.java (92%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/concurancy/CountUsingLock.java (94%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/concurancy/DeadlockExample.java (96%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/concurancy/MyThread.java (90%) create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/DPrincipleAfter.java create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/DPrincipleBefore.java create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/LPrincipleBefore.java create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/OPrincipleAfter.java create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/OPrincipleBefore.java create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/SPrincipaleBefore.java create mode 100644 src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/SPrincipleAfter.java rename src/main/java/com/example/jpa/{ => otherStuff/recap}/designpatterns/Builder.java (97%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/designpatterns/Facade.java (93%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/designpatterns/Factory.java (90%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/designpatterns/Interpreter.java (92%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/designpatterns/Observer.java (94%) rename src/main/java/com/example/jpa/{ => otherStuff/recap}/designpatterns/Singletone.java (93%) diff --git a/src/main/java/com/example/jpa/otherStuff/recap/Abstractizare.java b/src/main/java/com/example/jpa/otherStuff/recap/Abstractizare.java new file mode 100644 index 0000000..6417eb5 --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/Abstractizare.java @@ -0,0 +1,65 @@ +package com.example.jpa.otherStuff.recap; + +public class Abstractizare { + public static void main(String[] args){ + PremiumUser premiumUser = new PremiumUser("s", 25,10); + StandardUser standardUser = new StandardUser("p", 26,18); + } +} + +abstract class User{ + protected String name; + protected int age; + + public User(String name,int age){ + this.age = age; + this.name=name; + + } + public abstract double calculateDiscount(); + + + public void displayInfo(){ + System.out.println("Name : "+ name + "age" + age); + + } +} + +class StandardUser extends User{ + private int numberOfPurchases; + + + public StandardUser(String name,int age, int numberOfPurchases){ + super(name,age); + this.numberOfPurchases = numberOfPurchases; + + + } + + + @Override + public double calculateDiscount() { + return numberOfPurchases > 10 ? 0.1 : 0.0; + } +} +class PremiumUser extends User{ + private int numberOfPurchases; + + + public PremiumUser(String name,int age, int numberOfPurchases){ + super(name,age); + this.numberOfPurchases = numberOfPurchases; + + + } + + + @Override + public double calculateDiscount() { + return numberOfPurchases > 10 ? 0.1 : 0.0; + } +} + + + + diff --git a/src/main/java/com/example/jpa/otherStuff/recap/ExceptionDemo.java b/src/main/java/com/example/jpa/otherStuff/recap/ExceptionDemo.java new file mode 100644 index 0000000..1b9aedd --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/ExceptionDemo.java @@ -0,0 +1,67 @@ +package com.example.jpa.otherStuff.recap; + +import com.example.jpa.exceptions.EmailSendingException; + +public class ExceptionDemo { + //checked exceptions + static class InsuficientFoundsException extends Exception { + public InsuficientFoundsException(String message) { + super(message); + } + + } + + //uncheked except + static class AccountNotActiveException extends RuntimeException { + public AccountNotActiveException(String message) { + super(message); + } + } + + static class BankAccount { + private long balance = 1000L; + private boolean isActive = false; + + + public void transfer(long amount) throws InsuficientFoundsException { + if (amount > balance) + throw new InsuficientFoundsException("Fonduri insuficiente. Sold curent: " + balance); + + balance -= amount; + + + } + + public void withdraw(long amount) { + if (!isActive) + throw new AccountNotActiveException("Cont inactiv!"); + + if (amount < 0) + throw new IllegalArgumentException("Suma de retragere trebuie sa fie pozitiva!"); + + balance -= amount; + } + } + + public static void main(String... args) { + BankAccount account = new BankAccount(); + + + try { + account.transfer(900L); + } catch (InsuficientFoundsException ex) { + ex.printStackTrace(); + } + + + try { + account.withdraw(-5); + } catch (IllegalArgumentException e) { + System.out.println("Suma gresita! " + e.getMessage()); + } catch (AccountNotActiveException e) { + System.out.println("Exceptie: " + e.getMessage()); + + + } + } +} diff --git a/src/main/java/com/example/jpa/otherStuff/recap/Polimorfism.java b/src/main/java/com/example/jpa/otherStuff/recap/Polimorfism.java new file mode 100644 index 0000000..55aa97d --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/Polimorfism.java @@ -0,0 +1,49 @@ +package com.example.jpa.otherStuff.recap; + +public class Polimorfism { + public static void main(String[] args) { + Food pizza = new Pizza(); + Food salad = new Salad(); + + System.out.println(pizza.getPrice()); + System.out.println(salad.getPrice()); + + pizza.preparare(); + salad.preparare(); + + } + +} + + +interface Food{ + void preparare(); + double getPrice(); + +} + +class Pizza implements Food{ + + @Override + public void preparare() { + System.out.println("Prepara pizza!"); + } + + @Override + public double getPrice() { + return 12; + } + +} +class Salad implements Food{ + + @Override + public void preparare() { + System.out.println("Preparam salata!"); + } + + @Override + public double getPrice() { + return 10; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/otherStuff/recap/UserService.java b/src/main/java/com/example/jpa/otherStuff/recap/UserService.java new file mode 100644 index 0000000..46eac8f --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/UserService.java @@ -0,0 +1,4 @@ +package com.example.jpa.otherStuff.recap; + +public interface UserService { +} diff --git a/src/main/java/com/example/jpa/concurancy/AtomicExamples.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/AtomicExamples.java similarity index 91% rename from src/main/java/com/example/jpa/concurancy/AtomicExamples.java rename to src/main/java/com/example/jpa/otherStuff/recap/concurancy/AtomicExamples.java index b5bc06c..993b8d1 100644 --- a/src/main/java/com/example/jpa/concurancy/AtomicExamples.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/AtomicExamples.java @@ -1,4 +1,4 @@ -package com.example.jpa.concurancy; +package com.example.jpa.otherStuff.recap.concurancy; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/src/main/java/com/example/jpa/concurancy/CollectionExample.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/CollectionExample.java similarity index 92% rename from src/main/java/com/example/jpa/concurancy/CollectionExample.java rename to src/main/java/com/example/jpa/otherStuff/recap/concurancy/CollectionExample.java index a8f36ce..88832ca 100644 --- a/src/main/java/com/example/jpa/concurancy/CollectionExample.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/CollectionExample.java @@ -1,4 +1,4 @@ -package com.example.jpa.concurancy; +package com.example.jpa.otherStuff.recap.concurancy; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/com/example/jpa/concurancy/Count.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/Count.java similarity index 91% rename from src/main/java/com/example/jpa/concurancy/Count.java rename to src/main/java/com/example/jpa/otherStuff/recap/concurancy/Count.java index d7a2cf6..eb701a8 100644 --- a/src/main/java/com/example/jpa/concurancy/Count.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/Count.java @@ -1,4 +1,4 @@ -package com.example.jpa.concurancy; +package com.example.jpa.otherStuff.recap.concurancy; public class Count { public static int count = 0; diff --git a/src/main/java/com/example/jpa/concurancy/CountObjectSync.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/CountObjectSync.java similarity index 92% rename from src/main/java/com/example/jpa/concurancy/CountObjectSync.java rename to src/main/java/com/example/jpa/otherStuff/recap/concurancy/CountObjectSync.java index 31cbeef..6ae67d9 100644 --- a/src/main/java/com/example/jpa/concurancy/CountObjectSync.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/CountObjectSync.java @@ -1,4 +1,4 @@ -package com.example.jpa.concurancy; +package com.example.jpa.otherStuff.recap.concurancy; public class CountObjectSync { public static int count = 0; diff --git a/src/main/java/com/example/jpa/concurancy/CountUsingLock.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/CountUsingLock.java similarity index 94% rename from src/main/java/com/example/jpa/concurancy/CountUsingLock.java rename to src/main/java/com/example/jpa/otherStuff/recap/concurancy/CountUsingLock.java index cbc412b..05b4485 100644 --- a/src/main/java/com/example/jpa/concurancy/CountUsingLock.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/CountUsingLock.java @@ -1,4 +1,4 @@ -package com.example.jpa.concurancy; +package com.example.jpa.otherStuff.recap.concurancy; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; diff --git a/src/main/java/com/example/jpa/concurancy/DeadlockExample.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/DeadlockExample.java similarity index 96% rename from src/main/java/com/example/jpa/concurancy/DeadlockExample.java rename to src/main/java/com/example/jpa/otherStuff/recap/concurancy/DeadlockExample.java index d976b63..efc5c23 100644 --- a/src/main/java/com/example/jpa/concurancy/DeadlockExample.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/DeadlockExample.java @@ -1,4 +1,4 @@ -package com.example.jpa.concurancy; +package com.example.jpa.otherStuff.recap.concurancy; public class DeadlockExample { public static final Object RESOURCE1 = new Object(); diff --git a/src/main/java/com/example/jpa/concurancy/MyThread.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/MyThread.java similarity index 90% rename from src/main/java/com/example/jpa/concurancy/MyThread.java rename to src/main/java/com/example/jpa/otherStuff/recap/concurancy/MyThread.java index a1ae77f..83df662 100644 --- a/src/main/java/com/example/jpa/concurancy/MyThread.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/MyThread.java @@ -1,4 +1,4 @@ -package com.example.jpa.concurancy; +package com.example.jpa.otherStuff.recap.concurancy; public class MyThread extends Thread { @Override diff --git a/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/DPrincipleAfter.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/DPrincipleAfter.java new file mode 100644 index 0000000..1b03b2a --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/DPrincipleAfter.java @@ -0,0 +1,50 @@ +package com.example.jpa.otherStuff.recap.concurancy.solid; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class DPrincipleAfter { + public static void main(String... a) { + Logger consoleLogger = new ConsoleLogger1(); + Logger fileLogger = new FileLogger1(); + + LoggingService fLoggerService = new LoggingService(fileLogger); + + fLoggerService.processLog("Log to file"); + } +} + +interface Logger { + void log(String message); +} + +class ConsoleLogger1 implements Logger { + @Override + public void log(String message) { + System.out.println(message); + } +} + +class FileLogger1 implements Logger { + public void log(String message) { + File logFile = new File("filename.log"); + try (FileWriter fw = new FileWriter(logFile, true)) { + fw.write(message + "\n"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} + +class LoggingService { + private Logger logger; + + public LoggingService(Logger logger) { + this.logger = logger; + } + + public void processLog(String message) { + logger.log(message); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/DPrincipleBefore.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/DPrincipleBefore.java new file mode 100644 index 0000000..5170fa1 --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/DPrincipleBefore.java @@ -0,0 +1,28 @@ +package com.example.jpa.otherStuff.recap.concurancy.solid; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class DPrincipleBefore { +} + + +class ConsoleLogger { + public void log(String message) { + System.out.println(message); + } +} + + +class FileLogger { + public void log(String message) { + File logFile = new File("path/filename.log"); + try (FileWriter fw = new FileWriter(logFile, true)){ + fw.write(message + "\n"); + }catch(IOException e ){ + e.printStackTrace(); + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/LPrincipleBefore.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/LPrincipleBefore.java new file mode 100644 index 0000000..7607a78 --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/LPrincipleBefore.java @@ -0,0 +1,89 @@ +package com.example.jpa.otherStuff.recap.concurancy.solid; + +public class LPrincipleBefore { + public static void main(String[] a) { + Rectangle1 r = new Rectangle1(0, 0, 4, 5); + r.setWidth(10); + r.setHeight(20); + System.out.println("Arie: " + r.getArea()); + + Rectangle1 r2 = new Square(0, 0, 4); + r2.setWidth(10); + r2.setHeight(20); + System.out.println("Arie: " + r2.getArea()); + } +} + +abstract class Shape1 { + protected int x; + protected int y; + + public Shape1(int x, int y) { + this.x = x; + this.y = y; + } + + public abstract double getArea(); + + public abstract double getPerimeter(); + + public abstract void resize(int x, int y); + +} + +class Rectangle1 extends Shape1 { + protected int width; + protected int height; + + public Rectangle1(int x, int y, int width, int height) { + super(x, y); + this.width = width; + this.height = height; + } + + public void setHeight(int height) { + this.height = height; + } + + public void setWidth(int w) { + this.width = w; + } + + @Override + public double getArea() { + return width * height; + } + + @Override + public double getPerimeter() { + return 2 * (width + height); + } + + @Override + public void resize(int x, int y) { + this.x = x; + this.y = y; + } +} + +class Square extends Rectangle1 { + public Square(int x, int y, int size) { + super(x, y, size, size); + } + + @Override + public void setHeight(int h) { + setSize(h); + } + + @Override + public void setWidth(int w) { + setSize(w); + } + + private void setSize(int size) { + super.setHeight(size); + super.setWidth(size); + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/OPrincipleAfter.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/OPrincipleAfter.java new file mode 100644 index 0000000..284ec3f --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/OPrincipleAfter.java @@ -0,0 +1,78 @@ +package com.example.jpa.otherStuff.recap.concurancy.solid; + +public class OPrincipleAfter { + public static void main(String... a) { + ModernDrawingService service = new ModernDrawingService(); + Shape circle = new Circle(10, 10); + Shape rectangle = new Rectangle(5, 10); + + service.drawShape(circle); + service.drawShape(rectangle); + } +} + +interface Shape { + void draw(); + + int getX(); + + int getY(); + +} + +class Circle implements Shape { + private int x; + private int y; + + public Circle(int x, int y) { + this.x = x; + this.y = y; + } + + @Override + public void draw() { + System.out.println("Drawing Circle at(" + x + " , " + y + ") "); + } + + @Override + public int getX() { + return x; + } + + @Override + public int getY() { + return y; + } +} + +class Rectangle implements Shape { + private int x; + private int y; + + public Rectangle(int x, int y) { + this.x = x; + this.y = y; + } + + @Override + public void draw() { + System.out.println("Drawing Rectangle at(" + x + " , " + y + ") "); + } + + @Override + public int getX() { + return x; + } + + @Override + public int getY() { + return y; + } +} + + +class ModernDrawingService { + public void drawShape(Shape shape) { + shape.draw(); + } +} diff --git a/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/OPrincipleBefore.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/OPrincipleBefore.java new file mode 100644 index 0000000..6d96b4a --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/OPrincipleBefore.java @@ -0,0 +1,18 @@ +package com.example.jpa.otherStuff.recap.concurancy.solid; +// +public class OPrincipleBefore { + +} + + +class DrawingService { + public void drawShape(String type, int x, int y) { + if (type.equals("circle")) { + System.out.println("Drawing Circle at(" + x + " , " + y + ") "); + } else if (type.equals("rectangle")) { + System.out.println("Drawing Rectangle at(" + x + " , " + y + ") "); + } else if (type.equals("triangle")) { + System.out.println("Drawing Triangle at(" + x + " , " + y + ") "); + } + } +} diff --git a/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/SPrincipaleBefore.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/SPrincipaleBefore.java new file mode 100644 index 0000000..fcaadf7 --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/SPrincipaleBefore.java @@ -0,0 +1,38 @@ +package com.example.jpa.otherStuff.recap.concurancy.solid; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class SPrincipaleBefore { +} + +class UserRegistration { + public void registerUser(String username, String email, String password) { + + //Validations + if (username == null || username.length() < 2) { + throw new IllegalArgumentException("Username must not be null and should have min 2 chars"); + } + if (!email.contains("@")) { + throw new IllegalArgumentException("Invalid email format"); + } + try (Connection connection = DriverManager.getConnection("bla bka")) { + String sql = "insert into users(username, email,password) values ( ?,?,?)"; + PreparedStatement statement = connection.prepareStatement(sql); + statement.setString(1, username); + statement.setString(2, email); + statement.setString(3, password); + statement.executeUpdate(); + } catch (SQLException ex) { + ex.printStackTrace(); + } + try { + //Email sending implementation + + } catch (Exception e) { + + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/SPrincipleAfter.java b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/SPrincipleAfter.java new file mode 100644 index 0000000..c848135 --- /dev/null +++ b/src/main/java/com/example/jpa/otherStuff/recap/concurancy/solid/SPrincipleAfter.java @@ -0,0 +1,71 @@ +package com.example.jpa.otherStuff.recap.concurancy.solid; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class SPrincipleAfter { +} + +class UserValidation { + public void validation(String username, String email, String password) { + if (username == null || username.length() < 2) { + throw new IllegalArgumentException("Username must not be null and should have min 2 chars"); + } + if (!email.contains("@")) { + throw new IllegalArgumentException("Invalid email format"); + } + if (password.length() < 6) { + throw new IllegalArgumentException("Password must have at least 6 caracters!"); + } + } +} + +class UserRepository { + public void saveUser(String username, String email, String password) { + try (Connection connection = DriverManager.getConnection("bla bka")) { + String sql = "insert into users(username, email,password) values ( ?,?,?)"; + PreparedStatement statement = connection.prepareStatement(sql); + statement.setString(1, username); + statement.setString(2, email); + statement.setString(3, password); + statement.executeUpdate(); + } catch (SQLException ex) { + ex.printStackTrace(); + } + } +} + +class EmailService { + public void sendWelcomeEmail(String username, String email) { + try { + //Email sending implementation + + } catch (Exception e) { + + } + } +} + +class UserRegistrationService { + private UserValidation userValidation; + private UserRepository userRepository; + private EmailService emailService; + + public UserRegistrationService(UserValidation userValidation, UserRepository userRepository, EmailService emailService) { + this.emailService = emailService; + this.userRepository = userRepository; + this.userValidation = userValidation; + } + + public void registrationUser(String username, String email, String password) { + //validation + userValidation.validation(username, email, password); + //save in db + userRepository.saveUser(username, email, password); + //send email + emailService.sendWelcomeEmail(username, email); + + } +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/designpatterns/Builder.java b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Builder.java similarity index 97% rename from src/main/java/com/example/jpa/designpatterns/Builder.java rename to src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Builder.java index 23f0bdc..8c4c821 100644 --- a/src/main/java/com/example/jpa/designpatterns/Builder.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Builder.java @@ -1,4 +1,4 @@ -package com.example.jpa.designpatterns; +package com.example.jpa.otherStuff.recap.designpatterns; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/example/jpa/designpatterns/Facade.java b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Facade.java similarity index 93% rename from src/main/java/com/example/jpa/designpatterns/Facade.java rename to src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Facade.java index a1c30c9..20402f4 100644 --- a/src/main/java/com/example/jpa/designpatterns/Facade.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Facade.java @@ -1,4 +1,4 @@ -package com.example.jpa.designpatterns; +package com.example.jpa.otherStuff.recap.designpatterns; class SistemAudio{ public void pornesteAudio(){ diff --git a/src/main/java/com/example/jpa/designpatterns/Factory.java b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Factory.java similarity index 90% rename from src/main/java/com/example/jpa/designpatterns/Factory.java rename to src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Factory.java index 9504a3e..a756699 100644 --- a/src/main/java/com/example/jpa/designpatterns/Factory.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Factory.java @@ -1,6 +1,4 @@ -package com.example.jpa.designpatterns; - -import org.springframework.scheduling.support.SimpleTriggerContext; +package com.example.jpa.otherStuff.recap.designpatterns; interface Animal { void makeSound(); diff --git a/src/main/java/com/example/jpa/designpatterns/Interpreter.java b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Interpreter.java similarity index 92% rename from src/main/java/com/example/jpa/designpatterns/Interpreter.java rename to src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Interpreter.java index f778e1f..9236564 100644 --- a/src/main/java/com/example/jpa/designpatterns/Interpreter.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Interpreter.java @@ -1,6 +1,4 @@ -package com.example.jpa.designpatterns; - -import jdk.swing.interop.SwingInterOpUtils; +package com.example.jpa.otherStuff.recap.designpatterns; interface Expression { int interpret(); diff --git a/src/main/java/com/example/jpa/designpatterns/Observer.java b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Observer.java similarity index 94% rename from src/main/java/com/example/jpa/designpatterns/Observer.java rename to src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Observer.java index b871684..29c4a72 100644 --- a/src/main/java/com/example/jpa/designpatterns/Observer.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Observer.java @@ -1,4 +1,4 @@ -package com.example.jpa.designpatterns; +package com.example.jpa.otherStuff.recap.designpatterns; import java.util.ArrayList; diff --git a/src/main/java/com/example/jpa/designpatterns/Singletone.java b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Singletone.java similarity index 93% rename from src/main/java/com/example/jpa/designpatterns/Singletone.java rename to src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Singletone.java index 7c9e8c5..9cfba00 100644 --- a/src/main/java/com/example/jpa/designpatterns/Singletone.java +++ b/src/main/java/com/example/jpa/otherStuff/recap/designpatterns/Singletone.java @@ -1,4 +1,4 @@ -package com.example.jpa.designpatterns; +package com.example.jpa.otherStuff.recap.designpatterns; class DatabaseConnection { private static DatabaseConnection instance; From dd39e0c80ed98e27b13405dcbb9768bcd1b5bbc5 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 5 Dec 2024 19:39:39 +0200 Subject: [PATCH 12/37] new --- .../jpa/controllers/InstrumentController.java | 37 +++++++++++++++ .../example/jpa/enums/InstrumentCategory.java | 6 +++ .../com/example/jpa/enums/OrderStatus.java | 7 +++ .../jpa/impl/InstrumentServiceImpl.java | 46 +++++++++++++++++++ .../com/example/jpa/models/Instrument.java | 32 +++++++++++++ .../repositories/InstrumentRepository.java | 18 ++++++++ .../jpa/services/InstrumentService.java | 12 +++++ 7 files changed, 158 insertions(+) create mode 100644 src/main/java/com/example/jpa/controllers/InstrumentController.java create mode 100644 src/main/java/com/example/jpa/enums/InstrumentCategory.java create mode 100644 src/main/java/com/example/jpa/enums/OrderStatus.java create mode 100644 src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java create mode 100644 src/main/java/com/example/jpa/models/Instrument.java create mode 100644 src/main/java/com/example/jpa/repositories/InstrumentRepository.java create mode 100644 src/main/java/com/example/jpa/services/InstrumentService.java diff --git a/src/main/java/com/example/jpa/controllers/InstrumentController.java b/src/main/java/com/example/jpa/controllers/InstrumentController.java new file mode 100644 index 0000000..5f02260 --- /dev/null +++ b/src/main/java/com/example/jpa/controllers/InstrumentController.java @@ -0,0 +1,37 @@ +package com.example.jpa.controllers; + +import com.example.jpa.models.Instrument; +import com.example.jpa.services.InstrumentService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/instruments") +public class InstrumentController { + private final InstrumentService instrumentService; + + + public InstrumentController(InstrumentService service) { + this.instrumentService = service; + } + + @GetMapping + public ResponseEntity> getAllInstruments() { + return ResponseEntity.ok(instrumentService.getAllInstruments()); + } + + @GetMapping("/{id}") + public ResponseEntity getInstrumentById(@PathVariable Long id) { + return ResponseEntity.ok(instrumentService.findInstrumentById(id)); + + } + @PostMapping + public ResponseEntitycreateInstrument(@RequestBody Instrument instrument){ + Instrument createdInstrument = instrumentService.createInstrument(instrument); + return ResponseEntity.status(HttpStatus.CREATED).body(createdInstrument); + } + +} diff --git a/src/main/java/com/example/jpa/enums/InstrumentCategory.java b/src/main/java/com/example/jpa/enums/InstrumentCategory.java new file mode 100644 index 0000000..e71a784 --- /dev/null +++ b/src/main/java/com/example/jpa/enums/InstrumentCategory.java @@ -0,0 +1,6 @@ +package com.example.jpa.enums; + +public enum InstrumentCategory { +STRINGS,WIND,PERCUSSION,KEYBOARD + +} diff --git a/src/main/java/com/example/jpa/enums/OrderStatus.java b/src/main/java/com/example/jpa/enums/OrderStatus.java new file mode 100644 index 0000000..e720c0a --- /dev/null +++ b/src/main/java/com/example/jpa/enums/OrderStatus.java @@ -0,0 +1,7 @@ +package com.example.jpa.enums; + +public enum OrderStatus { + PENDING,PROCESSING,SHIPPED,DELIVERED,CANCELLED + + +} diff --git a/src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java b/src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java new file mode 100644 index 0000000..90a2517 --- /dev/null +++ b/src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java @@ -0,0 +1,46 @@ +package com.example.jpa.impl; + +import com.example.jpa.models.Instrument; +import com.example.jpa.repositories.InstrumentRepository; +import com.example.jpa.services.InstrumentService; +import jakarta.persistence.EntityNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class InstrumentServiceImpl implements InstrumentService { + + private final InstrumentRepository instrumentRepository; + @Autowired + public InstrumentServiceImpl(InstrumentRepository instrumentRepository){ + this.instrumentRepository = instrumentRepository; + } + + public List getAllInstruments(){ + return instrumentRepository.findAll(); + } + public Instrument findInstrumentById(Long id){ + return instrumentRepository.findById(id).orElseThrow(()-> new EntityNotFoundException("Instrument not found")); + + + } + public Instrument createInstrument (Instrument instrument){ + if(instrument.getStockQuantity()< 0){ + throw new IllegalArgumentException("sTOCK QUANTITI CANNOT BE NEGATIEVE"); + } + return instrumentRepository.save(instrument); + } + public void updateInstrumentStock(Long id, Integer quantity){ + Instrument instrument = findInstrumentById(id); + if (instrument == null){ + throw new EntityNotFoundException("Instrument with id: " + id + "cannot be found!"); + + + } + + + } + +} diff --git a/src/main/java/com/example/jpa/models/Instrument.java b/src/main/java/com/example/jpa/models/Instrument.java new file mode 100644 index 0000000..bd003b3 --- /dev/null +++ b/src/main/java/com/example/jpa/models/Instrument.java @@ -0,0 +1,32 @@ +package com.example.jpa.models; + +import com.example.jpa.enums.InstrumentCategory; +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Entity +@Table(name = "instrument") +@Data +@NoArgsConstructor + +public class Instrument { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String name; + @Column(nullable = false) + private BigDecimal price; + + @Enumerated(EnumType.STRING) + private InstrumentCategory category; + private String manufacturer; + @Column(nullable = false) + private int stockQuantity; + + +} diff --git a/src/main/java/com/example/jpa/repositories/InstrumentRepository.java b/src/main/java/com/example/jpa/repositories/InstrumentRepository.java new file mode 100644 index 0000000..44f3540 --- /dev/null +++ b/src/main/java/com/example/jpa/repositories/InstrumentRepository.java @@ -0,0 +1,18 @@ +package com.example.jpa.repositories; + +import com.example.jpa.enums.InstrumentCategory; +import com.example.jpa.models.Instrument; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.math.BigDecimal; +import java.util.List; + +@Repository +public interface InstrumentRepository extends JpaRepository { + List findByCategory(InstrumentCategory category); + + List findByPriceBetween(BigDecimal minPrice, BigDecimal maxPrice); + + List findByStockQuantityGreaterThan(int q); +} diff --git a/src/main/java/com/example/jpa/services/InstrumentService.java b/src/main/java/com/example/jpa/services/InstrumentService.java new file mode 100644 index 0000000..870e9f5 --- /dev/null +++ b/src/main/java/com/example/jpa/services/InstrumentService.java @@ -0,0 +1,12 @@ +package com.example.jpa.services; + +import com.example.jpa.models.Instrument; + +import java.util.List; + +public interface InstrumentService { + List getAllInstruments(); + Instrument findInstrumentById(Long id); + Instrument createInstrument (Instrument instrument); + void updateInstrumentStock(Long id, Integer quantity); +} From f8732ec55806c97980a6e7446cc8ec726babe63a Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 5 Dec 2024 20:26:07 +0200 Subject: [PATCH 13/37] new --- src/main/resources/application.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5f49709..c22077c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -11,7 +11,7 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect #Email config spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username=angelosima25@gmail.com -spring.mail.password=yfij xxvu ombn cabg +spring.mail.username= +spring.mail.password= spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true From 0252fe792663f5be1bf2048dbc2f0b89119b9aeb Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Sat, 7 Dec 2024 23:32:35 +0200 Subject: [PATCH 14/37] Refactor `EmailService` and Update Order Handling Renamed `EmailService` to reflect its implementation and adjusted import paths accordingly. Created `OrderServiceImpl` class to better handle order processing logic, moving the implementation from `OrderService` to enhance modularity and maintainability. Updated `UserController` and `OrderController` with new API endpoints, improving URL consistency. Additionally, added Javadoc comments for better code documentation and introduced request DTOs to streamline data handling in order operations. --- .../jpa/controllers/InstrumentController.java | 5 ++ .../jpa/controllers/OrderController.java | 14 +++-- .../jpa/controllers/UserController.java | 2 +- .../com/example/jpa/dtos/RequestOrderDto.java | 19 ++++++ .../jpa/{services => impl}/EmailService.java | 2 +- .../example/jpa/impl/OrderServiceImpl.java | 58 ++++++++++++++++++ .../com/example/jpa/models/Instrument.java | 3 + .../java/com/example/jpa/models/Order.java | 34 +++++++++-- .../com/example/jpa/models/OrderItem.java | 61 +++++++++++++++++++ .../example/jpa/services/OrderService.java | 52 ++-------------- .../com/example/jpa/services/UserService.java | 2 +- .../jpa/OrderServiceIntegrationTest.java | 4 +- .../java/com/example/jpa/UserServiceTest.java | 2 +- 13 files changed, 193 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/example/jpa/dtos/RequestOrderDto.java rename src/main/java/com/example/jpa/{services => impl}/EmailService.java (96%) create mode 100644 src/main/java/com/example/jpa/impl/OrderServiceImpl.java create mode 100644 src/main/java/com/example/jpa/models/OrderItem.java diff --git a/src/main/java/com/example/jpa/controllers/InstrumentController.java b/src/main/java/com/example/jpa/controllers/InstrumentController.java index 5f02260..5559878 100644 --- a/src/main/java/com/example/jpa/controllers/InstrumentController.java +++ b/src/main/java/com/example/jpa/controllers/InstrumentController.java @@ -8,6 +8,11 @@ import java.util.List; +/** + * Controller class for managing instruments in the system. + * Provides endpoints for retrieving all instruments, + * retrieving an instrument by ID, and creating a new instrument. + */ @RestController @RequestMapping("/api/instruments") public class InstrumentController { diff --git a/src/main/java/com/example/jpa/controllers/OrderController.java b/src/main/java/com/example/jpa/controllers/OrderController.java index 8af8406..da03ff8 100644 --- a/src/main/java/com/example/jpa/controllers/OrderController.java +++ b/src/main/java/com/example/jpa/controllers/OrderController.java @@ -1,6 +1,9 @@ package com.example.jpa.controllers; +import com.example.jpa.dtos.RequestOrderDto; import com.example.jpa.models.Order; +import com.example.jpa.impl.OrderServiceImpl; +import com.example.jpa.models.OrderItem; import com.example.jpa.services.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -9,22 +12,23 @@ import java.util.List; @RestController -@RequestMapping("/orders") +@RequestMapping("api/orders") public class OrderController { @Autowired private OrderService service; @PostMapping - public ResponseEntity placeOrder(@RequestParam Long userId, @RequestParam String product, @RequestParam Double price) { - Order order = service.placeOrder(userId, product, price); + public ResponseEntity placeOrder(@RequestBody RequestOrderDto orderDto) { + System.out.println("Sunt in placeOrder"); + Order order = service.placeOrder(orderDto.getUserId(), orderDto.getItems()); return ResponseEntity.ok(order); } + @GetMapping - public ResponseEntity> ordersWithPagination(@RequestParam Long userId,@RequestParam int page,@RequestParam int size) { + public ResponseEntity> ordersWithPagination(@RequestParam Long userId, @RequestParam int page, @RequestParam int size) { List orders = service.getOrdersWithPagination(userId, page, size); return ResponseEntity.ok(orders); } - } diff --git a/src/main/java/com/example/jpa/controllers/UserController.java b/src/main/java/com/example/jpa/controllers/UserController.java index 384c589..d3eee39 100644 --- a/src/main/java/com/example/jpa/controllers/UserController.java +++ b/src/main/java/com/example/jpa/controllers/UserController.java @@ -15,7 +15,7 @@ import java.util.Optional; @RestController -@RequestMapping("/users") +@RequestMapping("api/users") public class UserController { @Autowired private UserService service; diff --git a/src/main/java/com/example/jpa/dtos/RequestOrderDto.java b/src/main/java/com/example/jpa/dtos/RequestOrderDto.java new file mode 100644 index 0000000..9b1937e --- /dev/null +++ b/src/main/java/com/example/jpa/dtos/RequestOrderDto.java @@ -0,0 +1,19 @@ +package com.example.jpa.dtos; + +import com.example.jpa.models.OrderItem; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class RequestOrderDto { + + private Long userId; + private List items; + + +} diff --git a/src/main/java/com/example/jpa/services/EmailService.java b/src/main/java/com/example/jpa/impl/EmailService.java similarity index 96% rename from src/main/java/com/example/jpa/services/EmailService.java rename to src/main/java/com/example/jpa/impl/EmailService.java index ac51504..aa583eb 100644 --- a/src/main/java/com/example/jpa/services/EmailService.java +++ b/src/main/java/com/example/jpa/impl/EmailService.java @@ -1,4 +1,4 @@ -package com.example.jpa.services; +package com.example.jpa.impl; import com.example.jpa.exceptions.EmailSendingException; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/com/example/jpa/impl/OrderServiceImpl.java b/src/main/java/com/example/jpa/impl/OrderServiceImpl.java new file mode 100644 index 0000000..20b8433 --- /dev/null +++ b/src/main/java/com/example/jpa/impl/OrderServiceImpl.java @@ -0,0 +1,58 @@ +package com.example.jpa.impl; + +import com.example.jpa.enums.OrderStatus; +import com.example.jpa.models.Order; +import com.example.jpa.models.OrderItem; +import com.example.jpa.models.User; +import com.example.jpa.repositories.OrderRepository; +import com.example.jpa.repositories.UserJpaRepository; +import com.example.jpa.services.OrderService; +import jakarta.persistence.EntityNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +@Service +public class OrderServiceImpl implements OrderService { + @Autowired + private OrderRepository orderRepository; + @Autowired + private UserJpaRepository userRepository; + + /** + * Places an order for a specific user + */ + public Order placeOrder(Long userId, List items) { + if (items == null || items.isEmpty()) + throw new IllegalArgumentException("Order must contain at least one item!"); + + + Optional userOpt = userRepository.findById(userId); + Order order = new Order(); + if (userOpt.isPresent()) { + User user = userOpt.get(); + order.setUser(user); + order.setItems(items); + order.setStatus(OrderStatus.PENDING); + order.setOrderDate(LocalDate.now()); + order.calculateTotalAmount(); + items.forEach(OrderItem::updateInstrumentStock); + } else { + throw new EntityNotFoundException("User was not found!"); + } + + return orderRepository.save(order); + } + + public List getOrdersWithPagination(Long userId, int page, int size) { + + PageRequest pageRequest = PageRequest.of(page - 1, size); + Page orderPage = orderRepository.findByUserId(userId, pageRequest); + return orderPage.getContent(); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/models/Instrument.java b/src/main/java/com/example/jpa/models/Instrument.java index bd003b3..15b8158 100644 --- a/src/main/java/com/example/jpa/models/Instrument.java +++ b/src/main/java/com/example/jpa/models/Instrument.java @@ -7,6 +7,9 @@ import java.math.BigDecimal; +/** + * Represents an instrument entity with details such as ID, name, price, category, manufacturer, and stock quantity. + */ @Entity @Table(name = "instrument") @Data diff --git a/src/main/java/com/example/jpa/models/Order.java b/src/main/java/com/example/jpa/models/Order.java index b2cba3b..b6ce49d 100644 --- a/src/main/java/com/example/jpa/models/Order.java +++ b/src/main/java/com/example/jpa/models/Order.java @@ -1,13 +1,19 @@ package com.example.jpa.models; +import com.example.jpa.enums.OrderStatus; import com.fasterxml.jackson.annotation.JsonBackReference; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; import java.time.LocalDate; +import java.util.List; +/** + * Represents an Order entity that contains a list of OrderItems, order date, status, total amount, and associated User. + */ @Entity @Table(name = "orders") @Data @@ -19,20 +25,36 @@ public class Order { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String product; - private Double price; + @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) + private List items; private LocalDate orderDate; + @Enumerated(EnumType.STRING) + private OrderStatus status; + private BigDecimal totalAmount; + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "user_id", referencedColumnName = "id") @JsonBackReference private User user; - public Order(String product, Double price,LocalDate orderDate,User user){ - this.product= product; - this.price = price; - this.orderDate= orderDate; + public Order(List items,OrderStatus status, LocalDate orderDate, User user) { + this.items = items; + this.status = status; + this.orderDate = orderDate; this.user = user; } + public void calculateTotalAmount(){ + this.totalAmount = items.stream().map(OrderItem::getSubtotal).reduce(BigDecimal.ZERO,BigDecimal::add ); + } + + public void updateStatus(){ + if (items.isEmpty()) { + this.status = OrderStatus.CANCELLED; + }else if (status == OrderStatus.PENDING){ + this.status = OrderStatus.PROCESSING; + } + } + } diff --git a/src/main/java/com/example/jpa/models/OrderItem.java b/src/main/java/com/example/jpa/models/OrderItem.java new file mode 100644 index 0000000..7add93d --- /dev/null +++ b/src/main/java/com/example/jpa/models/OrderItem.java @@ -0,0 +1,61 @@ +package com.example.jpa.models; + +import jakarta.persistence.*; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * Represents an item in an order with details such as ID, associated instrument, quantity, and order. + */ +@Entity +@Table(name = "order_item") +@Data +public class OrderItem { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + + @ManyToOne + @JoinColumn(name = "instrument_id", nullable = false) + private Instrument instrument; + + + @Column(nullable = false) + private Integer quantity; + + @ManyToOne + @JoinColumn(name = "order_id", nullable = false) + private Order order; + + public OrderItem() { + } + + public OrderItem(Order order, Instrument instrument, Integer quantity) { + this.order = order; + this.quantity = quantity; + this.instrument = instrument; + } + + + public BigDecimal getSubtotal() { + return instrument.getPrice().multiply(BigDecimal.valueOf(quantity)); + + } + + public void setQuantity(Integer quantity) { + if (quantity <= 0) + throw new IllegalArgumentException("Quantity must be positive!"); + if (quantity > instrument.getStockQuantity()) + throw new IllegalStateException("Insufficient stock for this instrument!"); + + this.quantity = quantity; + + } + +public void updateInstrumentStock(){ + instrument.setStockQuantity(instrument.getStockQuantity()); +} + +} diff --git a/src/main/java/com/example/jpa/services/OrderService.java b/src/main/java/com/example/jpa/services/OrderService.java index d66671d..4173b1b 100644 --- a/src/main/java/com/example/jpa/services/OrderService.java +++ b/src/main/java/com/example/jpa/services/OrderService.java @@ -1,57 +1,13 @@ package com.example.jpa.services; import com.example.jpa.models.Order; -import com.example.jpa.models.User; -import com.example.jpa.repositories.OrderRepository; -import com.example.jpa.repositories.UserJpaRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Service; +import com.example.jpa.models.OrderItem; -import java.time.LocalDate; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -@Service -public class OrderService { - @Autowired - private OrderRepository orderRepository; - @Autowired - private UserJpaRepository userRepository; +public interface OrderService { - /* - * Places an order for a specific user - */ - public Order placeOrder(Long userId, String product, Double price) { - Optional userOpt = userRepository.findById(userId); - Order order = null; - if (userOpt.isPresent()) { - User user = userOpt.get(); - order = new Order(product, price, LocalDate.now(), user); + Order placeOrder(Long userId, List items); + List getOrdersWithPagination(Long userId,int page,int size); - - - } else { - System.out.println("User with id: " + userId + "not found!"); - return null; - } - return orderRepository.save(order); - } - - public List getOrdersWithPagination(Long userId, int page, int size) { -// int start = page == 1 ? 1 : page * size; -// List userOrders = orderRepository.findByUserId(userId); -// return userOrders.stream() -// .skip(start) -// .limit(size) -// .collect(Collectors.toList()); - - - - PageRequest pageRequest = PageRequest.of(page - 1, size); - Page orderPage = orderRepository.findByUserId(userId, pageRequest); - return orderPage.getContent(); - } } diff --git a/src/main/java/com/example/jpa/services/UserService.java b/src/main/java/com/example/jpa/services/UserService.java index 60d12ea..eecaf34 100644 --- a/src/main/java/com/example/jpa/services/UserService.java +++ b/src/main/java/com/example/jpa/services/UserService.java @@ -3,12 +3,12 @@ import com.example.jpa.dtos.CreateUserDto; import com.example.jpa.exceptions.EmailSendingException; import com.example.jpa.exceptions.UserServiceException; +import com.example.jpa.impl.EmailService; import com.example.jpa.models.User; import com.example.jpa.repositories.UserJpaRepository; import com.example.jpa.repositories.UserRepository; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import java.util.List; diff --git a/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java b/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java index 304b023..2fd7c10 100644 --- a/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java +++ b/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java @@ -4,7 +4,7 @@ import com.example.jpa.models.User; import com.example.jpa.repositories.OrderRepository; import com.example.jpa.repositories.UserJpaRepository; -import com.example.jpa.services.OrderService; +import com.example.jpa.impl.OrderServiceImpl; import jakarta.transaction.Transactional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -22,7 +22,7 @@ public class OrderServiceIntegrationTest { @Autowired - private OrderService service; + private OrderServiceImpl service; @Autowired diff --git a/src/test/java/com/example/jpa/UserServiceTest.java b/src/test/java/com/example/jpa/UserServiceTest.java index 9299719..14145fa 100644 --- a/src/test/java/com/example/jpa/UserServiceTest.java +++ b/src/test/java/com/example/jpa/UserServiceTest.java @@ -5,7 +5,7 @@ import com.example.jpa.exceptions.UserServiceException; import com.example.jpa.models.User; import com.example.jpa.repositories.UserJpaRepository; -import com.example.jpa.services.EmailService; +import com.example.jpa.impl.EmailService; import com.example.jpa.services.UserService; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; From 22b770ee07d7b4332e287e6b8b38d180d83fc0bb Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 13:21:23 +0200 Subject: [PATCH 15/37] Refactor all --- pom.xml | 5 ++ .../com/example/jpa/ExceptionsExample.java | 47 ++++++------- .../java/com/example/jpa/JpaApplication.java | 2 + .../jpa/controllers/InstrumentController.java | 10 +-- .../jpa/controllers/OrderController.java | 12 ++-- .../jpa/controllers/ReviewController.java | 24 +++++++ .../jpa/controllers/UserController.java | 34 ++++----- .../java/com/example/jpa/dtos/AddressDto.java | 6 +- .../com/example/jpa/dtos/CreateReviewDto.java | 16 +++++ .../com/example/jpa/dtos/CreateUserDto.java | 5 +- .../example/jpa/dtos/MonthlyIncomeReport.java | 19 +++++ .../java/com/example/jpa/dtos/OrderDto.java | 5 ++ .../example/jpa/dtos/OrderWeeklyReport.java | 20 ++++++ .../com/example/jpa/impl/EmailService.java | 7 +- .../jpa/impl/InstrumentServiceImpl.java | 36 +++++----- .../example/jpa/impl/OrderServiceImpl.java | 45 +++++++++++- .../example/jpa/impl/ReportingService.java | 66 ++++++++++++++++++ .../example/jpa/impl/ReviewServiceImpl.java | 41 +++++++++++ .../com/example/jpa/impl/UserServiceImpl.java | 69 +++++++++++++++++++ .../com/example/jpa/models/Instrument.java | 7 ++ .../java/com/example/jpa/models/Order.java | 23 +++---- .../com/example/jpa/models/OrderItem.java | 24 +++---- .../java/com/example/jpa/models/Review.java | 32 +++++++++ .../java/com/example/jpa/models/User.java | 4 ++ .../repositories/InstrumentRepository.java | 3 +- .../jpa/repositories/OrderRepository.java | 11 +-- .../jpa/repositories/ReviewRepository.java | 10 +++ .../jpa/repositories/UserJpaRepository.java | 7 +- .../example/jpa/services/OrderService.java | 8 ++- .../example/jpa/services/ReviewService.java | 8 +++ .../com/example/jpa/services/UserService.java | 66 +++--------------- src/main/resources/application.properties | 12 ++-- 32 files changed, 500 insertions(+), 184 deletions(-) create mode 100644 src/main/java/com/example/jpa/controllers/ReviewController.java create mode 100644 src/main/java/com/example/jpa/dtos/CreateReviewDto.java create mode 100644 src/main/java/com/example/jpa/dtos/MonthlyIncomeReport.java create mode 100644 src/main/java/com/example/jpa/dtos/OrderWeeklyReport.java create mode 100644 src/main/java/com/example/jpa/impl/ReportingService.java create mode 100644 src/main/java/com/example/jpa/impl/ReviewServiceImpl.java create mode 100644 src/main/java/com/example/jpa/impl/UserServiceImpl.java create mode 100644 src/main/java/com/example/jpa/models/Review.java create mode 100644 src/main/java/com/example/jpa/repositories/ReviewRepository.java create mode 100644 src/main/java/com/example/jpa/services/ReviewService.java diff --git a/pom.xml b/pom.xml index f13bd7f..271af94 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,11 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-devtools + runtime + org.springframework.boot spring-boot-starter-mail diff --git a/src/main/java/com/example/jpa/ExceptionsExample.java b/src/main/java/com/example/jpa/ExceptionsExample.java index 3671568..941d66d 100644 --- a/src/main/java/com/example/jpa/ExceptionsExample.java +++ b/src/main/java/com/example/jpa/ExceptionsExample.java @@ -2,11 +2,10 @@ import java.util.InputMismatchException; import java.util.Scanner; - public class ExceptionsExample { public static void main(String... args) { - // scannerExample1(); - // scannerExample2(); +// scannerExample1(); +// scannerExample2(); stringExample(); } @@ -21,15 +20,13 @@ private static void stringExample() { private static void printCharAt(String text, int index) { try { - System.out.println("Char at index :" + index + "is " + text.charAt(index)); + System.out.println("Char at index " + index + " is " + text.charAt(index)); } catch (IndexOutOfBoundsException e) { System.out.println(e.getMessage()); - // e.printStackTrace(); + e.printStackTrace(); } - } - private static void scannerExample2() { try (Scanner scanner = new Scanner(System.in)) { System.out.println("Enter two numbers: "); @@ -38,30 +35,30 @@ private static void scannerExample2() { int result = num1 / num2; System.out.println("Result: " + result); - } catch (ArithmeticException ex) {// 4/0 - System.out.println("Error :cannot divide by 0!"); - } catch (InputMismatchException ex) {//10.2 + } catch (ArithmeticException ex) { // 4/0 + System.out.println("Error: cannot divide by 0!"); + } catch (InputMismatchException ex) { System.out.println("Error: Please insert a valid number!"); } finally { - System.out.println("End of program!"); - + System.out.println("End of program"); } - } - private static void scannerExample1() { - Scanner scanner = new Scanner(System.in); - System.out.println("Enter 2 integers:"); - int num1 = scanner.nextInt(); - int num2 = scanner.nextInt(); + } - try { - int rez = num1 / num2; //Pentru a obtine exceptia 4/0! - System.out.println("Result = " + rez); - } catch (ArithmeticException e) { - System.out.println("Error: cannot divide by 0!"); - } + private static void scannerExample1() { + Scanner scanner = new Scanner(System.in); + System.out.println("Enter 2 integers:"); + int num1 = scanner.nextInt(); + int num2 = scanner.nextInt(); - scanner.close(); + try { + int rez = num1 / num2; // pt a obtine exceptia 4/0 + System.out.println("Result = " + rez); + } catch (ArithmeticException e) { + System.out.println("Error: cannot divide by 0!"); } + + scanner.close(); } +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/JpaApplication.java b/src/main/java/com/example/jpa/JpaApplication.java index ef14ebe..96c51a7 100644 --- a/src/main/java/com/example/jpa/JpaApplication.java +++ b/src/main/java/com/example/jpa/JpaApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication +@EnableScheduling public class JpaApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/jpa/controllers/InstrumentController.java b/src/main/java/com/example/jpa/controllers/InstrumentController.java index 5559878..03d6d9b 100644 --- a/src/main/java/com/example/jpa/controllers/InstrumentController.java +++ b/src/main/java/com/example/jpa/controllers/InstrumentController.java @@ -8,17 +8,11 @@ import java.util.List; -/** - * Controller class for managing instruments in the system. - * Provides endpoints for retrieving all instruments, - * retrieving an instrument by ID, and creating a new instrument. - */ @RestController @RequestMapping("/api/instruments") public class InstrumentController { private final InstrumentService instrumentService; - public InstrumentController(InstrumentService service) { this.instrumentService = service; } @@ -31,10 +25,10 @@ public ResponseEntity> getAllInstruments() { @GetMapping("/{id}") public ResponseEntity getInstrumentById(@PathVariable Long id) { return ResponseEntity.ok(instrumentService.findInstrumentById(id)); - } + @PostMapping - public ResponseEntitycreateInstrument(@RequestBody Instrument instrument){ + public ResponseEntity createInstrument(@RequestBody Instrument instrument) { Instrument createdInstrument = instrumentService.createInstrument(instrument); return ResponseEntity.status(HttpStatus.CREATED).body(createdInstrument); } diff --git a/src/main/java/com/example/jpa/controllers/OrderController.java b/src/main/java/com/example/jpa/controllers/OrderController.java index da03ff8..2281b79 100644 --- a/src/main/java/com/example/jpa/controllers/OrderController.java +++ b/src/main/java/com/example/jpa/controllers/OrderController.java @@ -1,9 +1,8 @@ package com.example.jpa.controllers; + import com.example.jpa.dtos.RequestOrderDto; import com.example.jpa.models.Order; -import com.example.jpa.impl.OrderServiceImpl; -import com.example.jpa.models.OrderItem; import com.example.jpa.services.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -12,7 +11,7 @@ import java.util.List; @RestController -@RequestMapping("api/orders") +@RequestMapping("/api/orders") public class OrderController { @Autowired private OrderService service; @@ -30,5 +29,8 @@ public ResponseEntity> ordersWithPagination(@RequestParam Long userI return ResponseEntity.ok(orders); } - -} + @PutMapping + public ResponseEntity cancelOrder(@RequestParam Long orderId) { + return ResponseEntity.ok(service.cancelOrder(orderId)); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/controllers/ReviewController.java b/src/main/java/com/example/jpa/controllers/ReviewController.java new file mode 100644 index 0000000..d4215d3 --- /dev/null +++ b/src/main/java/com/example/jpa/controllers/ReviewController.java @@ -0,0 +1,24 @@ +package com.example.jpa.controllers; + +import com.example.jpa.dtos.CreateReviewDto; +import com.example.jpa.models.Review; +import com.example.jpa.services.ReviewService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/reviews") +public class ReviewController { + @Autowired + private ReviewService reviewService; + + @PostMapping + public ResponseEntity addReview(@RequestBody CreateReviewDto dto) { + return ResponseEntity.ok(reviewService.addReview(dto)); + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/controllers/UserController.java b/src/main/java/com/example/jpa/controllers/UserController.java index d3eee39..7cf4214 100644 --- a/src/main/java/com/example/jpa/controllers/UserController.java +++ b/src/main/java/com/example/jpa/controllers/UserController.java @@ -4,9 +4,6 @@ import com.example.jpa.exceptions.UserServiceException; import com.example.jpa.models.User; import com.example.jpa.services.UserService; -import jdk.swing.interop.SwingInterOpUtils; -import org.apache.coyote.Response; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -14,11 +11,17 @@ import java.util.List; import java.util.Optional; +/** + * Represents a REST controller for handling user-related operations. + */ @RestController -@RequestMapping("api/users") +@RequestMapping("/api/users") public class UserController { - @Autowired - private UserService service; + private final UserService service; + + public UserController(UserService userService) { + this.service = userService; + } @PostMapping("/all") public ResponseEntity> createUsers(@RequestBody List users) { @@ -34,17 +37,15 @@ public ResponseEntity> getAllUsers() { @DeleteMapping("/{id}") public ResponseEntity deleteUser(@PathVariable Long id) { - service.deletUser(id); + service.deleteUser(id); return ResponseEntity.noContent().build(); } @GetMapping("/{username}") public ResponseEntity findByUsername(@PathVariable String username) { Optional user = service.findUserByUsername(username); - if (user.isPresent()) { - return ResponseEntity.ok(user.get()); - } else - return ResponseEntity.notFound().build(); + + return user.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } @PostMapping @@ -52,19 +53,18 @@ public ResponseEntity addUser(@RequestBody User user) { User savedUser = service.addUser(user); return ResponseEntity.ok(savedUser); } + @PostMapping("/create-from-dto") - public ResponseEntity createUserFromDto(@RequestBody CreateUserDto userDto){ - User user = new User(); + public ResponseEntity createUserFromDto(@RequestBody CreateUserDto userDto) { + User user = new User(); try { user = service.createUserFromDto(userDto); - }catch(UserServiceException ex){ + } catch (UserServiceException ex) { System.out.println(ex.getMessage()); System.out.println(ex.getErrorCode()); } return ResponseEntity.ok(user); - - } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/dtos/AddressDto.java b/src/main/java/com/example/jpa/dtos/AddressDto.java index 9d62e2f..8849dd3 100644 --- a/src/main/java/com/example/jpa/dtos/AddressDto.java +++ b/src/main/java/com/example/jpa/dtos/AddressDto.java @@ -3,12 +3,14 @@ import lombok.Data; import lombok.ToString; +import java.io.Serializable; + @Data @ToString -public class AddressDto { +public class AddressDto implements Serializable { private String city; private String street; private String country; private Integer numberOfStreet; -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/dtos/CreateReviewDto.java b/src/main/java/com/example/jpa/dtos/CreateReviewDto.java new file mode 100644 index 0000000..5613c44 --- /dev/null +++ b/src/main/java/com/example/jpa/dtos/CreateReviewDto.java @@ -0,0 +1,16 @@ +package com.example.jpa.dtos; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data + +public class CreateReviewDto { + private Long userId; + private Long instrumentId; + private Integer rating; + private String comment; + + +} diff --git a/src/main/java/com/example/jpa/dtos/CreateUserDto.java b/src/main/java/com/example/jpa/dtos/CreateUserDto.java index 555f04f..6b3fce2 100644 --- a/src/main/java/com/example/jpa/dtos/CreateUserDto.java +++ b/src/main/java/com/example/jpa/dtos/CreateUserDto.java @@ -2,13 +2,11 @@ import com.example.jpa.models.Order; import lombok.Data; -import lombok.NoArgsConstructor; import lombok.ToString; import java.io.Serializable; import java.time.LocalDate; import java.util.List; - @Data @ToString public class CreateUserDto implements Serializable { @@ -20,5 +18,4 @@ public class CreateUserDto implements Serializable { private boolean active; private AddressDto address; private List orders; - -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/dtos/MonthlyIncomeReport.java b/src/main/java/com/example/jpa/dtos/MonthlyIncomeReport.java new file mode 100644 index 0000000..6ab422d --- /dev/null +++ b/src/main/java/com/example/jpa/dtos/MonthlyIncomeReport.java @@ -0,0 +1,19 @@ +package com.example.jpa.dtos; + +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.Month; + +@Data +@ToString +public class MonthlyIncomeReport { +private Month month; +private int year; +private BigDecimal totalIncome; +private BigDecimal averageOrderValue; +private int totalOrderCount; + + +} diff --git a/src/main/java/com/example/jpa/dtos/OrderDto.java b/src/main/java/com/example/jpa/dtos/OrderDto.java index 5c21d13..5a3eed6 100644 --- a/src/main/java/com/example/jpa/dtos/OrderDto.java +++ b/src/main/java/com/example/jpa/dtos/OrderDto.java @@ -1,8 +1,13 @@ package com.example.jpa.dtos; +import lombok.Data; +import lombok.ToString; + import java.io.Serializable; import java.time.LocalDate; +@Data +@ToString public class OrderDto implements Serializable { private String product; diff --git a/src/main/java/com/example/jpa/dtos/OrderWeeklyReport.java b/src/main/java/com/example/jpa/dtos/OrderWeeklyReport.java new file mode 100644 index 0000000..93183ec --- /dev/null +++ b/src/main/java/com/example/jpa/dtos/OrderWeeklyReport.java @@ -0,0 +1,20 @@ +package com.example.jpa.dtos; + +import com.example.jpa.enums.OrderStatus; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Map; + +@Data//pentru getere si setere! +@ToString +public class OrderWeeklyReport { + private int totalOrders; + private LocalDate startDate; + private LocalDate endDate; + private BigDecimal totalRevenue; + private Map orderStatus; + +} diff --git a/src/main/java/com/example/jpa/impl/EmailService.java b/src/main/java/com/example/jpa/impl/EmailService.java index aa583eb..71fecc3 100644 --- a/src/main/java/com/example/jpa/impl/EmailService.java +++ b/src/main/java/com/example/jpa/impl/EmailService.java @@ -7,12 +7,13 @@ import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; + @Service public class EmailService { @Autowired private JavaMailSender mailSender; - public void sendEmail(String to,String subject,String body) throws EmailSendingException { + public void sendEmail(String to, String subject, String body) throws EmailSendingException { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); message.setSubject(subject); @@ -20,9 +21,9 @@ public void sendEmail(String to,String subject,String body) throws EmailSendingE try { mailSender.send(message); - }catch (MailException ex){ + } catch (MailException ex) { throw new EmailSendingException("Failed to send email: " + ex.getMessage()); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java b/src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java index 90a2517..444d64f 100644 --- a/src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java +++ b/src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java @@ -9,38 +9,40 @@ import java.util.List; + @Service public class InstrumentServiceImpl implements InstrumentService { - private final InstrumentRepository instrumentRepository; + @Autowired - public InstrumentServiceImpl(InstrumentRepository instrumentRepository){ + public InstrumentServiceImpl(InstrumentRepository instrumentRepository) { this.instrumentRepository = instrumentRepository; } - public List getAllInstruments(){ + public List getAllInstruments() { return instrumentRepository.findAll(); } - public Instrument findInstrumentById(Long id){ - return instrumentRepository.findById(id).orElseThrow(()-> new EntityNotFoundException("Instrument not found")); - + public Instrument findInstrumentById(Long id) { + return instrumentRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("Instrument not found")); } - public Instrument createInstrument (Instrument instrument){ - if(instrument.getStockQuantity()< 0){ - throw new IllegalArgumentException("sTOCK QUANTITI CANNOT BE NEGATIEVE"); - } + + public Instrument createInstrument(Instrument instrument) { + if (instrument.getStockQuantity() < 0) { + throw new IllegalArgumentException("Stock Quantity cannot be negative!"); + } + return instrumentRepository.save(instrument); } - public void updateInstrumentStock(Long id, Integer quantity){ - Instrument instrument = findInstrumentById(id); - if (instrument == null){ - throw new EntityNotFoundException("Instrument with id: " + id + "cannot be found!"); - + public void updateInstrumentStock(Long id, Integer quantity) { + Instrument instrument = findInstrumentById(id); + if (instrument == null) { + throw new EntityNotFoundException("Instrument with id: " + id + " cannot be found!"); } - + instrument.setStockQuantity(quantity); + instrumentRepository.save(instrument); } - } + diff --git a/src/main/java/com/example/jpa/impl/OrderServiceImpl.java b/src/main/java/com/example/jpa/impl/OrderServiceImpl.java index 20b8433..2baeae8 100644 --- a/src/main/java/com/example/jpa/impl/OrderServiceImpl.java +++ b/src/main/java/com/example/jpa/impl/OrderServiceImpl.java @@ -1,13 +1,17 @@ package com.example.jpa.impl; import com.example.jpa.enums.OrderStatus; +import com.example.jpa.models.Instrument; import com.example.jpa.models.Order; import com.example.jpa.models.OrderItem; import com.example.jpa.models.User; +import com.example.jpa.repositories.InstrumentRepository; import com.example.jpa.repositories.OrderRepository; import com.example.jpa.repositories.UserJpaRepository; + import com.example.jpa.services.OrderService; import jakarta.persistence.EntityNotFoundException; +import jakarta.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -17,12 +21,17 @@ import java.util.List; import java.util.Optional; +/** + * This class provides implementation for handling orders. + */ @Service public class OrderServiceImpl implements OrderService { @Autowired private OrderRepository orderRepository; @Autowired private UserJpaRepository userRepository; + @Autowired + private InstrumentRepository instrumentRepository; /** * Places an order for a specific user @@ -37,9 +46,28 @@ public Order placeOrder(Long userId, List items) { if (userOpt.isPresent()) { User user = userOpt.get(); order.setUser(user); - order.setItems(items); order.setStatus(OrderStatus.PENDING); order.setOrderDate(LocalDate.now()); + + List orderItems = items.stream() + .map(item -> { + OrderItem orderItem = new OrderItem(); + orderItem.setOrder(order); + orderItem.setQuantity(item.getQuantity()); + + if (item.getInstrument() == null) { + Instrument instrument = instrumentRepository.findById(item.getInstrument().getId()) + .orElseThrow(() -> new EntityNotFoundException("Instrument not found!")); + orderItem.setInstrument(instrument); + } else { + System.out.println("item.getInstrument() = " + item.getInstrument()); + orderItem.setInstrument(item.getInstrument()); + } + + return orderItem; + }).toList(); + + order.setItems(orderItems); order.calculateTotalAmount(); items.forEach(OrderItem::updateInstrumentStock); } else { @@ -50,9 +78,22 @@ public Order placeOrder(Long userId, List items) { } public List getOrdersWithPagination(Long userId, int page, int size) { - PageRequest pageRequest = PageRequest.of(page - 1, size); Page orderPage = orderRepository.findByUserId(userId, pageRequest); return orderPage.getContent(); } + + @Transactional + public Order cancelOrder(Long orderId) { + Order order = orderRepository.findById(orderId) + .orElseThrow(() -> new EntityNotFoundException("Order was not found!")); + + order.getItems().forEach(item -> { + Instrument instrument = item.getInstrument(); + instrument.setStockQuantity(instrument.getStockQuantity() + item.getQuantity()); + }); + + order.setStatus(OrderStatus.CANCELLED); + return orderRepository.save(order); + } } \ No newline at end of file diff --git a/src/main/java/com/example/jpa/impl/ReportingService.java b/src/main/java/com/example/jpa/impl/ReportingService.java new file mode 100644 index 0000000..e23d542 --- /dev/null +++ b/src/main/java/com/example/jpa/impl/ReportingService.java @@ -0,0 +1,66 @@ +package com.example.jpa.impl; + +import com.example.jpa.dtos.MonthlyIncomeReport; +import com.example.jpa.dtos.OrderWeeklyReport; +import com.example.jpa.models.Order; +import com.example.jpa.repositories.OrderRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class ReportingService { + @Autowired + private OrderRepository orderRepository; + + @Scheduled(cron = "0 0 9 ? * MON") + public void generateWeeklyOrderReport() { + LocalDate endDate = LocalDate.now(); + LocalDate startDate = endDate.minusDays(7); + + List weeklyOrders = orderRepository.findAllByOrderDateBetween(startDate, endDate); + + OrderWeeklyReport orderWeeklyReport = new OrderWeeklyReport(); + orderWeeklyReport.setStartDate(startDate); + orderWeeklyReport.setEndDate(endDate); + orderWeeklyReport.setTotalOrders(weeklyOrders.size()); + //@formatter:off + orderWeeklyReport.setTotalRevenue(calculateTotalIncome(weeklyOrders)); + + orderWeeklyReport.setOrderStatus(weeklyOrders.stream() + .collect(Collectors.groupingBy(Order::getStatus, Collectors.counting())));//@formatter:on + + System.out.println(orderWeeklyReport); + } + + @Scheduled(cron = "* * 9 1 * *") + public void generateMonthlyIncomeReport() { + LocalDate now = LocalDate.now().minusMonths(1); + LocalDate firstDayOfMonth = now.withDayOfMonth(1); + LocalDate lastDayOfMonth = now.withDayOfMonth(now.lengthOfMonth()); + + List orderList = orderRepository.findAllByOrderDateBetween(firstDayOfMonth, lastDayOfMonth); + + MonthlyIncomeReport report = new MonthlyIncomeReport(); + report.setYear(now.getYear()); + report.setMonth(now.getMonth()); + report.setTotalIncome(calculateTotalIncome(orderList)); + report.setAverageOrderValue(calculateTotalIncome(orderList).divide(BigDecimal.valueOf(orderList.size()), 2, RoundingMode.HALF_UP)); + report.setTotalOrderCount(orderList.size()); + System.out.println("Monthly report = " + report); + } + + private static BigDecimal calculateTotalIncome(List orderList) { + return orderList.stream() + .map(Order::getTotalAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/impl/ReviewServiceImpl.java b/src/main/java/com/example/jpa/impl/ReviewServiceImpl.java new file mode 100644 index 0000000..0cf1349 --- /dev/null +++ b/src/main/java/com/example/jpa/impl/ReviewServiceImpl.java @@ -0,0 +1,41 @@ +package com.example.jpa.impl; + +import com.example.jpa.dtos.CreateReviewDto; +import com.example.jpa.models.Instrument; +import com.example.jpa.models.Review; +import com.example.jpa.models.User; +import com.example.jpa.repositories.InstrumentRepository; +import com.example.jpa.repositories.ReviewRepository; +import com.example.jpa.repositories.UserJpaRepository; +import com.example.jpa.services.ReviewService; +import jakarta.persistence.EntityNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +@Service +public class ReviewServiceImpl implements ReviewService { + @Autowired + private ReviewRepository reviewRepository; + @Autowired + private InstrumentRepository instrumentRepository; + @Autowired + private UserJpaRepository userRepository; + + + public Review addReview(CreateReviewDto dto) { + Review review = new Review(); + review.setComment(dto.getComment()); + review.setRating(dto.getRating()); + review.setReviewDate(LocalDateTime.now()); + + User user = userRepository.findById(dto.getUserId()).orElseThrow(() -> new EntityNotFoundException("User was not found!")); + review.setUser(user); + + Instrument instrument = instrumentRepository.findById(dto.getUserId()).orElseThrow(() -> new EntityNotFoundException("Instrument not found!")); + review.setInstrument(instrument); + + return reviewRepository.save(review); + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/impl/UserServiceImpl.java b/src/main/java/com/example/jpa/impl/UserServiceImpl.java new file mode 100644 index 0000000..dcfdd67 --- /dev/null +++ b/src/main/java/com/example/jpa/impl/UserServiceImpl.java @@ -0,0 +1,69 @@ +package com.example.jpa.impl; + +import com.example.jpa.dtos.CreateUserDto; +import com.example.jpa.models.User; +import com.example.jpa.repositories.UserJpaRepository; +import com.example.jpa.repositories.UserRepository; +import com.example.jpa.services.UserService; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class UserServiceImpl implements UserService { + @Autowired + private UserRepository repository; + @Autowired + private UserJpaRepository jpaRepository; + @Autowired + private ObjectMapper mapper; + @Autowired + private EmailService emailService; + + + public Iterable saveAll(List users) { + return jpaRepository.saveAll(users); + } + + public Iterable findAllUsers() { + return jpaRepository.findAll(); + } + + public void deleteUser(Long id) { + jpaRepository.deleteById(id); + } + + public Optional findUserByUsername(String username) { + return jpaRepository.findByUsername(username); + } + + public User addUser(User user) { + // user.getOrders().forEach(o-> o.setUser(savedUser)); + // Save User + return jpaRepository.save(user); + } + + public User createUserFromDto(CreateUserDto userDto) { +// User u = new User(); +// u.setName(userDto.getName());... + User user = mapper.convertValue(userDto, User.class); + + User savedUser = jpaRepository.save(user); + + String subject = "Welcome to our service!"; + String body = "Dear " + savedUser.getName() + " Thank you for registration! \n your username is " + savedUser.getUsername(); + +// try { +// emailService.sendEmail(savedUser.getEmail(), subject, body); +// } catch (EmailSendingException e) { +// System.out.println(e.getMessage()); +// throw new UserServiceException("User created successfully, but failed to send welcome email!", "ERROR_ON_MAIL_SENDING"); +//// e.printStackTrace(); +// } + + return savedUser; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/models/Instrument.java b/src/main/java/com/example/jpa/models/Instrument.java index 15b8158..aa25753 100644 --- a/src/main/java/com/example/jpa/models/Instrument.java +++ b/src/main/java/com/example/jpa/models/Instrument.java @@ -1,11 +1,14 @@ package com.example.jpa.models; import com.example.jpa.enums.InstrumentCategory; +import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.*; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; /** * Represents an instrument entity with details such as ID, name, price, category, manufacturer, and stock quantity. @@ -32,4 +35,8 @@ public class Instrument { private int stockQuantity; + @JsonManagedReference + @OneToMany(mappedBy = "instrument", cascade = CascadeType.ALL) + private List reviews = new ArrayList<>(); + } diff --git a/src/main/java/com/example/jpa/models/Order.java b/src/main/java/com/example/jpa/models/Order.java index b6ce49d..716917d 100644 --- a/src/main/java/com/example/jpa/models/Order.java +++ b/src/main/java/com/example/jpa/models/Order.java @@ -1,7 +1,10 @@ package com.example.jpa.models; import com.example.jpa.enums.OrderStatus; +import com.example.jpa.models.OrderItem; +import com.example.jpa.models.User; import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,50 +14,46 @@ import java.time.LocalDate; import java.util.List; -/** - * Represents an Order entity that contains a list of OrderItems, order date, status, total amount, and associated User. - */ @Entity @Table(name = "orders") @Data @NoArgsConstructor @AllArgsConstructor - public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) + @JsonManagedReference private List items; private LocalDate orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; private BigDecimal totalAmount; - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "user_id", referencedColumnName = "id") @JsonBackReference private User user; - public Order(List items,OrderStatus status, LocalDate orderDate, User user) { + public Order(List items, OrderStatus status, LocalDate orderDate, User user) { this.items = items; this.status = status; this.orderDate = orderDate; this.user = user; } - public void calculateTotalAmount(){ - this.totalAmount = items.stream().map(OrderItem::getSubtotal).reduce(BigDecimal.ZERO,BigDecimal::add ); + + public void calculateTotalAmount() { + this.totalAmount = items.stream().map(OrderItem::getSubtotal).reduce(BigDecimal.ZERO, BigDecimal::add); } - public void updateStatus(){ + public void updateStatus() { if (items.isEmpty()) { this.status = OrderStatus.CANCELLED; - }else if (status == OrderStatus.PENDING){ + } else if (status == OrderStatus.PENDING) { this.status = OrderStatus.PROCESSING; } } - -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/models/OrderItem.java b/src/main/java/com/example/jpa/models/OrderItem.java index 7add93d..1f91ebb 100644 --- a/src/main/java/com/example/jpa/models/OrderItem.java +++ b/src/main/java/com/example/jpa/models/OrderItem.java @@ -1,13 +1,13 @@ package com.example.jpa.models; +import com.example.jpa.models.Instrument; +import com.example.jpa.models.Order; +import com.fasterxml.jackson.annotation.JsonBackReference; import jakarta.persistence.*; import lombok.Data; import java.math.BigDecimal; -/** - * Represents an item in an order with details such as ID, associated instrument, quantity, and order. - */ @Entity @Table(name = "order_item") @Data @@ -16,17 +16,16 @@ public class OrderItem { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne @JoinColumn(name = "instrument_id", nullable = false) private Instrument instrument; - @Column(nullable = false) private Integer quantity; @ManyToOne @JoinColumn(name = "order_id", nullable = false) + @JsonBackReference private Order order; public OrderItem() { @@ -38,24 +37,21 @@ public OrderItem(Order order, Instrument instrument, Integer quantity) { this.instrument = instrument; } - public BigDecimal getSubtotal() { return instrument.getPrice().multiply(BigDecimal.valueOf(quantity)); - } public void setQuantity(Integer quantity) { if (quantity <= 0) throw new IllegalArgumentException("Quantity must be positive!"); - if (quantity > instrument.getStockQuantity()) - throw new IllegalStateException("Insufficient stock for this instrument!"); +// if (quantity > instrument.getStockQuantity()) +// throw new IllegalStateException("Insufficient stock for this instrument!"); this.quantity = quantity; - } -public void updateInstrumentStock(){ - instrument.setStockQuantity(instrument.getStockQuantity()); -} + public void updateInstrumentStock() { + this.instrument.setStockQuantity(this.instrument.getStockQuantity() - this.quantity); + } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/models/Review.java b/src/main/java/com/example/jpa/models/Review.java new file mode 100644 index 0000000..5cf773d --- /dev/null +++ b/src/main/java/com/example/jpa/models/Review.java @@ -0,0 +1,32 @@ +package com.example.jpa.models; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonManagedReference; +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +@Entity +@Table(name = "reviews") +@Data +@NoArgsConstructor +public class Review { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name = "user_id", referencedColumnName = "id") + @JsonBackReference + private User user; + + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name = "instrument_id", referencedColumnName = "id") + @JsonBackReference + private Instrument instrument; + private Integer rating; + private String comment; + private LocalDateTime reviewDate; + +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/models/User.java b/src/main/java/com/example/jpa/models/User.java index 31e3aeb..c88650c 100644 --- a/src/main/java/com/example/jpa/models/User.java +++ b/src/main/java/com/example/jpa/models/User.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; @Data @@ -37,5 +38,8 @@ public class User { @JsonManagedReference private List orders; + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) + @JsonManagedReference + private List reviews = new ArrayList<>(); } diff --git a/src/main/java/com/example/jpa/repositories/InstrumentRepository.java b/src/main/java/com/example/jpa/repositories/InstrumentRepository.java index 44f3540..b1a5c52 100644 --- a/src/main/java/com/example/jpa/repositories/InstrumentRepository.java +++ b/src/main/java/com/example/jpa/repositories/InstrumentRepository.java @@ -8,6 +8,7 @@ import java.math.BigDecimal; import java.util.List; + @Repository public interface InstrumentRepository extends JpaRepository { List findByCategory(InstrumentCategory category); @@ -15,4 +16,4 @@ public interface InstrumentRepository extends JpaRepository { List findByPriceBetween(BigDecimal minPrice, BigDecimal maxPrice); List findByStockQuantityGreaterThan(int q); -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/repositories/OrderRepository.java b/src/main/java/com/example/jpa/repositories/OrderRepository.java index 8113f24..83bee92 100644 --- a/src/main/java/com/example/jpa/repositories/OrderRepository.java +++ b/src/main/java/com/example/jpa/repositories/OrderRepository.java @@ -5,10 +5,13 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import java.time.LocalDate; import java.util.List; -public interface OrderRepository extends JpaRepository { -List findByUserId(Long userId); -Page findByUserId(Long userId, Pageable pageable); -} +public interface OrderRepository extends JpaRepository { + List findByUserId(Long userId); + Page findByUserId(Long userId, Pageable pageable); + + List findAllByOrderDateBetween(LocalDate startDate, LocalDate endDate); +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/repositories/ReviewRepository.java b/src/main/java/com/example/jpa/repositories/ReviewRepository.java new file mode 100644 index 0000000..fd4fb28 --- /dev/null +++ b/src/main/java/com/example/jpa/repositories/ReviewRepository.java @@ -0,0 +1,10 @@ +package com.example.jpa.repositories; + +import com.example.jpa.models.Review; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReviewRepository extends JpaRepository { + + + +} diff --git a/src/main/java/com/example/jpa/repositories/UserJpaRepository.java b/src/main/java/com/example/jpa/repositories/UserJpaRepository.java index 6c5bfb5..ace10df 100644 --- a/src/main/java/com/example/jpa/repositories/UserJpaRepository.java +++ b/src/main/java/com/example/jpa/repositories/UserJpaRepository.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Optional; + public interface UserJpaRepository extends JpaRepository { Optional findByUsername(String username); @@ -28,12 +29,10 @@ public interface UserJpaRepository extends JpaRepository { List findByUsernameStartingWith(String text); - - @Query("SELECT u From User u where u.age > 30") + @Query("SELECT u FROM User u where u.age > 30") List findUsersOver30(); - @Query(value = "select u from users u where u.age > 30", nativeQuery = true) List findUsersOver30NativeQuery(); -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/services/OrderService.java b/src/main/java/com/example/jpa/services/OrderService.java index 4173b1b..07af9bb 100644 --- a/src/main/java/com/example/jpa/services/OrderService.java +++ b/src/main/java/com/example/jpa/services/OrderService.java @@ -5,9 +5,11 @@ import java.util.List; -public interface OrderService { +public interface OrderService { Order placeOrder(Long userId, List items); - List getOrdersWithPagination(Long userId,int page,int size); -} + List getOrdersWithPagination(Long userId, int page, int size); + + Order cancelOrder(Long orderId); +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/services/ReviewService.java b/src/main/java/com/example/jpa/services/ReviewService.java new file mode 100644 index 0000000..c53b2e8 --- /dev/null +++ b/src/main/java/com/example/jpa/services/ReviewService.java @@ -0,0 +1,8 @@ +package com.example.jpa.services; + +import com.example.jpa.dtos.CreateReviewDto; +import com.example.jpa.models.Review; + +public interface ReviewService { + Review addReview(CreateReviewDto dto); +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/services/UserService.java b/src/main/java/com/example/jpa/services/UserService.java index eecaf34..1ab1a56 100644 --- a/src/main/java/com/example/jpa/services/UserService.java +++ b/src/main/java/com/example/jpa/services/UserService.java @@ -1,69 +1,19 @@ package com.example.jpa.services; - import com.example.jpa.dtos.CreateUserDto; -import com.example.jpa.exceptions.EmailSendingException; -import com.example.jpa.exceptions.UserServiceException; -import com.example.jpa.impl.EmailService; import com.example.jpa.models.User; -import com.example.jpa.repositories.UserJpaRepository; -import com.example.jpa.repositories.UserRepository; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import java.util.List; import java.util.Optional; -@Service -public class UserService { - @Autowired - private UserRepository repository; - @Autowired - private UserJpaRepository jpaRepository; - @Autowired - private ObjectMapper mapper; - @Autowired - private EmailService emailService; - - public Iterable saveAll(List users) { - return jpaRepository.saveAll(users); - } - - public Iterable findAllUsers() { - return jpaRepository.findAll(); - } - - public void deletUser(Long id) { - jpaRepository.deleteById(id); - } - - public Optional findUserByUsername(String username) { - return jpaRepository.findByUsername(username); - } - - public User addUser(User user) { - // Save User - return jpaRepository.save(user); - } - - public User createUserFromDto(CreateUserDto userDto) { - User user = mapper.convertValue(userDto, User.class); - - User savedUser = jpaRepository.save(user); +public interface UserService { + Iterable saveAll(List users); - String subject = "Welcome to our service!"; - String body = "Dear " + savedUser.getName() + "Thank you for registration! \n your username is " + savedUser.getUsername(); + Iterable findAllUsers(); - try { - emailService.sendEmail(savedUser.getEmail(), subject, body); - } catch (EmailSendingException e) { - System.out.println(e.getMessage()); - throw new UserServiceException("User created successfuly, but failed to send welcome email!", "ERROR_ON_MAIL_SENDING"); - // e.printStackTrace(); - } + void deleteUser(Long id); - return savedUser; + Optional findUserByUsername(String username); + User addUser(User user); - } -} + User createUserFromDto(CreateUserDto userDto); +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c22077c..4d1bac1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,17 +1,19 @@ -#Database connection prop +# Database connection prop spring.datasource.url=jdbc:postgresql://localhost:5432/postgres spring.datasource.username=postgres spring.datasource.password=postgres -#Jpa prop +#JPA prop spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect #Email config spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username= +spring.mail.username=angelosimaproject30@gmail.com +# adaugati emailul personal spring.mail.password= +# generati o parola din contul vostru-> security -> 2-step verification -> App passwords generati una noua pe care sa o folositi spring.mail.properties.mail.smtp.auth=true -spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.enable=true \ No newline at end of file From 352346c8d73d99a298c4777efad35ce7f44890b0 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 18:56:27 +0200 Subject: [PATCH 16/37] add wishlist --- src/main/java/com/example/jpa/models/Instrument.java | 5 +++++ src/main/java/com/example/jpa/models/User.java | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/main/java/com/example/jpa/models/Instrument.java b/src/main/java/com/example/jpa/models/Instrument.java index aa25753..3c1583f 100644 --- a/src/main/java/com/example/jpa/models/Instrument.java +++ b/src/main/java/com/example/jpa/models/Instrument.java @@ -8,7 +8,9 @@ import java.math.BigDecimal; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Represents an instrument entity with details such as ID, name, price, category, manufacturer, and stock quantity. @@ -39,4 +41,7 @@ public class Instrument { @OneToMany(mappedBy = "instrument", cascade = CascadeType.ALL) private List reviews = new ArrayList<>(); + + @ManyToMany(mappedBy = "wishlist") + private Set users = new HashSet<>(); } diff --git a/src/main/java/com/example/jpa/models/User.java b/src/main/java/com/example/jpa/models/User.java index c88650c..ceff9af 100644 --- a/src/main/java/com/example/jpa/models/User.java +++ b/src/main/java/com/example/jpa/models/User.java @@ -8,7 +8,9 @@ import java.time.LocalDate; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; @Data @NoArgsConstructor @@ -42,4 +44,12 @@ public class User { @JsonManagedReference private List reviews = new ArrayList<>(); + @ManyToMany + @JoinTable( + name = "wishlist", + joinColumns = @JoinColumn(name ="user_id" ), + inverseJoinColumns = @JoinColumn(name = "instrument_id") + ) +private Set wishlist = new HashSet<>(); + } From 6229f3828bee4609356dfc7ca20c33477f25c079 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 19:59:55 +0200 Subject: [PATCH 17/37] add SECURITY --- pom.xml | 8 ++++++ .../java/com/example/jpa/JpaApplication.java | 2 ++ .../example/jpa/security/SecurityConfig.java | 26 +++++++++++++++++++ src/main/resources/application.properties | 9 +++++-- 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/jpa/security/SecurityConfig.java diff --git a/pom.xml b/pom.xml index 271af94..73f9892 100644 --- a/pom.xml +++ b/pom.xml @@ -70,6 +70,14 @@ spring-boot-devtools runtime + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-oauth2-client + org.springframework.boot spring-boot-starter-mail diff --git a/src/main/java/com/example/jpa/JpaApplication.java b/src/main/java/com/example/jpa/JpaApplication.java index 96c51a7..448fdc5 100644 --- a/src/main/java/com/example/jpa/JpaApplication.java +++ b/src/main/java/com/example/jpa/JpaApplication.java @@ -3,9 +3,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @SpringBootApplication @EnableScheduling +@EnableWebSecurity public class JpaApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/jpa/security/SecurityConfig.java b/src/main/java/com/example/jpa/security/SecurityConfig.java new file mode 100644 index 0000000..7202486 --- /dev/null +++ b/src/main/java/com/example/jpa/security/SecurityConfig.java @@ -0,0 +1,26 @@ +package com.example.jpa.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration + +public class SecurityConfig { + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + return http.authorizeHttpRequests(r->{ + r.requestMatchers("/api/users/create-from-dto").permitAll(); + r.anyRequest().authenticated(); + }) + .oauth2Login(Customizer.withDefaults()) + .formLogin(Customizer.withDefaults()) + .build(); + } + + + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4d1bac1..ae83ff2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -13,7 +13,12 @@ spring.mail.host=smtp.gmail.com spring.mail.port=587 spring.mail.username=angelosimaproject30@gmail.com # adaugati emailul personal -spring.mail.password= +spring.mail.password=vyhi ezyg bjyj mzak # generati o parola din contul vostru-> security -> 2-step verification -> App passwords generati una noua pe care sa o folositi spring.mail.properties.mail.smtp.auth=true -spring.mail.properties.mail.smtp.starttls.enable=true \ No newline at end of file +spring.mail.properties.mail.smtp.starttls.enable=true + +#Google props +logging.level.org.springframework.security=DEBUG +spring.security.ouath2.client.registration.google.client-id=597741826248-mpd6jhtjjkqgg2a6oubl8k85b2n1up6h.apps.googleusercontent.com +spring.security.ouath2.client.registration.google.client-secret=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 \ No newline at end of file From 6868d4ecc8348afde8644c950986defc14b66d21 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:02:15 +0200 Subject: [PATCH 18/37] add SECURITY --- src/main/java/com/example/jpa/security/SecurityConfig.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/jpa/security/SecurityConfig.java b/src/main/java/com/example/jpa/security/SecurityConfig.java index 7202486..99543ad 100644 --- a/src/main/java/com/example/jpa/security/SecurityConfig.java +++ b/src/main/java/com/example/jpa/security/SecurityConfig.java @@ -12,9 +12,9 @@ public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - return http.authorizeHttpRequests(r->{ - r.requestMatchers("/api/users/create-from-dto").permitAll(); - r.anyRequest().authenticated(); + return http.authorizeHttpRequests(r -> { + r.requestMatchers("/api/users/create-from-dto").permitAll(); + r.anyRequest().authenticated(); }) .oauth2Login(Customizer.withDefaults()) .formLogin(Customizer.withDefaults()) @@ -22,5 +22,4 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti } - } From a3f05e9b4ff941a9d257bfb2cf1390f44efd4d24 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:13:55 +0200 Subject: [PATCH 19/37] add --- .../com/example/jpa/controllers/UserController.java | 7 ++++++- .../java/com/example/jpa/impl/UserServiceImpl.java | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/jpa/controllers/UserController.java b/src/main/java/com/example/jpa/controllers/UserController.java index 7cf4214..13ad2ed 100644 --- a/src/main/java/com/example/jpa/controllers/UserController.java +++ b/src/main/java/com/example/jpa/controllers/UserController.java @@ -2,6 +2,7 @@ import com.example.jpa.dtos.CreateUserDto; import com.example.jpa.exceptions.UserServiceException; +import com.example.jpa.models.Instrument; import com.example.jpa.models.User; import com.example.jpa.services.UserService; import org.springframework.http.HttpStatus; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Optional; +import java.util.Set; /** * Represents a REST controller for handling user-related operations. @@ -66,5 +68,8 @@ public ResponseEntity createUserFromDto(@RequestBody CreateUserDto userDto return ResponseEntity.ok(user); } - +@GetMapping("/wishlist") + public ResponseEntity> getWishlist(@PathVariable Long id){ + return ResponseEntity.ok(service.getWishlist(id)); +} } \ No newline at end of file diff --git a/src/main/java/com/example/jpa/impl/UserServiceImpl.java b/src/main/java/com/example/jpa/impl/UserServiceImpl.java index dcfdd67..05f3b72 100644 --- a/src/main/java/com/example/jpa/impl/UserServiceImpl.java +++ b/src/main/java/com/example/jpa/impl/UserServiceImpl.java @@ -1,6 +1,7 @@ package com.example.jpa.impl; import com.example.jpa.dtos.CreateUserDto; +import com.example.jpa.models.Instrument; import com.example.jpa.models.User; import com.example.jpa.repositories.UserJpaRepository; import com.example.jpa.repositories.UserRepository; @@ -9,8 +10,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.Set; @Service public class UserServiceImpl implements UserService { @@ -66,4 +69,11 @@ public User createUserFromDto(CreateUserDto userDto) { return savedUser; } + public Set getWishlist(long userId){ + Optional user = jpaRepository.findById(userId); + if (user.isPresent()) + return user.get().getWishlist(); + else return Collections.EMPTY_SET; + } + } \ No newline at end of file From 46161feadf991bca73f94573dc8138a31dc8631c Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:16:26 +0200 Subject: [PATCH 20/37] add --- src/main/java/com/example/jpa/controllers/UserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/jpa/controllers/UserController.java b/src/main/java/com/example/jpa/controllers/UserController.java index 13ad2ed..09a69f5 100644 --- a/src/main/java/com/example/jpa/controllers/UserController.java +++ b/src/main/java/com/example/jpa/controllers/UserController.java @@ -68,7 +68,7 @@ public ResponseEntity createUserFromDto(@RequestBody CreateUserDto userDto return ResponseEntity.ok(user); } -@GetMapping("/wishlist") +@GetMapping("/wishlist/id") public ResponseEntity> getWishlist(@PathVariable Long id){ return ResponseEntity.ok(service.getWishlist(id)); } From 4eaeca67bd6c27ecf74d53523de6df120913e453 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:20:33 +0200 Subject: [PATCH 21/37] add --- src/main/resources/application.properties | 24 ----------------------- 1 file changed, 24 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ae83ff2..e69de29 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,24 +0,0 @@ -# Database connection prop -spring.datasource.url=jdbc:postgresql://localhost:5432/postgres -spring.datasource.username=postgres -spring.datasource.password=postgres - -#JPA prop -spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=update -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect - -#Email config -spring.mail.host=smtp.gmail.com -spring.mail.port=587 -spring.mail.username=angelosimaproject30@gmail.com -# adaugati emailul personal -spring.mail.password=vyhi ezyg bjyj mzak -# generati o parola din contul vostru-> security -> 2-step verification -> App passwords generati una noua pe care sa o folositi -spring.mail.properties.mail.smtp.auth=true -spring.mail.properties.mail.smtp.starttls.enable=true - -#Google props -logging.level.org.springframework.security=DEBUG -spring.security.ouath2.client.registration.google.client-id=597741826248-mpd6jhtjjkqgg2a6oubl8k85b2n1up6h.apps.googleusercontent.com -spring.security.ouath2.client.registration.google.client-secret=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 \ No newline at end of file From 81f5a6fa44e4b3a8494dfc7ad9e895970aba3245 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:21:18 +0200 Subject: [PATCH 22/37] add --- src/main/resources/application.properties | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29..eb2c69a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1,19 @@ +# Database connection prop +spring.datasource.url=jdbc:postgresql://localhost:5432/postgres +spring.datasource.username=postgres +spring.datasource.password=postgres + +#JPA prop +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +#Email config +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=angelosimaproject30@gmail.com +# adaugati emailul personal +spring.mail.password=vyhi ezyg bjyj mzak +# generati o parola din contul vostru-> security -> 2-step verification -> App passwords generati una noua pe care sa o folositi +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true From f05b3f1e83bd30b36f8b5e4bab515b2b1cdd777e Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:22:46 +0200 Subject: [PATCH 23/37] aaa --- src/main/resources/application.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index eb2c69a..ae92b23 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -17,3 +17,4 @@ spring.mail.password=vyhi ezyg bjyj mzak # generati o parola din contul vostru-> security -> 2-step verification -> App passwords generati una noua pe care sa o folositi spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true +aaaaaa \ No newline at end of file From b384629b9228e210e744d1779250ae9686ddaa8e Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:29:11 +0200 Subject: [PATCH 24/37] aaa --- src/main/resources/application.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ae92b23..eb2c69a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -17,4 +17,3 @@ spring.mail.password=vyhi ezyg bjyj mzak # generati o parola din contul vostru-> security -> 2-step verification -> App passwords generati una noua pe care sa o folositi spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true -aaaaaa \ No newline at end of file From 148eb0dffaaabed28211d496be62be5d1323d235 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:30:46 +0200 Subject: [PATCH 25/37] Revert "add" This reverts commit 81f5a6fa44e4b3a8494dfc7ad9e895970aba3245. --- src/main/resources/application.properties | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index eb2c69a..e69de29 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,19 +0,0 @@ -# Database connection prop -spring.datasource.url=jdbc:postgresql://localhost:5432/postgres -spring.datasource.username=postgres -spring.datasource.password=postgres - -#JPA prop -spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=update -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect - -#Email config -spring.mail.host=smtp.gmail.com -spring.mail.port=587 -spring.mail.username=angelosimaproject30@gmail.com -# adaugati emailul personal -spring.mail.password=vyhi ezyg bjyj mzak -# generati o parola din contul vostru-> security -> 2-step verification -> App passwords generati una noua pe care sa o folositi -spring.mail.properties.mail.smtp.auth=true -spring.mail.properties.mail.smtp.starttls.enable=true From a840afe0bc95c427a163b747e88c9c3a9b59e2f2 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:30:51 +0200 Subject: [PATCH 26/37] Revert "add SECURITY" This reverts commit 6868d4ecc8348afde8644c950986defc14b66d21. --- src/main/java/com/example/jpa/security/SecurityConfig.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/jpa/security/SecurityConfig.java b/src/main/java/com/example/jpa/security/SecurityConfig.java index 99543ad..7202486 100644 --- a/src/main/java/com/example/jpa/security/SecurityConfig.java +++ b/src/main/java/com/example/jpa/security/SecurityConfig.java @@ -12,9 +12,9 @@ public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - return http.authorizeHttpRequests(r -> { - r.requestMatchers("/api/users/create-from-dto").permitAll(); - r.anyRequest().authenticated(); + return http.authorizeHttpRequests(r->{ + r.requestMatchers("/api/users/create-from-dto").permitAll(); + r.anyRequest().authenticated(); }) .oauth2Login(Customizer.withDefaults()) .formLogin(Customizer.withDefaults()) @@ -22,4 +22,5 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti } + } From 9e849682c4d5dcbfbdb44f5685bbd0ffca3b1f1c Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:34:31 +0200 Subject: [PATCH 27/37] aaa --- pom.xml | 8 ------ .../java/com/example/jpa/JpaApplication.java | 2 -- .../example/jpa/security/SecurityConfig.java | 26 ------------------- .../com/example/jpa/services/UserService.java | 4 +++ 4 files changed, 4 insertions(+), 36 deletions(-) delete mode 100644 src/main/java/com/example/jpa/security/SecurityConfig.java diff --git a/pom.xml b/pom.xml index 73f9892..271af94 100644 --- a/pom.xml +++ b/pom.xml @@ -70,14 +70,6 @@ spring-boot-devtools runtime - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-oauth2-client - org.springframework.boot spring-boot-starter-mail diff --git a/src/main/java/com/example/jpa/JpaApplication.java b/src/main/java/com/example/jpa/JpaApplication.java index 448fdc5..96c51a7 100644 --- a/src/main/java/com/example/jpa/JpaApplication.java +++ b/src/main/java/com/example/jpa/JpaApplication.java @@ -3,11 +3,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @SpringBootApplication @EnableScheduling -@EnableWebSecurity public class JpaApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/jpa/security/SecurityConfig.java b/src/main/java/com/example/jpa/security/SecurityConfig.java deleted file mode 100644 index 7202486..0000000 --- a/src/main/java/com/example/jpa/security/SecurityConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.jpa.security; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.web.SecurityFilterChain; - -@Configuration - -public class SecurityConfig { - - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - return http.authorizeHttpRequests(r->{ - r.requestMatchers("/api/users/create-from-dto").permitAll(); - r.anyRequest().authenticated(); - }) - .oauth2Login(Customizer.withDefaults()) - .formLogin(Customizer.withDefaults()) - .build(); - } - - - -} diff --git a/src/main/java/com/example/jpa/services/UserService.java b/src/main/java/com/example/jpa/services/UserService.java index 1ab1a56..658fc11 100644 --- a/src/main/java/com/example/jpa/services/UserService.java +++ b/src/main/java/com/example/jpa/services/UserService.java @@ -1,8 +1,10 @@ package com.example.jpa.services; import com.example.jpa.dtos.CreateUserDto; +import com.example.jpa.models.Instrument; import com.example.jpa.models.User; import java.util.List; import java.util.Optional; +import java.util.Set; public interface UserService { Iterable saveAll(List users); @@ -16,4 +18,6 @@ public interface UserService { User addUser(User user); User createUserFromDto(CreateUserDto userDto); + + Set getWishlist(Long id); } \ No newline at end of file From b79ddc46f0244fa1a91ed9e73a80dda1d050bbc1 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:45:15 +0200 Subject: [PATCH 28/37] aaa --- .../java/com/example/jpa/{ => services}/impl/EmailService.java | 2 +- .../example/jpa/{ => services}/impl/InstrumentServiceImpl.java | 2 +- .../com/example/jpa/{ => services}/impl/OrderServiceImpl.java | 2 +- .../com/example/jpa/{ => services}/impl/ReportingService.java | 2 +- .../com/example/jpa/{ => services}/impl/ReviewServiceImpl.java | 2 +- .../com/example/jpa/{ => services}/impl/UserServiceImpl.java | 2 +- src/test/java/com/example/jpa/OrderServiceIntegrationTest.java | 2 +- src/test/java/com/example/jpa/UserServiceTest.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) rename src/main/java/com/example/jpa/{ => services}/impl/EmailService.java (95%) rename src/main/java/com/example/jpa/{ => services}/impl/InstrumentServiceImpl.java (97%) rename src/main/java/com/example/jpa/{ => services}/impl/OrderServiceImpl.java (98%) rename src/main/java/com/example/jpa/{ => services}/impl/ReportingService.java (98%) rename src/main/java/com/example/jpa/{ => services}/impl/ReviewServiceImpl.java (97%) rename src/main/java/com/example/jpa/{ => services}/impl/UserServiceImpl.java (98%) diff --git a/src/main/java/com/example/jpa/impl/EmailService.java b/src/main/java/com/example/jpa/services/impl/EmailService.java similarity index 95% rename from src/main/java/com/example/jpa/impl/EmailService.java rename to src/main/java/com/example/jpa/services/impl/EmailService.java index 71fecc3..43b00ff 100644 --- a/src/main/java/com/example/jpa/impl/EmailService.java +++ b/src/main/java/com/example/jpa/services/impl/EmailService.java @@ -1,4 +1,4 @@ -package com.example.jpa.impl; +package com.example.jpa.services.impl; import com.example.jpa.exceptions.EmailSendingException; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java b/src/main/java/com/example/jpa/services/impl/InstrumentServiceImpl.java similarity index 97% rename from src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java rename to src/main/java/com/example/jpa/services/impl/InstrumentServiceImpl.java index 444d64f..1d72fd8 100644 --- a/src/main/java/com/example/jpa/impl/InstrumentServiceImpl.java +++ b/src/main/java/com/example/jpa/services/impl/InstrumentServiceImpl.java @@ -1,4 +1,4 @@ -package com.example.jpa.impl; +package com.example.jpa.services.impl; import com.example.jpa.models.Instrument; import com.example.jpa.repositories.InstrumentRepository; diff --git a/src/main/java/com/example/jpa/impl/OrderServiceImpl.java b/src/main/java/com/example/jpa/services/impl/OrderServiceImpl.java similarity index 98% rename from src/main/java/com/example/jpa/impl/OrderServiceImpl.java rename to src/main/java/com/example/jpa/services/impl/OrderServiceImpl.java index 2baeae8..b084571 100644 --- a/src/main/java/com/example/jpa/impl/OrderServiceImpl.java +++ b/src/main/java/com/example/jpa/services/impl/OrderServiceImpl.java @@ -1,4 +1,4 @@ -package com.example.jpa.impl; +package com.example.jpa.services.impl; import com.example.jpa.enums.OrderStatus; import com.example.jpa.models.Instrument; diff --git a/src/main/java/com/example/jpa/impl/ReportingService.java b/src/main/java/com/example/jpa/services/impl/ReportingService.java similarity index 98% rename from src/main/java/com/example/jpa/impl/ReportingService.java rename to src/main/java/com/example/jpa/services/impl/ReportingService.java index e23d542..b9b1189 100644 --- a/src/main/java/com/example/jpa/impl/ReportingService.java +++ b/src/main/java/com/example/jpa/services/impl/ReportingService.java @@ -1,4 +1,4 @@ -package com.example.jpa.impl; +package com.example.jpa.services.impl; import com.example.jpa.dtos.MonthlyIncomeReport; import com.example.jpa.dtos.OrderWeeklyReport; diff --git a/src/main/java/com/example/jpa/impl/ReviewServiceImpl.java b/src/main/java/com/example/jpa/services/impl/ReviewServiceImpl.java similarity index 97% rename from src/main/java/com/example/jpa/impl/ReviewServiceImpl.java rename to src/main/java/com/example/jpa/services/impl/ReviewServiceImpl.java index 0cf1349..e868cca 100644 --- a/src/main/java/com/example/jpa/impl/ReviewServiceImpl.java +++ b/src/main/java/com/example/jpa/services/impl/ReviewServiceImpl.java @@ -1,4 +1,4 @@ -package com.example.jpa.impl; +package com.example.jpa.services.impl; import com.example.jpa.dtos.CreateReviewDto; import com.example.jpa.models.Instrument; diff --git a/src/main/java/com/example/jpa/impl/UserServiceImpl.java b/src/main/java/com/example/jpa/services/impl/UserServiceImpl.java similarity index 98% rename from src/main/java/com/example/jpa/impl/UserServiceImpl.java rename to src/main/java/com/example/jpa/services/impl/UserServiceImpl.java index 05f3b72..c2bc57a 100644 --- a/src/main/java/com/example/jpa/impl/UserServiceImpl.java +++ b/src/main/java/com/example/jpa/services/impl/UserServiceImpl.java @@ -1,4 +1,4 @@ -package com.example.jpa.impl; +package com.example.jpa.services.impl; import com.example.jpa.dtos.CreateUserDto; import com.example.jpa.models.Instrument; diff --git a/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java b/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java index 2fd7c10..af19bab 100644 --- a/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java +++ b/src/test/java/com/example/jpa/OrderServiceIntegrationTest.java @@ -4,7 +4,7 @@ import com.example.jpa.models.User; import com.example.jpa.repositories.OrderRepository; import com.example.jpa.repositories.UserJpaRepository; -import com.example.jpa.impl.OrderServiceImpl; +import com.example.jpa.services.impl.OrderServiceImpl; import jakarta.transaction.Transactional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/example/jpa/UserServiceTest.java b/src/test/java/com/example/jpa/UserServiceTest.java index 14145fa..30ab2b3 100644 --- a/src/test/java/com/example/jpa/UserServiceTest.java +++ b/src/test/java/com/example/jpa/UserServiceTest.java @@ -5,7 +5,7 @@ import com.example.jpa.exceptions.UserServiceException; import com.example.jpa.models.User; import com.example.jpa.repositories.UserJpaRepository; -import com.example.jpa.impl.EmailService; +import com.example.jpa.services.impl.EmailService; import com.example.jpa.services.UserService; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; From b261ce051f8c63efcf4aa7afe71c65805d1393c8 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:47:21 +0200 Subject: [PATCH 29/37] aaa --- src/main/resources/application-test.properties | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 1c37463..e69de29 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,12 +0,0 @@ -# Configurare H2 pentru teste -spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password= -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect - -# Configurare JPA/Hibernate -spring.jpa.hibernate.ddl-auto=create-drop -spring.jpa.show-sql=true -spring.jpa.properties.hibernate.format_sql=true -spring.h2.console.enabled=true \ No newline at end of file From 1f16ef82861752627dda2bfa14f574a3c8b1a410 Mon Sep 17 00:00:00 2001 From: Sima Angelin <99135792+Angelo2918@users.noreply.github.com> Date: Thu, 12 Dec 2024 20:47:33 +0200 Subject: [PATCH 30/37] Update application.properties --- src/main/resources/application.properties | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4d1bac1..8b13789 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,19 +1 @@ -# Database connection prop -spring.datasource.url=jdbc:postgresql://localhost:5432/postgres -spring.datasource.username=postgres -spring.datasource.password=postgres -#JPA prop -spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=update -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect - -#Email config -spring.mail.host=smtp.gmail.com -spring.mail.port=587 -spring.mail.username=angelosimaproject30@gmail.com -# adaugati emailul personal -spring.mail.password= -# generati o parola din contul vostru-> security -> 2-step verification -> App passwords generati una noua pe care sa o folositi -spring.mail.properties.mail.smtp.auth=true -spring.mail.properties.mail.smtp.starttls.enable=true \ No newline at end of file From c709c86bc373549b54b87af9da830a30340b8497 Mon Sep 17 00:00:00 2001 From: Sima Angelin <99135792+Angelo2918@users.noreply.github.com> Date: Thu, 12 Dec 2024 20:47:45 +0200 Subject: [PATCH 31/37] Update application-test.properties --- src/main/resources/application-test.properties | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 1c37463..8b13789 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,12 +1 @@ -# Configurare H2 pentru teste -spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password= -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect -# Configurare JPA/Hibernate -spring.jpa.hibernate.ddl-auto=create-drop -spring.jpa.show-sql=true -spring.jpa.properties.hibernate.format_sql=true -spring.h2.console.enabled=true \ No newline at end of file From c69c8d83bfc3e0fcaffadd3ef763102f078d7114 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:48:18 +0200 Subject: [PATCH 32/37] aaa --- .../java/com/example/jpa/services/impl/UserServiceImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/example/jpa/services/impl/UserServiceImpl.java b/src/main/java/com/example/jpa/services/impl/UserServiceImpl.java index c2bc57a..a5578db 100644 --- a/src/main/java/com/example/jpa/services/impl/UserServiceImpl.java +++ b/src/main/java/com/example/jpa/services/impl/UserServiceImpl.java @@ -69,6 +69,12 @@ public User createUserFromDto(CreateUserDto userDto) { return savedUser; } + + @Override + public Set getWishlist(Long id) { + return Set.of(); + } + public Set getWishlist(long userId){ Optional user = jpaRepository.findById(userId); if (user.isPresent()) From a64c4ddd00e41ae51c34b26cfbaffbef98f43e72 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 20:49:01 +0200 Subject: [PATCH 33/37] aaa --- src/main/resources/application-test.properties | 1 + src/main/resources/application.properties | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index e69de29..6b4b233 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -0,0 +1 @@ +zxczxczxczxc \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29..6597d7a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +zxczxczxc \ No newline at end of file From 4413b71a1ba7ec8a05ffa50c1ffd6ce3b24a6cd1 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 21:33:51 +0200 Subject: [PATCH 34/37] aaa --- .../jpa/controllers/UserController.java | 5 +---- .../com/example/jpa/dtos/RequestOrderDto.java | 5 +---- .../jpa/exceptions/UserServiceException.java | 8 ++++--- .../com/example/jpa/models/Instrument.java | 6 +----- .../java/com/example/jpa/models/Order.java | 2 -- .../java/com/example/jpa/models/User.java | 15 ++++++------- .../example/jpa/security/SecurityConfig.java | 21 +++++++++++++++++++ 7 files changed, 35 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/example/jpa/security/SecurityConfig.java diff --git a/src/main/java/com/example/jpa/controllers/UserController.java b/src/main/java/com/example/jpa/controllers/UserController.java index 09a69f5..2643f45 100644 --- a/src/main/java/com/example/jpa/controllers/UserController.java +++ b/src/main/java/com/example/jpa/controllers/UserController.java @@ -68,8 +68,5 @@ public ResponseEntity createUserFromDto(@RequestBody CreateUserDto userDto return ResponseEntity.ok(user); } -@GetMapping("/wishlist/id") - public ResponseEntity> getWishlist(@PathVariable Long id){ - return ResponseEntity.ok(service.getWishlist(id)); -} + } \ No newline at end of file diff --git a/src/main/java/com/example/jpa/dtos/RequestOrderDto.java b/src/main/java/com/example/jpa/dtos/RequestOrderDto.java index 9b1937e..8040cd3 100644 --- a/src/main/java/com/example/jpa/dtos/RequestOrderDto.java +++ b/src/main/java/com/example/jpa/dtos/RequestOrderDto.java @@ -11,9 +11,6 @@ @AllArgsConstructor @Data public class RequestOrderDto { - private Long userId; private List items; - - -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/exceptions/UserServiceException.java b/src/main/java/com/example/jpa/exceptions/UserServiceException.java index a31b7f7..2570981 100644 --- a/src/main/java/com/example/jpa/exceptions/UserServiceException.java +++ b/src/main/java/com/example/jpa/exceptions/UserServiceException.java @@ -3,12 +3,14 @@ public class UserServiceException extends RuntimeException { private String errorCode; - public UserServiceException(String message,String codeError){ + public UserServiceException(String message, String codeError) { super(message); this.errorCode = codeError; } -public String getErrorCode(){ + + public String getErrorCode() { + return errorCode; -} + } } diff --git a/src/main/java/com/example/jpa/models/Instrument.java b/src/main/java/com/example/jpa/models/Instrument.java index 3c1583f..6d2a7bf 100644 --- a/src/main/java/com/example/jpa/models/Instrument.java +++ b/src/main/java/com/example/jpa/models/Instrument.java @@ -19,7 +19,6 @@ @Table(name = "instrument") @Data @NoArgsConstructor - public class Instrument { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -29,19 +28,16 @@ public class Instrument { private String name; @Column(nullable = false) private BigDecimal price; - @Enumerated(EnumType.STRING) private InstrumentCategory category; private String manufacturer; @Column(nullable = false) private int stockQuantity; - @JsonManagedReference @OneToMany(mappedBy = "instrument", cascade = CascadeType.ALL) private List reviews = new ArrayList<>(); - @ManyToMany(mappedBy = "wishlist") private Set users = new HashSet<>(); -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/models/Order.java b/src/main/java/com/example/jpa/models/Order.java index 716917d..9c33876 100644 --- a/src/main/java/com/example/jpa/models/Order.java +++ b/src/main/java/com/example/jpa/models/Order.java @@ -13,7 +13,6 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; - @Entity @Table(name = "orders") @Data @@ -55,5 +54,4 @@ public void updateStatus() { this.status = OrderStatus.PROCESSING; } } - } \ No newline at end of file diff --git a/src/main/java/com/example/jpa/models/User.java b/src/main/java/com/example/jpa/models/User.java index ceff9af..482476e 100644 --- a/src/main/java/com/example/jpa/models/User.java +++ b/src/main/java/com/example/jpa/models/User.java @@ -12,17 +12,14 @@ import java.util.List; import java.util.Set; +@Entity +@Table(name = "users") @Data @NoArgsConstructor @AllArgsConstructor -@Entity -@Table(name = "users") public class User { - - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; private String name; private Integer age; @@ -38,7 +35,7 @@ public class User { @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) @JsonManagedReference - private List orders; + private List orders = new ArrayList<>(); @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) @JsonManagedReference @@ -47,9 +44,9 @@ public class User { @ManyToMany @JoinTable( name = "wishlist", - joinColumns = @JoinColumn(name ="user_id" ), + joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "instrument_id") ) -private Set wishlist = new HashSet<>(); + private Set wishlist = new HashSet<>(); -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/security/SecurityConfig.java b/src/main/java/com/example/jpa/security/SecurityConfig.java new file mode 100644 index 0000000..cc4c68d --- /dev/null +++ b/src/main/java/com/example/jpa/security/SecurityConfig.java @@ -0,0 +1,21 @@ +package com.example.jpa.security; + + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; + + +@Configuration +public class SecurityConfig { + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + return http.authorizeHttpRequests(r -> { + r.requestMatchers(HttpMethod.POST, "/api/users/create-from-dto").permitAll().anyRequest().authenticated(); + }) + .oauth2Login(Customizer.withDefaults()) + .formLogin(Customizer.withDefaults()) + .build(); + } +} \ No newline at end of file From 9ba061801eeb7551e8097d7f3a177752f1d77097 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 21:35:00 +0200 Subject: [PATCH 35/37] aaa --- .../resources/application-test.properties | 13 ++++++++++- src/main/resources/application.properties | 23 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 6b4b233..1c37463 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1 +1,12 @@ -zxczxczxczxc \ No newline at end of file +# Configurare H2 pentru teste +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect + +# Configurare JPA/Hibernate +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +spring.h2.console.enabled=true \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..6a9c87c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,24 @@ +# Database connection prop +spring.datasource.url=jdbc:postgresql://localhost:5432/postgres +spring.datasource.username=postgres +spring.datasource.password=postgres +#JPA prop +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +#Email config +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username= +# adaugati emailul personal +spring.mail.password= +# generati o parola din contul vostru-> security -> 2-step verification -> App passwords generati una noua pe care sa o folositi +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true + +#Google props +logging.level.org.springframework.security=DEBUG +spring.security.oauth2.client.registration.google.client-id= +spring.security.oauth2.client.registration.google.client-secret= \ No newline at end of file From b4b627279750ff6e9203f6baade8556cfbd94a74 Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 21:40:37 +0200 Subject: [PATCH 36/37] aaa --- src/main/java/com/example/jpa/JpaApplication.java | 4 +++- src/main/java/com/example/jpa/security/SecurityConfig.java | 3 +-- src/main/resources/application.properties | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/jpa/JpaApplication.java b/src/main/java/com/example/jpa/JpaApplication.java index 96c51a7..3665be0 100644 --- a/src/main/java/com/example/jpa/JpaApplication.java +++ b/src/main/java/com/example/jpa/JpaApplication.java @@ -4,12 +4,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; + @SpringBootApplication @EnableScheduling +@EnableW public class JpaApplication { public static void main(String[] args) { SpringApplication.run(JpaApplication.class, args); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jpa/security/SecurityConfig.java b/src/main/java/com/example/jpa/security/SecurityConfig.java index cc4c68d..d7aaec8 100644 --- a/src/main/java/com/example/jpa/security/SecurityConfig.java +++ b/src/main/java/com/example/jpa/security/SecurityConfig.java @@ -17,5 +17,4 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .oauth2Login(Customizer.withDefaults()) .formLogin(Customizer.withDefaults()) .build(); - } -} \ No newline at end of file + } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6a9c87c..e146cff 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -20,5 +20,5 @@ spring.mail.properties.mail.smtp.starttls.enable=true #Google props logging.level.org.springframework.security=DEBUG -spring.security.oauth2.client.registration.google.client-id= -spring.security.oauth2.client.registration.google.client-secret= \ No newline at end of file +spring.security.oauth2.client.registration.google.client-id=vcghd +spring.security.oauth2.client.registration.google.client-secret=fdgdf \ No newline at end of file From 798de1e2ef6a33bc5489f1b0e99cc1ab08aa694e Mon Sep 17 00:00:00 2001 From: Angelo2918 Date: Thu, 12 Dec 2024 22:04:09 +0200 Subject: [PATCH 37/37] aaa --- pom.xml | 7 +++++++ src/main/java/com/example/jpa/JpaApplication.java | 4 ++-- src/main/java/com/example/jpa/security/SecurityConfig.java | 7 +++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 271af94..0ab4a04 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,13 @@ org.springframework.boot spring-boot-devtools runtime + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-oauth2-client org.springframework.boot diff --git a/src/main/java/com/example/jpa/JpaApplication.java b/src/main/java/com/example/jpa/JpaApplication.java index 3665be0..24b2a13 100644 --- a/src/main/java/com/example/jpa/JpaApplication.java +++ b/src/main/java/com/example/jpa/JpaApplication.java @@ -3,11 +3,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; - +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @SpringBootApplication @EnableScheduling -@EnableW +@EnableWebSecurity public class JpaApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/jpa/security/SecurityConfig.java b/src/main/java/com/example/jpa/security/SecurityConfig.java index d7aaec8..f925af4 100644 --- a/src/main/java/com/example/jpa/security/SecurityConfig.java +++ b/src/main/java/com/example/jpa/security/SecurityConfig.java @@ -4,7 +4,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; - +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.SecurityFilterChain; @Configuration public class SecurityConfig { @@ -17,4 +19,5 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .oauth2Login(Customizer.withDefaults()) .formLogin(Customizer.withDefaults()) .build(); - } \ No newline at end of file + } +} \ No newline at end of file