From 824f79079ee67669318a40b23d9b3002e9654978 Mon Sep 17 00:00:00 2001 From: Antonio Manca Date: Thu, 8 Aug 2024 14:09:08 +0200 Subject: [PATCH 001/145] Add Dockerfile & Jenkinsfile --- Dockerfile | 4 ++++ Jenkinsfile | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 Dockerfile create mode 100644 Jenkinsfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..86462d85 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM amazoncorretto:17.0.8-alpine3.17 +EXPOSE 8080 +ADD /target/gepafin-0.0.1-SNAPSHOT.jar gepafin-0.0.1-SNAPSHOT.jar +ENTRYPOINT ["java", "-jar","gepafin-0.0.1-SNAPSHOT.jar"] \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..968d3a2b --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,64 @@ +pipeline { + agent any + options { + buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '5', daysToKeepStr: '', numToKeepStr: '5') + } + stages { + stage('Develop Branch Deploy Code') { + when { + branch 'develop' + } + environment { + github_branch = "develop" + dockerimagename = "devteambflows/gepafin-api-dev" + dockerImage = "" + registryCredential = 'dockerhublogin' + } + steps { + git branch: "${github_branch}", url: 'https://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@github.com/Kitzanos/GEPAFIN-BE.git' + script { + sh '/usr/share/maven/bin/mvn clean install -Dmaven.test.skip=true -Dspring.profiles.active=dev' + } + script { + dockerImage = docker.build dockerimagename + } + script { + docker.withRegistry('https://registry.hub.docker.com', registryCredential) { + dockerImage.push("latest") + } + } + script { + sh 'ssh ubuntu@jenkins-server1.bflows.ai "sh gepafin-dev-api.sh"' + } + } + } + stage('Production Branch Deploy Code') { + when { + branch 'master' + } + environment { + github_branch = "master" + dockerimagename = "devteambflows/gepafin-api-production" + dockerImage = "" + registryCredential = 'dockerhublogin' + } + steps { + git branch: "${github_branch}", url: 'https://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@github.com/Kitzanos/GEPAFIN-BE.git' + script { + sh '/usr/share/maven/bin/mvn clean install -Dmaven.test.skip=true -Dspring.profiles.active=production' + } + script { + dockerImage = docker.build dockerimagename + } + script { + docker.withRegistry('https://registry.hub.docker.com', registryCredential) { + dockerImage.push("latest") + } + } + script { + sh 'ssh ubuntu@46.105.65.89 "sh gepafin-production-api.sh"' + } + } + } + } +} \ No newline at end of file From f8ec4e5bf4da0959825fbe56a439e6884c141cab Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 9 Aug 2024 14:26:15 +0530 Subject: [PATCH 002/145] created gepafin project --- .idea/.gitignore | 3 + mvnw | 259 ++++++++++++++++++ mvnw.cmd | 149 ++++++++++ pom.xml | 54 ++++ .../TendermanagementApplication.java | 14 + .../gepafin/tendermanagement/model/User.java | 38 +++ .../web/rest/api/UserController.java | 10 + .../web/rest/api/impl/UserControllerImpl.java | 15 + src/main/resources/application.properties | 3 + .../TendermanagementApplicationTests.java | 13 + target/classes/application.properties | 3 + 11 files changed, 561 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/User.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/UserController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserControllerImpl.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/net/gepafin/tendermanagement/TendermanagementApplicationTests.java create mode 100644 target/classes/application.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/mvnw b/mvnw new file mode 100644 index 00000000..d7c358e5 --- /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 +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.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 00000000..6f779cff --- /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 https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.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 00000000..6142921d --- /dev/null +++ b/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + + net.gepafin + tendermanagement + 0.0.1-SNAPSHOT + tendermanagement + Tender Management project + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java new file mode 100644 index 00000000..f63a972f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TendermanagementApplication { + + public static void main(String[] args) { + SpringApplication.run(TendermanagementApplication.class, args); + } + +} + diff --git a/src/main/java/net/gepafin/tendermanagement/model/User.java b/src/main/java/net/gepafin/tendermanagement/model/User.java new file mode 100644 index 00000000..8b3fe662 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/User.java @@ -0,0 +1,38 @@ +package net.gepafin.tendermanagement.model; + +public class User { + private Long id; + private String name; + private String email; + + public User() {} + + public User(Long id, String name, String email) { + this.id = id; + this.name = name; + this.email = email; + } + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserController.java new file mode 100644 index 00000000..ae81b7ba --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserController.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.web.rest.api; +import net.gepafin.tendermanagement.model.User; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@RequestMapping("/api") +public interface UserController { + @GetMapping("/user") + User getUser(); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserControllerImpl.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserControllerImpl.java new file mode 100644 index 00000000..f7d6203d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserControllerImpl.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.model.User; +import net.gepafin.tendermanagement.web.rest.api.UserController; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class UserControllerImpl implements UserController +{ + + @Override + public User getUser() { + return new User(1L, "John Doe", "john.doe@test.test"); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 00000000..9aa841e8 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.application.name=tendermanagement +server.port=8080 + diff --git a/src/test/java/net/gepafin/tendermanagement/TendermanagementApplicationTests.java b/src/test/java/net/gepafin/tendermanagement/TendermanagementApplicationTests.java new file mode 100644 index 00000000..6c53e258 --- /dev/null +++ b/src/test/java/net/gepafin/tendermanagement/TendermanagementApplicationTests.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class TendermanagementApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/target/classes/application.properties b/target/classes/application.properties new file mode 100644 index 00000000..9aa841e8 --- /dev/null +++ b/target/classes/application.properties @@ -0,0 +1,3 @@ +spring.application.name=tendermanagement +server.port=8080 + From 2773dfa0340a316bb4af8dca4cfc0602be4ce9de Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 9 Aug 2024 15:11:07 +0530 Subject: [PATCH 003/145] Created a test api for getting user. --- .../web/rest/api/{UserController.java => UserApi.java} | 6 ++---- .../{UserControllerImpl.java => UserApiController.java} | 7 +++++-- 2 files changed, 7 insertions(+), 6 deletions(-) rename src/main/java/net/gepafin/tendermanagement/web/rest/api/{UserController.java => UserApi.java} (55%) rename src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/{UserControllerImpl.java => UserApiController.java} (60%) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java similarity index 55% rename from src/main/java/net/gepafin/tendermanagement/web/rest/api/UserController.java rename to src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index ae81b7ba..e1e0f29a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -1,10 +1,8 @@ package net.gepafin.tendermanagement.web.rest.api; import net.gepafin.tendermanagement.model.User; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -@RequestMapping("/api") -public interface UserController { - @GetMapping("/user") +public interface UserApi { + @GetMapping("") User getUser(); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserControllerImpl.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java similarity index 60% rename from src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserControllerImpl.java rename to src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index f7d6203d..4dbd4107 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserControllerImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -1,11 +1,14 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import net.gepafin.tendermanagement.model.User; -import net.gepafin.tendermanagement.web.rest.api.UserController; +import net.gepafin.tendermanagement.web.rest.api.UserApi; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; + @RestController -public class UserControllerImpl implements UserController +@RequestMapping("/v1/user") +public class UserApiController implements UserApi { @Override From a7a440bd9d2bd0717e2c6bc3176a966c612942ab Mon Sep 17 00:00:00 2001 From: Antonio Manca Date: Sat, 10 Aug 2024 08:05:43 +0200 Subject: [PATCH 004/145] Fix application name to tendermanagement in Dockerfile --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 86462d85..22070bd1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ FROM amazoncorretto:17.0.8-alpine3.17 EXPOSE 8080 -ADD /target/gepafin-0.0.1-SNAPSHOT.jar gepafin-0.0.1-SNAPSHOT.jar -ENTRYPOINT ["java", "-jar","gepafin-0.0.1-SNAPSHOT.jar"] \ No newline at end of file +ADD /target/tendermanagement-0.0.1-SNAPSHOT.jar tendermanagement-0.0.1-SNAPSHOT.jar +ENTRYPOINT ["java", "-jar","tendermanagement-0.0.1-SNAPSHOT.jar"] \ No newline at end of file From e09f61f918680034f663f2c368ab1a7bc1a1558a Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 14 Aug 2024 15:31:00 +0530 Subject: [PATCH 005/145] Done ticket GEPAFINBE-3 --- pom.xml | 80 ++++++++-- .../TendermanagementApplication.java | 9 ++ .../config/MessageSourceConfig.java | 17 +++ .../tendermanagement/config/SchemaInit.java | 70 +++++++++ .../tendermanagement/config/Translator.java | 25 ++++ .../constants/GepafinConstant.java | 27 ++++ .../tendermanagement/dao/RegionDao.java | 109 ++++++++++++++ .../gepafin/tendermanagement/dao/RoleDao.java | 80 ++++++++++ .../gepafin/tendermanagement/dao/UserDao.java | 99 +++++++++++++ .../tendermanagement/entities/BaseEntity.java | 35 +++++ .../entities/RegionEntity.java | 60 ++++++++ .../tendermanagement/entities/RoleEntity.java | 26 ++++ .../tendermanagement/entities/UserEntity.java | 77 ++++++++++ .../gepafin/tendermanagement/model/User.java | 38 ----- .../model/request/RegionReq.java | 39 +++++ .../model/request/RoleReq.java | 27 ++++ .../model/request/UpdateRegionReq.java | 35 +++++ .../model/request/UpdateUserReq.java | 21 +++ .../model/request/UserReq.java | 44 ++++++ .../model/response/RegionResponseBean.java | 28 ++++ .../model/response/RoleResponseBean.java | 19 +++ .../model/response/UserResponseBean.java | 41 ++++++ .../tendermanagement/model/util/Response.java | 29 ++++ .../repositories/RegionRepository.java | 9 ++ .../repositories/RoleRepository.java | 9 ++ .../repositories/UserRepository.java | 9 ++ .../service/RegionService.java | 22 +++ .../tendermanagement/service/RoleService.java | 19 +++ .../tendermanagement/service/UserService.java | 12 ++ .../service/impl/RegionServiceImpl.java | 43 ++++++ .../service/impl/RoleServiceImpl.java | 44 ++++++ .../service/impl/UserServiceImpl.java | 38 +++++ .../tendermanagement/util/DateTimeUtil.java | 53 +++++++ .../tendermanagement/util/ObjectUtils.java | 20 +++ .../gepafin/tendermanagement/util/Utils.java | 49 +++++++ .../web/rest/api/RegionApi.java | 91 ++++++++++++ .../web/rest/api/RoleApi.java | 93 ++++++++++++ .../web/rest/api/UserApi.java | 94 +++++++++++- .../api/errors/CustomValidationException.java | 16 ++ .../web/rest/api/errors/ErrorConstants.java | 28 ++++ .../api/errors/ResourceNotFoundException.java | 23 +++ .../web/rest/api/errors/Status.java | 16 ++ .../rest/api/impl/RegionApiController.java | 79 ++++++++++ .../web/rest/api/impl/RoleApiController.java | 75 ++++++++++ .../web/rest/api/impl/UserApiController.java | 70 ++++++++- src/main/resources/application.properties | 25 +++- .../db/changelog/db.changelog-1.0.0.xml | 137 ++++++++++++++++++ .../db/changelog/db.changelog-master.xml | 8 + src/main/resources/message_en.properties | 29 ++++ src/main/resources/message_it.properties | 28 ++++ target/classes/application.properties | 3 - 51 files changed, 2107 insertions(+), 70 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/config/MessageSourceConfig.java create mode 100644 src/main/java/net/gepafin/tendermanagement/config/SchemaInit.java create mode 100644 src/main/java/net/gepafin/tendermanagement/config/Translator.java create mode 100644 src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/UserDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/BaseEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/RegionEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java delete mode 100644 src/main/java/net/gepafin/tendermanagement/model/User.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/UpdateRegionReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/util/Response.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/RegionRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/RegionService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/RoleService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/UserService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java create mode 100644 src/main/java/net/gepafin/tendermanagement/util/ObjectUtils.java create mode 100644 src/main/java/net/gepafin/tendermanagement/util/Utils.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/CustomValidationException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ErrorConstants.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ResourceNotFoundException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/Status.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java create mode 100644 src/main/resources/db/changelog/db.changelog-1.0.0.xml create mode 100644 src/main/resources/db/changelog/db.changelog-master.xml create mode 100644 src/main/resources/message_en.properties create mode 100644 src/main/resources/message_it.properties delete mode 100644 target/classes/application.properties diff --git a/pom.xml b/pom.xml index 6142921d..1572627b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,5 @@ - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -13,28 +12,69 @@ 0.0.1-SNAPSHOT tendermanagement Tender Management project - - - - - - - - - - - - - 17 + 1.5.5.Final + org.springframework.boot spring-boot-starter-web + + + org.projectlombok + lombok + 1.18.24 + + + + + com.h2database + h2 + 1.4.200 + + + + + org.postgresql + postgresql + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.2.0 + + + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + provided + + + + org.liquibase + liquibase-core + + + org.springframework.boot spring-boot-starter-test @@ -42,13 +82,21 @@ + org.springframework.boot spring-boot-maven-plugin + + org.liquibase + liquibase-maven-plugin + 4.20.0 + + src/main/resources/application.properties + + - diff --git a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java index f63a972f..07a51505 100644 --- a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java +++ b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java @@ -2,12 +2,21 @@ package net.gepafin.tendermanagement; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.scheduling.annotation.EnableScheduling; +@EnableScheduling +@ComponentScan(basePackages = {"net.gepafin.tendermanagement"}) +@EnableJpaRepositories(basePackages = {"net.gepafin.tendermanagement"}) +@EntityScan(basePackages = {"net.gepafin.tendermanagement"}) @SpringBootApplication public class TendermanagementApplication { public static void main(String[] args) { SpringApplication.run(TendermanagementApplication.class, args); + System.out.println("Spring Boot started"); } } diff --git a/src/main/java/net/gepafin/tendermanagement/config/MessageSourceConfig.java b/src/main/java/net/gepafin/tendermanagement/config/MessageSourceConfig.java new file mode 100644 index 00000000..6f9767c6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/MessageSourceConfig.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ResourceBundleMessageSource; + +@Configuration +public class MessageSourceConfig { + @Bean(name = "defaultMessageSource") + public ResourceBundleMessageSource messageSource() { + ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); + messageSource.setBasenames("message"); + messageSource.setDefaultEncoding("UTF-8"); + messageSource.setUseCodeAsDefaultMessage(true); + return messageSource; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/config/SchemaInit.java b/src/main/java/net/gepafin/tendermanagement/config/SchemaInit.java new file mode 100644 index 00000000..6d57f81f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/SchemaInit.java @@ -0,0 +1,70 @@ +package net.gepafin.tendermanagement.config; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.stereotype.Component; + +import liquibase.change.DatabaseChange; +import liquibase.integration.spring.SpringLiquibase; +import org.springframework.beans.factory.annotation.Value; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Configuration +@ConditionalOnClass({ SpringLiquibase.class, DatabaseChange.class }) +@ConditionalOnProperty(prefix = "spring.liquibase", name = "enabled", matchIfMissing = true) +@AutoConfigureAfter({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) +@Import({SchemaInit.SpringLiquibaseDependsOnPostProcessor.class}) +public class SchemaInit { + + @Component + @ConditionalOnProperty(prefix = "spring.liquibase", name = "enabled", matchIfMissing = true) + public static class SchemaInitBean implements InitializingBean { + + private final DataSource dataSource; + private final String schemaName; + + @Autowired + public SchemaInitBean(DataSource dataSource, @Value("${spring.liquibase.default-schema}") String schemaName) { + this.dataSource = dataSource; + this.schemaName = schemaName; + } + + @Override + public void afterPropertiesSet() { + try (Connection conn = dataSource.getConnection(); + Statement statement = conn.createStatement()) { + log.info("Going to create DB schema '{}' if not exists.", schemaName); + String query = "create schema if not exists " + schemaName; + statement.execute(query); + } catch (SQLException e) { + throw new RuntimeException("Failed to create schema '" + schemaName + "'", e); + } + } + } + + + @ConditionalOnBean(SchemaInitBean.class) + static class SpringLiquibaseDependsOnPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor { + + SpringLiquibaseDependsOnPostProcessor() { + // Configure the 3rd party SpringLiquibase bean to depend on our SchemaInitBean + super(SpringLiquibase.class, SchemaInitBean.class); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/config/Translator.java b/src/main/java/net/gepafin/tendermanagement/config/Translator.java new file mode 100644 index 00000000..b3c02401 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/Translator.java @@ -0,0 +1,25 @@ +package net.gepafin.tendermanagement.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.stereotype.Component; + +import java.util.Locale; + +@Component +public class Translator { + + private static ResourceBundleMessageSource messageSource; + + @Autowired + Translator(ResourceBundleMessageSource messageSource) { + Translator.messageSource = messageSource; + } + + public static String toLocale(String msgCode) { +// LocaleContextHolder.setDefaultLocale(Locale.ITALIAN); + Locale locale = LocaleContextHolder.getLocale(); + return messageSource.getMessage(msgCode, null, locale); + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java new file mode 100644 index 00000000..7d00913f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -0,0 +1,27 @@ +package net.gepafin.tendermanagement.constants; + +public class GepafinConstant { + + public static final String USER_CREATED_SUCCESS_MSG = "user.created.success"; + public static final String USER_UPDATED_SUCCESS_MSG = "user.updated.success"; + public static final String USER_DELETED_SUCCESS_MSG = "user.deleted.success"; + public static final String USER_NOT_FOUND_MSG = "user.not.found"; + public static final String CREATE_USER_ERROR_MSG = "create_user_error_msg"; + public static final String UPDATE_USER_ERROR_MSG = "update_user_error_msg"; + public static final String DELETE_USER_ERROR_MSG = "delete_user_error_msg"; + public static final String GET_USER_SUCCESS_MSG = "get_user_success_msg"; + + public static final String ROLE_CREATED_SUCCESS_MSG = "role.created.success"; + public static final String ROLE_UPDATED_SUCCESS_MSG = "role.updated.success"; + public static final String ROLE_DELETED_SUCCESS_MSG = "role.deleted.success"; + public static final String ROLE_FETCH_SUCCESS_MSG = "role.fetch.success"; + public static final String ROLE_NOT_FOUND = "role.not.found"; + + + public static final String REGION_CREATED_SUCCESS_MSG = "region.created.success"; + public static final String REGION_UPDATED_SUCCESS_MSG = "region.updated.success"; + public static final String GET_REGION_SUCCESS_MSG = "get.region.success"; + public static final String DELETE_REGION_SUCCESS_MSG = "delete.region.success"; + public static final String REGION_NOT_FOUND_MSG = "user.region.not.found"; + public static final String PASSWORD_DOESNT_MATCH ="password.doesnt.match"; +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java new file mode 100644 index 00000000..27f7f250 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java @@ -0,0 +1,109 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.model.request.RegionReq; +import net.gepafin.tendermanagement.model.request.RoleReq; +import net.gepafin.tendermanagement.model.response.RegionResponseBean; +import net.gepafin.tendermanagement.model.request.UpdateRegionReq; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; +import net.gepafin.tendermanagement.repositories.RegionRepository; +import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; + +@Repository +public class RegionDao { + @Autowired + private RegionRepository regionRepository; + + public RegionResponseBean createRegion(RegionReq regionReq) { + RegionEntity regionEntity = convertRegionRequestToRegionEntity(regionReq); + regionRepository.save(regionEntity); + return convertRegionEntityToRegionResponse(regionEntity); + } + private RegionEntity convertRegionRequestToRegionEntity(RegionReq regionReq) { + RegionEntity regionEntity = new RegionEntity(); + regionEntity.setCountry(regionReq.getCountry()); + regionEntity.setDescription(regionReq.getDescription()); + regionEntity.setGdp(regionReq.getGdp()); + regionEntity.setRegionName(regionReq.getRegionName()); + regionEntity.setAreaSize(regionReq.getAreaSize()); + regionEntity.setPopulation(regionReq.getPopulation()); + regionEntity.setEnvironmentalScore(regionReq.getEnvironmentalScore()); + regionEntity.setStatus(regionReq.getStatus()); + regionEntity.setHealthcareAccess(regionReq.getHealthcareAccess()); + regionEntity.setInfrastructureScore(regionReq.getInfrastructureScore()); + regionEntity.setPriorityArea(regionReq.getPriorityArea()); + regionEntity.setUnemploymentRate(regionReq.getUnemploymentRate()); + regionEntity.setEducationLevel(regionReq.getEducationLevel()); + return regionEntity; + } + private RegionResponseBean convertRegionEntityToRegionResponse(RegionEntity regionEntity) { + RegionResponseBean regionResponseBean = new RegionResponseBean(); + regionResponseBean.setId(regionEntity.getId()); + regionResponseBean.setCreatedDate(regionEntity.getCreatedDate()); + regionResponseBean.setUpdatedDate(regionEntity.getUpdatedDate()); + regionResponseBean.setCountry(regionEntity.getCountry()); + regionResponseBean.setDescription(regionEntity.getDescription()); + regionResponseBean.setGdp(regionEntity.getGdp()); + regionResponseBean.setRegionName(regionEntity.getRegionName()); + regionResponseBean.setAreaSize(regionEntity.getAreaSize()); + regionResponseBean.setPopulation(regionEntity.getPopulation()); + regionResponseBean.setEnvironmentalScore(regionEntity.getEnvironmentalScore()); + regionResponseBean.setStatus(regionEntity.getStatus()); + regionResponseBean.setHealthcareAccess(regionEntity.getHealthcareAccess()); + regionResponseBean.setInfrastructureScore(regionEntity.getInfrastructureScore()); + regionResponseBean.setPriorityArea(regionEntity.getPriorityArea()); + regionResponseBean.setUnemploymentRate(regionEntity.getUnemploymentRate()); + regionResponseBean.setEducationLevel(regionEntity.getEducationLevel()); + return regionResponseBean; + } + + public RegionResponseBean updateRegion(Long id, RegionReq regionReq) { + RegionEntity existingRegion = getRegionById(id); + setIfUpdated(existingRegion::getRegionName, existingRegion::setRegionName, regionReq.getRegionName()); + setIfUpdated(existingRegion::getDescription, existingRegion::setDescription, regionReq.getDescription()); + setIfUpdated(existingRegion::getCountry, existingRegion::setCountry, regionReq.getCountry()); + setIfUpdated(existingRegion::getStatus, existingRegion::setStatus, regionReq.getStatus()); + setIfUpdated(existingRegion::getPriorityArea, existingRegion::setPriorityArea, regionReq.getPriorityArea()); + setIfUpdated(existingRegion::getPopulation, existingRegion::setPopulation, regionReq.getPopulation()); + setIfUpdated(existingRegion::getAreaSize, existingRegion::setAreaSize, regionReq.getAreaSize()); + setIfUpdated(existingRegion::getGdp, existingRegion::setGdp, regionReq.getGdp()); + setIfUpdated(existingRegion::getUnemploymentRate, existingRegion::setUnemploymentRate, regionReq.getUnemploymentRate()); + setIfUpdated(existingRegion::getInfrastructureScore, existingRegion::setInfrastructureScore, regionReq.getInfrastructureScore() ); + setIfUpdated(existingRegion::getEducationLevel, existingRegion::setEducationLevel, regionReq.getEducationLevel()); + setIfUpdated(existingRegion::getHealthcareAccess, existingRegion::setHealthcareAccess, regionReq.getHealthcareAccess()); + setIfUpdated(existingRegion::getEnvironmentalScore, existingRegion::setEnvironmentalScore, regionReq.getEnvironmentalScore()); + regionRepository.save(existingRegion); + return Utils.convertObject(existingRegion, RegionResponseBean.class); + } + public RegionEntity getRegionById(Long id) { + return regionRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); + } + public void deleteById(Long id) { + + regionRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); + regionRepository.deleteById(id); + } + public List getAllRegions() + { + return regionRepository.findAll() + .stream() + .map(regionEntity -> Utils.convertObject(regionEntity, RegionResponseBean.class)) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java new file mode 100644 index 00000000..08c1a40f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -0,0 +1,80 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.model.request.RoleReq; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; +import net.gepafin.tendermanagement.repositories.RoleRepository; +import net.gepafin.tendermanagement.service.RegionService; +import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; + +@Component +public class RoleDao { + + @Autowired + private RoleRepository roleRepository; + @Autowired + private RegionService regionService; + + public RoleResponseBean createRole(RoleReq roleReq) { + RoleEntity roleEntity = convertRoleRequestToRoleEntity(roleReq); + roleEntity = roleRepository.save(roleEntity); + return convertRoleEntityToRoleResponse(roleEntity); + } + private RoleEntity convertRoleRequestToRoleEntity(RoleReq roleReq) { + RoleEntity roleEntity = new RoleEntity(); + roleEntity.setRoleName(roleReq.getRoleName()); + roleEntity.setPermissions(roleReq.getPermissions()); + roleEntity.setDescription(roleEntity.getDescription()); + roleEntity.setRegion(regionService.getRegionById(roleReq.getRegionId())); + return roleEntity; + } + private RoleResponseBean convertRoleEntityToRoleResponse(RoleEntity roleEntity) { + RoleResponseBean roleResponseBean=new RoleResponseBean(); + roleResponseBean.setId(roleEntity.getId()); + roleResponseBean.setCreatedDate(roleEntity.getCreatedDate()); + roleResponseBean.setUpdatedDate(roleEntity.getUpdatedDate()); + roleResponseBean.setRoleName(roleEntity.getRoleName()); + roleResponseBean.setDescription(roleEntity.getDescription()); + roleResponseBean.setPermissions(roleEntity.getPermissions()); + roleResponseBean.setRegion(roleEntity.getRegion()); + return roleResponseBean; + } + public RoleResponseBean updateRole(Long id, RoleReq roleReq) { + + RoleEntity existingUserRole = getRoleById(id); + setIfUpdated(existingUserRole::getRoleName, existingUserRole::setRoleName, roleReq.getRoleName()); + setIfUpdated(existingUserRole::getDescription, existingUserRole::setDescription, roleReq.getDescription()); + setIfUpdated(existingUserRole::getPermissions, existingUserRole::setPermissions, roleReq.getPermissions()); + roleRepository.save(existingUserRole); + return Utils.convertObject(existingUserRole, RoleResponseBean.class); + } + + public RoleEntity getRoleById(Long id) { + return roleRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ROLE_NOT_FOUND))); + } + + public void deleteById(Long id) { + roleRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ROLE_NOT_FOUND))); + roleRepository.deleteById(id); + } + + public List getAllRoles() { + return roleRepository.findAll() + .stream() + .map(roleEntity -> Utils.convertObject(roleEntity, RoleResponseBean.class)) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java new file mode 100644 index 00000000..63a7c353 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -0,0 +1,99 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.UpdateUserReq; +import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.service.RoleService; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; + +@Repository +public class UserDao { + @Autowired + private UserRepository userRepository; + + @Autowired + private RoleService roleService; + + public UserResponseBean createUser(UserReq userReq) { + if (!userReq.getPassword().equals(userReq.getConfPassword())) { + throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); + } + UserEntity userEntity = convertUserRequestToUserEntity(userReq); + userEntity = userRepository.save(userEntity); + return convertUserEntityToUserResponse(userEntity); + } + + public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { + UserEntity userEntity = userRepository.findById(userId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); + setIfUpdated(userEntity::getStatus, userEntity::setStatus, userReq.getStatus()); + setIfUpdated(userEntity::getFirstName, userEntity::setFirstName, userReq.getFirstName()); + setIfUpdated(userEntity::getLastName, userEntity::setLastName, userReq.getLastName()); + setIfUpdated(userEntity::getOrganization, userEntity::setOrganization, userReq.getOrganization()); + setIfUpdated(userEntity::getAddress, userEntity::setAddress, userReq.getAddress()); + setIfUpdated(userEntity::getPhoneNumber, userEntity::setPhoneNumber, userReq.getPhoneNumber()); + if (userReq.getRoleId() != null) { + RoleEntity roleEntity = roleService.getRoleById(userReq.getRoleId()); + setIfUpdated(userEntity::getRoleEntity, userEntity::setRoleEntity, roleEntity); + } + userEntity = userRepository.save(userEntity); + return convertUserEntityToUserResponse(userEntity); + } + + private UserEntity convertUserRequestToUserEntity(UserReq userReq) { + UserEntity userEntity = new UserEntity(); + userEntity.setPassword(userReq.getPassword()); + userEntity.setEmail(userReq.getEmail()); + userEntity.setFirstName(userReq.getFirstName()); + userEntity.setStatus(userReq.getStatus()); + userEntity.setLastName(userReq.getLastName()); + userEntity.setOrganization(userReq.getOrganization()); + userEntity.setAddress(userReq.getAddress()); + userEntity.setPhoneNumber(userReq.getPhoneNumber()); + userEntity.setRoleEntity(roleService.getRoleById(userReq.getRoleId())); + return userEntity; + } + + private UserResponseBean convertUserEntityToUserResponse(UserEntity userEntity) { + UserResponseBean userResponseBean = new UserResponseBean(); + userResponseBean.setId(userEntity.getId()); + userResponseBean.setCreatedDate(userEntity.getCreatedDate()); + userResponseBean.setUpdatedDate(userEntity.getUpdatedDate()); + userResponseBean.setId(userEntity.getId()); + userResponseBean.setEmail(userEntity.getEmail()); + userResponseBean.setFirstName(userEntity.getFirstName()); + userResponseBean.setLastName(userEntity.getLastName()); + userResponseBean.setPhoneNumber(userEntity.getPhoneNumber()); + userResponseBean.setOrganization(userEntity.getOrganization()); + userResponseBean.setAddress(userEntity.getAddress()); + userResponseBean.setCity(userEntity.getCity()); + userResponseBean.setCountry(userEntity.getCountry()); + userResponseBean.setStatus(userEntity.getStatus()); + userResponseBean.setRole(userEntity.getRoleEntity()); + userResponseBean.setLastLogin(userEntity.getLastLogin()); + return userResponseBean; + } + + public UserResponseBean getUserById(Long id) { + UserEntity userEntity = userRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + return convertUserEntityToUserResponse(userEntity); + } + + public void deleteUser(Long id) { + userRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + userRepository.deleteById(id); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BaseEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BaseEntity.java new file mode 100644 index 00000000..f8427719 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/BaseEntity.java @@ -0,0 +1,35 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; +import net.gepafin.tendermanagement.util.DateTimeUtil; + + +import java.time.LocalDateTime; + +@MappedSuperclass +@Data +public class BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID", unique = true) + private Long id; + + + @Column(name = "CREATED_DATE", updatable = false) + LocalDateTime createdDate; + + @Column(name = "UPDATED_DATE") + LocalDateTime updatedDate; + + @PrePersist + public void setCreatedDate() { + this.createdDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); + this.updatedDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); + } + @PreUpdate + public void setUpdatedDate() { + this.updatedDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/RegionEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/RegionEntity.java new file mode 100644 index 00000000..d9687dd1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/RegionEntity.java @@ -0,0 +1,60 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +import lombok.Getter; +import lombok.Setter; +import net.gepafin.tendermanagement.entities.BaseEntity; + +import java.math.BigDecimal; + +@Entity +@Table(name = "\"REGION\"") +@Getter +@Setter +public class RegionEntity extends BaseEntity { + + @Column(name = "REGION_NAME", length = 255, nullable = true) + private String regionName; + + @Column(name = "DESCRIPTION", length = 255, nullable = true) + private String description; + + @Column(name = "COUNTRY", length = 50, nullable = true) + private String country; + + @Column(name = "STATUS", length = 30, nullable = true) + private String status; + + @Column(name = "PRIORITY_AREA", length = 255, nullable = true) + private String priorityArea; + + @Column(name = "POPULATION", nullable = true) + private Long population; + + @Column(name = "AREA_SIZE", nullable = true) + private BigDecimal areaSize; + + @Column(name = "GDP", nullable = true) + private BigDecimal gdp; + + @Column(name = "UNEMPLOYMENT_RATE", nullable = true) + private BigDecimal unemploymentRate; + + @Column(name = "INFRASTRUCTURE_SCORE", nullable = true) + private BigDecimal infrastructureScore; + + @Column(name = "EDUCATION_LEVEL", nullable = true) + private BigDecimal educationLevel; + + @Column(name = "HEALTHCARE_ACCESS", nullable = true) + private BigDecimal healthcareAccess; + + @Column(name = "ENVIRONMENTAL_SCORE", nullable = true) + private BigDecimal environmentalScore; +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java new file mode 100644 index 00000000..25693802 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java @@ -0,0 +1,26 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; + +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "\"ROLE\"") +@Getter +@Setter +public class RoleEntity extends BaseEntity { + + @Column(name = "ROLE_NAME", length = 50, nullable = true) + private String roleName; + + @Column(name = "DESCRIPTION", length = 255, nullable = true) + private String description; + + @Column(name = "PERMISSIONS", length = 255, nullable = true) + private String permissions; + @ManyToOne + @JoinColumn(name = "REGION_ID", nullable = true) + private RegionEntity region; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java new file mode 100644 index 00000000..890fdc32 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -0,0 +1,77 @@ +package net.gepafin.tendermanagement.entities; + +import com.fasterxml.jackson.annotation.JsonValue; +import jakarta.persistence.*; +import jakarta.validation.constraints.Email; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import lombok.Getter; +import lombok.Setter; +import net.gepafin.tendermanagement.entities.BaseEntity; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "\"USER\"") +@Getter +@Setter +public class UserEntity extends BaseEntity { + + @Column(name = "PASSWORD", columnDefinition = "TEXT",nullable = false) + @JsonIgnore + private String password; + + @Email + @Column(name = "EMAIL", length = 255, unique = true, nullable = false) + private String email; + + @ManyToOne + @JoinColumn(name = "ROLE_ID") + @JsonIgnore + private RoleEntity roleEntity; + + + @Column(name = "LAST_LOGIN") + private LocalDateTime lastLogin; + + @Column(name = "STATUS", length = 30, nullable = true) + private String status; + + @Column(name = "FIRST_NAME", length = 50, nullable = true) + private String firstName; + + @Column(name = "LAST_NAME", length = 50, nullable = true) + private String lastName; + + @Column(name = "PHONE_NUMBER", length = 15, nullable = true) + private String phoneNumber; + + @Column(name = "ORGANIZATION", length = 255, nullable = true) + private String organization; + + @Column(name = "ADDRESS", length = 255, nullable = true) + private String address; + + @Column(name = "CITY", length = 50, nullable = true) + private String city; + + @Column(name = "COUNTRY", length = 50, nullable = true) + private String country; + + public enum UserStatusEnum { + ACTIVE("ACTIVE"), + INACTIVE("INACTIVE"); + + private String value; + + UserStatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/User.java b/src/main/java/net/gepafin/tendermanagement/model/User.java deleted file mode 100644 index 8b3fe662..00000000 --- a/src/main/java/net/gepafin/tendermanagement/model/User.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.gepafin.tendermanagement.model; - -public class User { - private Long id; - private String name; - private String email; - - public User() {} - - public User(Long id, String name, String email) { - this.id = id; - this.name = name; - this.email = email; - } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } -} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java new file mode 100644 index 00000000..fae42f3c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java @@ -0,0 +1,39 @@ +package net.gepafin.tendermanagement.model.request; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; + +@Getter +@Setter +public class RegionReq { + + private String regionName; + + private String description; + + private String country; + + private String status; + + private String priorityArea; + + private Long population; + + private BigDecimal areaSize; + + private BigDecimal gdp; + + private BigDecimal unemploymentRate; + + private BigDecimal infrastructureScore; + + private BigDecimal educationLevel; + + private BigDecimal healthcareAccess; + + private BigDecimal environmentalScore; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java new file mode 100644 index 00000000..1e4ec6f4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java @@ -0,0 +1,27 @@ +package net.gepafin.tendermanagement.model.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RoleReq { + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Long id; + + private String roleName; + + private String description; + + private String permissions; + + private String status; + + private Long regionId; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateRegionReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateRegionReq.java new file mode 100644 index 00000000..8d32dc83 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateRegionReq.java @@ -0,0 +1,35 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UpdateRegionReq { + private String regionName; + + private String description; + + private String country; + + private String status; + + private String priorityArea; + + private Long population; + + private Double areaSize; + + private Double gdp; + + private Double unemploymentRate; + + private Double infrastructureScore; + + private Double educationLevel; + + private Double healthcareAccess; + + private Double environmentalScore; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java new file mode 100644 index 00000000..63eb2b89 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.model.request; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UpdateUserReq { + + private String firstName; + private String lastName; + private String phoneNumber; + private Long roleId; + private String organization; + private String address; + private String city; + private String status; + private String country; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java new file mode 100644 index 00000000..f866ac99 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -0,0 +1,44 @@ +package net.gepafin.tendermanagement.model.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +public class UserReq { + + + private String password; + + private String confPassword; + + private String email; + + private String firstName; + + private String lastName; + + private String phoneNumber; + + private Long roleId; + + private String organization; + + private String address; + + private String city; + + private String country; + + private String status; + + private LocalDateTime lastLogin; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java new file mode 100644 index 00000000..c16d4c94 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Getter +@Setter +public class RegionResponseBean { + private Long id; + private String regionName; + private String description; + private String country; + private String status; + private String priorityArea; + private Long population; + private BigDecimal areaSize; + private BigDecimal gdp; + private BigDecimal unemploymentRate; + private BigDecimal infrastructureScore; + private BigDecimal educationLevel; + private BigDecimal healthcareAccess; + private BigDecimal environmentalScore; + private LocalDateTime createdDate; + private LocalDateTime updatedDate; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java new file mode 100644 index 00000000..1e708b58 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import net.gepafin.tendermanagement.entities.RegionEntity; + +import java.time.LocalDateTime; + +@Data +public class RoleResponseBean { + private Long id; + private String roleName; + private String description; + private LocalDateTime createdDate; + private LocalDateTime updatedDate; + private String permissions; + private RegionEntity region; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java new file mode 100644 index 00000000..2c036804 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java @@ -0,0 +1,41 @@ +package net.gepafin.tendermanagement.model.response; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import net.gepafin.tendermanagement.entities.RoleEntity; + +import java.time.LocalDateTime; + +@Getter +@Setter +public class UserResponseBean { + private Long id; + private String email; + + private String firstName; + + private String lastName; + + private String phoneNumber; + + private RoleEntity role; + + private String organization; + + private String address; + + private String city; + + private String country; + + private String status; + + private LocalDateTime lastLogin; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/util/Response.java b/src/main/java/net/gepafin/tendermanagement/model/util/Response.java new file mode 100644 index 00000000..7d0c768d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/util/Response.java @@ -0,0 +1,29 @@ +package net.gepafin.tendermanagement.model.util; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +import java.io.Serializable; + +/** + * A generic response class used for API responses. + * + * @param the type of the response data + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class Response implements Serializable { + + private static final long serialVersionUID = 1L; + + private T data; // The response data + private Status status; // The status of the response + private String message; // Additional message or error description +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/RegionRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/RegionRepository.java new file mode 100644 index 00000000..87dfdfa0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/RegionRepository.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.RegionEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface RegionRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java new file mode 100644 index 00000000..e009e6a3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.RoleEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface RoleRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java new file mode 100644 index 00000000..2fdee718 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.UserEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/RegionService.java b/src/main/java/net/gepafin/tendermanagement/service/RegionService.java new file mode 100644 index 00000000..2288fa17 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/RegionService.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.model.request.RegionReq; +import net.gepafin.tendermanagement.model.response.RegionResponseBean; +import net.gepafin.tendermanagement.model.request.UpdateRegionReq; + +import java.util.List; + + +public interface RegionService { + + RegionResponseBean createRegion(RegionReq regionReq); + + RegionResponseBean updateRegion(Long regionId, RegionReq regionReq); + + RegionEntity getRegionById(Long regionId); + + void deleteRegion(Long regionId); + + List getAllRegions(); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/RoleService.java b/src/main/java/net/gepafin/tendermanagement/service/RoleService.java new file mode 100644 index 00000000..448197b4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/RoleService.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.model.request.RoleReq; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; + +import java.util.List; + +public interface RoleService { + RoleResponseBean createRole(RoleReq roleReq); + + RoleResponseBean updateRole(Long roleId, RoleReq roleReq); + + RoleEntity getRoleById(Long roleId); + + void deleteRole(Long roleId); + + List getAllRoles(); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java new file mode 100644 index 00000000..71faf129 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.model.request.UpdateUserReq; +import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.model.response.UserResponseBean; + +public interface UserService { + UserResponseBean createUser(UserReq userReq); + UserResponseBean updateUser(Long userId, UpdateUserReq userReq); + UserResponseBean getUserById(Long userId); + void deleteUser(Long userId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java new file mode 100644 index 00000000..63921ef1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java @@ -0,0 +1,43 @@ +package net.gepafin.tendermanagement.service.impl; + +import java.util.List; + +import net.gepafin.tendermanagement.dao.RegionDao; +import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.model.request.RegionReq; +import net.gepafin.tendermanagement.model.response.RegionResponseBean; +import net.gepafin.tendermanagement.model.request.UpdateRegionReq; +import net.gepafin.tendermanagement.service.RegionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +@Service +public class RegionServiceImpl implements RegionService { + + @Autowired + private RegionDao regionDao; + + @Override + public RegionResponseBean createRegion(RegionReq regionReq) { + return regionDao.createRegion(regionReq); + } + + @Override + public RegionResponseBean updateRegion(Long regionId, RegionReq regionReq) { + return regionDao.updateRegion(regionId,regionReq); + } + + @Override + public RegionEntity getRegionById(Long regionId) { + return regionDao.getRegionById(regionId); + } + + @Override + public void deleteRegion(Long regionId) { + regionDao.deleteById(regionId); + } + + @Override + public List getAllRegions() { + return regionDao.getAllRegions(); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java new file mode 100644 index 00000000..41f3f6ba --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java @@ -0,0 +1,44 @@ +package net.gepafin.tendermanagement.service.impl; + +import java.util.List; + +import net.gepafin.tendermanagement.dao.RoleDao; +import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.model.request.RoleReq; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; +import net.gepafin.tendermanagement.service.RoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +@Service +public class RoleServiceImpl implements RoleService { + + @Autowired + private RoleDao roleDao; + + @Override + public RoleResponseBean createRole(RoleReq roleReq) { + return roleDao.createRole(roleReq); + } + @Override + public RoleResponseBean updateRole(Long roleId, RoleReq roleReq) { + return roleDao.updateRole(roleId,roleReq); + } + + @Override + public RoleEntity getRoleById(Long roleId) { + return roleDao.getRoleById(roleId); + } + + @Override + public void deleteRole(Long roleId) { + roleDao.deleteById(roleId); + } + + @Override + public List getAllRoles() { + return roleDao.getAllRoles(); + + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java new file mode 100644 index 00000000..4d39ffc5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -0,0 +1,38 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.dao.UserDao; +import net.gepafin.tendermanagement.model.request.UpdateUserReq; +import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.format.DateTimeFormatter; + +@Service +public class UserServiceImpl implements UserService { + + @Autowired + private UserDao userDao; + public UserResponseBean createUser(UserReq userReq) { + return userDao.createUser(userReq); + } + + + @Override + public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { + return userDao.updateUser(userId, userReq); + } + + @Override + public UserResponseBean getUserById(Long userId) { + return userDao.getUserById(userId); + } + + @Override + public void deleteUser(Long userId) { + userDao.deleteUser(userId); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java new file mode 100644 index 00000000..ab67ccdd --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java @@ -0,0 +1,53 @@ +package net.gepafin.tendermanagement.util; + +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Calendar; +import java.util.Date; + +@Component +public class DateTimeUtil { + + + public static LocalDateTime DateServerToUTC(LocalDateTime systemDate) { + + ZonedDateTime ldtZoned = systemDate.atZone(ZoneId.systemDefault()); + LocalDateTime localDatetime = ldtZoned.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime(); + return localDatetime; + } + + public static LocalDateTime getPreviousMonthDate(int month) { + Calendar c = Calendar.getInstance(); + c.add(Calendar.MONTH, -month); + LocalDateTime conv = LocalDateTime.ofInstant(c.getTime().toInstant(), ZoneId.systemDefault()); + return conv; + } + + public static Date getDateWithoutTime(LocalDateTime systemDate) { + ZonedDateTime zdt = systemDate.atZone(ZoneId.systemDefault()); + Date date = Date.from(zdt.toInstant()); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + + public static LocalDateTime convertDateToLocalDateTime(Date date) { + LocalDateTime ldt = LocalDateTime.ofInstant(date.toInstant(), + ZoneId.systemDefault()); + return ldt; + } + + + public static Date convertLocalDateTimeToDateUsingInstant(LocalDateTime localDateTime) { + return Date + .from(localDateTime.atZone(ZoneId.systemDefault()) + .toInstant()); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/ObjectUtils.java b/src/main/java/net/gepafin/tendermanagement/util/ObjectUtils.java new file mode 100644 index 00000000..1f7d1215 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/ObjectUtils.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.util; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class ObjectUtils { + + public static void setIfNotNull(Consumer setter, T value) { + if (value != null) { + setter.accept(value); + } + } + public static void setIfUpdated(Supplier getter, Consumer setter, T newValue) { + T currentValue = getter.get(); + if (newValue != null && !newValue.equals(currentValue)) { + setter.accept(newValue); + } + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java new file mode 100644 index 00000000..aa1fe35b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -0,0 +1,49 @@ +package net.gepafin.tendermanagement.util; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.stream.Collectors; + +public class Utils { + + public static final Logger log = LoggerFactory.getLogger(Utils.class); + + private static final ObjectMapper mapper = new ObjectMapper() + .registerModule(new JavaTimeModule()) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + + public static U convertObject(T source, Class destinationClass) { + try { + return mapper.convertValue(source, destinationClass); + } catch (Exception e) { + log.error("Error converting object: " + e.getMessage(), e); + } + return null; + } + + public static List convertSourceListToDestinationList(List sourceList, Class destinationClass) { + try { + return sourceList.stream() + .map(source -> mapper.convertValue(source, destinationClass)) + .collect(Collectors.toList()); + } catch (Exception e) { + log.error("Error converting list: " + e.getMessage(), e); + } + return null; + } + + public static List convertSourceToList(T source, Class destinationClass) { + try { + // Convert single source object to a single-element list of destination type + return List.of(mapper.convertValue(source, destinationClass)); + } catch (Exception e) { + log.error("Error converting single object to list: " + e.getMessage(), e); + } + return null; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java new file mode 100644 index 00000000..3c9237a6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java @@ -0,0 +1,91 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.model.request.RegionReq; +import net.gepafin.tendermanagement.model.response.RegionResponseBean; +import net.gepafin.tendermanagement.model.request.UpdateRegionReq; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.Parameter; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Validated +@RequestMapping("/region") +public interface RegionApi { + + @Operation(summary = "Api to create region", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PostMapping(value = "",produces = "application/json") + ResponseEntity> createRegion( + @Parameter(description = "Region request object", required = true) @Valid @RequestBody RegionReq regionReq); + + @Operation(summary = "Api to update region", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PutMapping(value = "/{regionId}", produces = "application/json") + ResponseEntity> updateRegion( + @Parameter(description = "The region id", required = true) @PathVariable("regionId") Long regionId, + @Parameter(description = "Region request object", required = true) @Valid @RequestBody RegionReq regionReq); + + @Operation(summary = "Api to get a region by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/{regionId}", produces = "application/json") + ResponseEntity> getRegionById( + @Parameter(description = "The region id", required = true) @PathVariable("regionId") Long regionId); + + @Operation(summary = "Api to get all regions", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "", + produces = { "application/json" }) + ResponseEntity>> getAllRegions(); + @Operation(summary = "Api to delete region", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @DeleteMapping(value = "/{regionId}") + ResponseEntity> deleteRegion( + @Parameter(description = "The region id", required = true) @PathVariable("regionId") Long regionId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java new file mode 100644 index 00000000..2f94be9e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java @@ -0,0 +1,93 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.model.request.RoleReq; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.Parameter; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Validated +public interface RoleApi { + + @Operation(summary = "API to create role", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PostMapping(value = "", + produces = { "application/json" }) + ResponseEntity> createRole( + @Parameter(description = " Role request object", required = true) @Valid @RequestBody RoleReq roleReq); + + + @Operation(summary = "API to update role", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PutMapping(value = "/{roleId}", + produces = { "application/json" }) + ResponseEntity> updateRole( + @Parameter(description = "The role ID", required = true) @PathVariable("roleId") Long roleId, + @Parameter(description = "Role request object", required = true) @Valid @RequestBody RoleReq roleReq); + + @Operation(summary = "API to get role by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/{roleId}", + produces = { "application/json" }) + ResponseEntity> getRoleById( + @Parameter(description = "The role ID", required = true) @PathVariable("roleId") Long roleId); + + @Operation(summary = "API to get all roles", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "", + produces = { "application/json" }) + ResponseEntity>> getAllRoles(); + + @Operation(summary = "API to delete role", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @DeleteMapping(value = "/{roleId}") + ResponseEntity> deleteRole( + @Parameter(description = "The role ID", required = true) @PathVariable("roleId") Long roleId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index e1e0f29a..3c9eadc6 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -1,8 +1,94 @@ package net.gepafin.tendermanagement.web.rest.api; -import net.gepafin.tendermanagement.model.User; -import org.springframework.web.bind.annotation.GetMapping; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.UpdateUserReq; +import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Validated +//@RequestMapping("/user") public interface UserApi { - @GetMapping("") - User getUser(); + + @Operation(summary = "Api to create user", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @RequestMapping(value = "", + produces = { "application/json" }, + method = RequestMethod.POST) + default ResponseEntity> createUser( + @Parameter(description = "User request object", required = true) @Valid @RequestBody UserReq userReq) { + return new ResponseEntity>(HttpStatus.NOT_IMPLEMENTED); + } + + @Operation(summary = "Api to update user", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @RequestMapping(value = "/{userId}", + produces = { "application/json" }, + method = RequestMethod.PUT) + default ResponseEntity> updateUser( + @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, + @Parameter(description = "User request object", required = true) @Valid @RequestBody UpdateUserReq userReq) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + @Operation(summary = "Api to get user by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @RequestMapping(value = "/{userId}", + produces = { "application/json" }, + method = RequestMethod.GET) + default ResponseEntity> getUserById( + @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + @Operation(summary = "Api to delete user", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @RequestMapping(value = "/{userId}", + method = RequestMethod.DELETE) + default ResponseEntity> deleteUser( + @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/CustomValidationException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/CustomValidationException.java new file mode 100644 index 00000000..197a4e2b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/CustomValidationException.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +public class CustomValidationException extends RuntimeException { + + private final Status status; + private static final long serialVersionUID = 1L; + + public Status getStatus() { + return status; + } + + public CustomValidationException(Status status, String message) { + super(message); + this.status = status; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ErrorConstants.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ErrorConstants.java new file mode 100644 index 00000000..d48defba --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ErrorConstants.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import java.net.URI; + +public final class ErrorConstants { + + public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; + public static final String ERR_VALIDATION = "error.validation"; + public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; + public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); + public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); + public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password"); + public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used"); + public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used"); + + public static final String BADREQUEST_ERROR_EXAMPLE="{\"data\": null," + +"\"status\": \"VALIDATION_ERROR\",\"message\": \"string\"" + + "}"; + public static final String NOTFOUND_ERROR_EXAMPLE="{\"data\": null," + +"\"status\": \"NOT_FOUND\",\"message\": \"string\"" + + "}"; + public static final String UNAUTHORIZED_ERROR_EXAMPLE="{\"data\": null," + +"\"status\": \"UNAUTHORIZED\",\"message\": \"string\"" + + "}"; + + private ErrorConstants() { + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ResourceNotFoundException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ResourceNotFoundException.java new file mode 100644 index 00000000..bdc1bcc0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ResourceNotFoundException.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.NOT_FOUND) +public class ResourceNotFoundException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = 1L; +private final Status status; + + public ResourceNotFoundException(Status status, String message) { + super(message); + this.status = status; + } + + public Status getStatus() { + return status; + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/Status.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/Status.java new file mode 100644 index 00000000..dc713f3e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/Status.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +public enum Status { + SUCCESS("1"), VALIDATION_ERROR("2"), EXCEPTION_ERROR("3") , NOT_FOUND("4") , BAD_REQUEST("5") , UNAUTHORIZED("6") , + FORBIDDEN("7"), VALIDATION_COMPLETED("8"); + + private String action; + + public String getAction() { + return this.action; + } + + private Status(String action) { + this.action = action; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java new file mode 100644 index 00000000..e7387562 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java @@ -0,0 +1,79 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.model.request.RegionReq; +import net.gepafin.tendermanagement.model.response.RegionResponseBean; +import net.gepafin.tendermanagement.model.request.UpdateRegionReq; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.RegionService; +import net.gepafin.tendermanagement.web.rest.api.RegionApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/region}") +public class RegionApiController implements RegionApi { + + private final Logger log = LoggerFactory.getLogger(RegionApiController.class); + + @Autowired + private RegionService regionService; + + @Override + public ResponseEntity> createRegion( + @Valid @RequestBody RegionReq regionReq) { + log.info("Create Region - Request Body: {}", regionReq); + RegionResponseBean createdRegion = regionService.createRegion(regionReq); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createdRegion, Status.SUCCESS, Translator.toLocale(GepafinConstant.REGION_CREATED_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> updateRegion( + @PathVariable("regionId") Long regionId, + @Valid @RequestBody RegionReq regionReq) { + log.info("Update Region - Region ID: {}, Request Body: {}", regionId, regionReq); + RegionResponseBean updatedRegion = regionService.updateRegion(regionId, regionReq); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(updatedRegion, Status.SUCCESS, Translator.toLocale(GepafinConstant.REGION_UPDATED_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> getRegionById( + @PathVariable("regionId") Long regionId) { + log.info("Get Region by ID - Region ID: {}", regionId); + RegionEntity region = regionService.getRegionById(regionId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(region, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_REGION_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> deleteRegion( + @PathVariable("regionId") Long regionId) { + log.info("Delete Region - Region ID: {}", regionId); + regionService.deleteRegion(regionId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_REGION_SUCCESS_MSG))); + } + @Override + public ResponseEntity>> getAllRegions() { + List regions = regionService.getAllRegions(); + log.info("Get All Region"); + regionService.getAllRegions(); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(regions, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_REGION_SUCCESS_MSG))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java new file mode 100644 index 00000000..a720bf3c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java @@ -0,0 +1,75 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import java.util.List; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.model.request.RoleReq; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.RoleService; +import net.gepafin.tendermanagement.web.rest.api.RoleApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/role}") +public class RoleApiController implements RoleApi { + + private static final Logger log = LoggerFactory.getLogger(RoleApiController.class); + + @Autowired + private RoleService roleService; + @Override + public ResponseEntity> createRole(RoleReq body) { + log.info("Create Role - Request Body: {}", body); + RoleResponseBean roleReq = roleService.createRole(body); + + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(roleReq, Status.SUCCESS, Translator.toLocale(GepafinConstant.ROLE_CREATED_SUCCESS_MSG))); + + } + + @Override + public ResponseEntity> updateRole(Long roleId, RoleReq body) { + log.info("Update Role - Role ID: {}, Request Body: {}", roleId, body); + RoleResponseBean updatedUserRole = roleService.updateRole(roleId, body); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(updatedUserRole, Status.SUCCESS, Translator.toLocale(GepafinConstant.ROLE_UPDATED_SUCCESS_MSG))); + } + + @Override + public ResponseEntity>> getAllRoles() { + log.info("Get All Roles"); + List roles = roleService.getAllRoles(); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(roles, Status.SUCCESS, Translator.toLocale(GepafinConstant.ROLE_FETCH_SUCCESS_MSG))); + + } + + @Override + public ResponseEntity> getRoleById(Long roleId) { + log.info("Get Role by ID - Role ID: {}", roleId); + RoleEntity roleEntity = roleService.getRoleById(roleId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(roleEntity, Status.SUCCESS, Translator.toLocale(GepafinConstant.ROLE_FETCH_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> deleteRole(Long roleId) { + log.info("Delete Role - Role ID: {}", roleId); + roleService.deleteRole(roleId); + + return ResponseEntity.status(HttpStatus.NO_CONTENT) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.ROLE_DELETED_SUCCESS_MSG))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index 4dbd4107..ad169e42 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -1,18 +1,72 @@ package net.gepafin.tendermanagement.web.rest.api.impl; -import net.gepafin.tendermanagement.model.User; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.UpdateUserReq; +import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.web.rest.api.UserApi; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/v1/user") -public class UserApiController implements UserApi -{ +@RequestMapping("${openapi.gepafin.base-path:/v1/user}") +public class UserApiController implements UserApi { + + private final Logger log = LoggerFactory.getLogger(UserApiController.class); + + @Autowired + private UserService userService; @Override - public User getUser() { - return new User(1L, "John Doe", "john.doe@test.test"); + public ResponseEntity> createUser( + @Valid @RequestBody UserReq userReq) { + log.info("Create User with - Request Body: {}", userReq); + UserResponseBean createdUser = userService.createUser(userReq); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createdUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_CREATED_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> updateUser( + @PathVariable("userId") Long userId, + @Valid @RequestBody UpdateUserReq userReq) { + log.info("Update User - User ID: {}, Request Body: {}", userId, userReq); + UserResponseBean updatedUser = userService.updateUser(userId, userReq); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(updatedUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_UPDATED_SUCCESS_MSG))); + + } + + @Override + public ResponseEntity> getUserById( + @PathVariable("userId") Long userId) { + log.info("Get User by ID - User ID: {}", userId); + UserResponseBean user = userService.getUserById(userId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); + + } + + @Override + public ResponseEntity> deleteUser( + @PathVariable("userId") Long userId) { + log.info("Delete User By- User ID: {}", userId); + userService.deleteUser(userId); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_DELETED_SUCCESS_MSG))); + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9aa841e8..9126bd0a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,26 @@ spring.application.name=tendermanagement -server.port=8080 +springdoc.api-docs.path=/v1/api-docs +springdoc.swagger-ui.configUrl=/v1/api-docs +springfox.documentation.swagger-ui.path=/v1/api-docs +springdoc.swagger-ui.disable-swagger-default-url=true +springdoc.swagger-ui.path=/swagger-ui.html +# DataSource Configuration +spring.datasource.url=jdbc:postgresql://localhost:5432/gepafin_local +spring.datasource.username=postgres +spring.datasource.password=root +spring.datasource.driver-class-name=org.postgresql.Driver + +# JPA Configuration +spring.jpa.properties.hibernate.default_schema=gepafin_schema +spring.jpa.hibernate.ddl-auto=none + + +# Liquibase Configuration +spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.xml +spring.liquibase.default-schema=gepafin_schema +spring.liquibase.enabled=true + +# Debugging and SQL Output +logging.level.org.springframework.boot.autoconfigure.liquibase=ERROR +logging.level.liquibase=ERROR \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml new file mode 100644 index 00000000..20506096 --- /dev/null +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.xml b/src/main/resources/db/changelog/db.changelog-master.xml new file mode 100644 index 00000000..f44695c7 --- /dev/null +++ b/src/main/resources/db/changelog/db.changelog-master.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties new file mode 100644 index 00000000..bdbcf92b --- /dev/null +++ b/src/main/resources/message_en.properties @@ -0,0 +1,29 @@ +user.created.success=User created successfully. +user.updated.success=User updated successfully. +user.deleted.success=User deleted successfully. +user.not.found=User not found. +create_user_error_msg=An error occurred while creating the user. +update_user_error_msg=An error occurred while updating the user. +delete_user_error_msg=An error occurred while deleting the user. +get_user_success_msg=User retrieved successfully. +get_user_error_msg=An error occurred while retrieving the user. +# Role-related messages +role.created.success=Role created successfully. +role.updated.success=Role updated successfully. +role.deleted.success=Role deleted successfully. +role.not.found=Role not found. +create.role.error=Error occurred while creating the role. +update.role.error=Error occurred while updating the role. +role.fetch.success=Role fetched successfully. +delete.role.error=Error occurred while deleting the role. + +# Region-related messages +region.created.success=Region created successfully. +region.updated.success=Region updated successfully. +get.region.success=Region fetched successfully. +delete.region.success=Region deleted successfully. +user.region.not.found=Region not found. +create.regiom.error=Error occurred while creating the region. +update.region.error=Error occurred while updating the region. +password.doesnt.match=Password and confirm password do not match. + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties new file mode 100644 index 00000000..bfd0d8f3 --- /dev/null +++ b/src/main/resources/message_it.properties @@ -0,0 +1,28 @@ +user.created.success=Utente creato con successo. +user.updated.success=Utente aggiornato con successo. +user.deleted.success=Utente eliminato con successo. +user.not.found=Utente non trovato. +create_user_error_msg=Si è verificato un errore durante la creazione dell'utente. +update_user_error_msg=Si è verificato un errore durante l'aggiornamento dell'utente. +delete_user_error_msg=Si è verificato un errore durante l'eliminazione dell'utente. +get_user_success_msg=Utente recuperato con successo. +get_user_error_msg=Si è verificato un errore durante il recupero dell'utente. +# Role-related messages +role.created.success=Ruolo creato con successo. +role.updated.success=Ruolo aggiornato con successo. +role.deleted.success=Ruolo eliminato con successo. +role.not.found=Ruolo non trovato. +create.role.error=Errore durante la creazione del ruolo. +update.role.error=Errore durante l'aggiornamento del ruolo. +role.fetch.success=Ruolo recuperato con successo. +delete.role.error=Errore durante l'eliminazione del ruolo. + +# Region-related messages +region.created.success=Regione creata con successo. +region.updated.success=Regione aggiornata con successo. +get.region.success=Regione recuperata con successo. +delete.region.success=Regione eliminata con successo. +user.region.not.found=Regione non trovata. +create.regiom.error=Errore durante la creazione della regione. +update.region.error=Errore durante l'aggiornamento della regione. +password.doesnt.match=La password e la conferma della password non corrispondono. diff --git a/target/classes/application.properties b/target/classes/application.properties deleted file mode 100644 index 9aa841e8..00000000 --- a/target/classes/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -spring.application.name=tendermanagement -server.port=8080 - From 324490da698fc4f19f41f191eadb34e4e2894415 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 14 Aug 2024 15:34:46 +0530 Subject: [PATCH 006/145] Updated code --- .gitignore | 56 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 524f0963..219512a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,42 @@ -# Compiled class file -*.class +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/ +### DS_Store ### +.DS_Store +/bin/ + -# Log file -*.log -# BlueJ files -*.ctxt -# Mobile Tools for Java (J2ME) -.mtj.tmp/ -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -replay_pid* From 7a080504aaf238e4b06c6154966856c8278ce728 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 21 Aug 2024 18:21:20 +0530 Subject: [PATCH 007/145] Security implementation --- pom.xml | 24 ++++ .../config/SecurityConfig.java | 111 ++++++++++++++++++ .../config/jwt/JWTConfigurer.java | 23 ++++ .../config/jwt/JWTFilter.java | 43 +++++++ .../config/jwt/TokenProvider.java | 93 +++++++++++++++ .../constants/GepafinConstant.java | 4 + .../tendermanagement/dao/RegionDao.java | 2 +- .../gepafin/tendermanagement/dao/RoleDao.java | 10 +- .../gepafin/tendermanagement/dao/UserDao.java | 52 ++++++-- .../tendermanagement/model/BaseBean.java | 16 +++ .../model/request/LoginReq.java | 18 +++ .../model/request/UserReq.java | 16 +-- .../model/response/LoginResponse.java | 42 +++++++ .../model/response/RegionResponseBean.java | 6 +- .../model/response/RoleResponseBean.java | 8 +- .../model/response/UserResponseBean.java | 12 +- .../tendermanagement/model/util/JWTToken.java | 26 ++++ .../repositories/UserRepository.java | 2 + .../tendermanagement/service/UserService.java | 7 ++ .../service/impl/AuthenticationService.java | 60 ++++++++++ .../service/impl/RegionServiceImpl.java | 7 ++ .../service/impl/RoleServiceImpl.java | 6 + .../service/impl/UserServiceImpl.java | 17 ++- .../web/rest/api/UserApi.java | 43 ++++--- .../api/errors/GlobalExceptionHandler.java | 23 ++++ .../api/impl/CustomUserDetailsService.java | 55 +++++++++ .../web/rest/api/impl/UserApiController.java | 48 ++++---- src/main/resources/application.properties | 11 +- src/main/resources/message_en.properties | 7 ++ src/main/resources/message_it.properties | 7 ++ 30 files changed, 721 insertions(+), 78 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java create mode 100644 src/main/java/net/gepafin/tendermanagement/config/jwt/JWTConfigurer.java create mode 100644 src/main/java/net/gepafin/tendermanagement/config/jwt/JWTFilter.java create mode 100644 src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/BaseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/LoginReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java diff --git a/pom.xml b/pom.xml index 1572627b..d2022b37 100644 --- a/pom.xml +++ b/pom.xml @@ -80,6 +80,30 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-security + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + + + org.springframework.boot + spring-boot-starter-web + + diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java new file mode 100644 index 00000000..1c97a2de --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -0,0 +1,111 @@ +package net.gepafin.tendermanagement.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; +import net.gepafin.tendermanagement.config.jwt.JWTConfigurer; +import net.gepafin.tendermanagement.config.jwt.JWTFilter; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.handler.HandlerMappingIntrospector; + +@Configuration +@EnableWebSecurity +public class SecurityConfig { + + private final TokenProvider tokenProvider; + + @Autowired + public SecurityConfig(TokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { + return config.getAuthenticationManager(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { + return new MvcRequestMatcher.Builder(introspector); + } + + @Bean + public WebSecurityCustomizer webSecurityCustomizer(MvcRequestMatcher.Builder mvc) { + return (web) -> web.ignoring() + .requestMatchers(mvc.pattern(HttpMethod.OPTIONS, "/**")) + .requestMatchers(new AntPathRequestMatcher("/i18n/**")) + .requestMatchers(new AntPathRequestMatcher("/content/**")) + .requestMatchers(new AntPathRequestMatcher("/swagger-ui/index.html")) + .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); + } + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOrigin("*"); + config.addAllowedHeader("*"); + config.addAllowedMethod("*"); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { + http + .csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(auth -> auth + .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user/login")).permitAll() + .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user")).permitAll() + .requestMatchers("/swagger-ui/**").permitAll() + .requestMatchers("/v1/api-docs/**").permitAll() + .anyRequest().authenticated() + ) + .sessionManagement(session -> session + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + ) + .apply(new JWTConfigurer(tokenProvider)) + .and() + .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class); + + return http.build(); + } + + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .addServersItem(new Server().url("/")) + .addSecurityItem(new SecurityRequirement().addList("bearer-key")) + .components(new Components().addSecuritySchemes("bearer-key", + new SecurityScheme().type(SecurityScheme.Type.HTTP) + .scheme("bearer").bearerFormat("JWT"))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTConfigurer.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTConfigurer.java new file mode 100644 index 00000000..1ee7efe6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTConfigurer.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.config.jwt; + +import org.springframework.security.config.annotation.SecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.DefaultSecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +public class JWTConfigurer extends SecurityConfigurerAdapter { + + public static final String AUTHORIZATION_HEADER = "Authorization"; + + private TokenProvider tokenProvider; + + public JWTConfigurer(TokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Override + public void configure(HttpSecurity http) throws Exception { + JWTFilter customFilter = new JWTFilter(tokenProvider); + http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTFilter.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTFilter.java new file mode 100644 index 00000000..4d8d5948 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTFilter.java @@ -0,0 +1,43 @@ +package net.gepafin.tendermanagement.config.jwt; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.GenericFilterBean; + +import java.io.IOException; + +public class JWTFilter extends GenericFilterBean { + + private final TokenProvider tokenProvider; + + public JWTFilter(TokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + String token = resolveToken(httpServletRequest); + + if (StringUtils.hasText(token) && tokenProvider.validateToken(token)) { + Authentication authentication = tokenProvider.getAuthentication(token); + if (authentication != null) { + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } + + filterChain.doFilter(servletRequest, servletResponse); + } + + private String resolveToken(HttpServletRequest request) { + String bearerToken = request.getHeader("Authorization"); + return StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ") ? bearerToken.substring(7) : null; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java new file mode 100644 index 00000000..7ac7948e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java @@ -0,0 +1,93 @@ +package net.gepafin.tendermanagement.config.jwt; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; +import jakarta.annotation.PostConstruct; +import org.apache.commons.lang3.time.DateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.stream.Collectors; +@Component +public class TokenProvider { + private final Logger log = LoggerFactory.getLogger(TokenProvider.class); + + @Value("${security.authentication.jwt.secret}") + private String secretKey; + + @Value("${security.authentication.jwt.token-validity-in-seconds}") + private long tokenValidityInSeconds; + + private SecretKey key; + + @PostConstruct + public void init() { + this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); + } + public String createToken(Authentication authentication,Boolean rememberMe) { + String authorities = authentication.getAuthorities().stream() + .map(GrantedAuthority::getAuthority) + .collect(Collectors.joining(",")); + Long now = null; + Date validity=null; + if(Boolean.TRUE.equals(rememberMe)) { + now= DateUtils.addMonths(new Date(), 2).getTime(); + validity = new Date(now); + }else { + now=(new Date()).getTime(); + validity = new Date(now + (this.tokenValidityInSeconds * 1000)); + } + return Jwts.builder() + .setSubject(authentication.getName()) + .claim("auth", authorities) + .signWith(key, SignatureAlgorithm.HS512) + .setExpiration(validity) + .compact(); + } + + public Authentication getAuthentication(String token) { + Claims claims = Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(token) + .getBody(); + UserDetails principal = new User(claims.getSubject(), "", Collections.emptyList()); + + return new UsernamePasswordAuthenticationToken(principal, token, principal.getAuthorities()); + } + + + private Collection ClaimsToAuthorities(Object authClaim) { + return authClaim == null || ((String) authClaim).isEmpty() ? + Collections.emptyList() : + Arrays.stream(((String) authClaim).split(",")) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + } + + public boolean validateToken(String authToken) { + try { + Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(authToken); + return true; + } catch (Exception e) { + log.info("Token validation failed: " + e.getMessage()); + return false; + } + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 7d00913f..af5b5475 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -24,4 +24,8 @@ public class GepafinConstant { public static final String DELETE_REGION_SUCCESS_MSG = "delete.region.success"; public static final String REGION_NOT_FOUND_MSG = "user.region.not.found"; public static final String PASSWORD_DOESNT_MATCH ="password.doesnt.match"; + public static final String LOGIN_SUCCESS_MSG="login.successfully"; + public static final String PASSWORD_MIN_LEN ="pass.min.len.msg"; + public static final String EMAIL_ALREADY_EXISTS = "email.already.exists"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java index 27f7f250..3cc3d997 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java @@ -50,7 +50,7 @@ public class RegionDao { regionEntity.setEducationLevel(regionReq.getEducationLevel()); return regionEntity; } - private RegionResponseBean convertRegionEntityToRegionResponse(RegionEntity regionEntity) { + public RegionResponseBean convertRegionEntityToRegionResponse(RegionEntity regionEntity) { RegionResponseBean regionResponseBean = new RegionResponseBean(); regionResponseBean.setId(regionEntity.getId()); regionResponseBean.setCreatedDate(regionEntity.getCreatedDate()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index 08c1a40f..fe25a923 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -4,6 +4,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.RoleReq; +import net.gepafin.tendermanagement.model.response.RegionResponseBean; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.repositories.RoleRepository; import net.gepafin.tendermanagement.service.RegionService; @@ -23,9 +24,13 @@ public class RoleDao { @Autowired private RoleRepository roleRepository; + @Autowired private RegionService regionService; + @Autowired + private RegionDao regionDao; + public RoleResponseBean createRole(RoleReq roleReq) { RoleEntity roleEntity = convertRoleRequestToRoleEntity(roleReq); roleEntity = roleRepository.save(roleEntity); @@ -39,7 +44,7 @@ public class RoleDao { roleEntity.setRegion(regionService.getRegionById(roleReq.getRegionId())); return roleEntity; } - private RoleResponseBean convertRoleEntityToRoleResponse(RoleEntity roleEntity) { + public RoleResponseBean convertRoleEntityToRoleResponse(RoleEntity roleEntity) { RoleResponseBean roleResponseBean=new RoleResponseBean(); roleResponseBean.setId(roleEntity.getId()); roleResponseBean.setCreatedDate(roleEntity.getCreatedDate()); @@ -47,7 +52,8 @@ public class RoleDao { roleResponseBean.setRoleName(roleEntity.getRoleName()); roleResponseBean.setDescription(roleEntity.getDescription()); roleResponseBean.setPermissions(roleEntity.getPermissions()); - roleResponseBean.setRegion(roleEntity.getRegion()); + RegionResponseBean regionResponseBean = regionDao.convertRegionEntityToRegionResponse(roleEntity.getRegion()); + roleResponseBean.setRegion(regionResponseBean); return roleResponseBean; } public RoleResponseBean updateRole(Long id, RoleReq roleReq) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 63a7c353..eecdd4e0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -1,33 +1,53 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.model.response.LoginResponse; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.RoleService; +import net.gepafin.tendermanagement.service.impl.AuthenticationService; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Repository; import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; - @Repository public class UserDao { + @Autowired private UserRepository userRepository; - + @Autowired + private AuthenticationService authService; @Autowired private RoleService roleService; + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private RoleDao roleDao; + public UserResponseBean createUser(UserReq userReq) { + if (userRepository.existsByEmail(userReq.getEmail())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); + } if (!userReq.getPassword().equals(userReq.getConfPassword())) { - throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); + } + if (userReq.getPassword().length() < 8) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_MIN_LEN)); } UserEntity userEntity = convertUserRequestToUserEntity(userReq); userEntity = userRepository.save(userEntity); @@ -53,15 +73,15 @@ public class UserDao { private UserEntity convertUserRequestToUserEntity(UserReq userReq) { UserEntity userEntity = new UserEntity(); - userEntity.setPassword(userReq.getPassword()); - userEntity.setEmail(userReq.getEmail()); - userEntity.setFirstName(userReq.getFirstName()); - userEntity.setStatus(userReq.getStatus()); - userEntity.setLastName(userReq.getLastName()); - userEntity.setOrganization(userReq.getOrganization()); - userEntity.setAddress(userReq.getAddress()); - userEntity.setPhoneNumber(userReq.getPhoneNumber()); - userEntity.setRoleEntity(roleService.getRoleById(userReq.getRoleId())); + userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); + userEntity.setEmail(userReq.getEmail()); + userEntity.setFirstName(userReq.getFirstName()); + userEntity.setStatus(userReq.getStatus()); + userEntity.setLastName(userReq.getLastName()); + userEntity.setOrganization(userReq.getOrganization()); + userEntity.setAddress(userReq.getAddress()); + userEntity.setPhoneNumber(userReq.getPhoneNumber()); + userEntity.setRoleEntity(roleService.getRoleById(userReq.getRoleId())); return userEntity; } @@ -80,7 +100,8 @@ public class UserDao { userResponseBean.setCity(userEntity.getCity()); userResponseBean.setCountry(userEntity.getCountry()); userResponseBean.setStatus(userEntity.getStatus()); - userResponseBean.setRole(userEntity.getRoleEntity()); + RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(userEntity.getRoleEntity()); + userResponseBean.setRole(roleResponseBean); userResponseBean.setLastLogin(userEntity.getLastLogin()); return userResponseBean; } @@ -96,4 +117,9 @@ public class UserDao { .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); userRepository.deleteById(id); } + + + public JWTToken login(LoginReq loginReq) { + return authService.login(loginReq); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/BaseBean.java b/src/main/java/net/gepafin/tendermanagement/model/BaseBean.java new file mode 100644 index 00000000..49eb0d41 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/BaseBean.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model; + +import java.time.LocalDateTime; + +import lombok.Data; + +@Data +public class BaseBean { + + private Long id; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LoginReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LoginReq.java new file mode 100644 index 00000000..d337d231 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LoginReq.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.model.request; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LoginReq { + @NotBlank(message = "{email.not.blank}") + @Email(message = "{email.invalid}") + private String email; + @NotEmpty + private String password; + private Boolean rememberMe; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java index f866ac99..d7d7041b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.model.request; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Getter; @@ -14,19 +15,20 @@ import java.time.LocalDateTime; @Setter public class UserReq { - - private String password; - - private String confPassword; - + @NotBlank(message = "{email.not.blank}") + @Email(message = "{email.invalid}") private String email; + @NotEmpty + private String password; + @NotEmpty + private String confPassword; private String firstName; private String lastName; private String phoneNumber; - + @NotEmpty private Long roleId; private String organization; @@ -39,6 +41,4 @@ public class UserReq { private String status; - private LocalDateTime lastLogin; - } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java new file mode 100644 index 00000000..64af6b1a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java @@ -0,0 +1,42 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class LoginResponse { + private Long id; + + private String email; + + private String firstName; + + private String lastName; + + private RoleResponseBean role; + + private String phoneNumber; + + private String organization; + + private String address; + + private String city; + + private String country; + + private String status; + + private LocalDateTime lastLogin; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java index c16d4c94..55182822 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java @@ -2,14 +2,14 @@ package net.gepafin.tendermanagement.model.response; import lombok.Getter; import lombok.Setter; +import net.gepafin.tendermanagement.model.BaseBean; import java.math.BigDecimal; import java.time.LocalDateTime; @Getter @Setter -public class RegionResponseBean { - private Long id; +public class RegionResponseBean extends BaseBean { private String regionName; private String description; private String country; @@ -23,6 +23,4 @@ public class RegionResponseBean { private BigDecimal educationLevel; private BigDecimal healthcareAccess; private BigDecimal environmentalScore; - private LocalDateTime createdDate; - private LocalDateTime updatedDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java index 1e708b58..d5d579e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java @@ -4,16 +4,14 @@ import lombok.Data; import lombok.Getter; import lombok.Setter; import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.model.BaseBean; import java.time.LocalDateTime; @Data -public class RoleResponseBean { - private Long id; +public class RoleResponseBean extends BaseBean { private String roleName; private String description; - private LocalDateTime createdDate; - private LocalDateTime updatedDate; private String permissions; - private RegionEntity region; + private RegionResponseBean region; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java index 2c036804..1dcaa944 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java @@ -6,22 +6,23 @@ import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.model.BaseBean; import java.time.LocalDateTime; @Getter @Setter -public class UserResponseBean { - private Long id; +public class UserResponseBean extends BaseBean { + private String email; private String firstName; private String lastName; - private String phoneNumber; + private RoleResponseBean role; - private RoleEntity role; + private String phoneNumber; private String organization; @@ -35,7 +36,4 @@ public class UserResponseBean { private LocalDateTime lastLogin; - private LocalDateTime createdDate; - - private LocalDateTime updatedDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java b/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java new file mode 100644 index 00000000..53596d25 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java @@ -0,0 +1,26 @@ +package net.gepafin.tendermanagement.model.util; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import net.gepafin.tendermanagement.model.response.LoginResponse; +import net.gepafin.tendermanagement.model.response.UserResponseBean; + +/** + * JWTToken + */ +@Data +public class JWTToken { + @JsonProperty("token") + private String token; + + @JsonProperty("user") + private LoginResponse loginResponse; + public JWTToken(String token, LoginResponse loginResponse) { + this.token = token; + this.loginResponse = loginResponse; + } + +} + diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index 2fdee718..dc0aad37 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -6,4 +6,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface UserRepository extends JpaRepository { + UserEntity findByEmail(String email); + boolean existsByEmail(String email); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 71faf129..68912240 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -1,12 +1,19 @@ package net.gepafin.tendermanagement.service; +import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.util.JWTToken; public interface UserService { UserResponseBean createUser(UserReq userReq); + UserResponseBean updateUser(Long userId, UpdateUserReq userReq); + UserResponseBean getUserById(Long userId); + void deleteUser(Long userId); + + JWTToken login(LoginReq loginReq); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java new file mode 100644 index 00000000..1b5137ce --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -0,0 +1,60 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.dao.RoleDao; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.LoginReq; +import net.gepafin.tendermanagement.model.response.LoginResponse; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; +import net.gepafin.tendermanagement.model.util.JWTToken; +import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.Collections; + +@Service +public class AuthenticationService { + + private final TokenProvider tokenProvider; + private final AuthenticationManager authenticationManager; + + @Autowired + private UserRepository userRepository; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private RoleDao roleDao; + + @Autowired + public AuthenticationService(TokenProvider tokenProvider, AuthenticationManager authenticationManager) { + this.tokenProvider = tokenProvider; + this.authenticationManager = authenticationManager; + } + + public JWTToken login(LoginReq loginReq) { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginReq.getEmail(),loginReq.getPassword()); + Authentication authentication = this.authenticationManager.authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + String token = tokenProvider.createToken(authentication,loginReq.getRememberMe()); + UserEntity user = userRepository.findByEmail(loginReq.getEmail()); + if (user == null) { + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); + return new JWTToken(token, new LoginResponse(user.getId(),user.getEmail(), + user.getFirstName(),user.getLastName(),roleResponseBean, user.getPhoneNumber(), user.getAddress(), user.getOrganization(), user.getCountry(),user.getStatus() + ,user.getCity(),user.getLastLogin(),user.getCreatedDate(),user.getUpdatedDate())); + } + } + + diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java index 63921ef1..345362d3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java @@ -10,6 +10,8 @@ import net.gepafin.tendermanagement.model.request.UpdateRegionReq; import net.gepafin.tendermanagement.service.RegionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + @Service public class RegionServiceImpl implements RegionService { @@ -17,26 +19,31 @@ public class RegionServiceImpl implements RegionService { private RegionDao regionDao; @Override + @Transactional(rollbackFor = Exception.class) public RegionResponseBean createRegion(RegionReq regionReq) { return regionDao.createRegion(regionReq); } @Override + @Transactional(rollbackFor = Exception.class) public RegionResponseBean updateRegion(Long regionId, RegionReq regionReq) { return regionDao.updateRegion(regionId,regionReq); } @Override + @Transactional(readOnly = true) public RegionEntity getRegionById(Long regionId) { return regionDao.getRegionById(regionId); } @Override + @Transactional(rollbackFor = Exception.class) public void deleteRegion(Long regionId) { regionDao.deleteById(regionId); } @Override + @Transactional(readOnly = true) public List getAllRegions() { return regionDao.getAllRegions(); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java index 41f3f6ba..9f66415a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java @@ -9,6 +9,7 @@ import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.service.RoleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @@ -18,25 +19,30 @@ public class RoleServiceImpl implements RoleService { private RoleDao roleDao; @Override + @Transactional(rollbackFor = Exception.class) public RoleResponseBean createRole(RoleReq roleReq) { return roleDao.createRole(roleReq); } @Override + @Transactional(rollbackFor = Exception.class) public RoleResponseBean updateRole(Long roleId, RoleReq roleReq) { return roleDao.updateRole(roleId,roleReq); } @Override + @Transactional(readOnly = true) public RoleEntity getRoleById(Long roleId) { return roleDao.getRoleById(roleId); } @Override + @Transactional(rollbackFor = Exception.class) public void deleteRole(Long roleId) { roleDao.deleteById(roleId); } @Override + @Transactional(readOnly = true) public List getAllRoles() { return roleDao.getAllRoles(); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index 4d39ffc5..c6205aae 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -1,12 +1,16 @@ package net.gepafin.tendermanagement.service.impl; import net.gepafin.tendermanagement.dao.UserDao; +import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.format.DateTimeFormatter; @@ -15,24 +19,35 @@ public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; + + @Transactional(rollbackFor = Exception.class) public UserResponseBean createUser(UserReq userReq) { return userDao.createUser(userReq); } @Override + @Transactional(rollbackFor = Exception.class) public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { return userDao.updateUser(userId, userReq); } @Override + @Transactional(readOnly = true) public UserResponseBean getUserById(Long userId) { return userDao.getUserById(userId); } @Override + @Transactional(rollbackFor = Exception.class) public void deleteUser(Long userId) { userDao.deleteUser(userId); } -} + @Override + public JWTToken login(LoginReq loginReq) { + return userDao.login(loginReq); + + } + +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 3c9eadc6..beae1296 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -6,9 +6,11 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.HttpStatus; @@ -28,13 +30,13 @@ public interface UserApi { responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @RequestMapping(value = "", - produces = { "application/json" }, + produces = {"application/json"}, method = RequestMethod.POST) default ResponseEntity> createUser( @Parameter(description = "User request object", required = true) @Valid @RequestBody UserReq userReq) { @@ -45,13 +47,13 @@ public interface UserApi { responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @RequestMapping(value = "/{userId}", - produces = { "application/json" }, + produces = {"application/json"}, method = RequestMethod.PUT) default ResponseEntity> updateUser( @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, @@ -63,13 +65,13 @@ public interface UserApi { responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @RequestMapping(value = "/{userId}", - produces = { "application/json" }, + produces = {"application/json"}, method = RequestMethod.GET) default ResponseEntity> getUserById( @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId) { @@ -80,15 +82,26 @@ public interface UserApi { responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @RequestMapping(value = "/{userId}", method = RequestMethod.DELETE) default ResponseEntity> deleteUser( @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } + + @Operation(summary = "Api to login user", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request"), + @ApiResponse(responseCode = "401", description = "Unauthorized")}) + @RequestMapping(value = "/login", + produces = {"application/json"}, + method = RequestMethod.POST) + ResponseEntity> login( + @Parameter(description = "Login request object", required = true) @Valid @RequestBody LoginReq loginReq); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java new file mode 100644 index 00000000..6a6b00ef --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import net.gepafin.tendermanagement.model.util.Response; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.http.ResponseEntity; + +@ControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(CustomValidationException.class) + public ResponseEntity> handleCustomValidationException(CustomValidationException ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(new Response<>(null, ex.getStatus(), ex.getMessage())); + } + + @ExceptionHandler(ResourceNotFoundException.class) + public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException ex) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, ex.getStatus(), ex.getMessage())); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java new file mode 100644 index 00000000..102a388c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java @@ -0,0 +1,55 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.repositories.RoleRepository; +import net.gepafin.tendermanagement.repositories.UserRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collections; + +@Service +public class CustomUserDetailsService implements UserDetailsService { + + private final Logger log = LoggerFactory.getLogger(CustomUserDetailsService.class); + + private final UserRepository userRepository; + private final RoleRepository roleRepository; + + public CustomUserDetailsService(UserRepository userRepository, RoleRepository roleRepository) { + this.userRepository = userRepository; + this.roleRepository = roleRepository; + } + + @Override + @Transactional + public UserDetails loadUserByUsername(final String email) throws UsernameNotFoundException { + log.debug("Authenticating {}", email); + + UserEntity user = userRepository.findByEmail(email); + if (user == null) { + throw new UsernameNotFoundException("User " + email + " was not found in the database"); + } + + return createSpringSecurityUser(user); + } + + private org.springframework.security.core.userdetails.User createSpringSecurityUser(UserEntity user) { + RoleEntity role = user.getRoleEntity(); + GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleName()); + + return new org.springframework.security.core.userdetails.User( + user.getEmail(), + user.getPassword(), + Collections.singletonList(grantedAuthority) + ); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index ad169e42..caf3c61a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -3,14 +3,16 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.validation.Valid; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.web.rest.api.UserApi; -import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +23,7 @@ import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/user}") +@Validated public class UserApiController implements UserApi { private final Logger log = LoggerFactory.getLogger(UserApiController.class); @@ -31,42 +34,45 @@ public class UserApiController implements UserApi { @Override public ResponseEntity> createUser( @Valid @RequestBody UserReq userReq) { - log.info("Create User with - Request Body: {}", userReq); - UserResponseBean createdUser = userService.createUser(userReq); - return ResponseEntity.status(HttpStatus.CREATED) - .body(new Response<>(createdUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_CREATED_SUCCESS_MSG))); + log.info("Create User with - Request Body: {}", userReq); + UserResponseBean createdUser = userService.createUser(userReq); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createdUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_CREATED_SUCCESS_MSG))); } @Override public ResponseEntity> updateUser( @PathVariable("userId") Long userId, @Valid @RequestBody UpdateUserReq userReq) { - log.info("Update User - User ID: {}, Request Body: {}", userId, userReq); - UserResponseBean updatedUser = userService.updateUser(userId, userReq); - - return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(updatedUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_UPDATED_SUCCESS_MSG))); - + log.info("Update User - User ID: {}, Request Body: {}", userId, userReq); + UserResponseBean updatedUser = userService.updateUser(userId, userReq); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(updatedUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_UPDATED_SUCCESS_MSG))); } @Override public ResponseEntity> getUserById( @PathVariable("userId") Long userId) { - log.info("Get User by ID - User ID: {}", userId); - UserResponseBean user = userService.getUserById(userId); - return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); - + log.info("Get User by ID - User ID: {}", userId); + UserResponseBean user = userService.getUserById(userId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); } @Override public ResponseEntity> deleteUser( @PathVariable("userId") Long userId) { - log.info("Delete User By- User ID: {}", userId); - userService.deleteUser(userId); - - return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_DELETED_SUCCESS_MSG))); + log.info("Delete User - User ID: {}", userId); + userService.deleteUser(userId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_DELETED_SUCCESS_MSG))); + } + @Override + public ResponseEntity> login( + @Valid @RequestBody LoginReq loginReq) { + log.info("User login attempt "); + JWTToken jwtToken = userService.login(loginReq); + return ResponseEntity.ok(new Response<>(jwtToken, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOGIN_SUCCESS_MSG))); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9126bd0a..54a465f5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -23,4 +23,13 @@ spring.liquibase.enabled=true # Debugging and SQL Output logging.level.org.springframework.boot.autoconfigure.liquibase=ERROR -logging.level.liquibase=ERROR \ No newline at end of file +logging.level.liquibase=ERROR +# JWT configuration +# Ensure these values match your expectations +security.authentication.jwt.secret=my-secret-token-to-change-in-prod-environment-your-super-secure-randomly-generated-key +security.authentication.jwt.token-validity-in-seconds=86400 + + +spring.main.allow-circular-references=true + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index bdbcf92b..3149b6fc 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -27,3 +27,10 @@ create.regiom.error=Error occurred while creating the region. update.region.error=Error occurred while updating the region. password.doesnt.match=Password and confirm password do not match. +login.successfully=Login successfully. +pass.min.len.msg=Password must be at least 8 characters long. +email.already.exists=A user with this email already exists. + + + + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index bfd0d8f3..d6b29447 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -26,3 +26,10 @@ user.region.not.found=Regione non trovata. create.regiom.error=Errore durante la creazione della regione. update.region.error=Errore durante l'aggiornamento della regione. password.doesnt.match=La password e la conferma della password non corrispondono. + +# Login-related messages +login.successfully=Accesso effettuato con successo. +pass.min.len.msg=La password deve essere lunga almeno 8 caratteri. +email.already.exists=Esiste già un utente con questa email. + + From fa714faef96c4beab0f96b9cc2deaf842b6759a5 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 21 Aug 2024 19:34:15 +0530 Subject: [PATCH 008/145] updated swagger configation --- src/main/resources/application-dev.properties | 8 ++++++ .../resources/application-local.properties | 8 ++++++ .../resources/application-testing.properties | 7 +++++ src/main/resources/application.properties | 26 +++++++++---------- 4 files changed, 36 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/application-dev.properties create mode 100644 src/main/resources/application-local.properties create mode 100644 src/main/resources/application-testing.properties diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties new file mode 100644 index 00000000..72135766 --- /dev/null +++ b/src/main/resources/application-dev.properties @@ -0,0 +1,8 @@ +# DataSource Configuration +spring.datasource.url=jdbc:postgresql://dbstaging.memento.credit:20184/gepaDb +spring.datasource.username=usergepa +spring.datasource.password=vs1pAc9vu07mMcdx93j6WiBS +spring.datasource.driver-class-name=org.postgresql.Driver + +# JPA Configuration +spring.h2.console.enabled=true \ No newline at end of file diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 00000000..7ed5944b --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1,8 @@ +# DataSource Configuration +spring.datasource.url=jdbc:postgresql://localhost:5432/gepafin_local +spring.datasource.username=postgres +spring.datasource.password=root +spring.datasource.driver-class-name=org.postgresql.Driver + +# JPA Configuration +spring.jpa.show-sql=true \ No newline at end of file diff --git a/src/main/resources/application-testing.properties b/src/main/resources/application-testing.properties new file mode 100644 index 00000000..ea3a5732 --- /dev/null +++ b/src/main/resources/application-testing.properties @@ -0,0 +1,7 @@ +# DataSource Configuration +spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +spring.datasource.username=sa +spring.datasource.password=sa + +# JPA Configuration +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 9126bd0a..f72dc2c4 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,26 +1,26 @@ spring.application.name=tendermanagement -springdoc.api-docs.path=/v1/api-docs -springdoc.swagger-ui.configUrl=/v1/api-docs -springfox.documentation.swagger-ui.path=/v1/api-docs -springdoc.swagger-ui.disable-swagger-default-url=true -springdoc.swagger-ui.path=/swagger-ui.html -# DataSource Configuration -spring.datasource.url=jdbc:postgresql://localhost:5432/gepafin_local -spring.datasource.username=postgres -spring.datasource.password=root -spring.datasource.driver-class-name=org.postgresql.Driver +# Multipart Configuration +spring.servlet.multipart.max-file-size=50MB +spring.servlet.multipart.max-request-size=50MB + +spring.profiles.active=testing + # JPA Configuration spring.jpa.properties.hibernate.default_schema=gepafin_schema spring.jpa.hibernate.ddl-auto=none +spring.jpa.show-sql=false # Liquibase Configuration spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.xml spring.liquibase.default-schema=gepafin_schema -spring.liquibase.enabled=true +spring.liquibase.enabled=true + # Debugging and SQL Output -logging.level.org.springframework.boot.autoconfigure.liquibase=ERROR -logging.level.liquibase=ERROR \ No newline at end of file + +# Swagger Configuration +springdoc.api-docs.path=/v1/api-docs + From 04e9ff57a7bf4c65d548079789edaf6722a341e5 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 21 Aug 2024 19:54:27 +0530 Subject: [PATCH 009/145] Add Logger --- .../config/jwt/TokenProvider.java | 39 +++++++---- .../tendermanagement/dao/RegionDao.java | 56 ++++++++++------ .../gepafin/tendermanagement/dao/RoleDao.java | 66 +++++++++++++------ .../gepafin/tendermanagement/dao/UserDao.java | 34 ++++++++-- .../service/impl/AuthenticationService.java | 45 ++++++++----- 5 files changed, 164 insertions(+), 76 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java index 7ac7948e..1964bd1c 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java @@ -36,26 +36,35 @@ public class TokenProvider { @PostConstruct public void init() { this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); + log.info("JWT Secret Key initialized."); } - public String createToken(Authentication authentication,Boolean rememberMe) { + + public String createToken(Authentication authentication, Boolean rememberMe) { String authorities = authentication.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.joining(",")); - Long now = null; - Date validity=null; - if(Boolean.TRUE.equals(rememberMe)) { - now= DateUtils.addMonths(new Date(), 2).getTime(); + Long now; + Date validity; + + if (Boolean.TRUE.equals(rememberMe)) { + now = DateUtils.addMonths(new Date(), 2).getTime(); validity = new Date(now); - }else { - now=(new Date()).getTime(); + log.info("Creating token with extended validity for 2 months."); + } else { + now = (new Date()).getTime(); validity = new Date(now + (this.tokenValidityInSeconds * 1000)); + log.info("Creating token with standard validity of {} seconds.", this.tokenValidityInSeconds); } - return Jwts.builder() + + String token = Jwts.builder() .setSubject(authentication.getName()) .claim("auth", authorities) .signWith(key, SignatureAlgorithm.HS512) .setExpiration(validity) .compact(); + + log.debug("Generated token: {}", token); + return token; } public Authentication getAuthentication(String token) { @@ -64,18 +73,21 @@ public class TokenProvider { .build() .parseClaimsJws(token) .getBody(); - UserDetails principal = new User(claims.getSubject(), "", Collections.emptyList()); - return new UsernamePasswordAuthenticationToken(principal, token, principal.getAuthorities()); + UserDetails principal = new User(claims.getSubject(), "", Collections.emptyList()); + log.info("Authenticated user: {}", claims.getSubject()); + + return new UsernamePasswordAuthenticationToken(principal, token, ClaimsToAuthorities(claims.get("auth"))); } - private Collection ClaimsToAuthorities(Object authClaim) { - return authClaim == null || ((String) authClaim).isEmpty() ? + Collection authorities = authClaim == null || ((String) authClaim).isEmpty() ? Collections.emptyList() : Arrays.stream(((String) authClaim).split(",")) .map(SimpleGrantedAuthority::new) .collect(Collectors.toList()); + log.debug("Converted authorities from claims: {}", authorities); + return authorities; } public boolean validateToken(String authToken) { @@ -84,9 +96,10 @@ public class TokenProvider { .setSigningKey(key) .build() .parseClaimsJws(authToken); + log.info("Token is valid."); return true; } catch (Exception e) { - log.info("Token validation failed: " + e.getMessage()); + log.error("Token validation failed: {}", e.getMessage()); return false; } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java index 3cc3d997..9277b167 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java @@ -3,21 +3,17 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RegionEntity; -import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.RegionReq; -import net.gepafin.tendermanagement.model.request.RoleReq; import net.gepafin.tendermanagement.model.response.RegionResponseBean; -import net.gepafin.tendermanagement.model.request.UpdateRegionReq; -import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.repositories.RegionRepository; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; -import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -25,14 +21,19 @@ import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; @Repository public class RegionDao { + private final Logger log = LoggerFactory.getLogger(RegionDao.class); + @Autowired - private RegionRepository regionRepository; + private RegionRepository regionRepository; public RegionResponseBean createRegion(RegionReq regionReq) { + log.info("Creating new region with details: {}", regionReq); RegionEntity regionEntity = convertRegionRequestToRegionEntity(regionReq); - regionRepository.save(regionEntity); + regionEntity = regionRepository.save(regionEntity); + log.info("Region created with ID: {}", regionEntity.getId()); return convertRegionEntityToRegionResponse(regionEntity); } + private RegionEntity convertRegionRequestToRegionEntity(RegionReq regionReq) { RegionEntity regionEntity = new RegionEntity(); regionEntity.setCountry(regionReq.getCountry()); @@ -50,7 +51,8 @@ public class RegionDao { regionEntity.setEducationLevel(regionReq.getEducationLevel()); return regionEntity; } - public RegionResponseBean convertRegionEntityToRegionResponse(RegionEntity regionEntity) { + + public RegionResponseBean convertRegionEntityToRegionResponse(RegionEntity regionEntity) { RegionResponseBean regionResponseBean = new RegionResponseBean(); regionResponseBean.setId(regionEntity.getId()); regionResponseBean.setCreatedDate(regionEntity.getCreatedDate()); @@ -72,7 +74,11 @@ public class RegionDao { } public RegionResponseBean updateRegion(Long id, RegionReq regionReq) { + log.info("Updating region with ID: {}", id); RegionEntity existingRegion = getRegionById(id); + log.info("Current region details: {}", existingRegion); + log.info("New region details: {}", regionReq); + setIfUpdated(existingRegion::getRegionName, existingRegion::setRegionName, regionReq.getRegionName()); setIfUpdated(existingRegion::getDescription, existingRegion::setDescription, regionReq.getDescription()); setIfUpdated(existingRegion::getCountry, existingRegion::setCountry, regionReq.getCountry()); @@ -82,28 +88,40 @@ public class RegionDao { setIfUpdated(existingRegion::getAreaSize, existingRegion::setAreaSize, regionReq.getAreaSize()); setIfUpdated(existingRegion::getGdp, existingRegion::setGdp, regionReq.getGdp()); setIfUpdated(existingRegion::getUnemploymentRate, existingRegion::setUnemploymentRate, regionReq.getUnemploymentRate()); - setIfUpdated(existingRegion::getInfrastructureScore, existingRegion::setInfrastructureScore, regionReq.getInfrastructureScore() ); + setIfUpdated(existingRegion::getInfrastructureScore, existingRegion::setInfrastructureScore, regionReq.getInfrastructureScore()); setIfUpdated(existingRegion::getEducationLevel, existingRegion::setEducationLevel, regionReq.getEducationLevel()); setIfUpdated(existingRegion::getHealthcareAccess, existingRegion::setHealthcareAccess, regionReq.getHealthcareAccess()); setIfUpdated(existingRegion::getEnvironmentalScore, existingRegion::setEnvironmentalScore, regionReq.getEnvironmentalScore()); - regionRepository.save(existingRegion); + + existingRegion = regionRepository.save(existingRegion); + + log.info("Region updated with ID: {}", existingRegion.getId()); return Utils.convertObject(existingRegion, RegionResponseBean.class); } - public RegionEntity getRegionById(Long id) { - return regionRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); - } - public void deleteById(Long id) { + public RegionEntity getRegionById(Long id) { + log.info("Fetching region with ID: {}", id); + RegionEntity regionEntity = regionRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); + log.info("Region found: {}", regionEntity); + return regionEntity; + } + + public void deleteById(Long id) { + log.info("Deleting region with ID: {}", id); regionRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); regionRepository.deleteById(id); + log.info("Region deleted with ID: {}", id); } - public List getAllRegions() - { - return regionRepository.findAll() + + public List getAllRegions() { + log.info("Fetching all regions"); + List regions = regionRepository.findAll() .stream() .map(regionEntity -> Utils.convertObject(regionEntity, RegionResponseBean.class)) .collect(Collectors.toList()); + log.info("Total regions found: {}", regions.size()); + return regions; } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index fe25a923..e7f4c5f9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -11,6 +11,8 @@ import net.gepafin.tendermanagement.service.RegionService; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -21,10 +23,11 @@ import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; @Component public class RoleDao { + private final Logger log = LoggerFactory.getLogger(RoleDao.class); @Autowired private RoleRepository roleRepository; - + @Autowired private RegionService regionService; @@ -32,55 +35,76 @@ public class RoleDao { private RegionDao regionDao; public RoleResponseBean createRole(RoleReq roleReq) { + log.info("Creating new role with details: {}", roleReq); RoleEntity roleEntity = convertRoleRequestToRoleEntity(roleReq); roleEntity = roleRepository.save(roleEntity); + log.info("Role created with ID: {}", roleEntity.getId()); return convertRoleEntityToRoleResponse(roleEntity); } + private RoleEntity convertRoleRequestToRoleEntity(RoleReq roleReq) { RoleEntity roleEntity = new RoleEntity(); roleEntity.setRoleName(roleReq.getRoleName()); roleEntity.setPermissions(roleReq.getPermissions()); - roleEntity.setDescription(roleEntity.getDescription()); + roleEntity.setDescription(roleReq.getDescription()); roleEntity.setRegion(regionService.getRegionById(roleReq.getRegionId())); return roleEntity; } + public RoleResponseBean convertRoleEntityToRoleResponse(RoleEntity roleEntity) { - RoleResponseBean roleResponseBean=new RoleResponseBean(); - roleResponseBean.setId(roleEntity.getId()); - roleResponseBean.setCreatedDate(roleEntity.getCreatedDate()); - roleResponseBean.setUpdatedDate(roleEntity.getUpdatedDate()); - roleResponseBean.setRoleName(roleEntity.getRoleName()); - roleResponseBean.setDescription(roleEntity.getDescription()); - roleResponseBean.setPermissions(roleEntity.getPermissions()); - RegionResponseBean regionResponseBean = regionDao.convertRegionEntityToRegionResponse(roleEntity.getRegion()); - roleResponseBean.setRegion(regionResponseBean); + RoleResponseBean roleResponseBean = new RoleResponseBean(); + roleResponseBean.setId(roleEntity.getId()); + roleResponseBean.setCreatedDate(roleEntity.getCreatedDate()); + roleResponseBean.setUpdatedDate(roleEntity.getUpdatedDate()); + roleResponseBean.setRoleName(roleEntity.getRoleName()); + roleResponseBean.setDescription(roleEntity.getDescription()); + roleResponseBean.setPermissions(roleEntity.getPermissions()); + RegionResponseBean regionResponseBean = regionDao.convertRegionEntityToRegionResponse(roleEntity.getRegion()); + roleResponseBean.setRegion(regionResponseBean); return roleResponseBean; } - public RoleResponseBean updateRole(Long id, RoleReq roleReq) { - RoleEntity existingUserRole = getRoleById(id); - setIfUpdated(existingUserRole::getRoleName, existingUserRole::setRoleName, roleReq.getRoleName()); - setIfUpdated(existingUserRole::getDescription, existingUserRole::setDescription, roleReq.getDescription()); - setIfUpdated(existingUserRole::getPermissions, existingUserRole::setPermissions, roleReq.getPermissions()); - roleRepository.save(existingUserRole); - return Utils.convertObject(existingUserRole, RoleResponseBean.class); + public RoleResponseBean updateRole(Long id, RoleReq roleReq) { + log.info("Updating role with ID: {}", id); + RoleEntity existingRole = getRoleById(id); + + // Log changes before update + log.info("Current role details: {}", existingRole); + log.info("New role details: {}", roleReq); + + setIfUpdated(existingRole::getRoleName, existingRole::setRoleName, roleReq.getRoleName()); + setIfUpdated(existingRole::getDescription, existingRole::setDescription, roleReq.getDescription()); + setIfUpdated(existingRole::getPermissions, existingRole::setPermissions, roleReq.getPermissions()); + + existingRole = roleRepository.save(existingRole); + + log.info("Role updated with ID: {}", existingRole.getId()); + return Utils.convertObject(existingRole, RoleResponseBean.class); } public RoleEntity getRoleById(Long id) { - return roleRepository.findById(id) + log.info("Fetching role with ID: {}", id); + RoleEntity roleEntity = roleRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ROLE_NOT_FOUND))); + log.info("Role found: {}", roleEntity); + return roleEntity; } public void deleteById(Long id) { + log.info("Deleting role with ID: {}", id); roleRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ROLE_NOT_FOUND))); + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ROLE_NOT_FOUND))); roleRepository.deleteById(id); + log.info("Role deleted with ID: {}", id); } public List getAllRoles() { - return roleRepository.findAll() + log.info("Fetching all roles"); + List roles = roleRepository.findAll() .stream() .map(roleEntity -> Utils.convertObject(roleEntity, RoleResponseBean.class)) .collect(Collectors.toList()); + log.info("Total roles found: {}", roles.size()); + return roles; } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index eecdd4e0..af0e19f4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -18,45 +18,61 @@ import net.gepafin.tendermanagement.service.impl.AuthenticationService; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Repository; import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; + @Repository public class UserDao { + private final Logger log = LoggerFactory.getLogger(UserDao.class); + @Autowired private UserRepository userRepository; + @Autowired private AuthenticationService authService; + @Autowired private RoleService roleService; @Autowired private PasswordEncoder passwordEncoder; - + @Autowired private RoleDao roleDao; public UserResponseBean createUser(UserReq userReq) { + log.info("Creating user with email: {}", userReq.getEmail()); if (userRepository.existsByEmail(userReq.getEmail())) { + log.error("User creation failed: Email {} already exists", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); } if (!userReq.getPassword().equals(userReq.getConfPassword())) { + log.error("User creation failed: Passwords do not match for email {}", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); } if (userReq.getPassword().length() < 8) { + log.error("User creation failed: Password length is less than 8 characters for email {}", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_MIN_LEN)); } UserEntity userEntity = convertUserRequestToUserEntity(userReq); userEntity = userRepository.save(userEntity); + log.info("User created with ID: {}", userEntity.getId()); return convertUserEntityToUserResponse(userEntity); } public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { + log.info("Updating user with ID: {}", userId); UserEntity userEntity = userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); + log.info("Current user details: {}", userEntity); + log.info("New user details: {}", userReq); + setIfUpdated(userEntity::getStatus, userEntity::setStatus, userReq.getStatus()); setIfUpdated(userEntity::getFirstName, userEntity::setFirstName, userReq.getFirstName()); setIfUpdated(userEntity::getLastName, userEntity::setLastName, userReq.getLastName()); @@ -68,6 +84,7 @@ public class UserDao { setIfUpdated(userEntity::getRoleEntity, userEntity::setRoleEntity, roleEntity); } userEntity = userRepository.save(userEntity); + log.info("User updated with ID: {}", userEntity.getId()); return convertUserEntityToUserResponse(userEntity); } @@ -90,7 +107,6 @@ public class UserDao { userResponseBean.setId(userEntity.getId()); userResponseBean.setCreatedDate(userEntity.getCreatedDate()); userResponseBean.setUpdatedDate(userEntity.getUpdatedDate()); - userResponseBean.setId(userEntity.getId()); userResponseBean.setEmail(userEntity.getEmail()); userResponseBean.setFirstName(userEntity.getFirstName()); userResponseBean.setLastName(userEntity.getLastName()); @@ -107,19 +123,25 @@ public class UserDao { } public UserResponseBean getUserById(Long id) { + log.info("Fetching user with ID: {}", id); UserEntity userEntity = userRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + log.info("User found: {}", userEntity); return convertUserEntityToUserResponse(userEntity); } public void deleteUser(Long id) { + log.info("Deleting user with ID: {}", id); userRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); userRepository.deleteById(id); + log.info("User deleted with ID: {}", id); } - public JWTToken login(LoginReq loginReq) { - return authService.login(loginReq); + log.info("User login attempt for email: {}", loginReq.getEmail()); + JWTToken jwtToken = authService.login(loginReq); + log.info("Login successful for email: {}", loginReq.getEmail()); + return jwtToken; } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 1b5137ce..022f3775 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -12,6 +12,8 @@ import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -20,18 +22,20 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; -import java.util.Collections; - @Service public class AuthenticationService { + private final Logger log = LoggerFactory.getLogger(AuthenticationService.class); + private final TokenProvider tokenProvider; private final AuthenticationManager authenticationManager; @Autowired - private UserRepository userRepository; + private UserRepository userRepository; + @Autowired private PasswordEncoder passwordEncoder; + @Autowired private RoleDao roleDao; @@ -42,19 +46,26 @@ public class AuthenticationService { } public JWTToken login(LoginReq loginReq) { - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginReq.getEmail(),loginReq.getPassword()); - Authentication authentication = this.authenticationManager.authenticate(authenticationToken); - SecurityContextHolder.getContext().setAuthentication(authentication); - String token = tokenProvider.createToken(authentication,loginReq.getRememberMe()); - UserEntity user = userRepository.findByEmail(loginReq.getEmail()); - if (user == null) { - throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } - RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); - return new JWTToken(token, new LoginResponse(user.getId(),user.getEmail(), - user.getFirstName(),user.getLastName(),roleResponseBean, user.getPhoneNumber(), user.getAddress(), user.getOrganization(), user.getCountry(),user.getStatus() - ,user.getCity(),user.getLastLogin(),user.getCreatedDate(),user.getUpdatedDate())); - } - } + log.info("Attempting login for email: {}", loginReq.getEmail()); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginReq.getEmail(), loginReq.getPassword()); + Authentication authentication = this.authenticationManager.authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + log.info("Authentication successful for email: {}", loginReq.getEmail()); + String token = tokenProvider.createToken(authentication, loginReq.getRememberMe()); + log.info("JWT token generated for email: {}", loginReq.getEmail()); + UserEntity user = userRepository.findByEmail(loginReq.getEmail()); + if (user == null) { + log.error("User not found for email: {}", loginReq.getEmail()); + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); + JWTToken jwtToken = new JWTToken(token, new LoginResponse(user.getId(), user.getEmail(), user.getFirstName(), + user.getLastName(), roleResponseBean, user.getPhoneNumber(), user.getAddress(), user.getOrganization(), + user.getCountry(), user.getStatus(), user.getCity(), user.getLastLogin(), user.getCreatedDate(), + user.getUpdatedDate())); + log.info("Login successful for email: {}", loginReq.getEmail()); + return jwtToken; + } +} From e7466d16ec3abf04e6e6c7fafd8e57f7d57592fc Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 21 Aug 2024 20:55:13 +0530 Subject: [PATCH 010/145] Done ticket GEPAFINBE-8 --- pom.xml | 20 ++ .../tendermanagement/config/AmazonConfig.java | 34 ++ .../constants/GepafinConstant.java | 14 + .../gepafin/tendermanagement/dao/CallDao.java | 323 ++++++++++++++++++ .../tendermanagement/dao/DocumentDao.java | 80 +++++ .../tendermanagement/entities/CallEntity.java | 66 ++++ .../CallTargetAudienceChecklistEntity.java | 23 ++ .../entities/DocumentEntity.java | 31 ++ .../entities/EvaluationCriteriaEntity.java | 30 ++ .../tendermanagement/entities/FaqEntity.java | 46 +++ .../entities/LookUpDataEntity.java | 37 ++ .../tendermanagement/enums/CallTypeEnum.java | 21 ++ .../enums/DocumentTypeEnum.java | 20 ++ .../model/request/CreateCallRequest.java | 49 +++ .../model/request/DocumentReq.java | 11 + .../model/request/EvaluationCriteriaReq.java | 11 + .../model/request/FaqReq.java | 13 + .../model/request/LookUpDataReq.java | 11 + .../model/response/CallResponseBean.java | 42 +++ .../response/CreateCallResponseBean.java | 60 ++++ .../model/response/DocumentResponseBean.java | 21 ++ .../EvaluationCriteriaResponseBean.java | 21 ++ .../model/response/FaqResponseBean.java | 30 ++ .../model/response/LookUpDataResponse.java | 22 ++ .../repositories/CallRepository.java | 8 + ...CallTargetAudienceChecklistRepository.java | 7 + .../repositories/DocumentRepository.java | 9 + .../EvaluationCriteriaRepository.java | 7 + .../repositories/FaqRepository.java | 7 + .../repositories/LookUpDataRepository.java | 7 + .../service/AmazonS3Service.java | 20 ++ .../tendermanagement/service/CallService.java | 10 + .../service/DocumentService.java | 14 + .../service/impl/AmazonS3ServiceImpl.java | 91 +++++ .../service/impl/CallServiceImpl.java | 21 ++ .../service/impl/DocumentServiceImpl.java | 28 ++ .../gepafin/tendermanagement/util/Utils.java | 13 + .../web/rest/api/CallApi.java | 36 ++ .../web/rest/api/DocumentApi.java | 53 +++ .../web/rest/api/impl/CallApiController.java | 34 ++ .../rest/api/impl/DocumentApiController.java | 45 +++ src/main/resources/application.properties | 9 + .../db/changelog/db.changelog-1.0.0.xml | 158 +++++++++ src/main/resources/message_en.properties | 14 + src/main/resources/message_it.properties | 15 + 45 files changed, 1642 insertions(+) create mode 100644 src/main/java/net/gepafin/tendermanagement/config/AmazonConfig.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/CallDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/CallTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/DocumentTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/DocumentReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/CallResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/CallService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/DocumentService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java diff --git a/pom.xml b/pom.xml index 1572627b..ac87bfdd 100644 --- a/pom.xml +++ b/pom.xml @@ -80,6 +80,26 @@ spring-boot-starter-test test + + + com.amazonaws + aws-java-sdk-s3 + 1.12.312 + + + + com.amazonaws + aws-java-sdk-core + 1.12.341 + + + + commons-io + commons-io + 2.11.0 + + + diff --git a/src/main/java/net/gepafin/tendermanagement/config/AmazonConfig.java b/src/main/java/net/gepafin/tendermanagement/config/AmazonConfig.java new file mode 100644 index 00000000..878cd12f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/AmazonConfig.java @@ -0,0 +1,34 @@ +package net.gepafin.tendermanagement.config; + +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AmazonConfig { + + @Value("${aws.access.key.id}") + private String accessKey; + + @Value("${aws.secret.access.key}") + private String secretKey; + + @Value("${aws.s3.region}") + private String region; + + @Bean + public AmazonS3 mementoBucket() { + AWSCredentials awsCredentials = + new BasicAWSCredentials(accessKey, secretKey); + return AmazonS3ClientBuilder + .standard() + .withRegion(region) + .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 7d00913f..cdb9e573 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -24,4 +24,18 @@ public class GepafinConstant { public static final String DELETE_REGION_SUCCESS_MSG = "delete.region.success"; public static final String REGION_NOT_FOUND_MSG = "user.region.not.found"; public static final String PASSWORD_DOESNT_MATCH ="password.doesnt.match"; + public static final String USER_NOT_EXIST_MSG = "user.not.exist"; + public static final String REGION_NOT_FOUND = "region.not.found"; + public static final String USER_ID_NOT_NULL_MSG = "user.id.not.null"; + public static final String QUESTION_NOT_EMPTY_MSG = "question.not.empty"; + public static final String NAME_NOT_EMPTY_MSG = "name.not.empty"; + public static final String TYPE_NOT_EMPTY_MSG = "type.not.empty"; + public static final String REGION_NOT_NULL_MSG = "region.not.null"; + public static final String AMOUNT_GREATER_THAN_ZERO_MSG = "amount.greater.than.zero"; + public static final String LOOK_UP_DATA_NOT_VALID_MSG = "look.up.data.not.valid"; + public static final String FILES_UPLOADED_MSG = "files.uploaded"; + public static final String CALL_CREATED_SUCCESSFULLY_MSG = "call.created.successfully"; + public static final String FILE_DELETED_SUCCESSFULLY_MSG="file.deleted.successfully"; + public static final String DOCUMENT_NOT_FOUND="document.not.found"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java new file mode 100644 index 00000000..fc2b966c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -0,0 +1,323 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import net.gepafin.tendermanagement.enums.CallTypeEnum; +import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.repositories.*; +import net.gepafin.tendermanagement.service.AmazonS3Service; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; + +@Component +public class CallDao { + + @Autowired + private CallRepository callRepository; + + @Autowired + private DocumentRepository documentRepository; + + @Autowired + private EvaluationCriteriaRepository evaluationCriteriaRepository; + + @Autowired + private FaqRepository faqRepository; + + @Autowired + private RegionRepository regionRepository; + + @Autowired + private LookUpDataRepository lookUpDataRepository; + + @Autowired + private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; + + public CreateCallResponseBean createCall(CreateCallRequest createCallRequest) { + try { + CreateCallResponseBean createCallResponseBean=null; + CallEntity callEntity = convertToCallEntity(createCallRequest); + List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity); + List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); + List imageEntities=convertToDocumentEntities(createCallRequest.getImages(),callEntity); + List faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity); + List amiedTo=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.AIMED_TO); + List checkList=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.CHECKLIST); + createCallResponseBean= assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, documentEntities, faqEntities,imageEntities); + createCallResponseBean.setAimedTo(amiedTo); + createCallResponseBean.setCheckList(checkList); + return createCallResponseBean; + } catch (Exception e) { + throw new RuntimeException("Error processing create call request", e); + } + } + + + public CallEntity convertToCallEntity(CreateCallRequest createCallRequest) { + CallEntity callEntity = new CallEntity(); + validateCallEntity(createCallRequest.getRegionId(), createCallRequest.getAmount()); + RegionEntity region = regionRepository.findById(createCallRequest.getRegionId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND))); + callEntity.setRegion(region); + callEntity.setName(createCallRequest.getName()); + callEntity.setDescriptionShort(createCallRequest.getDescriptionShort()); + callEntity.setDescriptionLong(createCallRequest.getDescriptionLong()); + callEntity.setStartDate(createCallRequest.getStartDate()); + callEntity.setEndDate(createCallRequest.getEndDate()); + callEntity.setStatus(String.valueOf(createCallRequest.getStatus())); + callEntity.setAmountMax(createCallRequest.getAmountMax()); + callEntity.setAmount(createCallRequest.getAmountMax()); + callEntity.setThreshold(createCallRequest.getThreshold()); + callEntity.setConfidi(false); + if(createCallRequest.getConfidi()!=null){ + callEntity.setConfidi(createCallRequest.getConfidi()); + } + callEntity.setDocumentation_requested(createCallRequest.getDocumentationRequested()); + callEntity = callRepository.save(callEntity); + return callEntity; + } + + public List convertToEvaluationCriteriaEntities(List criteriaReqList, CallEntity callEntity) { + List evaluationCriteriaEntities = criteriaReqList.stream().map(req -> convertToEvaluationCriteriaEntity(req, callEntity)).collect(Collectors.toList()); + evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); + return evaluationCriteriaEntities; + } + + private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, CallEntity callEntity) { + EvaluationCriteriaEntity criteriaEntity = new EvaluationCriteriaEntity(); + validateEvolutionCrieteriaEntity(criteriaReq.getName()); + criteriaEntity.setName(criteriaReq.getName()); + criteriaEntity.setDescription(criteriaReq.getValue()); + criteriaEntity.setScore(criteriaReq.getScore()); + criteriaEntity.setCall(callEntity); + return criteriaEntity; + } + + + public List convertToDocumentEntities(List documentReqList, CallEntity callEntity) { + List documentEntities = documentReqList.stream().map(req -> convertToDocumentEntity(req, callEntity)).collect(Collectors.toList()); + documentRepository.saveAll(documentEntities); + return documentEntities; + } + + private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { + DocumentEntity documentEntity = new DocumentEntity(); + validateDocumentEntity(documentReq.getFileName()); + documentEntity.setFileName(documentReq.getFileName()); + documentEntity.setFilePath(documentReq.getUrl()); + documentEntity.setCall(callEntity); + return documentEntity; + } + + + public List convertToFaqEntities(List faqReqList, CallEntity callEntity) { + List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity)).collect(Collectors.toList()); + faqRepository.saveAll(faqEntities); + return faqEntities; + } + + private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity) { + FaqEntity faqEntity = new FaqEntity(); + validateFaqEntity(faqReq.getQuestion()); +// UserEntity userEntity= userRepository.findById(1l) +// .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); +// faqEntity.setUser(userEntity); + faqEntity.setIsVisible(true); + if(faqReq.getIsVisible()!=null){ + faqEntity.setIsVisible(faqReq.getIsVisible()); + } + faqEntity.setQuestionShort(faqReq.getQuestionShort()); + faqEntity.setQuestion(faqReq.getQuestion()); + if(faqReq.getResponse()!=null ||faqReq.getResponseShort()!=null){ + faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + } + faqEntity.setResponseShort(faqReq.getResponseShort()); + faqEntity.setResponse(faqReq.getResponse()); + faqEntity.setCall(callEntity); + return faqEntity; + } + + public void validateFaqEntity( String question) { + if (!StringUtils.hasText(question)) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.QUESTION_NOT_EMPTY_MSG)); + } + } + + public void validateDocumentEntity(String name) { + if (!StringUtils.hasText(name)) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); + } + } + + public void validateEvolutionCrieteriaEntity(String name) { + if (!StringUtils.hasText(name)) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); + } + } + + public void validateCallEntity(Long regionId, BigDecimal fundingAmount) { + if (regionId == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); + } + + if (fundingAmount == null || fundingAmount.compareTo(BigDecimal.ZERO) <= 0) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); + } + } + public CreateCallResponseBean convertToCallResponseBean(CallEntity callEntity) { + CreateCallResponseBean createCallResponseBean = new CreateCallResponseBean(); + createCallResponseBean.setId(callEntity.getId()); + createCallResponseBean.setName(callEntity.getName()); + createCallResponseBean.setDates(List.of(callEntity.getStartDate(), callEntity.getEndDate())); + createCallResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); + createCallResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); + createCallResponseBean.setStatus(CallTypeEnum.valueOf(callEntity.getStatus())); + createCallResponseBean.setRegionId(callEntity.getRegion().getId()); + createCallResponseBean.setAmount(callEntity.getAmount()); + createCallResponseBean.setAmountMax(callEntity.getAmountMax()); + createCallResponseBean.setContactInfo(callEntity.getContactInfo()); + createCallResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); + createCallResponseBean.setThreshold(callEntity.getThreshold()); + createCallResponseBean.setDocumentationReqested(callEntity.getDocumentation_requested()); + createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); + createCallResponseBean.setCreatedDate(callEntity.getCreatedDate()); + createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); + return createCallResponseBean; + } + public EvaluationCriteriaResponseBean convertToEvaluationCriteriaResponseBean(EvaluationCriteriaEntity entity) { + EvaluationCriteriaResponseBean responseBean = new EvaluationCriteriaResponseBean(); + responseBean.setId(entity.getId()); + responseBean.setName(entity.getName()); + responseBean.setDescription(entity.getDescription()); + responseBean.setScore(entity.getScore()); + responseBean.setCreatedDate(entity.getCreatedDate()); + responseBean.setUpdatedDate(entity.getUpdatedDate()); + return responseBean; + } + public DocumentResponseBean convertToDocumentResponseBean(DocumentEntity entity) { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(entity.getId()); + responseBean.setName(entity.getFileName()); + responseBean.setDescription(entity.getDescription()); + responseBean.setFilePath(entity.getFilePath()); + responseBean.setCreatedDate(entity.getCreatedDate()); + responseBean.setUpdatedDate(entity.getUpdatedDate()); + return responseBean; + } + public FaqResponseBean convertToFaqResponseBean(FaqEntity entity) { + FaqResponseBean responseBean = new FaqResponseBean(); + responseBean.setId(entity.getId()); + responseBean.setQuestionShort(entity.getQuestionShort()); + responseBean.setResponseShort(entity.getResponseShort()); + responseBean.setResponse(entity.getResponse()); + responseBean.setQuestion(entity.getQuestion()); + responseBean.setUserId(entity.getUser().getId()); + responseBean.setIsVisible(entity.getIsVisible()); + responseBean.setCreatedDate(entity.getCreatedDate()); + responseBean.setUpdatedDate(entity.getUpdatedDate()); + return responseBean; + } + public CreateCallResponseBean assembleCreateCallResponseBean( + CallEntity callEntity, + List evaluationCriteriaEntities, + List documentEntities, + List faqEntities,List images) { + + CreateCallResponseBean callResponseBean = convertToCallResponseBean(callEntity); + + List evaluationCriteriaResponseBeans = evaluationCriteriaEntities.stream() + .map(this::convertToEvaluationCriteriaResponseBean) + .collect(Collectors.toList()); + + List documentResponseBeans = documentEntities.stream() + .map(this::convertToDocumentResponseBean) + .collect(Collectors.toList()); + + List faqResponseBeans = faqEntities.stream() + .map(this::convertToFaqResponseBean) + .collect(Collectors.toList()); + + List imagesResponseBean = images.stream() + .map(this::convertToDocumentResponseBean) + .collect(Collectors.toList()); + CreateCallResponseBean createCallResponseBean =callResponseBean; + createCallResponseBean.setCriteria(evaluationCriteriaResponseBeans); + createCallResponseBean.setDocs(documentResponseBeans); + createCallResponseBean.setFaq(faqResponseBeans); + createCallResponseBean.setImages(imagesResponseBean); + return createCallResponseBean; + } + public List convertLookUpDataEntities(List lookUpData, CallEntity callEntity, LookUpDataEntity.LookUpDataTypeEnum type) { + List lookUpDataEntities = lookUpData.stream() + .map(req -> convertLookUpDataRequestIntoLookUpDataEntity(req, type)) + .collect(Collectors.toList()); + + lookUpDataRepository.saveAll(lookUpDataEntities); + + return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities); + } + + private List createCallTargetAudienceCheckList(CallEntity callEntity, List lookUpDataEntities) { + List lookUpDataResponses=new ArrayList<>(); + List callTargetAudienceChecklistEntities=new ArrayList<>(); + for(LookUpDataEntity lookUpDataEntity:lookUpDataEntities){ + CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity=new CallTargetAudienceChecklistEntity(); + callTargetAudienceChecklistEntity.setIsValidated(false); + callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); + callTargetAudienceChecklistEntity.setCall(callEntity); + callTargetAudienceChecklistEntities.add(callTargetAudienceChecklistEntity); + lookUpDataResponses.add(convertToLookUpDataResponseBean(lookUpDataEntity,callTargetAudienceChecklistEntity)); + } + callTargetAudienceChecklistRepository.saveAll(callTargetAudienceChecklistEntities); + return lookUpDataResponses; + } + + private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, LookUpDataEntity.LookUpDataTypeEnum type) { + if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(BigDecimal.ZERO)) { + LookUpDataEntity newEntity = new LookUpDataEntity(); + newEntity.setValue(req.getValue()); + newEntity.setType(type.getValue()); + return newEntity; + } + + return lookUpDataRepository.findById(req.getLookUpDataId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + } + + private CallTargetAudienceChecklistEntity createChecklistEntity(CallEntity callEntity, LookUpDataEntity lookUpDataEntity) { + CallTargetAudienceChecklistEntity checklistEntity = new CallTargetAudienceChecklistEntity(); + checklistEntity.setCall(callEntity); + checklistEntity.setLookupData(lookUpDataEntity); + checklistEntity.setIsValidated(false); + return checklistEntity; + } + + public LookUpDataResponse convertToLookUpDataResponseBean(LookUpDataEntity lookUpDataEntity,CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { + LookUpDataResponse lookUpDataResponse = new LookUpDataResponse(); + lookUpDataResponse.setId(callTargetAudienceChecklistEntity.getId()); + lookUpDataResponse.setLookUpDataId(lookUpDataEntity.getId()); + lookUpDataResponse.setValue(lookUpDataEntity.getValue()); + lookUpDataResponse.setTitle(lookUpDataEntity.getTitle()); + lookUpDataResponse.setCreatedDate(lookUpDataEntity.getCreatedDate()); + lookUpDataResponse.setUpdatedDate(lookUpDataEntity.getUpdatedDate()); + return lookUpDataResponse; + } +} + + + diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java new file mode 100644 index 00000000..3c5cd708 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -0,0 +1,80 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.repositories.DocumentRepository; +import net.gepafin.tendermanagement.service.AmazonS3Service; +import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.apache.commons.io.FilenameUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class DocumentDao { + + @Autowired + private AmazonS3Service amazonS3Service; + + @Autowired + private DocumentRepository documentRepository; + + @Autowired + private CallDao callDao; + + @Value("${aws.s3.bucket.name}") + private String bucketName; + + @Value("${aws.s3.url.folder}") + private String s3Folder; + + @Value("${aws.s3.url}") + private String s3Url; + + public List uploadFiles(List files, DocumentTypeEnum fileType) { + List documentEntities = new ArrayList<>(); + + for (MultipartFile file : files) { + try { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + String fileName = StringUtils.cleanPath(file.getOriginalFilename()); + String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); + fileName = (firstNameContain + "." + extension); + String filepath = amazonS3Service.upload(fileName,file); + DocumentEntity documentEntity = new DocumentEntity(); + documentEntity.setFileName(fileName); + documentEntity.setType(fileType.getValue()); + documentEntity.setFilePath(filepath); + documentEntities.add(documentEntity); + } catch (IOException e) {} + } + documentRepository.saveAll(documentEntities); + return documentEntities.stream() + .map(callDao::convertToDocumentResponseBean) + .collect(Collectors.toList()); + } + public Void deleteFile(Long documentId){ + DocumentEntity documentEntity= documentRepository.findById(documentId); + if(documentEntity==null){ + new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); + } + String fileName= Utils.extractFileName(documentEntity.getFilePath()); + try { + amazonS3Service.delete(bucketName, fileName); + documentRepository.delete(documentEntity); + }catch (Exception e){} + return null; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java new file mode 100644 index 00000000..1ee48d6b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -0,0 +1,66 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import lombok.Builder; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Entity +@Table(name = "CALL") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CallEntity extends BaseEntity { + + @Column(name = "NAME", nullable = false, length = 255) + private String name; + + @Column(name = "DESCRIPTION_SHORT", columnDefinition = "TEXT") + private String descriptionShort; + + @Column(name = "DESCRIPTION_LONG", columnDefinition = "TEXT") + private String descriptionLong; + + @Column(name = "START_DATE", nullable = false) + private LocalDateTime startDate; + + @Column(name = "END_DATE", nullable = false) + private LocalDateTime endDate; + + @Column(name = "STATUS", nullable = false, length = 255) + private String status; + + @ManyToOne + @JoinColumn(name = "REGION_ID", nullable = false, foreignKey = @ForeignKey(name = "fk_region_call")) + private RegionEntity region; + + @Column(name = "AMOUNT", nullable = false) + private BigDecimal amount; + + @Column(name = "AMOUNT_MAX", nullable = false) + private BigDecimal amountMax; + + @Column(name = "CONTACT_INFO", columnDefinition = "TEXT") + private String contactInfo; + + @Column(name = "SUBMISSION_METHOD", columnDefinition = "TEXT") + private String submissionMethod; + + @Column(name = "THRESHOLD", nullable = false) + private Integer threshold; + + @Column(name="DOCUMENTATION_REQUESTED",columnDefinition = "TEXT") + private String documentation_requested; + + @Column(name = "PRIORITY_AREA", columnDefinition = "TEXT") + private String priorityArea; + + @Column(name = "CONFIDI") + private Boolean confidi; +} + diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java new file mode 100644 index 00000000..be94ee59 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Table(name = "CALL_TARGET_AUDIENCE_CHECKLIST") +@Data +public class CallTargetAudienceChecklistEntity extends BaseEntity{ + + @ManyToOne + @JoinColumn(name = "CALL_ID") + private CallEntity call; + + @ManyToOne + @JoinColumn(name = "LOOKUP_DATA_ID") + private LookUpDataEntity lookupData; + + @Column(name = "IS_VALIDATED") + private Boolean isValidated; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java new file mode 100644 index 00000000..5a15351c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java @@ -0,0 +1,31 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import lombok.Builder; + +@Entity +@Table(name = "DOCUMENT") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class DocumentEntity extends BaseEntity{ + @Column(name = "FILE_NAME", length = 255) + private String fileName; + + @Column(name = "FILE_PATH", length = 255) + private String filePath; + + @Column(name="TYPE") + private String type; + + @ManyToOne + @JoinColumn(name = "CALL_ID") + private CallEntity call; + + @Column(name = "DESCRIPTION", columnDefinition = "TEXT") + private String description; +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java new file mode 100644 index 00000000..539d9c30 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java @@ -0,0 +1,30 @@ +package net.gepafin.tendermanagement.entities; +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import lombok.Builder; + + +@Entity +@Table(name = "EVALUATION_CRITERIA") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class EvaluationCriteriaEntity extends BaseEntity { + + @ManyToOne + @JoinColumn(name = "CALL_ID", nullable = false) + private CallEntity call; + + @Column(name = "NAME", nullable = false, columnDefinition = "TEXT") + private String name; + + @Column(name = "DESCRIPTION", columnDefinition = "TEXT") + private String description; + + @Column(name = "SCORE", nullable = false) + private Integer score; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java new file mode 100644 index 00000000..aa521521 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java @@ -0,0 +1,46 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import lombok.Builder; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "FAQ") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class FaqEntity extends BaseEntity { + + @ManyToOne + @JoinColumn(name = "CALL_ID", nullable = false) + private CallEntity call; + + @ManyToOne + @JoinColumn(name = "USER_ID", nullable = false, foreignKey = @ForeignKey(name = "fk_user_faq")) + private UserEntity user; + + @Column(name = "IS_VISIBLE", nullable = false) + private Boolean isVisible; + + @Column(name = "QUESTION_SHORT", length = 255) + private String questionShort; + + @Column(name = "QUESTION", columnDefinition = "TEXT") + private String question; + + @Column(name = "RESPONSE_SHORT", length = 255) + private String responseShort; + + @Column(name = "RESPONSE", columnDefinition = "TEXT") + private String response; + + @Column(name = "RESPONSE_DATE") + private LocalDateTime responseDate; + +} + diff --git a/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java new file mode 100644 index 00000000..41ca9ba7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java @@ -0,0 +1,37 @@ +package net.gepafin.tendermanagement.entities; + +import com.fasterxml.jackson.annotation.JsonValue; +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Table(name = "LOOKUP_DATA") +@Data +public class LookUpDataEntity extends BaseEntity{ + + @Column(name = "TITLE", length = 255, nullable = true) + private String title; + + @Column(name = "TYPE", length = 255, nullable = false) + private String type; + + @Column(name = "VALUE", columnDefinition = "TEXT", nullable = true) + private String value; + + public enum LookUpDataTypeEnum { + CHECKLIST("CHECKLIST"), + AIMED_TO("AIMED_TO"), + EVALUATION_CRITERIA("EVALUATION_CRITERIA"); + + private String value; + + LookUpDataTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/CallTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/CallTypeEnum.java new file mode 100644 index 00000000..46b88869 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/CallTypeEnum.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum CallTypeEnum { + + DRAFT("DRAFT"), + PUBLISH("PUBLISH"), + EXPIRE("EXPIRE"); + + private String value; + + CallTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/DocumentTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/DocumentTypeEnum.java new file mode 100644 index 00000000..d5275796 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/DocumentTypeEnum.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum DocumentTypeEnum { + + DOCUMENT("DOCUMENT"), + IMAGES("IMAGES"); + + private String value; + + DocumentTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java new file mode 100644 index 00000000..80d828fc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java @@ -0,0 +1,49 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.CallTypeEnum; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class CreateCallRequest { + + private String name; + + private String descriptionShort; + + private String descriptionLong; + + private LocalDateTime startDate; + + private LocalDateTime endDate; + + private Long regionId; + + private BigDecimal amount; + + private BigDecimal amountMax; + + private List aimedTo; + + private String documentationRequested; + + private Integer threshold; + + private Boolean Confidi; + + List criteria; + + private List faq; + + private List checkList; + + private List docs; + + private List images; + + private CallTypeEnum status; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/DocumentReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/DocumentReq.java new file mode 100644 index 00000000..a2f65bba --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/DocumentReq.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class DocumentReq { + + private Long id; + private String url; + private String fileName; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java new file mode 100644 index 00000000..a8b90e1c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class EvaluationCriteriaReq { + + private String name; + private String value; + private Integer score; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java new file mode 100644 index 00000000..de9f5225 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FaqReq { + + private Boolean isVisible; + private String questionShort; + private String question; + private String responseShort; + private String response; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java new file mode 100644 index 00000000..18b847b4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class LookUpDataReq { + + private Long lookUpDataId; + + private String value; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponseBean.java new file mode 100644 index 00000000..0efff823 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponseBean.java @@ -0,0 +1,42 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class CallResponseBean { + + + private Long id; + + private String title; + + private String description; + + private LocalDateTime startDate; + + private LocalDateTime endDate; + + private String status; + + private RegionResponseBean region; + + private BigDecimal fundingAmount; + + private String contactInfo; + + private String submissionMethod; + + private Integer totalScore; + + private Integer minimumScore; + + private String priorityArea; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java new file mode 100644 index 00000000..b913f85b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java @@ -0,0 +1,60 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.CallTypeEnum; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class CreateCallResponseBean { + + private Long id; + + private String name; + + private String descriptionShort; + + private String descriptionLong; + + private List dates; + + private CallTypeEnum status; + + private Long regionId; + + private BigDecimal amount; + + private BigDecimal amountMax; + + private String contactInfo; + + private String submissionMethod; + + private Integer threshold; + + private String priorityArea; + + private String documentationReqested; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; + + private List aimedTo; + + private List criteria; + + private List docs; + + private List faq; + + private List images; + + private List checkList; + +} + + + diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java new file mode 100644 index 00000000..82aa9b9a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class DocumentResponseBean { + + private Long id; + + private String name; + + private String filePath; + + private String description; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java new file mode 100644 index 00000000..29cfed21 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class EvaluationCriteriaResponseBean { + + private Long id; + + private String name; + + private String description; + + private Integer score; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java new file mode 100644 index 00000000..fdc4be63 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java @@ -0,0 +1,30 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + + +import java.time.LocalDateTime; + +@Data +public class FaqResponseBean { + + private Long id; + + private Long userId; + + private Boolean isVisible; + + private String questionShort; + + private String question; + + private String responseShort; + + private String response; + + private LocalDateTime responseDate; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java new file mode 100644 index 00000000..27811e63 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class LookUpDataResponse { + + private Long id; + + private Long lookUpDataId; + + private String title; + + private String value; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java new file mode 100644 index 00000000..ef6e144f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -0,0 +1,8 @@ +package net.gepafin.tendermanagement.repositories; +import net.gepafin.tendermanagement.entities.CallEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CallRepository extends JpaRepository { + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java new file mode 100644 index 00000000..fe70f982 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java @@ -0,0 +1,7 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CallTargetAudienceChecklistRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java new file mode 100644 index 00000000..d8d4f07a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.repositories; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DocumentRepository extends JpaRepository { + + DocumentEntity findById(Long id); +} + diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java new file mode 100644 index 00000000..057566a6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java @@ -0,0 +1,7 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EvaluationCriteriaRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java new file mode 100644 index 00000000..9453ade3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -0,0 +1,7 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.FaqEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface FaqRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java new file mode 100644 index 00000000..e4ffb08a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java @@ -0,0 +1,7 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.LookUpDataEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface LookUpDataRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java new file mode 100644 index 00000000..188d131a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.service; + + +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; + +@Component +public interface AmazonS3Service { + + + public String upload(String fileName, + MultipartFile file) throws IOException; + + public Boolean delete(String bucketName ,String fileName); + + InputStream getFile(String filePath) throws IOException; +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java new file mode 100644 index 00000000..5f688af3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; + +public interface CallService { + + CreateCallResponseBean createCall(CreateCallRequest createCallRequest); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java new file mode 100644 index 00000000..806d81cc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +public interface DocumentService { + + public List uploadFile(List files, DocumentTypeEnum fileType); + + public Void deleteFile(Long documentId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java new file mode 100644 index 00000000..ad865d13 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -0,0 +1,91 @@ +package net.gepafin.tendermanagement.service.impl; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.*; +import net.gepafin.tendermanagement.service.AmazonS3Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + + +@Service +public class AmazonS3ServiceImpl implements AmazonS3Service { + + @Autowired + private AmazonS3 amazonS3; + + @Autowired + private Environment environment; + + @Value("${aws.s3.bucket.name}") + private String bucketName; + + @Value("${aws.s3.url.folder}") + private String s3Folder; + + @Value("${aws.s3.url}") + private String s3Url; + + + @Override + public String upload(String fileName, + MultipartFile file) throws IOException { + + String path = bucketName+"/"+s3Folder; + + InputStream inputStream = file.getInputStream(); + + ObjectMetadata objectMetadata = new ObjectMetadata(); + Map metadata = new HashMap<>(); + metadata.put("Content-Type", file.getContentType()); + metadata.put("Content-Length", String.valueOf(file.getSize())); + + Optional> optionalMetaData = Optional.of(metadata); + optionalMetaData.ifPresent(map -> { + if (!map.isEmpty()) { + map.forEach(objectMetadata::addUserMetadata); + } + }); + + if(Boolean.FALSE.equals(isTestProfileActivated())) { + amazonS3.putObject(path, fileName, inputStream, objectMetadata); + } + return s3Url + s3Folder +"/"+ fileName; + } + + @Override + public Boolean delete(String bucketName,String fileName) { + + final DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, fileName); + if(Boolean.FALSE.equals(isTestProfileActivated())) { + amazonS3.deleteObject(deleteObjectRequest); + } + return true; + } + + public Boolean isTestProfileActivated() { + String[] activeProfiles = environment.getActiveProfiles(); + return Arrays.stream(activeProfiles).anyMatch("test"::equals); + } + + @Override + public InputStream getFile(String filePath) throws IOException { + try { + String path = bucketName+ s3Folder +"/"; + GetObjectRequest getObjectRequest = new GetObjectRequest(path, filePath); + S3Object s3Object = amazonS3.getObject(getObjectRequest); + return s3Object.getObjectContent(); + } catch (AmazonS3Exception e) { + throw new IOException("Error getting file from Amazon S3", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java new file mode 100644 index 00000000..7e59aff6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.dao.CallDao; +import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.service.CallService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +@Service +public class CallServiceImpl implements CallService { + + @Autowired + private CallDao callDao; + + @Override + public CreateCallResponseBean createCall(CreateCallRequest createCallRequest) { + return callDao.createCall(createCallRequest); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java new file mode 100644 index 00000000..e7bf864e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.dao.DocumentDao; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.service.DocumentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@Service +public class DocumentServiceImpl implements DocumentService { + + + @Autowired + private DocumentDao fileDao; + + @Override + public List uploadFile(List files, DocumentTypeEnum fileType) { + return fileDao.uploadFiles(files,fileType); + } + @Override + public Void deleteFile(Long documentId){ + return fileDao.deleteFile(documentId); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index aa1fe35b..ee81849b 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -46,4 +46,17 @@ public class Utils { } return null; } + public static String extractFileName(String filePath) { + if (filePath == null || filePath.isEmpty()) { + return null; + } + int lastSlashIndex = filePath.lastIndexOf('/'); + + if (lastSlashIndex >= 0 && lastSlashIndex < filePath.length() - 1) { + return filePath.substring(lastSlashIndex + 1); + } else { + return filePath; + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java new file mode 100644 index 00000000..a6c9bfc0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -0,0 +1,36 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + + +public interface CallApi { + + @Operation(summary = "API to create call", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> createCall( + @Parameter(description = "Call request object", required = true) + @Valid @RequestBody CreateCallRequest createCallRequest); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java new file mode 100644 index 00000000..4c3386c6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java @@ -0,0 +1,53 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +public interface DocumentApi { + + @Operation(summary = "Api to upload a file", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, + @RequestParam("file") List files, + @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + @Operation(summary = "API to delete a file by document id", + responses = { + @ApiResponse(responseCode = "200", description = "File deleted successfully"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @DeleteMapping(value = "/deleteFile") + default ResponseEntity> deleteFile(HttpServletRequest httpServletRequest, + @RequestParam( "id") Long id) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java new file mode 100644 index 00000000..5e68ecbd --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -0,0 +1,34 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.web.rest.api.CallApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/call}") +public class CallApiController implements CallApi { + + @Autowired + private CallService callService; + + + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> createCall(CreateCallRequest createCallRequest) { + CreateCallResponseBean createCallResponseBean = callService.createCall(createCallRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java new file mode 100644 index 00000000..d4a151b0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java @@ -0,0 +1,45 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.DocumentService; +import net.gepafin.tendermanagement.web.rest.api.DocumentApi; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@RestController +@RequestMapping("${openapi.swaggerBflowsMiddleware.base-path:/v1/document}") +public class DocumentApiController implements DocumentApi { + + @Autowired + private DocumentService fileService; + + @Override + public ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, + List files, DocumentTypeEnum fileType) { + try { + List responseBeans=fileService.uploadFile(files,fileType); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); + } catch (CustomValidationException ex) { + throw ex; + } + } + @Override + public ResponseEntity> deleteFile(HttpServletRequest httpServletRequest, Long documentId) { + fileService.deleteFile(documentId); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILE_DELETED_SUCCESSFULLY_MSG))); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f72dc2c4..b4351d76 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -24,3 +24,12 @@ spring.liquibase.enabled=true # Swagger Configuration springdoc.api-docs.path=/v1/api-docs + +#aws configuration +aws.access.key.id=AKIAVWDQWCUEOSUN4LUW +aws.secret.access.key=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 +aws.s3.region=eu-west-1 +aws.s3.bucket.name=mementoresources +aws.s3.url = https://mementoresources.s3.eu-west-1.amazonaws.com/ +aws.s3.url.folder=gepafin + diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 20506096..9877f940 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -134,4 +134,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index bdbcf92b..540a6b3e 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -27,3 +27,17 @@ create.regiom.error=Error occurred while creating the region. update.region.error=Error occurred while updating the region. password.doesnt.match=Password and confirm password do not match. +#call related messages +user.not.exist=User does not exist. +region.not.found=Region not found. +user.id.not.null=User ID cannot be null. +question.not.empty=Question cannot be empty. +name.not.empty=Name cannot be empty. +type.not.empty=Type cannot be empty. +region.not.null=Region ID cannot be null. +amount.greater.than.zero=Amount must be greater than zero. +look.up.data.not.valid=Look up data entity is not valid. +files.uploaded=Files uploaded successfully. +call.created.successfully=Call created successfully. +file.deleted.successfully=File deleted successfully. +document.not.found=Document not found. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index bfd0d8f3..b6cf8f79 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -26,3 +26,18 @@ user.region.not.found=Regione non trovata. create.regiom.error=Errore durante la creazione della regione. update.region.error=Errore durante l'aggiornamento della regione. password.doesnt.match=La password e la conferma della password non corrispondono. + +#call related messages +user.not.exist=L'utente non esiste. +region.not.found=Regione non trovata. +user.id.not.null=L'ID utente non può essere nullo. +question.not.empty=La domanda non può essere vuota. +name.not.empty=Il nome non può essere vuoto. +type.not.empty=Il tipo non può essere vuoto. +region.not.null=L'ID regione non può essere nullo. +amount.greater.than.zero=L'importo del finanziamento deve essere maggiore di zero. +look.up.data.not.valid=L'entità dati di ricerca non è valida. +files.uploaded=File caricati correttamente. +call.created.successfully=Chiamata creata correttamente. +file.deleted.successfully=File eliminato con successo. +document.not.found=Documento non trovato. \ No newline at end of file From 84283ba69f0616a592cb34e3cae10be57eff2998 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 11:38:17 +0530 Subject: [PATCH 011/145] updated user table name to gepafin_user --- .../net/gepafin/tendermanagement/entities/UserEntity.java | 2 +- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java index 042fe962..719f9a5b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -12,7 +12,7 @@ import lombok.Setter; import java.time.LocalDateTime; @Entity -@Table(name = "\"USER\"") +@Table(name = "GEPAFIN_USER") @Getter @Setter public class UserEntity extends BaseEntity { diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 20506096..5406e4a5 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -86,10 +86,10 @@ - + + primaryKeyName="gepafin_user_pkey"/> @@ -105,7 +105,7 @@ - + From 5517550d7d16eaa902504fcbb57754e292ffe10e Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 11:52:33 +0530 Subject: [PATCH 012/145] added userId in the token --- .../tendermanagement/config/jwt/TokenProvider.java | 11 +++++++++-- .../gepafin/tendermanagement/model/util/JWTToken.java | 4 +--- .../service/impl/AuthenticationService.java | 8 ++------ 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java index 1964bd1c..27887e26 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java @@ -5,6 +5,8 @@ import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import jakarta.annotation.PostConstruct; +import net.gepafin.tendermanagement.entities.UserEntity; + import org.apache.commons.lang3.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +41,7 @@ public class TokenProvider { log.info("JWT Secret Key initialized."); } - public String createToken(Authentication authentication, Boolean rememberMe) { + public String createToken(Authentication authentication, Boolean rememberMe, UserEntity user) { String authorities = authentication.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.joining(",")); @@ -55,9 +57,14 @@ public class TokenProvider { validity = new Date(now + (this.tokenValidityInSeconds * 1000)); log.info("Creating token with standard validity of {} seconds.", this.tokenValidityInSeconds); } + + String payload = authentication.getName(); + if(user != null) { + payload += ":"+user.getId(); + } String token = Jwts.builder() - .setSubject(authentication.getName()) + .setSubject(payload) .claim("auth", authorities) .signWith(key, SignatureAlgorithm.HS512) .setExpiration(validity) diff --git a/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java b/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java index 53596d25..a57b7d59 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java +++ b/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java @@ -1,11 +1,9 @@ package net.gepafin.tendermanagement.model.util; import com.fasterxml.jackson.annotation.JsonProperty; + import lombok.Data; -import lombok.Getter; -import lombok.Setter; import net.gepafin.tendermanagement.model.response.LoginResponse; -import net.gepafin.tendermanagement.model.response.UserResponseBean; /** * JWTToken diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 022f3775..1d76fc3c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -19,7 +19,6 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @Service @@ -33,9 +32,6 @@ public class AuthenticationService { @Autowired private UserRepository userRepository; - @Autowired - private PasswordEncoder passwordEncoder; - @Autowired private RoleDao roleDao; @@ -51,13 +47,13 @@ public class AuthenticationService { Authentication authentication = this.authenticationManager.authenticate(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authentication); log.info("Authentication successful for email: {}", loginReq.getEmail()); - String token = tokenProvider.createToken(authentication, loginReq.getRememberMe()); - log.info("JWT token generated for email: {}", loginReq.getEmail()); UserEntity user = userRepository.findByEmail(loginReq.getEmail()); if (user == null) { log.error("User not found for email: {}", loginReq.getEmail()); throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); } + String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user); + log.info("JWT token generated for email: {}", loginReq.getEmail()); RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); JWTToken jwtToken = new JWTToken(token, new LoginResponse(user.getId(), user.getEmail(), user.getFirstName(), user.getLastName(), roleResponseBean, user.getPhoneNumber(), user.getAddress(), user.getOrganization(), From f8f58689c4651e51057e4b1c5b260e04978def37 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 22 Aug 2024 12:32:27 +0530 Subject: [PATCH 013/145] added userId in the faq table --- pom.xml | 8 ++ .../config/jwt/TokenProvider.java | 92 ++++++++++++++++++- .../gepafin/tendermanagement/dao/CallDao.java | 20 ++-- .../tendermanagement/service/CallService.java | 3 +- .../service/impl/CallServiceImpl.java | 12 ++- .../gepafin/tendermanagement/util/Utils.java | 10 ++ .../web/rest/api/CallApi.java | 3 +- .../web/rest/api/impl/CallApiController.java | 5 +- .../db/changelog/db.changelog-1.0.0.xml | 2 +- 9 files changed, 136 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 07434795..1b55d803 100644 --- a/pom.xml +++ b/pom.xml @@ -129,6 +129,14 @@ hibernate-validator + + com.google.code.gson + gson + 2.10.1 + + + + diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java index 27887e26..c3c54d99 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java @@ -5,8 +5,10 @@ import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import jakarta.annotation.PostConstruct; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.UserEntity; - +import net.gepafin.tendermanagement.util.Utils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,11 +20,17 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import javax.crypto.SecretKey; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; +import com.google.gson.Gson; + +import static io.micrometer.common.util.StringUtils.isEmpty; + + @Component public class TokenProvider { private final Logger log = LoggerFactory.getLogger(TokenProvider.class); @@ -35,13 +43,19 @@ public class TokenProvider { private SecretKey key; + private static final String AUTHORITIES_KEY = "auth"; + private static final String MERCHANTID="merchantId"; + + public static final String INVALID_USER = "invalid_user"; + static final String AUTH_SECRET = "X-Api-Secret"; + @PostConstruct public void init() { this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); log.info("JWT Secret Key initialized."); } - public String createToken(Authentication authentication, Boolean rememberMe, UserEntity user) { + public String createToken(Authentication authentication, Boolean rememberMe, UserEntity user) { String authorities = authentication.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.joining(",")); @@ -60,7 +74,7 @@ public class TokenProvider { String payload = authentication.getName(); if(user != null) { - payload += ":"+user.getId(); + payload += ":"+user.getId(); } String token = Jwts.builder() @@ -110,4 +124,76 @@ public class TokenProvider { return false; } } + public Map getUserInfoAndUserIdFromToken(HttpServletRequest request) { + Map userInfo = new HashMap<>(); + String authSecretHeader=request.getHeader(AUTH_SECRET); +// userInfo.put(MERCHANTID, null); + String bearerToken = request.getHeader("Authorization"); + String token = ""; + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { + token = bearerToken.substring(7, bearerToken.length()); + } + extractDetailsFromTheToken(userInfo, authSecretHeader, token); + return userInfo; + } + public Map extractDetailsFromTheToken(Map userInfo, String authSecretHeader, + String token) { + String payload = null; + Boolean isSuperAdmin = false; +// if (StringUtils.hasText(token) && token.endsWith("_superKey" + getSuperUserToken())) { +// Map payloadMap = getUserDetailsForSuperUser(token); +// payload = payloadMap.get("sub").toString(); +// isSuperAdmin = true; +// +// } else + if (!isEmpty(authSecretHeader)) { + String secret = Utils.decodeBase64String(authSecretHeader); + String[] tokenArr = secret.split("\\.", 2); + String[] merchant = tokenArr[0].split("-"); + if (ArrayUtils.isNotEmpty(merchant) && 2 <= merchant.length) { + userInfo.put(MERCHANTID, merchant[1]); + return userInfo; + } + + } else { + payload = getUserDetails(token); + } + if (payload != null && !isSuperAdmin) { + String[] payloadString = payload.split(":");{ + + if (payloadString.length > 1) { +// userInfo.put(MERCHANTID, payloadString[1]); +// userInfo.put("associatedTags", payloadString[2]); + userInfo.put("userId", payloadString[1]); + } + } + + if (payloadString.length > 1) { +// userInfo.put(MERCHANTID, payloadString[1]); +// userInfo.put("associatedTags", payloadString[2]); + userInfo.put("userId", payloadString[1]); + } + } else { + String[] payloadString = payload.split(":"); + + if (payloadString.length > 1) { + userInfo.put("userId", payloadString[1]); + } + } + + return userInfo; + } + public Map getUserDetailsForSuperUser(String token) { + Base64.Decoder decoder = Base64.getUrlDecoder(); + String[] parts = token.split("\\."); // Splitting header, payload and signature + Gson g = new Gson(); + return g.fromJson(new String(decoder.decode(parts[1])), Map.class); + } +// public String getSuperUserToken() { +// return superUserToken; +// } + public String getUserDetails(String token) { + Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody(); + return claims.getSubject(); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index fc2b966c..d034f8a7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -14,7 +14,6 @@ import net.gepafin.tendermanagement.enums.CallTypeEnum; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; -import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -48,14 +47,17 @@ public class CallDao { @Autowired private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; - public CreateCallResponseBean createCall(CreateCallRequest createCallRequest) { + @Autowired + private UserRepository userRepository; + + public CreateCallResponseBean createCall(CreateCallRequest createCallRequest, Long userId) { try { CreateCallResponseBean createCallResponseBean=null; CallEntity callEntity = convertToCallEntity(createCallRequest); List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity); List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); List imageEntities=convertToDocumentEntities(createCallRequest.getImages(),callEntity); - List faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity); + List faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); List amiedTo=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.AIMED_TO); List checkList=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.CHECKLIST); createCallResponseBean= assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, documentEntities, faqEntities,imageEntities); @@ -125,18 +127,18 @@ public class CallDao { } - public List convertToFaqEntities(List faqReqList, CallEntity callEntity) { - List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity)).collect(Collectors.toList()); + public List convertToFaqEntities(List faqReqList, CallEntity callEntity, Long userId) { + List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userId)).collect(Collectors.toList()); faqRepository.saveAll(faqEntities); return faqEntities; } - private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity) { + private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { FaqEntity faqEntity = new FaqEntity(); validateFaqEntity(faqReq.getQuestion()); -// UserEntity userEntity= userRepository.findById(1l) -// .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); -// faqEntity.setUser(userEntity); + UserEntity userEntity= userRepository.findById(userId) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + faqEntity.setUser(userEntity); faqEntity.setIsVisible(true); if(faqReq.getIsVisible()!=null){ faqEntity.setIsVisible(faqReq.getIsVisible()); diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 5f688af3..40dfd65f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -1,10 +1,11 @@ package net.gepafin.tendermanagement.service; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.model.request.CreateCallRequest; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; public interface CallService { - CreateCallResponseBean createCall(CreateCallRequest createCallRequest); + CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 7e59aff6..cb4b76bc 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -1,5 +1,7 @@ package net.gepafin.tendermanagement.service.impl; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.model.request.CreateCallRequest; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; @@ -7,6 +9,8 @@ import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Map; + @Service public class CallServiceImpl implements CallService { @@ -14,8 +18,12 @@ public class CallServiceImpl implements CallService { @Autowired private CallDao callDao; + @Autowired + private TokenProvider tokenProvider; + @Override - public CreateCallResponseBean createCall(CreateCallRequest createCallRequest) { - return callDao.createCall(createCallRequest); + public CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return callDao.createCall(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index ee81849b..21392d61 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -3,9 +3,12 @@ package net.gepafin.tendermanagement.util; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import io.micrometer.common.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import java.util.List; import java.util.stream.Collectors; @@ -58,5 +61,12 @@ public class Utils { return filePath; } } + public static String decodeBase64String(String decodedString) { + if (StringUtils.isBlank(decodedString)) { + return decodedString; + } + byte[] decode = Base64.getDecoder().decode(decodedString.getBytes(StandardCharsets.UTF_8)); + return new String(decode, StandardCharsets.UTF_8); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index a6c9bfc0..bd8863b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import net.gepafin.tendermanagement.model.request.CreateCallRequest; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; @@ -29,7 +30,7 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity> createCall( + public ResponseEntity> createCall(HttpServletRequest request, @Parameter(description = "Call request object", required = true) @Valid @RequestBody CreateCallRequest createCallRequest); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 5e68ecbd..d4165383 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.web.rest.api.impl; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.model.request.CreateCallRequest; @@ -26,8 +27,8 @@ public class CallApiController implements CallApi { @Override @Transactional(rollbackFor=Exception.class) - public ResponseEntity> createCall(CreateCallRequest createCallRequest) { - CreateCallResponseBean createCallResponseBean = callService.createCall(createCallRequest); + public ResponseEntity> createCall(HttpServletRequest request, CreateCallRequest createCallRequest) { + CreateCallResponseBean createCallResponseBean = callService.createCall(request, createCallRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index bb80c810..eb0d2fdc 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -212,7 +212,7 @@ - + From dcf8fa6cbc762bf3262225cc373113d9b6762dbb Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 22 Aug 2024 15:08:58 +0530 Subject: [PATCH 014/145] Inserted data for user,role and region --- .../constants/GepafinConstant.java | 2 + .../gepafin/tendermanagement/dao/CallDao.java | 25 +++-- .../db/changelog/db.changelog-1.0.0.xml | 97 +++++++++++++++++++ src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 2 + 5 files changed, 113 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index add54e21..75b748fe 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -40,5 +40,7 @@ public class GepafinConstant { public static final String LOGIN_SUCCESS_MSG="login.successfully"; public static final String PASSWORD_MIN_LEN ="pass.min.len.msg"; public static final String EMAIL_ALREADY_EXISTS = "email.already.exists"; + public static final String DOCUMENT_ID_NOT_FOUND="document.id.not.found"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index d034f8a7..03e65b45 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -118,8 +118,11 @@ public class CallDao { } private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { - DocumentEntity documentEntity = new DocumentEntity(); - validateDocumentEntity(documentReq.getFileName()); + validateDocumentEntity(documentReq.getId(),documentReq.getFileName()); + DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()); + if(documentEntity==null){ + throw new ResourceNotFoundException(Status.VALIDATION_ERROR,GepafinConstant.DOCUMENT_NOT_FOUND); + } documentEntity.setFileName(documentReq.getFileName()); documentEntity.setFilePath(documentReq.getUrl()); documentEntity.setCall(callEntity); @@ -160,7 +163,11 @@ public class CallDao { } } - public void validateDocumentEntity(String name) { + public void validateDocumentEntity(Long documentId,String name) { + if(documentId==null){ + throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND)); + } + if (!StringUtils.hasText(name)) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); } @@ -276,16 +283,14 @@ public class CallDao { private List createCallTargetAudienceCheckList(CallEntity callEntity, List lookUpDataEntities) { List lookUpDataResponses=new ArrayList<>(); - List callTargetAudienceChecklistEntities=new ArrayList<>(); for(LookUpDataEntity lookUpDataEntity:lookUpDataEntities){ CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity=new CallTargetAudienceChecklistEntity(); callTargetAudienceChecklistEntity.setIsValidated(false); callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); callTargetAudienceChecklistEntity.setCall(callEntity); - callTargetAudienceChecklistEntities.add(callTargetAudienceChecklistEntity); + callTargetAudienceChecklistEntity= callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity); lookUpDataResponses.add(convertToLookUpDataResponseBean(lookUpDataEntity,callTargetAudienceChecklistEntity)); } - callTargetAudienceChecklistRepository.saveAll(callTargetAudienceChecklistEntities); return lookUpDataResponses; } @@ -301,14 +306,6 @@ public class CallDao { .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); } - private CallTargetAudienceChecklistEntity createChecklistEntity(CallEntity callEntity, LookUpDataEntity lookUpDataEntity) { - CallTargetAudienceChecklistEntity checklistEntity = new CallTargetAudienceChecklistEntity(); - checklistEntity.setCall(callEntity); - checklistEntity.setLookupData(lookUpDataEntity); - checklistEntity.setIsValidated(false); - return checklistEntity; - } - public LookUpDataResponse convertToLookUpDataResponseBean(LookUpDataEntity lookUpDataEntity,CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { LookUpDataResponse lookUpDataResponse = new LookUpDataResponse(); lookUpDataResponse.setId(callTargetAudienceChecklistEntity.getId()); diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index eb0d2fdc..ffd93d80 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -292,4 +292,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 93821549..1960099c 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -41,6 +41,7 @@ files.uploaded=Files uploaded successfully. call.created.successfully=Call created successfully. file.deleted.successfully=File deleted successfully. document.not.found=Document not found. +document.id.not.found=Document ID not found. # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ff2e2019..4ed41cc8 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -41,6 +41,8 @@ files.uploaded=File caricati correttamente. call.created.successfully=Chiamata creata correttamente. file.deleted.successfully=File eliminato con successo. document.not.found=Documento non trovato. +document.id.not.found=ID documento non trovato. + # Login-related messages login.successfully=Accesso effettuato con successo. pass.min.len.msg=La password deve essere lunga almeno 8 caratteri. From 86b2dd896cd67b5e209a7a0b3a3eca8c728fa51f Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 15:37:33 +0530 Subject: [PATCH 015/145] added new exception in global exception handler --- pom.xml | 7 +- .../api/errors/BadRequestAlertException.java | 28 ++++++ .../api/errors/ForbiddenAccessException.java | 23 +++++ .../api/errors/GlobalExceptionHandler.java | 98 ++++++++++++++++++- .../errors/UnauthorizedAccessException.java | 23 +++++ src/main/resources/message_en.properties | 7 ++ src/main/resources/message_it.properties | 6 +- 7 files changed, 186 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/BadRequestAlertException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ForbiddenAccessException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/UnauthorizedAccessException.java diff --git a/pom.xml b/pom.xml index 1b55d803..713de99a 100644 --- a/pom.xml +++ b/pom.xml @@ -132,10 +132,13 @@ com.google.code.gson gson - 2.10.1 - + + org.zalando + problem-spring-web + 0.23.0 + diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/BadRequestAlertException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/BadRequestAlertException.java new file mode 100644 index 00000000..c8e6abc9 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/BadRequestAlertException.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.zalando.problem.AbstractThrowableProblem; +import org.zalando.problem.Status; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; + +public class BadRequestAlertException extends AbstractThrowableProblem { + + private static final long serialVersionUID = 1L; + + public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) { + this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey); + } + + public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) { + super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey)); + } + + private static Map getAlertParameters(String entityName, String errorKey) { + Map parameters = new HashMap<>(); + parameters.put("message", "error." + errorKey); + parameters.put("params", entityName); + return parameters; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ForbiddenAccessException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ForbiddenAccessException.java new file mode 100644 index 00000000..9b448f6a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ForbiddenAccessException.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.FORBIDDEN) +public class ForbiddenAccessException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = 1L; + private final Status status; + + public ForbiddenAccessException(Status status, String message) { + super(message); + this.status = status; + } + + public Status getStatus() { + return status; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java index 6a6b00ef..bf5d7123 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -1,18 +1,37 @@ package net.gepafin.tendermanagement.web.rest.api.errors; +import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.model.util.Response; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.core.AuthenticationException; +import org.springframework.validation.FieldError; +import org.springframework.validation.ObjectError; @ControllerAdvice public class GlobalExceptionHandler { + + public final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + @ResponseStatus(value = HttpStatus.BAD_REQUEST) @ExceptionHandler(CustomValidationException.class) - public ResponseEntity> handleCustomValidationException(CustomValidationException ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new Response<>(null, ex.getStatus(), ex.getMessage())); + @ResponseBody + public Response handleCustomValidationException(final CustomValidationException ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, ex.getStatus(), ex.getMessage()); } @ExceptionHandler(ResourceNotFoundException.class) @@ -20,4 +39,77 @@ public class GlobalExceptionHandler { return ResponseEntity.status(HttpStatus.NOT_FOUND) .body(new Response<>(null, ex.getStatus(), ex.getMessage())); } + + @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(Exception.class) + @ResponseBody + public Response handleThrowable(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.EXCEPTION_ERROR, Translator.toLocale("common_message")); + } + + @ResponseStatus(value = HttpStatus.UNAUTHORIZED) + @ExceptionHandler(AuthenticationException.class) + @ResponseBody + public Response handleInvalidTokenException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(ex.getMessage(), Status.UNAUTHORIZED, Translator.toLocale("invalid_signature")); + } + + @ResponseStatus(value = HttpStatus.UNAUTHORIZED) + @ExceptionHandler(UnauthorizedAccessException.class) + @ResponseBody + public Response unauthorizedAccessException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.UNAUTHORIZED, ex.getMessage()); + } + + @ResponseStatus(value = HttpStatus.FORBIDDEN) + @ExceptionHandler(ForbiddenAccessException.class) + @ResponseBody + public Response forbiddenAccessException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.FORBIDDEN, ex.getMessage()); + } + + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public Response handleValiationException(final MethodArgumentNotValidException ex) { + + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + final List errors = new ArrayList(); + for (final FieldError error : ex.getBindingResult().getFieldErrors()) { + errors.add(error.getField() + ": " + error.getDefaultMessage()); + } + for (final ObjectError error : ex.getBindingResult().getGlobalErrors()) { + errors.add(error.getObjectName() + ": " + error.getDefaultMessage()); + } + return new Response<>(errors, Status.VALIDATION_ERROR, Translator.toLocale("req_validation_er")); + } + + @ResponseStatus(value = HttpStatus.UNAUTHORIZED) + @ExceptionHandler(BadCredentialsException.class) + @ResponseBody + public Response handleUnAuthorizedException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.VALIDATION_ERROR, Translator.toLocale("invalid_login")); + } + + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler(BadRequestAlertException.class) + @ResponseBody + public Response badRequestAlertException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(null, Status.EXCEPTION_ERROR, ex.getMessage()); + } + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/UnauthorizedAccessException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/UnauthorizedAccessException.java new file mode 100644 index 00000000..34f1b5ef --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/UnauthorizedAccessException.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.UNAUTHORIZED) +public class UnauthorizedAccessException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = 1L; + private final Status status; + + public UnauthorizedAccessException(Status status, String message) { + super(message); + this.status = status; + } + + public Status getStatus() { + return status; + } +} diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 1960099c..1c9cc13b 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -48,6 +48,13 @@ login.successfully=Login successfully. pass.min.len.msg=Password must be at least 8 characters long. email.already.exists=A user with this email already exists. +#Global messages +common_message=Something went wrong..Please try again.. +invalid_signature=Invalid token. +invalid_login=Invalid username or password. +req_validation_er=Request Validation Error + + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 4ed41cc8..326c7329 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -48,4 +48,8 @@ login.successfully=Accesso effettuato con successo. pass.min.len.msg=La password deve essere lunga almeno 8 caratteri. email.already.exists=Esiste gi� un utente con questa email. - +#Global messages +common_message=qualcosa é andato storto. Per favore riprova +invalid_signature=Gettone non valido. +invalid_login=Nome utente o password errati +req_validation_er=Errore di convalida From 6fc8ad991d1d9a81ca65b8628fbf3b7339f0a4c7 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 22 Aug 2024 16:56:44 +0530 Subject: [PATCH 016/145] Changed description for call api --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 2 +- .../java/net/gepafin/tendermanagement/web/rest/api/CallApi.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 03e65b45..470c0819 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -121,7 +121,7 @@ public class CallDao { validateDocumentEntity(documentReq.getId(),documentReq.getFileName()); DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()); if(documentEntity==null){ - throw new ResourceNotFoundException(Status.VALIDATION_ERROR,GepafinConstant.DOCUMENT_NOT_FOUND); + throw new ResourceNotFoundException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); } documentEntity.setFileName(documentReq.getFileName()); documentEntity.setFilePath(documentReq.getUrl()); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index bd8863b5..18bb89c8 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.RequestBody; public interface CallApi { - @Operation(summary = "API to create call", + @Operation(summary = "Api to create call", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { From ad8d580528ce04ee81ed41d5b6d822030a0116e2 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 22 Aug 2024 17:07:25 +0530 Subject: [PATCH 017/145] User-Management --- .../tendermanagement/dao/RegionDao.java | 12 ++++--- .../gepafin/tendermanagement/dao/UserDao.java | 16 +++++++--- .../tendermanagement/entities/UserEntity.java | 15 --------- .../enums/RegionStatusEnum.java | 18 +++++++++++ .../enums/UserStatusEnum.java | 21 +++++++++++++ .../model/request/RegionReq.java | 3 +- .../model/request/RoleReq.java | 2 -- .../model/request/UpdateRegionReq.java | 3 +- .../model/request/UpdateUserReq.java | 3 +- .../model/request/UserReq.java | 3 +- .../model/response/RegionResponseBean.java | 3 +- .../model/response/UserResponseBean.java | 3 +- .../service/impl/AuthenticationService.java | 31 ++++++++++++++++--- 13 files changed, 98 insertions(+), 35 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/RegionStatusEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/UserStatusEnum.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java index 9277b167..40493b04 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java @@ -3,6 +3,8 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.enums.RegionStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.RegionReq; import net.gepafin.tendermanagement.model.response.RegionResponseBean; import net.gepafin.tendermanagement.repositories.RegionRepository; @@ -43,7 +45,7 @@ public class RegionDao { regionEntity.setAreaSize(regionReq.getAreaSize()); regionEntity.setPopulation(regionReq.getPopulation()); regionEntity.setEnvironmentalScore(regionReq.getEnvironmentalScore()); - regionEntity.setStatus(regionReq.getStatus()); + regionEntity.setStatus(regionReq.getStatus().getValue()); regionEntity.setHealthcareAccess(regionReq.getHealthcareAccess()); regionEntity.setInfrastructureScore(regionReq.getInfrastructureScore()); regionEntity.setPriorityArea(regionReq.getPriorityArea()); @@ -64,7 +66,7 @@ public class RegionDao { regionResponseBean.setAreaSize(regionEntity.getAreaSize()); regionResponseBean.setPopulation(regionEntity.getPopulation()); regionResponseBean.setEnvironmentalScore(regionEntity.getEnvironmentalScore()); - regionResponseBean.setStatus(regionEntity.getStatus()); + regionResponseBean.setStatus(RegionStatusEnum.valueOf(regionEntity.getStatus())); regionResponseBean.setHealthcareAccess(regionEntity.getHealthcareAccess()); regionResponseBean.setInfrastructureScore(regionEntity.getInfrastructureScore()); regionResponseBean.setPriorityArea(regionEntity.getPriorityArea()); @@ -78,11 +80,13 @@ public class RegionDao { RegionEntity existingRegion = getRegionById(id); log.info("Current region details: {}", existingRegion); log.info("New region details: {}", regionReq); - + String newStatus = regionReq.getStatus() != null ? regionReq.getStatus().getValue() : null; + if (Boolean.FALSE.equals(existingRegion.getStatus().equals(newStatus))) { + existingRegion.setStatus(newStatus); + } setIfUpdated(existingRegion::getRegionName, existingRegion::setRegionName, regionReq.getRegionName()); setIfUpdated(existingRegion::getDescription, existingRegion::setDescription, regionReq.getDescription()); setIfUpdated(existingRegion::getCountry, existingRegion::setCountry, regionReq.getCountry()); - setIfUpdated(existingRegion::getStatus, existingRegion::setStatus, regionReq.getStatus()); setIfUpdated(existingRegion::getPriorityArea, existingRegion::setPriorityArea, regionReq.getPriorityArea()); setIfUpdated(existingRegion::getPopulation, existingRegion::setPopulation, regionReq.getPopulation()); setIfUpdated(existingRegion::getAreaSize, existingRegion::setAreaSize, regionReq.getAreaSize()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index b2fd8190..8fb88a40 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -4,6 +4,8 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.CallTypeEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; @@ -70,8 +72,10 @@ public class UserDao { .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); log.info("Current user details: {}", userEntity); log.info("New user details: {}", userReq); - - setIfUpdated(userEntity::getStatus, userEntity::setStatus, userReq.getStatus()); + String newStatus = userReq.getStatus() != null ? userReq.getStatus().getValue() : null; + if (Boolean.FALSE.equals(userEntity.getStatus().equals(newStatus))) { + userEntity.setStatus(newStatus); + } setIfUpdated(userEntity::getFirstName, userEntity::setFirstName, userReq.getFirstName()); setIfUpdated(userEntity::getLastName, userEntity::setLastName, userReq.getLastName()); setIfUpdated(userEntity::getOrganization, userEntity::setOrganization, userReq.getOrganization()); @@ -91,7 +95,7 @@ public class UserDao { userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); userEntity.setEmail(userReq.getEmail()); userEntity.setFirstName(userReq.getFirstName()); - userEntity.setStatus(userReq.getStatus()); + userEntity.setStatus(userReq.getStatus().getValue()); userEntity.setLastName(userReq.getLastName()); userEntity.setOrganization(userReq.getOrganization()); userEntity.setAddress(userReq.getAddress()); @@ -113,7 +117,7 @@ public class UserDao { userResponseBean.setAddress(userEntity.getAddress()); userResponseBean.setCity(userEntity.getCity()); userResponseBean.setCountry(userEntity.getCountry()); - userResponseBean.setStatus(userEntity.getStatus()); + userResponseBean.setStatus(UserStatusEnum.valueOf(userEntity.getStatus())); RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(userEntity.getRoleEntity()); userResponseBean.setRole(roleResponseBean); userResponseBean.setLastLogin(userEntity.getLastLogin()); @@ -124,6 +128,10 @@ public class UserDao { log.info("Fetching user with ID: {}", id); UserEntity userEntity = userRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) { + log.info("User with ID: {} is not active", id); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } log.info("User found: {}", userEntity); return convertUserEntityToUserResponse(userEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java index 719f9a5b..aac82db9 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -58,19 +58,4 @@ public class UserEntity extends BaseEntity { @Column(name = "COUNTRY", length = 50, nullable = true) private String country; - public enum UserStatusEnum { - ACTIVE("ACTIVE"), - INACTIVE("INACTIVE"); - - private String value; - - UserStatusEnum(String value) { - this.value = value; - } - - @JsonValue - public String getValue() { - return value; - } - } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/RegionStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/RegionStatusEnum.java new file mode 100644 index 00000000..599e8ea2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/RegionStatusEnum.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.enums; +import com.fasterxml.jackson.annotation.JsonValue; + +public enum RegionStatusEnum { + ACTIVE("ACTIVE"), + INACTIVE("INACTIVE"); + + private String value; + + RegionStatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserStatusEnum.java new file mode 100644 index 00000000..8df4f40b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserStatusEnum.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum UserStatusEnum { + ACTIVE("ACTIVE"), + INACTIVE("INACTIVE"), + + PENDING_VERIFICATION("PENDING_VERIFICATION"); + + private String value; + + UserStatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java index fae42f3c..d078155c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java @@ -4,6 +4,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import net.gepafin.tendermanagement.enums.RegionStatusEnum; import java.math.BigDecimal; @@ -17,7 +18,7 @@ public class RegionReq { private String country; - private String status; + private RegionStatusEnum status; private String priorityArea; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java index 1e4ec6f4..f1fd7d70 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java @@ -20,8 +20,6 @@ public class RoleReq { private String permissions; - private String status; - private Long regionId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateRegionReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateRegionReq.java index 8d32dc83..1b62d403 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateRegionReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateRegionReq.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.model.request; import lombok.Getter; import lombok.Setter; +import net.gepafin.tendermanagement.enums.RegionStatusEnum; @Getter @Setter @@ -12,7 +13,7 @@ public class UpdateRegionReq { private String country; - private String status; + private RegionStatusEnum status; private String priorityArea; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java index 63eb2b89..f4a8a107 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java @@ -4,6 +4,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import net.gepafin.tendermanagement.enums.UserStatusEnum; @Getter @Setter @@ -16,6 +17,6 @@ public class UpdateUserReq { private String organization; private String address; private String city; - private String status; + private UserStatusEnum status; private String country; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java index 97a59438..07761068 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -6,6 +6,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import net.gepafin.tendermanagement.enums.UserStatusEnum; @Getter @Setter @@ -35,6 +36,6 @@ public class UserReq { private String country; - private String status; + private UserStatusEnum status; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java index 55182822..23a4088a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Getter; import lombok.Setter; +import net.gepafin.tendermanagement.enums.RegionStatusEnum; import net.gepafin.tendermanagement.model.BaseBean; import java.math.BigDecimal; @@ -13,7 +14,7 @@ public class RegionResponseBean extends BaseBean { private String regionName; private String description; private String country; - private String status; + private RegionStatusEnum status; private String priorityArea; private Long population; private BigDecimal areaSize; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java index 1dcaa944..f23b6978 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java @@ -6,6 +6,7 @@ import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.BaseBean; import java.time.LocalDateTime; @@ -32,7 +33,7 @@ public class UserResponseBean extends BaseBean { private String country; - private String status; + private UserStatusEnum status; private LocalDateTime lastLogin; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 1d76fc3c..6ad8cf5f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -10,6 +10,7 @@ import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; @@ -20,6 +21,7 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; @Service public class AuthenticationService { @@ -52,16 +54,37 @@ public class AuthenticationService { log.error("User not found for email: {}", loginReq.getEmail()); throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); } + user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + userRepository.save(user); String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user); log.info("JWT token generated for email: {}", loginReq.getEmail()); RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); - JWTToken jwtToken = new JWTToken(token, new LoginResponse(user.getId(), user.getEmail(), user.getFirstName(), - user.getLastName(), roleResponseBean, user.getPhoneNumber(), user.getAddress(), user.getOrganization(), - user.getCountry(), user.getStatus(), user.getCity(), user.getLastLogin(), user.getCreatedDate(), - user.getUpdatedDate())); + + LoginResponse loginResponse = getLoginResponse(user, roleResponseBean); + + JWTToken jwtToken = new JWTToken(token, loginResponse); log.info("Login successful for email: {}", loginReq.getEmail()); return jwtToken; } + + private static LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) { + LoginResponse loginResponse = new LoginResponse(); + loginResponse.setId(user.getId()); + loginResponse.setEmail(user.getEmail()); + loginResponse.setFirstName(user.getFirstName()); + loginResponse.setLastName(user.getLastName()); + loginResponse.setRole(roleResponseBean); + loginResponse.setPhoneNumber(user.getPhoneNumber()); + loginResponse.setAddress(user.getAddress()); + loginResponse.setOrganization(user.getOrganization()); + loginResponse.setCountry(user.getCountry()); + loginResponse.setStatus(user.getStatus()); + loginResponse.setCity(user.getCity()); + loginResponse.setLastLogin(user.getLastLogin()); + loginResponse.setCreatedDate(user.getCreatedDate()); + loginResponse.setUpdatedDate(user.getUpdatedDate()); + return loginResponse; + } } From 65feafca3f4d16e2650f3a431e601ba860f14b5d Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 17:29:15 +0530 Subject: [PATCH 018/145] added cors config --- .../TendermanagementApplication.java | 14 +++++++ .../config/SecurityConfig.java | 2 + .../gepafin/tendermanagement/dao/CallDao.java | 37 ++++++++++--------- .../web/rest/api/CallApi.java | 2 + .../web/rest/api/RoleApi.java | 10 ++--- .../api/errors/GlobalExceptionHandler.java | 3 +- 6 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java index 07a51505..943dd254 100644 --- a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java +++ b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java @@ -4,8 +4,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @EnableScheduling @ComponentScan(basePackages = {"net.gepafin.tendermanagement"}) @@ -18,6 +21,17 @@ public class TendermanagementApplication { SpringApplication.run(TendermanagementApplication.class, args); System.out.println("Spring Boot started"); } + + @Configuration + public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + + registry.addMapping("/**").allowedOrigins("http://localhost:3000") + .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD").allowCredentials(true); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 1c97a2de..62ec6911 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -14,6 +14,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; @@ -32,6 +33,7 @@ import org.springframework.web.servlet.handler.HandlerMappingIntrospector; @Configuration @EnableWebSecurity +@EnableMethodSecurity(prePostEnabled = true) public class SecurityConfig { private final TokenProvider tokenProvider; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 470c0819..b4987c81 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -50,24 +50,25 @@ public class CallDao { @Autowired private UserRepository userRepository; - public CreateCallResponseBean createCall(CreateCallRequest createCallRequest, Long userId) { - try { - CreateCallResponseBean createCallResponseBean=null; - CallEntity callEntity = convertToCallEntity(createCallRequest); - List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity); - List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); - List imageEntities=convertToDocumentEntities(createCallRequest.getImages(),callEntity); - List faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); - List amiedTo=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.AIMED_TO); - List checkList=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.CHECKLIST); - createCallResponseBean= assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, documentEntities, faqEntities,imageEntities); - createCallResponseBean.setAimedTo(amiedTo); - createCallResponseBean.setCheckList(checkList); - return createCallResponseBean; - } catch (Exception e) { - throw new RuntimeException("Error processing create call request", e); - } - } + public CreateCallResponseBean createCall(CreateCallRequest createCallRequest, Long userId) { + CreateCallResponseBean createCallResponseBean = null; + CallEntity callEntity = convertToCallEntity(createCallRequest); + List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities( + createCallRequest.getCriteria(), callEntity); + List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); + List imageEntities = convertToDocumentEntities(createCallRequest.getImages(), callEntity); + List faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); + List amiedTo = convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, + LookUpDataTypeEnum.AIMED_TO); + List checkList = convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, + LookUpDataTypeEnum.CHECKLIST); + createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, + documentEntities, faqEntities, imageEntities); + createCallResponseBean.setAimedTo(amiedTo); + createCallResponseBean.setCheckList(checkList); + return createCallResponseBean; + + } public CallEntity convertToCallEntity(CreateCallRequest createCallRequest) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 18bb89c8..b2b335de 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -13,6 +13,7 @@ import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -30,6 +31,7 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('SUPER_ADMIN')") public ResponseEntity> createCall(HttpServletRequest request, @Parameter(description = "Call request object", required = true) @Valid @RequestBody CreateCallRequest createCallRequest); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java index 2f94be9e..7225d87e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java @@ -21,7 +21,7 @@ import java.util.List; @Validated public interface RoleApi { - @Operation(summary = "API to create role", + @Operation(summary = "Api to create role", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -36,7 +36,7 @@ public interface RoleApi { @Parameter(description = " Role request object", required = true) @Valid @RequestBody RoleReq roleReq); - @Operation(summary = "API to update role", + @Operation(summary = "Api to update role", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -51,7 +51,7 @@ public interface RoleApi { @Parameter(description = "The role ID", required = true) @PathVariable("roleId") Long roleId, @Parameter(description = "Role request object", required = true) @Valid @RequestBody RoleReq roleReq); - @Operation(summary = "API to get role by id", + @Operation(summary = "Api to get role by id", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -65,7 +65,7 @@ public interface RoleApi { ResponseEntity> getRoleById( @Parameter(description = "The role ID", required = true) @PathVariable("roleId") Long roleId); - @Operation(summary = "API to get all roles", + @Operation(summary = "Api to get all roles", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -78,7 +78,7 @@ public interface RoleApi { produces = { "application/json" }) ResponseEntity>> getAllRoles(); - @Operation(summary = "API to delete role", + @Operation(summary = "Api to delete role", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java index bf5d7123..addb9a99 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authorization.AuthorizationDeniedException; import org.springframework.security.core.AuthenticationException; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; @@ -59,7 +60,7 @@ public class GlobalExceptionHandler { } @ResponseStatus(value = HttpStatus.UNAUTHORIZED) - @ExceptionHandler(UnauthorizedAccessException.class) + @ExceptionHandler({ UnauthorizedAccessException.class, AuthorizationDeniedException.class }) @ResponseBody public Response unauthorizedAccessException(final Throwable ex) { log.error(ex.getMessage()); From 54f4db42d3bcbdb94b9e3154b64ee27ec22b2cbc Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 17:40:19 +0530 Subject: [PATCH 019/145] updated security config for cors --- .../config/SecurityConfig.java | 65 +++++++++---------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 1c97a2de..d70582a8 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -1,13 +1,5 @@ package net.gepafin.tendermanagement.config; -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; -import io.swagger.v3.oas.models.servers.Server; -import net.gepafin.tendermanagement.config.jwt.JWTConfigurer; -import net.gepafin.tendermanagement.config.jwt.JWTFilter; -import net.gepafin.tendermanagement.config.jwt.TokenProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,7 +8,6 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -24,12 +15,16 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; +import net.gepafin.tendermanagement.config.jwt.JWTFilter; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; + @Configuration @EnableWebSecurity public class SecurityConfig { @@ -56,27 +51,27 @@ public class SecurityConfig { return new MvcRequestMatcher.Builder(introspector); } - @Bean - public WebSecurityCustomizer webSecurityCustomizer(MvcRequestMatcher.Builder mvc) { - return (web) -> web.ignoring() - .requestMatchers(mvc.pattern(HttpMethod.OPTIONS, "/**")) - .requestMatchers(new AntPathRequestMatcher("/i18n/**")) - .requestMatchers(new AntPathRequestMatcher("/content/**")) - .requestMatchers(new AntPathRequestMatcher("/swagger-ui/index.html")) - .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); - } - - @Bean - public CorsFilter corsFilter() { - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOrigin("*"); - config.addAllowedHeader("*"); - config.addAllowedMethod("*"); - source.registerCorsConfiguration("/**", config); - return new CorsFilter(source); - } +// @Bean +// public WebSecurityCustomizer webSecurityCustomizer(MvcRequestMatcher.Builder mvc) { +// return (web) -> web.ignoring() +// .requestMatchers(mvc.pattern(HttpMethod.OPTIONS, "/**")) +// .requestMatchers(new AntPathRequestMatcher("/i18n/**")) +// .requestMatchers(new AntPathRequestMatcher("/content/**")) +// .requestMatchers(new AntPathRequestMatcher("/swagger-ui/index.html")) +// .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); +// } +// +// @Bean +// public CorsFilter corsFilter() { +// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); +// CorsConfiguration config = new CorsConfiguration(); +// config.setAllowCredentials(true); +// config.addAllowedOrigin("*"); +// config.addAllowedHeader("*"); +// config.addAllowedMethod("*"); +// source.registerCorsConfiguration("/**", config); +// return new CorsFilter(source); +// } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { @@ -92,8 +87,6 @@ public class SecurityConfig { .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ) - .apply(new JWTConfigurer(tokenProvider)) - .and() .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class); return http.build(); From dfbd9e079733ebb881f1522ed2efbade1e452b73 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 17:55:28 +0530 Subject: [PATCH 020/145] updated code --- .../config/SecurityConfig.java | 23 +++++++++++-------- .../gepafin/tendermanagement/dao/UserDao.java | 1 - 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index cdec64f6..d9393278 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -9,6 +9,7 @@ import org.springframework.security.config.annotation.authentication.configurati import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -16,6 +17,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; import io.swagger.v3.oas.models.Components; @@ -52,16 +54,17 @@ public class SecurityConfig { MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector); } + + @Bean + public WebSecurityCustomizer webSecurityCustomizer(MvcRequestMatcher.Builder mvc) { + return (web) -> web.ignoring().requestMatchers(mvc.pattern(HttpMethod.OPTIONS, "/**")) + .requestMatchers(new AntPathRequestMatcher("/i18n/**")) + .requestMatchers(new AntPathRequestMatcher("/content/**")) + .requestMatchers(new AntPathRequestMatcher("/swagger-ui/index.html")) + .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); + } + -// @Bean -// public WebSecurityCustomizer webSecurityCustomizer(MvcRequestMatcher.Builder mvc) { -// return (web) -> web.ignoring() -// .requestMatchers(mvc.pattern(HttpMethod.OPTIONS, "/**")) -// .requestMatchers(new AntPathRequestMatcher("/i18n/**")) -// .requestMatchers(new AntPathRequestMatcher("/content/**")) -// .requestMatchers(new AntPathRequestMatcher("/swagger-ui/index.html")) -// .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); -// } // // @Bean // public CorsFilter corsFilter() { @@ -77,7 +80,7 @@ public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { - http + http .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user/login")).permitAll() diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 8fb88a40..2ca30fe6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -4,7 +4,6 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.enums.CallTypeEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; From d8a696f02c4966075601032b1447d114ce275428 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 18:15:37 +0530 Subject: [PATCH 021/145] updated code for cors --- .../TendermanagementApplication.java | 20 ------------- .../config/SecurityConfig.java | 29 +++++++++++-------- 2 files changed, 17 insertions(+), 32 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java index 943dd254..8e3f5ef8 100644 --- a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java +++ b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java @@ -2,18 +2,9 @@ package net.gepafin.tendermanagement; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @EnableScheduling -@ComponentScan(basePackages = {"net.gepafin.tendermanagement"}) -@EnableJpaRepositories(basePackages = {"net.gepafin.tendermanagement"}) -@EntityScan(basePackages = {"net.gepafin.tendermanagement"}) @SpringBootApplication public class TendermanagementApplication { @@ -21,17 +12,6 @@ public class TendermanagementApplication { SpringApplication.run(TendermanagementApplication.class, args); System.out.println("Spring Boot started"); } - - @Configuration - public class CorsConfig implements WebMvcConfigurer { - - @Override - public void addCorsMappings(CorsRegistry registry) { - - registry.addMapping("/**").allowedOrigins("http://localhost:3000") - .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD").allowCredentials(true); - } - } } diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index d9393278..2d47430e 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -15,9 +15,14 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.access.intercept.AuthorizationFilter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; import io.swagger.v3.oas.models.Components; @@ -65,18 +70,17 @@ public class SecurityConfig { } -// -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// CorsConfiguration config = new CorsConfiguration(); -// config.setAllowCredentials(true); -// config.addAllowedOrigin("*"); -// config.addAllowedHeader("*"); -// config.addAllowedMethod("*"); -// source.registerCorsConfiguration("/**", config); -// return new CorsFilter(source); -// } + @Bean + public CorsConfigurationSource corsConfigurationSource() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOrigin("http://localhost:3000"); // Change this to your frontend URL + config.addAllowedHeader("*"); + config.addAllowedMethod("*"); + source.registerCorsConfiguration("/**", config); + return source; + } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { @@ -92,6 +96,7 @@ public class SecurityConfig { .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ) + .addFilterBefore(new CorsFilter(corsConfigurationSource()), AuthorizationFilter.class) .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class); return http.build(); From 0f7574499cbf0494d636015cc53b58878d310300 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 18:31:38 +0530 Subject: [PATCH 022/145] updated code for cors --- .../TendermanagementApplication.java | 13 +++++++++ .../config/SecurityConfig.java | 29 ++++++++++--------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java index 8e3f5ef8..f9a97be8 100644 --- a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java +++ b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java @@ -2,7 +2,10 @@ package net.gepafin.tendermanagement; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @EnableScheduling @SpringBootApplication @@ -12,6 +15,16 @@ public class TendermanagementApplication { SpringApplication.run(TendermanagementApplication.class, args); System.out.println("Spring Boot started"); } + + @Configuration + public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**").allowedOrigins("http://localhost:3000") + .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD").allowCredentials(true); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 2d47430e..53b7baef 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -39,10 +39,13 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; public class SecurityConfig { private final TokenProvider tokenProvider; + + private final CorsFilter corsFilter; @Autowired - public SecurityConfig(TokenProvider tokenProvider) { + public SecurityConfig(TokenProvider tokenProvider, CorsFilter corsFilter) { this.tokenProvider = tokenProvider; + this.corsFilter = corsFilter; } @Bean @@ -70,17 +73,17 @@ public class SecurityConfig { } - @Bean - public CorsConfigurationSource corsConfigurationSource() { - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOrigin("http://localhost:3000"); // Change this to your frontend URL - config.addAllowedHeader("*"); - config.addAllowedMethod("*"); - source.registerCorsConfiguration("/**", config); - return source; - } +// @Bean +// public CorsConfigurationSource corsConfigurationSource() { +// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); +// CorsConfiguration config = new CorsConfiguration(); +// config.setAllowCredentials(true); +// config.addAllowedOrigin("http://localhost:3000"); // Change this to your frontend URL +// config.addAllowedHeader("*"); +// config.addAllowedMethod("*"); +// source.registerCorsConfiguration("/**", config); +// return source; +// } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { @@ -96,7 +99,7 @@ public class SecurityConfig { .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ) - .addFilterBefore(new CorsFilter(corsConfigurationSource()), AuthorizationFilter.class) + .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class); return http.build(); From 34646a605687403a7f75208663469be2bf585ab5 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 18:46:39 +0530 Subject: [PATCH 023/145] updated code --- .../config/SecurityConfig.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 53b7baef..1ffed20b 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -39,13 +39,10 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; public class SecurityConfig { private final TokenProvider tokenProvider; - - private final CorsFilter corsFilter; @Autowired - public SecurityConfig(TokenProvider tokenProvider, CorsFilter corsFilter) { + public SecurityConfig(TokenProvider tokenProvider) { this.tokenProvider = tokenProvider; - this.corsFilter = corsFilter; } @Bean @@ -73,17 +70,17 @@ public class SecurityConfig { } -// @Bean -// public CorsConfigurationSource corsConfigurationSource() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// CorsConfiguration config = new CorsConfiguration(); -// config.setAllowCredentials(true); -// config.addAllowedOrigin("http://localhost:3000"); // Change this to your frontend URL -// config.addAllowedHeader("*"); -// config.addAllowedMethod("*"); -// source.registerCorsConfiguration("/**", config); -// return source; -// } + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOrigin("http://localhost:3000"); + config.addAllowedMethod("*"); + config.addAllowedHeader("*"); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { @@ -99,7 +96,7 @@ public class SecurityConfig { .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ) - .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(corsFilter(), UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class); return http.build(); From 28045c1de0ccd5b766a08a91259675f58a1c1bae Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 22 Aug 2024 19:00:34 +0530 Subject: [PATCH 024/145] updated code --- .../config/SecurityConfig.java | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 1ffed20b..f000c416 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -1,5 +1,7 @@ package net.gepafin.tendermanagement.config; +import java.util.ArrayList; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -70,15 +72,34 @@ public class SecurityConfig { } +// @Bean +// public CorsFilter corsFilter() { +// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); +// CorsConfiguration config = new CorsConfiguration(); +// config.setAllowCredentials(true); +// config.addAllowedOrigin("http://localhost:3000"); +// config.addAllowedMethod("*"); +// config.addAllowedHeader("*"); +// source.registerCorsConfiguration("/**", config); +// return new CorsFilter(source); +// } + @Bean public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOrigin("http://localhost:3000"); - config.addAllowedMethod("*"); - config.addAllowedHeader("*"); - source.registerCorsConfiguration("/**", config); + config.addAllowedOrigin("*"); + config.addAllowedMethod("*"); + config.addAllowedHeader("*"); + config.setMaxAge(3600l); + + if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) { + source.registerCorsConfiguration("/v1/**", config); + source.registerCorsConfiguration("/management/**", config); + source.registerCorsConfiguration("/v1/api-docs", config); + } return new CorsFilter(source); } From b6692e206d1d92a8e7f9ef1b6395aa014f82b98a Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 23 Aug 2024 11:50:58 +0530 Subject: [PATCH 025/145] updated code for PreAuthorize role --- .../config/SecurityConfig.java | 17 ------- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/CallDao.java | 1 + .../gepafin/tendermanagement/dao/RoleDao.java | 3 ++ .../gepafin/tendermanagement/dao/UserDao.java | 12 ++--- .../tendermanagement/entities/RoleEntity.java | 6 ++- .../model/request/RoleReq.java | 4 +- .../model/request/UpdateUserReq.java | 2 - .../model/request/UserReq.java | 2 - .../model/response/RoleResponseBean.java | 1 + .../repositories/UserRepository.java | 4 +- .../service/impl/AuthenticationService.java | 45 ++++++++++--------- .../web/rest/api/CallApi.java | 2 +- .../web/rest/api/UserApi.java | 2 + .../api/impl/CustomUserDetailsService.java | 20 ++++----- .../db/changelog/db.changelog-1.0.0.xml | 15 +++++-- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 18 files changed, 71 insertions(+), 68 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index f000c416..fa2b2020 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -1,7 +1,5 @@ package net.gepafin.tendermanagement.config; -import java.util.ArrayList; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,12 +15,10 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.access.intercept.AuthorizationFilter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; @@ -71,18 +67,6 @@ public class SecurityConfig { .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); } - -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// CorsConfiguration config = new CorsConfiguration(); -// config.setAllowCredentials(true); -// config.addAllowedOrigin("http://localhost:3000"); -// config.addAllowedMethod("*"); -// config.addAllowedHeader("*"); -// source.registerCorsConfiguration("/**", config); -// return new CorsFilter(source); -// } @Bean public CorsFilter corsFilter() { @@ -109,7 +93,6 @@ public class SecurityConfig { .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user/login")).permitAll() - .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user")).permitAll() .requestMatchers("/swagger-ui/**").permitAll() .requestMatchers("/v1/api-docs/**").permitAll() .anyRequest().authenticated() diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 75b748fe..c3de4e48 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -10,6 +10,7 @@ public class GepafinConstant { public static final String UPDATE_USER_ERROR_MSG = "update_user_error_msg"; public static final String DELETE_USER_ERROR_MSG = "delete_user_error_msg"; public static final String GET_USER_SUCCESS_MSG = "get_user_success_msg"; + public static final String USER_NOT_ACTIVE_MSG = "user.not.active"; public static final String ROLE_CREATED_SUCCESS_MSG = "role.created.success"; public static final String ROLE_UPDATED_SUCCESS_MSG = "role.updated.success"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index b4987c81..179b3f4e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -19,6 +19,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index e7f4c5f9..d0c6342c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -45,6 +45,7 @@ public class RoleDao { private RoleEntity convertRoleRequestToRoleEntity(RoleReq roleReq) { RoleEntity roleEntity = new RoleEntity(); roleEntity.setRoleName(roleReq.getRoleName()); + roleEntity.setRoleType(roleReq.getRoleType()); roleEntity.setPermissions(roleReq.getPermissions()); roleEntity.setDescription(roleReq.getDescription()); roleEntity.setRegion(regionService.getRegionById(roleReq.getRegionId())); @@ -57,6 +58,7 @@ public class RoleDao { roleResponseBean.setCreatedDate(roleEntity.getCreatedDate()); roleResponseBean.setUpdatedDate(roleEntity.getUpdatedDate()); roleResponseBean.setRoleName(roleEntity.getRoleName()); + roleResponseBean.setRoleType(roleEntity.getRoleType()); roleResponseBean.setDescription(roleEntity.getDescription()); roleResponseBean.setPermissions(roleEntity.getPermissions()); RegionResponseBean regionResponseBean = regionDao.convertRegionEntityToRegionResponse(roleEntity.getRegion()); @@ -73,6 +75,7 @@ public class RoleDao { log.info("New role details: {}", roleReq); setIfUpdated(existingRole::getRoleName, existingRole::setRoleName, roleReq.getRoleName()); + setIfUpdated(existingRole::getRoleType, existingRole::setRoleType, roleReq.getRoleType()); setIfUpdated(existingRole::getDescription, existingRole::setDescription, roleReq.getDescription()); setIfUpdated(existingRole::getPermissions, existingRole::setPermissions, roleReq.getPermissions()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 2ca30fe6..dc06326f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -47,7 +47,7 @@ public class UserDao { public UserResponseBean createUser(UserReq userReq) { log.info("Creating user with email: {}", userReq.getEmail()); - if (userRepository.existsByEmail(userReq.getEmail())) { + if (userRepository.existsByEmailIgnoreCase(userReq.getEmail())) { log.error("User creation failed: Email {} already exists", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); } @@ -94,7 +94,7 @@ public class UserDao { userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); userEntity.setEmail(userReq.getEmail()); userEntity.setFirstName(userReq.getFirstName()); - userEntity.setStatus(userReq.getStatus().getValue()); + userEntity.setStatus(UserStatusEnum.PENDING_VERIFICATION.getValue()); userEntity.setLastName(userReq.getLastName()); userEntity.setOrganization(userReq.getOrganization()); userEntity.setAddress(userReq.getAddress()); @@ -127,10 +127,10 @@ public class UserDao { log.info("Fetching user with ID: {}", id); UserEntity userEntity = userRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); - if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) { - log.info("User with ID: {} is not active", id); - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } +// if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) { +// log.info("User with ID: {} is not active", id); +// throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); +// } log.info("User found: {}", userEntity); return convertUserEntityToUserResponse(userEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java index ff741702..c94b36b9 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java @@ -11,7 +11,7 @@ import lombok.Setter; @Setter public class RoleEntity extends BaseEntity { - @Column(name = "ROLE_NAME", length = 50, nullable = true) + @Column(name = "ROLE_NAME", length = 255, nullable = true) private String roleName; @Column(name = "DESCRIPTION", length = 255, nullable = true) @@ -19,8 +19,12 @@ public class RoleEntity extends BaseEntity { @Column(name = "PERMISSIONS", length = 255, nullable = true) private String permissions; + @ManyToOne @JoinColumn(name = "REGION_ID", nullable = true) private RegionEntity region; + + @Column(name = "ROLE_TYPE", length = 255, nullable = true) + private String roleType; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java index f1fd7d70..50cf17ce 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java @@ -1,8 +1,6 @@ package net.gepafin.tendermanagement.model.request; import com.fasterxml.jackson.annotation.JsonProperty; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -21,5 +19,7 @@ public class RoleReq { private String permissions; private Long regionId; + + private String roleType; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java index f4a8a107..65eba841 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java @@ -1,7 +1,5 @@ package net.gepafin.tendermanagement.model.request; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import net.gepafin.tendermanagement.enums.UserStatusEnum; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java index 07761068..54841e9b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -36,6 +36,4 @@ public class UserReq { private String country; - private UserStatusEnum status; - } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java index d5d579e5..da097f48 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java @@ -14,4 +14,5 @@ public class RoleResponseBean extends BaseBean { private String description; private String permissions; private RegionResponseBean region; + private String roleType; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index dc0aad37..6b6fcbe0 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -6,6 +6,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface UserRepository extends JpaRepository { - UserEntity findByEmail(String email); - boolean existsByEmail(String email); + Optional findByEmailIgnoreCase(String email); + boolean existsByEmailIgnoreCase(String email); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 6ad8cf5f..6955edf4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.RoleDao; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.RoleResponseBean; @@ -43,30 +44,32 @@ public class AuthenticationService { this.authenticationManager = authenticationManager; } - public JWTToken login(LoginReq loginReq) { - log.info("Attempting login for email: {}", loginReq.getEmail()); - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginReq.getEmail(), loginReq.getPassword()); - Authentication authentication = this.authenticationManager.authenticate(authenticationToken); - SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("Authentication successful for email: {}", loginReq.getEmail()); - UserEntity user = userRepository.findByEmail(loginReq.getEmail()); - if (user == null) { - log.error("User not found for email: {}", loginReq.getEmail()); - throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } - user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - userRepository.save(user); - String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user); - log.info("JWT token generated for email: {}", loginReq.getEmail()); - RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); + public JWTToken login(LoginReq loginReq) { + log.info("Attempting login for email: {}", loginReq.getEmail()); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginReq.getEmail(), loginReq.getPassword()); + Authentication authentication = this.authenticationManager.authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + log.info("Authentication successful for email: {}", loginReq.getEmail()); + UserEntity user = userRepository.findByEmailIgnoreCase(loginReq.getEmail()).orElseThrow(()-> new CustomValidationException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + if (Boolean.FALSE.equals(UserStatusEnum.ACTIVE.getValue().equals(user.getStatus()))) { + new CustomValidationException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + userRepository.save(user); + String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user); + log.info("JWT token generated for email: {}", loginReq.getEmail()); + RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); - LoginResponse loginResponse = getLoginResponse(user, roleResponseBean); + LoginResponse loginResponse = getLoginResponse(user, roleResponseBean); - JWTToken jwtToken = new JWTToken(token, loginResponse); + JWTToken jwtToken = new JWTToken(token, loginResponse); - log.info("Login successful for email: {}", loginReq.getEmail()); - return jwtToken; - } + log.info("Login successful for email: {}", loginReq.getEmail()); + return jwtToken; + } private static LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) { LoginResponse loginResponse = new LoginResponse(); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index b2b335de..637ad6f8 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -31,7 +31,7 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - @PreAuthorize("hasRole('SUPER_ADMIN')") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") public ResponseEntity> createCall(HttpServletRequest request, @Parameter(description = "Call request object", required = true) @Valid @RequestBody CreateCallRequest createCallRequest); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 7c310b83..cca0b247 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -16,6 +16,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -37,6 +38,7 @@ public interface UserApi { @RequestMapping(value = "", produces = {"application/json"}, method = RequestMethod.POST) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") default ResponseEntity> createUser( @Parameter(description = "User request object", required = true) @Validated @RequestBody UserReq userReq) { return new ResponseEntity>(HttpStatus.NOT_IMPLEMENTED); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java index 102a388c..7345d13e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java @@ -1,9 +1,13 @@ package net.gepafin.tendermanagement.web.rest.api.impl; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.repositories.RoleRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.GrantedAuthority; @@ -22,11 +26,9 @@ public class CustomUserDetailsService implements UserDetailsService { private final Logger log = LoggerFactory.getLogger(CustomUserDetailsService.class); private final UserRepository userRepository; - private final RoleRepository roleRepository; - public CustomUserDetailsService(UserRepository userRepository, RoleRepository roleRepository) { + public CustomUserDetailsService(UserRepository userRepository) { this.userRepository = userRepository; - this.roleRepository = roleRepository; } @Override @@ -34,17 +36,15 @@ public class CustomUserDetailsService implements UserDetailsService { public UserDetails loadUserByUsername(final String email) throws UsernameNotFoundException { log.debug("Authenticating {}", email); - UserEntity user = userRepository.findByEmail(email); - if (user == null) { - throw new UsernameNotFoundException("User " + email + " was not found in the database"); - } - + UserEntity user = userRepository.findByEmailIgnoreCase(email) + .orElseThrow( + () -> new UsernameNotFoundException("User " + email + " was not found in the database")); return createSpringSecurityUser(user); } private org.springframework.security.core.userdetails.User createSpringSecurityUser(UserEntity user) { RoleEntity role = user.getRoleEntity(); - GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleName()); + GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleType()); return new org.springframework.security.core.userdetails.User( user.getEmail(), diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index ffd93d80..d090e106 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -66,6 +66,9 @@ + + + @@ -314,7 +317,8 @@ - + + @@ -324,7 +328,8 @@ - + + @@ -334,7 +339,8 @@ - + + @@ -344,7 +350,8 @@ - + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 1c9cc13b..c35db8ac 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -7,6 +7,7 @@ update_user_error_msg=An error occurred while updating the user. delete_user_error_msg=An error occurred while deleting the user. get_user_success_msg=User retrieved successfully. get_user_error_msg=An error occurred while retrieving the user. +user.not.active=User is not active. Please contact support. # Role-related messages role.created.success=Role created successfully. role.updated.success=Role updated successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 326c7329..085c1ce4 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -7,6 +7,7 @@ update_user_error_msg=Si � verificato un errore durante l'aggiornamento dell'u delete_user_error_msg=Si � verificato un errore durante l'eliminazione dell'utente. get_user_success_msg=Utente recuperato con successo. get_user_error_msg=Si � verificato un errore durante il recupero dell'utente. +user.not.active=Utente non attivo. Si prega di contattare il supporto. # Role-related messages role.created.success=Ruolo creato con successo. role.updated.success=Ruolo aggiornato con successo. From 1b9ddc30faef439029b5010ada7ee27f6879f26e Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 26 Aug 2024 11:44:52 +0530 Subject: [PATCH 026/145] created call api in 2 steps --- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/CallDao.java | 134 ++++++++++++------ .../tendermanagement/dao/DocumentDao.java | 54 +++---- .../tendermanagement/entities/CallEntity.java | 4 +- ...quest.java => CreateCallRequestStep1.java} | 28 ++-- .../model/request/CreateCallRequestStep2.java | 29 ++++ .../model/request/LookUpDataReq.java | 2 + .../response/CreateCallResponseBean.java | 2 +- .../repositories/CallRepository.java | 4 +- ...CallTargetAudienceChecklistRepository.java | 11 +- .../repositories/DocumentRepository.java | 5 +- .../repositories/FaqRepository.java | 9 +- .../service/AmazonS3Service.java | 9 +- .../tendermanagement/service/CallService.java | 7 +- .../service/DocumentService.java | 2 +- .../service/impl/AmazonS3ServiceImpl.java | 2 +- .../service/impl/CallServiceImpl.java | 13 +- .../service/impl/DocumentServiceImpl.java | 15 +- .../web/rest/api/CallApi.java | 30 +++- .../web/rest/api/impl/CallApiController.java | 15 +- .../db/changelog/db.changelog-1.0.0.xml | 1 - src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 1 + 23 files changed, 254 insertions(+), 126 deletions(-) rename src/main/java/net/gepafin/tendermanagement/model/request/{CreateCallRequest.java => CreateCallRequestStep1.java} (73%) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index c3de4e48..ab9f75cc 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -42,6 +42,7 @@ public class GepafinConstant { public static final String PASSWORD_MIN_LEN ="pass.min.len.msg"; public static final String EMAIL_ALREADY_EXISTS = "email.already.exists"; public static final String DOCUMENT_ID_NOT_FOUND="document.id.not.found"; + public static final String INVALID_DATE_MSG = "call.invalid.date"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 179b3f4e..0b99ceb6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -1,28 +1,52 @@ package net.gepafin.tendermanagement.dao; -import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.*; - import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; +import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.CallTypeEnum; -import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.*; -import net.gepafin.tendermanagement.repositories.*; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; +import net.gepafin.tendermanagement.model.request.DocumentReq; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaReq; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.request.LookUpDataReq; +import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.model.response.LookUpDataResponse; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.CallTargetAudienceChecklistRepository; +import net.gepafin.tendermanagement.repositories.DocumentRepository; +import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; +import net.gepafin.tendermanagement.repositories.FaqRepository; +import net.gepafin.tendermanagement.repositories.LookUpDataRepository; +import net.gepafin.tendermanagement.repositories.RegionRepository; +import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; @Component public class CallDao { @@ -51,30 +75,23 @@ public class CallDao { @Autowired private UserRepository userRepository; - public CreateCallResponseBean createCall(CreateCallRequest createCallRequest, Long userId) { + public CreateCallResponseBean createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { CreateCallResponseBean createCallResponseBean = null; CallEntity callEntity = convertToCallEntity(createCallRequest); - List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities( - createCallRequest.getCriteria(), callEntity); - List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); - List imageEntities = convertToDocumentEntities(createCallRequest.getImages(), callEntity); List faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); List amiedTo = convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, LookUpDataTypeEnum.AIMED_TO); - List checkList = convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, - LookUpDataTypeEnum.CHECKLIST); - createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, - documentEntities, faqEntities, imageEntities); + createCallResponseBean = assembleCreateCallResponseBean(callEntity, Collections.emptyList(), + Collections.emptyList(), faqEntities, Collections.emptyList()); createCallResponseBean.setAimedTo(amiedTo); - createCallResponseBean.setCheckList(checkList); return createCallResponseBean; } - public CallEntity convertToCallEntity(CreateCallRequest createCallRequest) { + public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest) { CallEntity callEntity = new CallEntity(); - validateCallEntity(createCallRequest.getRegionId(), createCallRequest.getAmount()); + validateCallEntity(createCallRequest); RegionEntity region = regionRepository.findById(createCallRequest.getRegionId()) .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND))); callEntity.setRegion(region); @@ -86,12 +103,11 @@ public class CallDao { callEntity.setStatus(String.valueOf(createCallRequest.getStatus())); callEntity.setAmountMax(createCallRequest.getAmountMax()); callEntity.setAmount(createCallRequest.getAmountMax()); - callEntity.setThreshold(createCallRequest.getThreshold()); callEntity.setConfidi(false); if(createCallRequest.getConfidi()!=null){ callEntity.setConfidi(createCallRequest.getConfidi()); } - callEntity.setDocumentation_requested(createCallRequest.getDocumentationRequested()); + callEntity.setDocumentationRequested(createCallRequest.getDocumentationRequested()); callEntity = callRepository.save(callEntity); return callEntity; } @@ -121,13 +137,15 @@ public class CallDao { private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { validateDocumentEntity(documentReq.getId(),documentReq.getFileName()); - DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()); - if(documentEntity==null){ - throw new ResourceNotFoundException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - documentEntity.setFileName(documentReq.getFileName()); - documentEntity.setFilePath(documentReq.getUrl()); - documentEntity.setCall(callEntity); + DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); +// if(documentEntity==null){ +// throw ; +// } +// documentEntity.setFileName(documentReq.getFileName()); +// documentEntity.setFilePath(documentReq.getUrl()); +// documentEntity.setCall(callEntity); return documentEntity; } @@ -170,9 +188,9 @@ public class CallDao { throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND)); } - if (!StringUtils.hasText(name)) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); - } +// if (!StringUtils.hasText(name)) { +// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); +// } } public void validateEvolutionCrieteriaEntity(String name) { @@ -181,14 +199,17 @@ public class CallDao { } } - public void validateCallEntity(Long regionId, BigDecimal fundingAmount) { - if (regionId == null) { + public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { + if (createCallRequest.getRegionId() == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); } - if (fundingAmount == null || fundingAmount.compareTo(BigDecimal.ZERO) <= 0) { + if (createCallRequest.getAmount().compareTo(BigDecimal.ZERO) <= 0||createCallRequest.getAmountMax().compareTo(BigDecimal.ZERO) <= 0) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); } + if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); + } } public CreateCallResponseBean convertToCallResponseBean(CallEntity callEntity) { CreateCallResponseBean createCallResponseBean = new CreateCallResponseBean(); @@ -204,7 +225,7 @@ public class CallDao { createCallResponseBean.setContactInfo(callEntity.getContactInfo()); createCallResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); createCallResponseBean.setThreshold(callEntity.getThreshold()); - createCallResponseBean.setDocumentationReqested(callEntity.getDocumentation_requested()); + createCallResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); createCallResponseBean.setCreatedDate(callEntity.getCreatedDate()); createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); @@ -291,13 +312,13 @@ public class CallDao { callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); callTargetAudienceChecklistEntity.setCall(callEntity); callTargetAudienceChecklistEntity= callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity); - lookUpDataResponses.add(convertToLookUpDataResponseBean(lookUpDataEntity,callTargetAudienceChecklistEntity)); + lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity)); } return lookUpDataResponses; } private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, LookUpDataEntity.LookUpDataTypeEnum type) { - if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(BigDecimal.ZERO)) { + if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { LookUpDataEntity newEntity = new LookUpDataEntity(); newEntity.setValue(req.getValue()); newEntity.setType(type.getValue()); @@ -308,8 +329,9 @@ public class CallDao { .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); } - public LookUpDataResponse convertToLookUpDataResponseBean(LookUpDataEntity lookUpDataEntity,CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { + public LookUpDataResponse convertToLookUpDataResponseBean(CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { LookUpDataResponse lookUpDataResponse = new LookUpDataResponse(); + LookUpDataEntity lookUpDataEntity = callTargetAudienceChecklistEntity.getLookupData(); lookUpDataResponse.setId(callTargetAudienceChecklistEntity.getId()); lookUpDataResponse.setLookUpDataId(lookUpDataEntity.getId()); lookUpDataResponse.setValue(lookUpDataEntity.getValue()); @@ -318,6 +340,32 @@ public class CallDao { lookUpDataResponse.setUpdatedDate(lookUpDataEntity.getUpdatedDate()); return lookUpDataResponse; } + + + public CreateCallResponseBean createCallStep2(CreateCallRequestStep2 createCallRequest, Long userId) { + CreateCallResponseBean createCallResponseBean = null; + CallEntity callEntity = callRepository.findById(createCallRequest.getCallId()) + .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG))); + + callEntity.setThreshold(createCallRequest.getThreshold()); + List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities( + createCallRequest.getCriteria(), callEntity); + List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); + List imageEntities = convertToDocumentEntities(createCallRequest.getImages(), callEntity); + List checkList = convertLookUpDataEntities(createCallRequest.getCheckList(), callEntity, + LookUpDataTypeEnum.CHECKLIST); + List faqEntities = faqRepository.findByCallId(callEntity.getId()); + List amiedTo = callTargetAudienceChecklistRepository + .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() + .map(this::convertToLookUpDataResponseBean).toList(); + createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, + documentEntities, faqEntities, imageEntities); + createCallResponseBean.setAimedTo(amiedTo); + createCallResponseBean.setCheckList(checkList); + return createCallResponseBean; + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 3c5cd708..f9603b70 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -1,5 +1,16 @@ package net.gepafin.tendermanagement.dao; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.io.FilenameUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.DocumentEntity; @@ -10,17 +21,6 @@ import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; -import org.apache.commons.io.FilenameUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; @Component public class DocumentDao { @@ -34,15 +34,6 @@ public class DocumentDao { @Autowired private CallDao callDao; - @Value("${aws.s3.bucket.name}") - private String bucketName; - - @Value("${aws.s3.url.folder}") - private String s3Folder; - - @Value("${aws.s3.url}") - private String s3Url; - public List uploadFiles(List files, DocumentTypeEnum fileType) { List documentEntities = new ArrayList<>(); @@ -65,16 +56,15 @@ public class DocumentDao { .map(callDao::convertToDocumentResponseBean) .collect(Collectors.toList()); } - public Void deleteFile(Long documentId){ - DocumentEntity documentEntity= documentRepository.findById(documentId); - if(documentEntity==null){ - new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - String fileName= Utils.extractFileName(documentEntity.getFilePath()); - try { - amazonS3Service.delete(bucketName, fileName); - documentRepository.delete(documentEntity); - }catch (Exception e){} - return null; - } + + public void deleteFile(Long documentId) { + DocumentEntity documentEntity = documentRepository.findById(documentId) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); + + String fileName = Utils.extractFileName(documentEntity.getFilePath()); + amazonS3Service.delete(fileName); + documentRepository.delete(documentEntity); + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index 1ee48d6b..81da7209 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -52,10 +52,10 @@ public class CallEntity extends BaseEntity { private String submissionMethod; @Column(name = "THRESHOLD", nullable = false) - private Integer threshold; + private Long threshold; @Column(name="DOCUMENTATION_REQUESTED",columnDefinition = "TEXT") - private String documentation_requested; + private String documentationRequested; @Column(name = "PRIORITY_AREA", columnDefinition = "TEXT") private String priorityArea; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java similarity index 73% rename from src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java rename to src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index 80d828fc..e6cbc3e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -7,43 +7,47 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; -@Data -public class CreateCallRequest { +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +@Data +public class CreateCallRequestStep1 { + + @NotEmpty private String name; + @NotEmpty private String descriptionShort; + @NotEmpty private String descriptionLong; + @NotNull private LocalDateTime startDate; + @NotNull private LocalDateTime endDate; + @NotNull private Long regionId; + @NotNull private BigDecimal amount; + @NotNull private BigDecimal amountMax; + @NotNull private List aimedTo; + @NotEmpty private String documentationRequested; - private Integer threshold; - private Boolean Confidi; - List criteria; - private List faq; - private List checkList; - - private List docs; - - private List images; - + @NotNull private CallTypeEnum status; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java new file mode 100644 index 00000000..7908c9ae --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java @@ -0,0 +1,29 @@ +package net.gepafin.tendermanagement.model.request; + +import java.util.List; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import net.gepafin.tendermanagement.enums.CallTypeEnum; + +@Data +public class CreateCallRequestStep2 { + + @NotNull + private Long callId; + + private Long threshold; + + @NotNull + private List criteria; + + @NotNull + private List checkList; + + private List docs; + + private List images; + + private CallTypeEnum status; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java index 18b847b4..5fe41b41 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java @@ -1,10 +1,12 @@ package net.gepafin.tendermanagement.model.request; +import jakarta.validation.constraints.NotNull; import lombok.Data; @Data public class LookUpDataReq { + @NotNull private Long lookUpDataId; private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java index b913f85b..56a42a2a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java @@ -32,7 +32,7 @@ public class CreateCallResponseBean { private String submissionMethod; - private Integer threshold; + private Long threshold; private String priorityArea; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index ef6e144f..093e4086 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -1,8 +1,10 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.CallEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; -public interface CallRepository extends JpaRepository { +@Repository +public interface CallRepository extends JpaRepository { } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java index fe70f982..8d4912fe 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java @@ -1,7 +1,14 @@ package net.gepafin.tendermanagement.repositories; -import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; -import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; + +@Repository public interface CallTargetAudienceChecklistRepository extends JpaRepository { + + List findByCallIdAndLookupDataType(Long id, String value); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index d8d4f07a..9a2a4639 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -1,9 +1,10 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.DocumentEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; -public interface DocumentRepository extends JpaRepository { +@Repository +public interface DocumentRepository extends JpaRepository { - DocumentEntity findById(Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java index 9453ade3..7b4b7610 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -1,7 +1,14 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.FaqEntity; -import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository public interface FaqRepository extends JpaRepository { + + List findByCallId(Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index 188d131a..1ff3a7fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.service; - import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -10,11 +9,9 @@ import java.io.InputStream; @Component public interface AmazonS3Service { + public String upload(String fileName, MultipartFile file) throws IOException; - public String upload(String fileName, - MultipartFile file) throws IOException; + public Boolean delete(String fileName); - public Boolean delete(String bucketName ,String fileName); - - InputStream getFile(String filePath) throws IOException; + InputStream getFile(String filePath) throws IOException; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 40dfd65f..f8a07093 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -1,11 +1,14 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; public interface CallService { - CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest); + CreateCallResponseBean createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest); + + CreateCallResponseBean createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java index 806d81cc..4081af53 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java @@ -10,5 +10,5 @@ public interface DocumentService { public List uploadFile(List files, DocumentTypeEnum fileType); - public Void deleteFile(Long documentId); + public void deleteFile(Long documentId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java index ad865d13..3657d115 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -63,7 +63,7 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } @Override - public Boolean delete(String bucketName,String fileName) { + public Boolean delete(String fileName) { final DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, fileName); if(Boolean.FALSE.equals(isTestProfileActivated())) { diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index cb4b76bc..53edaf6d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -3,7 +3,8 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; -import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; @@ -22,8 +23,14 @@ public class CallServiceImpl implements CallService { private TokenProvider tokenProvider; @Override - public CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest) { + public CreateCallResponseBean createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - return callDao.createCall(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); + return callDao.createCallStep1(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); + } + + @Override + public CreateCallResponseBean createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return callDao.createCallStep2(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java index e7bf864e..55c6165b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -1,14 +1,15 @@ package net.gepafin.tendermanagement.service.impl; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + import net.gepafin.tendermanagement.dao.DocumentDao; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.service.DocumentService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; @Service public class DocumentServiceImpl implements DocumentService { @@ -22,7 +23,7 @@ public class DocumentServiceImpl implements DocumentService { return fileDao.uploadFiles(files,fileType); } @Override - public Void deleteFile(Long documentId){ - return fileDao.deleteFile(documentId); + public void deleteFile(Long documentId){ + fileDao.deleteFile(documentId); } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 637ad6f8..3da8bab6 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -7,20 +7,22 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; -import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; - +@Validated public interface CallApi { - @Operation(summary = "Api to create call", + @Operation(summary = "Api to create call step 1", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -30,10 +32,26 @@ public interface CallApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "/step1", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - public ResponseEntity> createCall(HttpServletRequest request, + public ResponseEntity> createCallStep1(HttpServletRequest request, @Parameter(description = "Call request object", required = true) - @Valid @RequestBody CreateCallRequest createCallRequest); + @Valid @RequestBody CreateCallRequestStep1 createCallRequest); + + @Operation(summary = "Api to create call step 2", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "/step2", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> createCallStep2(HttpServletRequest request, + @Parameter(description = "Call request object", required = true) + @Valid @RequestBody CreateCallRequestStep2 createCallRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index d4165383..0ff654bc 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -3,7 +3,8 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.CallService; @@ -27,8 +28,16 @@ public class CallApiController implements CallApi { @Override @Transactional(rollbackFor=Exception.class) - public ResponseEntity> createCall(HttpServletRequest request, CreateCallRequest createCallRequest) { - CreateCallResponseBean createCallResponseBean = callService.createCall(request, createCallRequest); + public ResponseEntity> createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { + CreateCallResponseBean createCallResponseBean = callService.createCallStep1(request, createCallRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); + } + + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest) { + CreateCallResponseBean createCallResponseBean = callService.createCallStep2(request, createCallRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index d090e106..5293ec62 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -171,7 +171,6 @@ - diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index c35db8ac..15aa6498 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -43,6 +43,8 @@ call.created.successfully=Call created successfully. file.deleted.successfully=File deleted successfully. document.not.found=Document not found. document.id.not.found=Document ID not found. +call.created.successfully=Call created successfully. +call.invalid.date=Invalid start or end date. # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 085c1ce4..ae93ff53 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -43,6 +43,7 @@ call.created.successfully=Chiamata creata correttamente. file.deleted.successfully=File eliminato con successo. document.not.found=Documento non trovato. document.id.not.found=ID documento non trovato. +call.invalid.date=Data di inizio o fine non valida. # Login-related messages login.successfully=Accesso effettuato con successo. From a45dd56432621f66bca5ed4f9c71987d1f99d220 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 12:27:12 +0530 Subject: [PATCH 027/145] Api related to logout,reset and change password in user api controller --- .../config/SecurityConfig.java | 29 ++++--- .../config/jwt/TokenProvider.java | 22 +++++ .../constants/GepafinConstant.java | 8 ++ .../gepafin/tendermanagement/dao/UserDao.java | 84 +++++++++++++++++- .../tendermanagement/entities/UserEntity.java | 2 + .../model/request/ChangePasswordRequest.java | 16 ++++ .../request/InitiatePasswordResetReq.java | 8 ++ .../model/request/LogoutReq.java | 10 +++ .../model/request/ResetPasswordReq.java | 11 +++ .../tendermanagement/service/UserService.java | 18 +++- .../service/impl/AuthenticationService.java | 17 +++- .../service/impl/UserServiceImpl.java | 30 ++++++- .../web/rest/api/UserApi.java | 85 +++++++++++++++++-- .../web/rest/api/impl/UserApiController.java | 57 +++++++++++-- .../db/changelog/db.changelog-1.0.0.xml | 8 ++ src/main/resources/message_en.properties | 14 +++ src/main/resources/message_it.properties | 10 +++ 17 files changed, 393 insertions(+), 36 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ChangePasswordRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 53b7baef..5ffca88e 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -39,13 +39,12 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; public class SecurityConfig { private final TokenProvider tokenProvider; - - private final CorsFilter corsFilter; + private final CorsConfigurationSource corsConfigurationSource; @Autowired - public SecurityConfig(TokenProvider tokenProvider, CorsFilter corsFilter) { + public SecurityConfig(TokenProvider tokenProvider, CorsConfigurationSource corsConfigurationSource) { this.tokenProvider = tokenProvider; - this.corsFilter = corsFilter; + this.corsConfigurationSource = corsConfigurationSource; } @Bean @@ -59,20 +58,19 @@ public class SecurityConfig { } @Bean - MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { + public MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector); } - + @Bean public WebSecurityCustomizer webSecurityCustomizer(MvcRequestMatcher.Builder mvc) { return (web) -> web.ignoring().requestMatchers(mvc.pattern(HttpMethod.OPTIONS, "/**")) - .requestMatchers(new AntPathRequestMatcher("/i18n/**")) - .requestMatchers(new AntPathRequestMatcher("/content/**")) - .requestMatchers(new AntPathRequestMatcher("/swagger-ui/index.html")) - .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); + .requestMatchers(new AntPathRequestMatcher("/i18n/**")) + .requestMatchers(new AntPathRequestMatcher("/content/**")) + .requestMatchers(new AntPathRequestMatcher("/swagger-ui/index.html")) + .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); } - // @Bean // public CorsConfigurationSource corsConfigurationSource() { // UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); @@ -85,9 +83,14 @@ public class SecurityConfig { // return source; // } + @Bean + public CorsFilter corsFilter() { + return new CorsFilter(corsConfigurationSource); + } + @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { - http + http .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user/login")).permitAll() @@ -99,7 +102,7 @@ public class SecurityConfig { .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ) - .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(corsFilter(), UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class); return http.build(); diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java index c3c54d99..3068fefb 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java @@ -48,6 +48,7 @@ public class TokenProvider { public static final String INVALID_USER = "invalid_user"; static final String AUTH_SECRET = "X-Api-Secret"; + private final Set invalidatedTokens = new HashSet<>(); @PostConstruct public void init() { @@ -113,6 +114,10 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { + if (isTokenInvalid(authToken)) { + log.warn("Token is invalidated."); + return false; + } Jwts.parserBuilder() .setSigningKey(key) .build() @@ -124,6 +129,15 @@ public class TokenProvider { return false; } } + + public void invalidateToken(String token) { + invalidatedTokens.add(token); + log.info("Token invalidated: {}", token); + } + + public boolean isTokenInvalid(String token) { + return invalidatedTokens.contains(token); + } public Map getUserInfoAndUserIdFromToken(HttpServletRequest request) { Map userInfo = new HashMap<>(); String authSecretHeader=request.getHeader(AUTH_SECRET); @@ -196,4 +210,12 @@ public class TokenProvider { Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody(); return claims.getSubject(); } + public String extractTokenFromRequest(HttpServletRequest request) { + String bearerToken = request.getHeader("Authorization"); + if (bearerToken != null && bearerToken.startsWith("Bearer ")) { + return bearerToken.substring(7); // Remove "Bearer " prefix + } + return null; // Return null if token is not found or not in Bearer format + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 75b748fe..6fdebe76 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -42,5 +42,13 @@ public class GepafinConstant { public static final String EMAIL_ALREADY_EXISTS = "email.already.exists"; public static final String DOCUMENT_ID_NOT_FOUND="document.id.not.found"; + public static final String RESET_PASSWORD_INITIATED = "password.reset.initiated"; + public static final String PASSWORD_RESET_SUCCESS = "password.reset.success"; + public static final String INVALID_TOKEN_MSG = "invalid.token.msg"; + public static final String CURRENT_PASSWORD_INCORRECT = "current.password.incorrect"; + + public static final String LOGOUT_SUCCESSFUL_MSG = "logout.successful.msg"; + public static final String SUCCESS_PASSWORD_CHANGED = "success.password.changed"; + public static final String UPDATE_USER_STATUS_SUCCESS_MSG = "update.user.status.success"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 2ca30fe6..8a0197f6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -1,13 +1,13 @@ package net.gepafin.tendermanagement.dao; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -23,6 +23,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Repository; +import java.security.SecureRandom; +import java.util.Base64; +import java.util.Optional; + import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; @Repository @@ -149,4 +153,78 @@ public class UserDao { log.info("Login successful for email: {}", loginReq.getEmail()); return jwtToken; } + public String generateSecureToken() { + SecureRandom secureRandom = new SecureRandom(); + byte[] tokenBytes = new byte[24]; + secureRandom.nextBytes(tokenBytes); + String token = Base64.getUrlEncoder().withoutPadding().encodeToString(tokenBytes); + log.debug("Generated secure token: {}", token); + return token; + } + + public String initiatePasswordReset(InitiatePasswordResetReq resetReq) { + UserEntity user = userRepository.findByEmail(resetReq.getEmail()); + if (user == null) { + log.info("Password reset attempt for non-existent user: {}", resetReq.getEmail()); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + String token = generateSecureToken(); + user.setResetPasswordToken(token); + userRepository.save(user); + log.info("Password reset token generated for user: {}", resetReq.getEmail()); + return token; + } + + public Boolean resetPassword(ResetPasswordReq resetPasswordReq) { + UserEntity user = userRepository.findByEmail(resetPasswordReq.getEmail()); + if (user == null) { + log.info("Password reset attempt for non-existent user: {}", resetPasswordReq.getEmail()); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + String dbToken = user.getResetPasswordToken(); + + if (dbToken == null || !dbToken.equals(resetPasswordReq.getToken())) { + log.info("Invalid password reset token for user: {}", resetPasswordReq.getEmail()); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); + } + + user.setPassword(passwordEncoder.encode(resetPasswordReq.getNewPassword())); + user.setResetPasswordToken(null); + userRepository.save(user); + log.info("Password successfully reset for user: {}", resetPasswordReq.getEmail()); + return true; + } + + public Boolean changePassword(ChangePasswordRequest request) { + UserEntity user = userRepository.findByEmail(request.getEmail()); + if (user == null) { + log.info("Password reset attempt for non-existent user: {}", request.getEmail()); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) { + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CURRENT_PASSWORD_INCORRECT)); + } + if (!request.getNewPassword().equals(request.getConfirmPassword())) { + log.info("User creation failed: Passwords do not match for email {}", user.getEmail()); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); + } + user.setPassword(passwordEncoder.encode(request.getNewPassword())); + userRepository.save(user); + return true; + } + public void logout(HttpServletRequest request, HttpServletResponse response) { + authService.logout(request, response); + log.info("User successfully logged out."); + } + + public UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq) { + log.info("Updating status for user with ID: {}", userId); + UserEntity userEntity = userRepository.findById(userId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + userEntity.setStatus(statusReq.getValue()); + userEntity = userRepository.save(userEntity); + log.info("User status updated to {} for user ID: {}", statusReq, userId); + return convertUserEntityToUserResponse(userEntity); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java index aac82db9..5bd88f33 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -58,4 +58,6 @@ public class UserEntity extends BaseEntity { @Column(name = "COUNTRY", length = 50, nullable = true) private String country; + @Column(name = "RESET_PASSWORD_TOKEN", length = 255, nullable = true) + private String resetPasswordToken; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ChangePasswordRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ChangePasswordRequest.java new file mode 100644 index 00000000..a15f8cfc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ChangePasswordRequest.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class ChangePasswordRequest { + + + private String email; + + private String password; + + private String newPassword; + + private String confirmPassword; +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java new file mode 100644 index 00000000..ae2ba0d0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java @@ -0,0 +1,8 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class InitiatePasswordResetReq { + private String email; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java new file mode 100644 index 00000000..00c07a25 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.model.request; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.Data; + +@Data +public class LogoutReq { + private String email; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java new file mode 100644 index 00000000..7a46596a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class ResetPasswordReq { + private String email; + private String token; + private String newPassword; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 68912240..c609a5ac 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -1,8 +1,9 @@ package net.gepafin.tendermanagement.service; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -16,4 +17,15 @@ public interface UserService { void deleteUser(Long userId); JWTToken login(LoginReq loginReq); + + + String initiatePasswordReset(InitiatePasswordResetReq resetReq); + + Boolean resetPassword(ResetPasswordReq resetPasswordReq); + + Boolean changePassword(ChangePasswordRequest request); + + void logoutUser(HttpServletRequest request, HttpServletResponse response); + + UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 6ad8cf5f..ca480a88 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -1,11 +1,14 @@ package net.gepafin.tendermanagement.service.impl; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.RoleDao; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.LoginReq; +import net.gepafin.tendermanagement.model.request.LogoutReq; import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -20,7 +23,9 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Service; + import java.time.LocalDateTime; @Service @@ -67,7 +72,7 @@ public class AuthenticationService { log.info("Login successful for email: {}", loginReq.getEmail()); return jwtToken; } - + private static LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) { LoginResponse loginResponse = new LoginResponse(); loginResponse.setId(user.getId()); @@ -86,5 +91,15 @@ public class AuthenticationService { loginResponse.setUpdatedDate(user.getUpdatedDate()); return loginResponse; } + public void logout(HttpServletRequest request, HttpServletResponse response) + { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (auth != null) { + String token = tokenProvider.extractTokenFromRequest(request); + tokenProvider.invalidateToken(token); + new SecurityContextLogoutHandler().logout(request, response, auth); + } + SecurityContextHolder.getContext().setAuthentication(null); + SecurityContextHolder.clearContext(); +} } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index c6205aae..6499aa29 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -1,9 +1,10 @@ package net.gepafin.tendermanagement.service.impl; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.dao.UserDao; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -50,4 +51,27 @@ public class UserServiceImpl implements UserService { } + @Override + public String initiatePasswordReset(InitiatePasswordResetReq resetReq) { + return userDao.initiatePasswordReset(resetReq); + } + + @Override + public Boolean resetPassword(ResetPasswordReq resetPasswordReq) { + return userDao.resetPassword(resetPasswordReq); + } + @Override + public Boolean changePassword(ChangePasswordRequest request){ + return userDao.changePassword(request); + } + @Override + public void logoutUser(HttpServletRequest request, HttpServletResponse response) { + userDao.logout(request,response); + } + @Override + @Transactional(rollbackFor = Exception.class) + public UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq) { + return userDao.updateUserStatus(userId, statusReq); + + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 7c310b83..2959c13d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -5,10 +5,12 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; @@ -17,10 +19,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.*; @Validated public interface UserApi { @@ -103,4 +102,76 @@ public interface UserApi { method = RequestMethod.POST) ResponseEntity> login( @Parameter(description = "Login request object", required = true) @Valid @RequestBody LoginReq loginReq); + @Operation(summary = "Api to initiate password reset", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) + @RequestMapping(value = "/reset-password/initiate", + produces = {"application/json"}, + method = RequestMethod.POST) + ResponseEntity> initiatePasswordReset( + @Parameter(description = "Initiate password reset request object", required = true) @Valid @RequestBody InitiatePasswordResetReq initiatePasswordResetReq); + + @Operation(summary = "Api to reset password", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) + @RequestMapping(value = "/reset-password", + produces = {"application/json"}, + method = RequestMethod.POST) + ResponseEntity> resetPassword( + @Parameter(description = "Reset password request object", required = true) @Valid @RequestBody ResetPasswordReq resetPasswordReq); + @Operation(summary = "Api to change user password", + responses = { + @ApiResponse(responseCode = "200", description = "Password Changed Successfully", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = "{ \"message\": \"Password changed successfully.\" }")})), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) + @RequestMapping(value = "/change-password", + produces = {"application/json"}, + method = RequestMethod.POST) + ResponseEntity> changePassword( + @Parameter(description = "Change password request object", required = true) @Valid @RequestBody ChangePasswordRequest changePasswordRequest); @Operation(summary = "Api to logout user", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) + @RequestMapping(value = "/logout", + method = RequestMethod.POST) + ResponseEntity> logoutUser( + @Parameter(description = "The request object is not needed for logout", required = false) HttpServletRequest request, + @Parameter(description = "The response object is not needed for logout", required = false) HttpServletResponse response); + @Operation(summary = "API to update user active/deactive status", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)})) + }) + @RequestMapping(value = "/{userId}/status", + produces = {"application/json"}, + method = RequestMethod.PUT) + default ResponseEntity> updateUserStatus( + @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) UserStatusEnum status) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + } + diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index f44c2e87..fb4801b7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -1,17 +1,19 @@ package net.gepafin.tendermanagement.web.rest.api.impl; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.UpdateUserReq; -import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.web.rest.api.UserApi; - import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,7 +29,8 @@ import org.springframework.web.bind.annotation.*; public class UserApiController implements UserApi { private final Logger log = LoggerFactory.getLogger(UserApiController.class); - + @Autowired + private TokenProvider tokenProvider; @Autowired private UserService userService; @@ -74,4 +77,46 @@ public class UserApiController implements UserApi { JWTToken jwtToken = userService.login(loginReq); return ResponseEntity.ok(new Response<>(jwtToken, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOGIN_SUCCESS_MSG))); } -} + @Override + public ResponseEntity> changePassword(@Valid @RequestBody ChangePasswordRequest request) { + log.info("Change Password attempt for email: {}", request.getEmail()); + userService.changePassword(request); + return ResponseEntity.ok(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.SUCCESS_PASSWORD_CHANGED))); + } + @Override + public ResponseEntity> initiatePasswordReset(InitiatePasswordResetReq request) { + log.info("Initiating password reset for email: {}", request.getEmail()); + String resetToken = userService.initiatePasswordReset(request); + log.info("Password reset token generated for email: {}", request.getEmail()); + return ResponseEntity.ok(new Response<>(resetToken, Status.SUCCESS, Translator.toLocale(GepafinConstant.RESET_PASSWORD_INITIATED))); + } + + @Override + public ResponseEntity> resetPassword(ResetPasswordReq request) { + log.info("Resetting password for username: {}", request.getEmail()); + Boolean success = userService.resetPassword(request); + if (success) { + log.info("Password reset successfully for username: {}", request.getEmail()); + } else { + log.error("Password reset failed for username: {}", request.getEmail()); + } + return ResponseEntity.ok(new Response<>(success, Status.SUCCESS, Translator.toLocale(GepafinConstant.PASSWORD_RESET_SUCCESS))); + } + + @Override + public ResponseEntity> logoutUser(HttpServletRequest request, HttpServletResponse response) { + userService.logoutUser(request, response); + + log.info("User has successfully logged"); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOGOUT_SUCCESSFUL_MSG))); + } + + @Override + public ResponseEntity> updateUserStatus(@PathVariable Long userId, @RequestParam UserStatusEnum status) { + log.info("Update User Status for- User ID: {}, Request Body: {}", userId, status); + UserResponseBean updatedUser = userService.updateUserStatus(userId, status); + return ResponseEntity.ok(new Response<>(updatedUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.UPDATE_USER_STATUS_SUCCESS_MSG))); + } + +} \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index ffd93d80..cce854f6 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -389,4 +389,12 @@ + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 1c9cc13b..34d711c7 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -54,6 +54,20 @@ invalid_signature=Invalid token. invalid_login=Invalid username or password. req_validation_er=Request Validation Error +# Password reset messages +password.reset.initiated=Password reset initiated. +password.reset.success=Password has been successfully reset. +#Change Password +invalid.token.msg=The token provided is invalid or expired. Please request a new token. +current.password.incorrect = Current password is incorrect. +success.password.changed=Password changed successfully. +#Logout +logout.successful.msg=Logout successful. You have been logged out successfully. +#Update user Active or Deactive status +update.user.status.success=User status has been successfully updated. + + + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 326c7329..33624af7 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -53,3 +53,13 @@ common_message=qualcosa é andato storto. Per favore riprova invalid_signature=Gettone non valido. invalid_login=Nome utente o password errati req_validation_er=Errore di convalida +# Password reset messages +password.reset.initiated=Reimpostazione della password avviata. +password.reset.success=La password è stata reimpostata con successo. +invalid.token.msg=Il token fornito è invalido o scaduto. Si prega di richiedere un nuovo token. +current.password.incorrect = La password attuale non è corretta. +success.password.changed=Password cambiata con successo. +logout.successful.msg=Logout riuscito. Sei stato disconnesso con successo. + +update.user.status.success=Lo stato dell'utente è stato aggiornato con successo. + From 83e7c898bdb60fc05efed01c1278dc26bdfad540 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 12:45:20 +0530 Subject: [PATCH 028/145] Update code --- .../net/gepafin/tendermanagement/config/SecurityConfig.java | 4 ---- .../gepafin/tendermanagement/repositories/UserRepository.java | 1 + .../tendermanagement/service/impl/AuthenticationService.java | 4 ++-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 90285d95..e06c3e4b 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -87,10 +87,6 @@ public class SecurityConfig { return new CorsFilter(source); } - @Bean - public CorsFilter corsFilter() { - return new CorsFilter(corsConfigurationSource); - } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index 6b6fcbe0..7720430c 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -8,4 +8,5 @@ import java.util.Optional; public interface UserRepository extends JpaRepository { Optional findByEmailIgnoreCase(String email); boolean existsByEmailIgnoreCase(String email); + UserEntity findByEmail(String email); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index b3806deb..62ead6f2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -59,8 +59,8 @@ public class AuthenticationService { UserEntity user = userRepository.findByEmailIgnoreCase(loginReq.getEmail()).orElseThrow(()-> new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); if (Boolean.FALSE.equals(UserStatusEnum.ACTIVE.getValue().equals(user.getStatus()))) { - new CustomValidationException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + throw new CustomValidationException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); } user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); userRepository.save(user); From c55ca10d03c065714fe1652a046455c6548c86da Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 26 Aug 2024 15:09:17 +0530 Subject: [PATCH 029/145] updated code --- .../tendermanagement/constants/GepafinConstant.java | 2 ++ .../java/net/gepafin/tendermanagement/dao/CallDao.java | 7 +++++-- .../model/request/CreateCallRequestStep1.java | 7 +------ .../model/request/CreateCallRequestStep2.java | 1 + .../model/response/CreateCallResponseBean.java | 8 +++++--- .../gepafin/tendermanagement/web/rest/api/CallApi.java | 3 ++- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index ab9f75cc..f8239a1d 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -43,6 +43,8 @@ public class GepafinConstant { public static final String EMAIL_ALREADY_EXISTS = "email.already.exists"; public static final String DOCUMENT_ID_NOT_FOUND="document.id.not.found"; public static final String INVALID_DATE_MSG = "call.invalid.date"; + public static final String STEP_1 = "STEP_1"; + public static final String STEP_2 = "STEP_2"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 0b99ceb6..c6265391 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -84,6 +84,7 @@ public class CallDao { createCallResponseBean = assembleCreateCallResponseBean(callEntity, Collections.emptyList(), Collections.emptyList(), faqEntities, Collections.emptyList()); createCallResponseBean.setAimedTo(amiedTo); + createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); return createCallResponseBean; } @@ -100,7 +101,7 @@ public class CallDao { callEntity.setDescriptionLong(createCallRequest.getDescriptionLong()); callEntity.setStartDate(createCallRequest.getStartDate()); callEntity.setEndDate(createCallRequest.getEndDate()); - callEntity.setStatus(String.valueOf(createCallRequest.getStatus())); + callEntity.setStatus(CallTypeEnum.DRAFT.getValue()); callEntity.setAmountMax(createCallRequest.getAmountMax()); callEntity.setAmount(createCallRequest.getAmountMax()); callEntity.setConfidi(false); @@ -349,6 +350,8 @@ public class CallDao { Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG))); callEntity.setThreshold(createCallRequest.getThreshold()); + callEntity.setStatus(createCallRequest.getStatus().getValue()); + callRepository.save(callEntity); List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities( createCallRequest.getCriteria(), callEntity); List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); @@ -363,8 +366,8 @@ public class CallDao { documentEntities, faqEntities, imageEntities); createCallResponseBean.setAimedTo(amiedTo); createCallResponseBean.setCheckList(checkList); + createCallResponseBean.setCurrentStep(GepafinConstant.STEP_2); return createCallResponseBean; - } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index e6cbc3e9..0c18cd1e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -1,14 +1,12 @@ package net.gepafin.tendermanagement.model.request; -import lombok.Data; -import net.gepafin.tendermanagement.enums.CallTypeEnum; - import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; +import lombok.Data; @Data public class CreateCallRequestStep1 { @@ -47,7 +45,4 @@ public class CreateCallRequestStep1 { private List faq; - @NotNull - private CallTypeEnum status; - } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java index 7908c9ae..d4264977 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java @@ -24,6 +24,7 @@ public class CreateCallRequestStep2 { private List images; + @NotNull private CallTypeEnum status; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java index 56a42a2a..cfeaa4b1 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java @@ -1,12 +1,12 @@ package net.gepafin.tendermanagement.model.response; -import lombok.Data; -import net.gepafin.tendermanagement.enums.CallTypeEnum; - import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +import lombok.Data; +import net.gepafin.tendermanagement.enums.CallTypeEnum; + @Data public class CreateCallResponseBean { @@ -53,6 +53,8 @@ public class CreateCallResponseBean { private List images; private List checkList; + + private String currentStep; } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 3da8bab6..2bf116e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -17,6 +17,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; @Validated @@ -48,7 +49,7 @@ public interface CallApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PostMapping(value = "/step2", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PutMapping(value = "/step2", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") public ResponseEntity> createCallStep2(HttpServletRequest request, @Parameter(description = "Call request object", required = true) From 948e5ec31dc6046dc6ba424d70448f9c0e3354d5 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 17:05:03 +0530 Subject: [PATCH 030/145] Created crud operation for evaluation criteria,faq,lookUp data and document --- .../constants/GepafinConstant.java | 19 +++ .../gepafin/tendermanagement/dao/CallDao.java | 16 ++- .../tendermanagement/dao/DocumentDao.java | 110 ++++++++++++++---- .../dao/EvaluationCriteriaDao.java | 75 ++++++++++++ .../gepafin/tendermanagement/dao/FaqDao.java | 96 +++++++++++++++ .../tendermanagement/dao/LookUpDataDao.java | 65 +++++++++++ .../model/request/EvaluationCriteriaReq.java | 2 + .../request/EvaluationCriteriaRequest.java | 17 +++ .../model/request/LookUpDataRequest.java | 12 ++ .../EvaluationCriteriaResponseBean.java | 9 +- .../model/response/FaqResponseBean.java | 8 +- .../model/response/LookUpDataResponse.java | 11 +- .../response/LookUpDataResponseBean.java | 15 +++ .../EvaluationCriteriaRepository.java | 2 +- .../repositories/FaqRepository.java | 6 +- .../service/DocumentService.java | 7 +- .../service/EvaluationCriteriaService.java | 16 +++ .../tendermanagement/service/FaqService.java | 15 +++ .../service/LookUpDataService.java | 15 +++ .../service/impl/DocumentServiceImpl.java | 29 +++-- .../impl/EvaluationCriteriaServiceImpl.java | 36 ++++++ .../service/impl/FaqServiceImpl.java | 44 +++++++ .../service/impl/LookUpDataServiceImpl.java | 35 ++++++ .../web/rest/api/DocumentApi.java | 37 +++++- .../web/rest/api/EvaluationCriteriaApi.java | 78 +++++++++++++ .../tendermanagement/web/rest/api/FaqApi.java | 57 +++++++++ .../web/rest/api/LookUpDataApi.java | 51 ++++++++ .../rest/api/impl/DocumentApiController.java | 29 +++-- .../impl/EvaluationCriteriaApiController.java | 66 +++++++++++ .../web/rest/api/impl/FaqApiController.java | 61 ++++++++++ .../api/impl/LookUpDataApiController.java | 62 ++++++++++ src/main/resources/message_en.properties | 24 +++- src/main/resources/message_it.properties | 27 +++++ 33 files changed, 1075 insertions(+), 77 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/FaqService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index ab9f75cc..c5b1a697 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -44,5 +44,24 @@ public class GepafinConstant { public static final String DOCUMENT_ID_NOT_FOUND="document.id.not.found"; public static final String INVALID_DATE_MSG = "call.invalid.date"; + public static final String EVALUATION_CRITERIA_NOT_FOUND = "evaluation.criteria.not.found"; + public static final String EVALUATION_CRITERIA_CREATED_SUCCESSFULLY = "evaluation.criteria.created.successfully"; + public static final String EVALUATION_CRITERIA_FETCH_SUCCESSFULLY = "evaluation.criteria.fetch.successfully"; + public static final String EVALUATION_CRITERIA_UPDATED_SUCCESSFULLY = "evaluation.criteria.updated.successfully"; + public static final String EVALUATION_CRITERIA_DELETED_SUCCESSFULLY = "evaluation.criteria.deleted.successfully"; + public static final String CALL_NOT_FOUND="call.not.found"; + public static final String SCORE_NOT_NULL_MSG="score.not.null"; + public static final String FAQ_NOT_FOUND = "faq.not.found"; + public static final String FAQ_CREATED_SUCCESSFULLY = "faq.created.successfully"; + public static final String FAQ_FETCHED_SUCCESSFULLY = "faq.fetched.successfully"; + public static final String FAQ_UPDATED_SUCCESSFULLY = "faq.updated.successfully"; + public static final String FAQ_DELETED_SUCCESSFULLY = "faq.deleted.successfully"; + public static final String LOOKUP_DATA_NOT_FOUND = "lookupdata.not.found"; + public static final String LOOKUP_DATA_CREATED_SUCCESSFULLY = "lookupdata.created.successfully"; + public static final String LOOKUP_DATA_FETCHED_SUCCESSFULLY = "lookupdata.fetched.successfully"; + public static final String LOOKUP_DATA_UPDATED_SUCCESSFULLY = "lookupdata.updated.successfully"; + public static final String LOOKUP_DATA_DELETED_SUCCESSFULLY = "lookupdata.deleted.successfully"; + public static final String DOCUMENT_UPDATED_SUCCESSFULLY = "document.updated.successfully"; + public static final String DOCUMENT_FETCHED_SUCCESSFULLY = "document.fetched.successfully"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 0b99ceb6..e3984435 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -112,7 +112,7 @@ public class CallDao { return callEntity; } - public List convertToEvaluationCriteriaEntities(List criteriaReqList, CallEntity callEntity) { + public List convertListOfEvaluationCriteriaReqToEvaluationCriteriaEntities(List criteriaReqList, CallEntity callEntity) { List evaluationCriteriaEntities = criteriaReqList.stream().map(req -> convertToEvaluationCriteriaEntity(req, callEntity)).collect(Collectors.toList()); evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); return evaluationCriteriaEntities; @@ -120,7 +120,7 @@ public class CallDao { private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, CallEntity callEntity) { EvaluationCriteriaEntity criteriaEntity = new EvaluationCriteriaEntity(); - validateEvolutionCrieteriaEntity(criteriaReq.getName()); + validateEvolutionCrieteriaEntity(criteriaReq.getName(),criteriaReq.getScore()); criteriaEntity.setName(criteriaReq.getName()); criteriaEntity.setDescription(criteriaReq.getValue()); criteriaEntity.setScore(criteriaReq.getScore()); @@ -156,7 +156,7 @@ public class CallDao { return faqEntities; } - private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { + public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { FaqEntity faqEntity = new FaqEntity(); validateFaqEntity(faqReq.getQuestion()); UserEntity userEntity= userRepository.findById(userId) @@ -193,10 +193,13 @@ public class CallDao { // } } - public void validateEvolutionCrieteriaEntity(String name) { + public void validateEvolutionCrieteriaEntity(String name,Integer score) { if (!StringUtils.hasText(name)) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); } + if (score == null || score <= 0) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.SCORE_NOT_NULL_MSG)); + } } public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { @@ -366,6 +369,11 @@ public class CallDao { return createCallResponseBean; } + public List convertToEvaluationCriteriaEntities(List criteriaReqList, CallEntity callEntity) { + List evaluationCriteriaEntities = criteriaReqList.stream().map(req -> convertToEvaluationCriteriaEntity(req, callEntity)).collect(Collectors.toList()); + evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); + return evaluationCriteriaEntities; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index f9603b70..81910ae6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -1,8 +1,7 @@ package net.gepafin.tendermanagement.dao; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import org.apache.commons.io.FilenameUtils; @@ -13,14 +12,20 @@ import org.springframework.web.multipart.MultipartFile; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Value; + +import java.util.ArrayList; +import java.util.List; @Component public class DocumentDao { @@ -34,21 +39,32 @@ public class DocumentDao { @Autowired private CallDao callDao; - public List uploadFiles(List files, DocumentTypeEnum fileType) { - List documentEntities = new ArrayList<>(); + @Value("${aws.s3.bucket.name}") + private String bucketName; + @Value("${aws.s3.url.folder}") + private String s3Folder; + + @Value("${aws.s3.url}") + private String s3Url; + + @Autowired + private CallRepository callRepository; + + public List uploadFiles(List files,Long callId, DocumentTypeEnum fileType) { + List documentEntities = new ArrayList<>(); + CallEntity callEntity=callRepository.findById(callId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); for (MultipartFile file : files) { try { - String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - String fileName = StringUtils.cleanPath(file.getOriginalFilename()); - String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); - fileName = (firstNameContain + "." + extension); - String filepath = amazonS3Service.upload(fileName,file); - DocumentEntity documentEntity = new DocumentEntity(); - documentEntity.setFileName(fileName); - documentEntity.setType(fileType.getValue()); - documentEntity.setFilePath(filepath); - documentEntities.add(documentEntity); + uploadFileOnAmazonS3 result = uploadFileOnAmazonS3(file); + if(result!=null) { + DocumentEntity documentEntity = new DocumentEntity(); + documentEntity.setFileName(result.fileName()); + documentEntity.setCall(callEntity); + documentEntity.setType(fileType.getValue()); + documentEntity.setFilePath(result.filepath()); + documentEntities.add(documentEntity); + } } catch (IOException e) {} } documentRepository.saveAll(documentEntities); @@ -57,14 +73,62 @@ public class DocumentDao { .collect(Collectors.toList()); } - public void deleteFile(Long documentId) { - DocumentEntity documentEntity = documentRepository.findById(documentId) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); + private uploadFileOnAmazonS3 uploadFileOnAmazonS3(MultipartFile file) throws IOException { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + String fileName = StringUtils.cleanPath(file.getOriginalFilename()); + String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); + fileName = (firstNameContain + "." + extension); + String filepath = amazonS3Service.upload(fileName, file); + uploadFileOnAmazonS3 result = new uploadFileOnAmazonS3(fileName, filepath); + return result; + } - String fileName = Utils.extractFileName(documentEntity.getFilePath()); - amazonS3Service.delete(fileName); - documentRepository.delete(documentEntity); + private record uploadFileOnAmazonS3(String fileName, String filepath) { + } - } -} + public void deleteFile(Long documentId){ + DocumentEntity documentEntity = getDocumentEntity(documentId); + String fileName= Utils.extractFileName(documentEntity.getFilePath()); + deleteFileOnAmazonS3(fileName); + documentRepository.delete(documentEntity); + } + + private DocumentEntity deleteFileOnAmazonS3(String fileName) { + try { + amazonS3Service.delete(fileName); + }catch (Exception e){} + return null; + } + + private DocumentEntity getDocumentEntity(Long documentId) { + Optional documentEntity= documentRepository.findById(documentId); + if(documentEntity.isEmpty()){ + throw new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); + } + return documentEntity.orElse(null); + } + + public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum){ + DocumentEntity documentEntity = getDocumentEntity(documentId); + String fileName= Utils.extractFileName(documentEntity.getFilePath()); + deleteFileOnAmazonS3(fileName); + uploadFileOnAmazonS3 result= null; + try { + result = uploadFileOnAmazonS3(file); + } catch (IOException e) {} + if(result!=null){ + documentEntity.setFilePath(result.filepath); + documentEntity.setFileName(result.fileName); + documentEntity.setType(documentTypeEnum.getValue()); + documentRepository.save(documentEntity); + } + return callDao.convertToDocumentResponseBean(documentEntity); + } + public DocumentResponseBean getDocument(Long documentId) { + Optional documentEntity= documentRepository.findById(documentId); + if(documentEntity.isEmpty()){ + new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); + } + return callDao.convertToDocumentResponseBean(documentEntity.orElse(null)); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java new file mode 100644 index 00000000..c24b2db6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -0,0 +1,75 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.stereotype.Component; + + +@Component +public class EvaluationCriteriaDao { + + @Autowired + private EvaluationCriteriaRepository repository; + + @Autowired + private CallRepository callRepository; + + public EvaluationCriteriaResponseBean createEvaluationCriteria(EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaEntity entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(evaluationCriteriaRequest); + return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); + } + + private EvaluationCriteriaEntity convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaEntity entity = new EvaluationCriteriaEntity(); + CallEntity callEntity= callRepository.findById(evaluationCriteriaRequest.getCallId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + entity.setCall(callEntity); + entity.setName(evaluationCriteriaRequest.getName()); + entity.setDescription(evaluationCriteriaRequest.getDescription()); + entity.setScore(evaluationCriteriaRequest.getScore()); + entity = repository.save(entity); + return entity; + } + + public EvaluationCriteriaResponseBean getEvaluationCriteriaById(Long id) { + return repository.findById(id) + .map(this::convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + } + + public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest request) { + EvaluationCriteriaEntity entity = repository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(request); + return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); + } + + public void deleteEvaluationCriteria(Long id) { + try { + repository.deleteById(id); + } catch (EmptyResultDataAccessException e) { + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)); + } + } + + private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(EvaluationCriteriaEntity entity) { + EvaluationCriteriaResponseBean response = new EvaluationCriteriaResponseBean(); + response.setId(entity.getId()); + response.setName(entity.getName()); + response.setDescription(entity.getDescription()); + response.setScore(entity.getScore()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + return response; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java new file mode 100644 index 00000000..cbf06fc3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java @@ -0,0 +1,96 @@ +package net.gepafin.tendermanagement.dao; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.FaqRepository; +import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +public class FaqDao { + + @Autowired + private FaqRepository faqRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private CallDao callDao; + + @Autowired + private CallRepository callRepository; + + public FaqResponseBean createFaq(FaqReq faqRequest,Long userId,Long callId) { + FaqEntity entity = new FaqEntity(); + CallEntity callEntity=callRepository.findById(callId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + entity= callDao.convertToFaqEntity(faqRequest,callEntity,userId); + faqRepository.save(entity); + return convertFaqEntityToResponseBean(entity); + } + + public FaqResponseBean getFaqById(Long id) { + return faqRepository.findById(id) + .map(this::convertFaqEntityToResponseBean) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + } + + public FaqResponseBean updateFaq(Long id, FaqReq faqRequest,Long userId) { + FaqEntity entity = faqRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + updateFaqEntity(entity,faqRequest,userId,entity.getCall()); + faqRepository.save(entity); + return convertFaqEntityToResponseBean(entity); + } + + public void deleteFaq(Long id) { + FaqEntity entity = faqRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + faqRepository.deleteById(entity.getId()); + + } + + private FaqResponseBean convertFaqEntityToResponseBean(FaqEntity entity) { + FaqResponseBean response = new FaqResponseBean(); + response.setId(entity.getId()); + response.setUserId(entity.getUser().getId()); + response.setIsVisible(entity.getIsVisible()); + response.setUpdatedDate(entity.getUpdatedDate()); + response.setCreatedDate(entity.getCreatedDate()); + response.setQuestionShort(entity.getQuestionShort()); + response.setQuestion(entity.getQuestion()); + response.setResponseShort(entity.getResponseShort()); + response.setResponse(entity.getResponse()); + response.setResponseDate(entity.getResponseDate()); + return response; + } + private void updateFaqEntity(FaqEntity faqEntity, FaqReq faqReq, Long userId,CallEntity callEntity) { + faqEntity.setQuestion(faqReq.getQuestion()); + UserEntity userEntity= userRepository.findById(userId) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + faqEntity.setUser(userEntity); + faqEntity.setIsVisible(true); + if(faqReq.getIsVisible()!=null){ + faqEntity.setIsVisible(faqReq.getIsVisible()); + } + faqEntity.setQuestionShort(faqReq.getQuestionShort()); + faqEntity.setQuestion(faqReq.getQuestion()); + if(faqReq.getResponse()!=null ||faqReq.getResponseShort()!=null){ + faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + } + faqEntity.setResponseShort(faqReq.getResponseShort()); + faqEntity.setResponse(faqReq.getResponse()); + faqEntity.setCall(callEntity); + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java new file mode 100644 index 00000000..6d9daf37 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java @@ -0,0 +1,65 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.entities.LookUpDataEntity; +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; +import net.gepafin.tendermanagement.repositories.LookUpDataRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class LookUpDataDao { + + @Autowired + private LookUpDataRepository lookUpDataRepository; + + public LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq) { + LookUpDataEntity entity = convertLookUpDataReqToLookUpDataEntity(lookUpDataReq); + return convertLookUpDataEntityToResponseBean(entity); + } + private LookUpDataEntity convertLookUpDataReqToLookUpDataEntity(LookUpDataRequest lookUpDataReq) { + LookUpDataEntity entity = new LookUpDataEntity(); + entity.setTitle(lookUpDataReq.getTitle()); + entity.setType(lookUpDataReq.getType().getValue()); + entity.setValue(lookUpDataReq.getValue()); + lookUpDataRepository.save(entity); + return entity; + } + + public LookUpDataResponseBean getLookUpDataById(Long id) { + return lookUpDataRepository.findById(id) + .map(this::convertLookUpDataEntityToResponseBean) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + } + + public LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq) { + LookUpDataEntity entity = lookUpDataRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + entity.setTitle(lookUpDataReq.getTitle()); + entity.setType(lookUpDataReq.getType().getValue()); + entity.setValue(lookUpDataReq.getValue()); + lookUpDataRepository.save(entity); + return convertLookUpDataEntityToResponseBean(entity); + } + + public void deleteLookUpData(Long id) { + LookUpDataEntity entity = lookUpDataRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + lookUpDataRepository.deleteById(entity.getId()); + } + + private LookUpDataResponseBean convertLookUpDataEntityToResponseBean(LookUpDataEntity entity) { + LookUpDataResponseBean response = new LookUpDataResponseBean(); + response.setId(entity.getId()); + response.setTitle(entity.getTitle()); + response.setType(LookUpDataEntity.LookUpDataTypeEnum.valueOf(entity.getType())); + response.setValue(entity.getValue()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + return response; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java index a8b90e1c..76b0afa4 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java @@ -1,7 +1,9 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; +import lombok.NoArgsConstructor; +@NoArgsConstructor @Data public class EvaluationCriteriaReq { diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaRequest.java new file mode 100644 index 00000000..061cc6ae --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaRequest.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data +public class EvaluationCriteriaRequest { + + private Long callId; + + private String name; + + private String description; + + private Integer score; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java new file mode 100644 index 00000000..459e1416 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; + +@Data +public class LookUpDataRequest { + + private String title; + private LookUpDataTypeEnum type; + private String value; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java index 29cfed21..5eac6455 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java @@ -1,13 +1,11 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; -import java.time.LocalDateTime; @Data -public class EvaluationCriteriaResponseBean { - - private Long id; +public class EvaluationCriteriaResponseBean extends BaseBean { private String name; @@ -15,7 +13,4 @@ public class EvaluationCriteriaResponseBean { private Integer score; - private LocalDateTime createdDate; - - private LocalDateTime updatedDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java index fdc4be63..14ca345e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java @@ -1,14 +1,13 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; import java.time.LocalDateTime; @Data -public class FaqResponseBean { - - private Long id; +public class FaqResponseBean extends BaseBean { private Long userId; @@ -24,7 +23,4 @@ public class FaqResponseBean { private LocalDateTime responseDate; - private LocalDateTime createdDate; - - private LocalDateTime updatedDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java index 27811e63..4fb3f5d9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java @@ -1,13 +1,10 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; - -import java.time.LocalDateTime; +import net.gepafin.tendermanagement.model.BaseBean; @Data -public class LookUpDataResponse { - - private Long id; +public class LookUpDataResponse extends BaseBean { private Long lookUpDataId; @@ -15,8 +12,4 @@ public class LookUpDataResponse { private String value; - private LocalDateTime createdDate; - - private LocalDateTime updatedDate; - } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java new file mode 100644 index 00000000..554db7bd --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class LookUpDataResponseBean extends BaseBean { + + private String title; + + private String value; + + private LookUpDataTypeEnum type; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java index 057566a6..2812e264 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java @@ -3,5 +3,5 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import org.springframework.data.jpa.repository.JpaRepository; -public interface EvaluationCriteriaRepository extends JpaRepository { +public interface EvaluationCriteriaRepository extends JpaRepository { } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java index 7b4b7610..9e10f3d3 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -5,10 +5,8 @@ import net.gepafin.tendermanagement.entities.FaqEntity; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface FaqRepository extends JpaRepository { +public interface FaqRepository extends JpaRepository { + List findByCallId(Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java index 4081af53..f55636df 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.service; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import org.springframework.web.multipart.MultipartFile; @@ -8,7 +9,11 @@ import java.util.List; public interface DocumentService { - public List uploadFile(List files, DocumentTypeEnum fileType); + public List uploadFile(List files,Long callId, DocumentTypeEnum fileType); public void deleteFile(Long documentId); + + public DocumentResponseBean updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum); + + public DocumentResponseBean getDocument(HttpServletRequest httpServletRequest,Long documentId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java b/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java new file mode 100644 index 00000000..3c1e2b85 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; + +public interface EvaluationCriteriaService { + + public EvaluationCriteriaResponseBean createEvaluationCriteria(HttpServletRequest request,EvaluationCriteriaRequest evaluationCriteriaRequest); + + public EvaluationCriteriaResponseBean getEvaluationCriteria(HttpServletRequest request,Long id); + + public EvaluationCriteriaResponseBean updateEvaluationCriteria(HttpServletRequest request,Long id, EvaluationCriteriaRequest evaluationCriteriaRequest); + + public void deleteEvaluationCriteria(HttpServletRequest request,Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/FaqService.java b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java new file mode 100644 index 00000000..58ca8234 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.service; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; + +public interface FaqService { + + FaqResponseBean createFaq(HttpServletRequest request,Long callId, FaqReq faqRequest); + + FaqResponseBean getFaqById(HttpServletRequest request, Long id); + + FaqResponseBean updateFaq(HttpServletRequest request, Long id, FaqReq faqRequest); + + void deleteFaq(HttpServletRequest request, Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java new file mode 100644 index 00000000..0a69be9f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; + +public interface LookUpDataService { + + LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq); + + LookUpDataResponseBean getLookUpDataById(Long id); + + LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq); + + void deleteLookUpData(Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java index 55c6165b..15e278bf 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -2,28 +2,41 @@ package net.gepafin.tendermanagement.service.impl; import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.DocumentDao; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.service.DocumentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + + @Service public class DocumentServiceImpl implements DocumentService { @Autowired - private DocumentDao fileDao; + private DocumentDao documentDao; @Override - public List uploadFile(List files, DocumentTypeEnum fileType) { - return fileDao.uploadFiles(files,fileType); + public List uploadFile(List files,Long callId,DocumentTypeEnum fileType) { + return documentDao.uploadFiles(files,callId,fileType); } @Override public void deleteFile(Long documentId){ - fileDao.deleteFile(documentId); + documentDao.deleteFile(documentId); + return ; + } + + @Override + public DocumentResponseBean updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { + return documentDao.updateDocument(documentId,file,documentTypeEnum); + } + + @Override + public DocumentResponseBean getDocument(HttpServletRequest httpServletRequest, Long documentId) { + return documentDao.getDocument(documentId); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java new file mode 100644 index 00000000..2aef9e5f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java @@ -0,0 +1,36 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.EvaluationCriteriaDao; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.service.EvaluationCriteriaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class EvaluationCriteriaServiceImpl implements EvaluationCriteriaService { + + @Autowired + private EvaluationCriteriaDao evaluationCriteriaDao; + + @Override + public EvaluationCriteriaResponseBean createEvaluationCriteria(HttpServletRequest request,EvaluationCriteriaRequest evaluationCriteriaRequest) { + return evaluationCriteriaDao.createEvaluationCriteria(evaluationCriteriaRequest); + } + + @Override + public EvaluationCriteriaResponseBean getEvaluationCriteria(HttpServletRequest request,Long id) { + return evaluationCriteriaDao.getEvaluationCriteriaById(id); + } + + @Override + public EvaluationCriteriaResponseBean updateEvaluationCriteria(HttpServletRequest request,Long id, EvaluationCriteriaRequest evaluationCriteriaRequest) { + return evaluationCriteriaDao.updateEvaluationCriteria(id,evaluationCriteriaRequest); + } + + @Override + public void deleteEvaluationCriteria(HttpServletRequest request,Long id) { + evaluationCriteriaDao.deleteEvaluationCriteria(id); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java new file mode 100644 index 00000000..252935f2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java @@ -0,0 +1,44 @@ +package net.gepafin.tendermanagement.service.impl; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; +import net.gepafin.tendermanagement.dao.FaqDao; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.service.FaqService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class FaqServiceImpl implements FaqService { + + @Autowired + private FaqDao faqDao; + + @Autowired + private TokenProvider tokenProvider; + + @Override + public FaqResponseBean createFaq(HttpServletRequest request,Long callId, FaqReq faqRequest) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return faqDao.createFaq(faqRequest,Long.parseLong(userInfo.get("userId").toString()),callId); + } + + @Override + public FaqResponseBean getFaqById(HttpServletRequest request, Long id) { + return faqDao.getFaqById(id); + } + + @Override + public FaqResponseBean updateFaq(HttpServletRequest request, Long id, FaqReq faqRequest) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return faqDao.updateFaq(id, faqRequest,Long.parseLong(userInfo.get("userId").toString())); + } + + @Override + public void deleteFaq(HttpServletRequest request, Long id) { + faqDao.deleteFaq(id); + } +} + diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java new file mode 100644 index 00000000..86a2ae6e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java @@ -0,0 +1,35 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.dao.LookUpDataDao; +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; +import net.gepafin.tendermanagement.service.LookUpDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class LookUpDataServiceImpl implements LookUpDataService { + + @Autowired + private LookUpDataDao lookUpDataDao; + + @Override + public LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq) { + return lookUpDataDao.createLookUpData(lookUpDataReq); + } + + @Override + public LookUpDataResponseBean getLookUpDataById(Long id) { + return lookUpDataDao.getLookUpDataById(id); + } + + @Override + public LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq) { + return lookUpDataDao.updateLookUpData(id, lookUpDataReq); + } + + @Override + public void deleteLookUpData(Long id) { + lookUpDataDao.deleteLookUpData(id); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java index 4c3386c6..2ca052ad 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.web.rest.api; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -27,14 +28,12 @@ public interface DocumentApi { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) - }) - @PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, - @RequestParam("file") List files, - @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) + @PostMapping(value = "/uploadFile/call/{callId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, @Parameter(description = "call id", required = true) @PathVariable Long callId, @RequestParam("file") List files, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } + @Operation(summary = "API to delete a file by document id", responses = { @ApiResponse(responseCode = "200", description = "File deleted successfully"), @@ -50,4 +49,30 @@ public interface DocumentApi { @RequestParam( "id") Long id) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } + @Operation(summary = "Api to update document", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) + @PostMapping(value = "/{documentId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + default ResponseEntity> updateDocument(HttpServletRequest httpServletRequest, @Parameter(description = "document id", required = true) @PathVariable Long documentId, @RequestParam("file") MultipartFile file, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + @Operation(summary = "API to get document by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) + }) + @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> getDocumentById(HttpServletRequest request, + @Parameter(description = "document id", required = true) + @PathVariable Long id); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java new file mode 100644 index 00000000..1b791f2e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java @@ -0,0 +1,78 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +public interface EvaluationCriteriaApi { + + + @Operation(summary = "API to create evaluation criteria", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "/criteria", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> createEvaluationCriteria(HttpServletRequest request, + @Parameter(description = "Evaluation criteria request object", required = true) + @Valid @RequestBody EvaluationCriteriaRequest createCallRequest); + + @Operation(summary = "API to get evaluation criteria by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) + }) + @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> getEvaluationCriteriaById(HttpServletRequest request, + @Parameter(description = "evaluation criteria id", required = true) + @PathVariable Long id); + + @Operation(summary = "API to update evaluation criteria", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PutMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> updateEvaluationCriteria(HttpServletRequest request, + @Parameter(description = "evaluation criteria id", required = true) + @PathVariable Long id, + @Parameter(description = "Evaluation criteria request object", required = true) + @Valid @RequestBody EvaluationCriteriaRequest evaluationCriteriaRequest); + + @Operation(summary = "API to delete evaluation criteria", + responses = { + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) + }) + @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, + @Parameter(description = "evaluation criteria id", required = true) + @PathVariable Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java new file mode 100644 index 00000000..2d76f286 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java @@ -0,0 +1,57 @@ +package net.gepafin.tendermanagement.web.rest.api; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +public interface FaqApi { + + @Operation(summary = "API to create FAQ", + responses = { + @ApiResponse(responseCode = "201", description = "Created"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Unauthorized\" }"))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @PostMapping(value = "/call/{callId}", consumes = "application/json", produces = "application/json") + ResponseEntity> createFaq(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) + @PathVariable Long id, @Valid @RequestBody FaqReq faqRequest); + + @Operation(summary = "API to get FAQ by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @GetMapping(value = "/{id}", produces = "application/json") + ResponseEntity> getFaqById(HttpServletRequest request, + @PathVariable Long id); + + @Operation(summary = "API to update FAQ", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))) + }) + @PutMapping(value = "/{id}", consumes = "application/json", produces = "application/json") + ResponseEntity> updateFaq(HttpServletRequest request, + @PathVariable Long id, + @Valid @RequestBody FaqReq faqRequest); + + @Operation(summary = "API to delete FAQ", + responses = { + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @DeleteMapping(value = "/{id}") + ResponseEntity> deleteFaq(HttpServletRequest request, + @PathVariable Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java new file mode 100644 index 00000000..7ad01422 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java @@ -0,0 +1,51 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +public interface LookUpDataApi { + + @Operation(summary = "API to create LookUp Data", + responses = { + @ApiResponse(responseCode = "201", description = "Created"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @PostMapping(value = "/lookupdata", consumes = "application/json", produces = "application/json") + ResponseEntity> createLookUpData(HttpServletRequest request, @Valid @RequestBody LookUpDataRequest lookUpDataReq); + + @Operation(summary = "API to get LookUp Data by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @GetMapping(value = "/lookupdata/{id}", produces = "application/json") + ResponseEntity> getLookUpDataById(HttpServletRequest request, @PathVariable Long id); + + @Operation(summary = "API to update LookUp Data", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @PutMapping(value = "/lookupdata/{id}", consumes = "application/json", produces = "application/json") + ResponseEntity> updateLookUpData(HttpServletRequest request, @PathVariable Long id, @Valid @RequestBody LookUpDataRequest lookUpDataReq); + + @Operation(summary = "API to delete LookUp Data", + responses = { + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) + }) + @DeleteMapping(value = "/lookupdata/{id}") + ResponseEntity> deleteLookUpData(HttpServletRequest request, @PathVariable Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java index d4a151b0..5f986716 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java @@ -20,16 +20,17 @@ import java.util.List; @RestController @RequestMapping("${openapi.swaggerBflowsMiddleware.base-path:/v1/document}") -public class DocumentApiController implements DocumentApi { +public class +DocumentApiController implements DocumentApi { @Autowired - private DocumentService fileService; + private DocumentService documentService; @Override - public ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, - List files, DocumentTypeEnum fileType) { + public ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, Long callId, + List files, DocumentTypeEnum fileType) { try { - List responseBeans=fileService.uploadFile(files,fileType); + List responseBeans = documentService.uploadFile(files, callId, fileType); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); } catch (CustomValidationException ex) { @@ -38,8 +39,22 @@ public class DocumentApiController implements DocumentApi { } @Override public ResponseEntity> deleteFile(HttpServletRequest httpServletRequest, Long documentId) { - fileService.deleteFile(documentId); + documentService.deleteFile(documentId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILE_DELETED_SUCCESSFULLY_MSG))); - } + } + + @Override + public ResponseEntity> updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { + DocumentResponseBean responseBeans = documentService.updateDocument(httpServletRequest, documentId, file, documentTypeEnum); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPDATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getDocumentById(HttpServletRequest request, Long id) { + DocumentResponseBean documentResponseBean= documentService.getDocument(request,id); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(documentResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_FETCHED_SUCCESSFULLY))); } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java new file mode 100644 index 00000000..7ee581e2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java @@ -0,0 +1,66 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.EvaluationCriteriaService; +import net.gepafin.tendermanagement.web.rest.api.EvaluationCriteriaApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/evaluation}") +public class EvaluationCriteriaApiController implements EvaluationCriteriaApi { + + @Autowired + private EvaluationCriteriaService service; + + @Override + public ResponseEntity> createEvaluationCriteria(HttpServletRequest request, EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaResponseBean responseBean = service.createEvaluationCriteria(request,evaluationCriteriaRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getEvaluationCriteriaById(HttpServletRequest request, Long id) { + EvaluationCriteriaResponseBean responseBean = service.getEvaluationCriteria(request,id); + if (responseBean != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_FETCH_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + } + } + + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> updateEvaluationCriteria(HttpServletRequest request, Long id, EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaResponseBean responseBean = service.updateEvaluationCriteria(request,id, evaluationCriteriaRequest); + if (responseBean != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_UPDATED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + } + } + + @Override + public ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, Long id) { + service.deleteEvaluationCriteria(request,id); + return ResponseEntity.status(HttpStatus.OK) + .header("Message", Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_DELETED_SUCCESSFULLY)) + .build(); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java new file mode 100644 index 00000000..142e5614 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java @@ -0,0 +1,61 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.FaqService; +import net.gepafin.tendermanagement.web.rest.api.FaqApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/faq}") +public class FaqApiController implements FaqApi { + + @Autowired + private FaqService faqService; + + @Override + public ResponseEntity> createFaq(HttpServletRequest request, Long callId,FaqReq faqRequest) { + FaqResponseBean response = faqService.createFaq(request,callId, faqRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.FAQ_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getFaqById(HttpServletRequest request, Long id) { + FaqResponseBean response = faqService.getFaqById(request, id); + if (response != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.FAQ_FETCHED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + } + } + + @Override + public ResponseEntity> updateFaq(HttpServletRequest request, Long id, FaqReq faqRequest) { + FaqResponseBean response = faqService.updateFaq(request, id, faqRequest); + if (response != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.FAQ_UPDATED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + } + } + + @Override + public ResponseEntity> deleteFaq(HttpServletRequest request, Long id) { + faqService.deleteFaq(request, id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FAQ_DELETED_SUCCESSFULLY))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java new file mode 100644 index 00000000..79fae0de --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java @@ -0,0 +1,62 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.LookUpDataRequest; +import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.LookUpDataService; +import net.gepafin.tendermanagement.web.rest.api.LookUpDataApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/lookupdata}") +public class LookUpDataApiController implements LookUpDataApi { + + @Autowired + private LookUpDataService lookUpDataService; + + @Override + public ResponseEntity> createLookUpData(HttpServletRequest request, LookUpDataRequest lookUpDataReq) { + LookUpDataResponseBean responseBean = lookUpDataService.createLookUpData(lookUpDataReq); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getLookUpDataById(HttpServletRequest request, Long id) { + LookUpDataResponseBean responseBean = lookUpDataService.getLookUpDataById(id); + if (responseBean != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_FETCHED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response(responseBean, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + } + } + + @Override + public ResponseEntity> updateLookUpData(HttpServletRequest request, Long id, LookUpDataRequest lookUpDataReq) { + LookUpDataResponseBean responseBean = lookUpDataService.updateLookUpData(id, lookUpDataReq); + if (responseBean != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_UPDATED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response(responseBean, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + } + } + + @Override + public ResponseEntity> deleteLookUpData(HttpServletRequest request, Long id) { + lookUpDataService.deleteLookUpData(id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_DELETED_SUCCESSFULLY))); + } +} diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 15aa6498..918cd38a 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -45,6 +45,8 @@ document.not.found=Document not found. document.id.not.found=Document ID not found. call.created.successfully=Call created successfully. call.invalid.date=Invalid start or end date. +call.not.found=Call not dound. +score.not.null=Score cannot be null or cannot be zero. # Login-related messages login.successfully=Login successfully. @@ -57,7 +59,27 @@ invalid_signature=Invalid token. invalid_login=Invalid username or password. req_validation_er=Request Validation Error +#EvaluationCriteria-related messages +evaluation.criteria.not.found=EvaluationCriteria not found. +evaluation.criteria.created.successfully=EvaluationCriteria created successfully. +evaluation.criteria.fetch.successfully=EvaluationCriteria fetched successfully. +evaluation.criteria.updated.successfully=EvaluationCriteria updated successfully. +evaluation.criteria.deleted.successfully=EvaluationCriteria deleted successfully. +#Faq-related messages +faq.not.found=Faq not found. +faq.created.successfully=Faq created successfully. +faq.fetched.successfully=Faq fetched successfully. +faq.updated.successfully=Faq updated successfully. +faq.deleted.successfully=Faq deleted successfully. +#LookUpData-related message +lookupdata.not.found=LookUpData not found. +lookupdata.created.successfully=LookUpData created successfully. +lookupdata.fetched.successfully=LookUpData fetched successfully. +lookupdata.updated.successfully=LookUpData updated successfully. +lookupdata.deleted.successfully=LookUpData deleted successfully. - +#Document-related message +document.updated.successfully=Document updated successfully. +document.fetched.successfully=Document fetched successfully. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ae93ff53..39cdf933 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -44,6 +44,8 @@ file.deleted.successfully=File eliminato con successo. document.not.found=Documento non trovato. document.id.not.found=ID documento non trovato. call.invalid.date=Data di inizio o fine non valida. +call.not.found=Chiamata non trovata. +score.not.null=Il punteggio non pu� essere nullo o zero. # Login-related messages login.successfully=Accesso effettuato con successo. @@ -55,3 +57,28 @@ common_message=qualcosa é andato storto. Per favore riprova invalid_signature=Gettone non valido. invalid_login=Nome utente o password errati req_validation_er=Errore di convalida + +#EvaluationCriteria-related messages +evaluation.criteria.not.found=EvaluationCriteria non trovato. +evaluation.criteria.created.successfully=EvaluationCriteria creato con successo. +evaluation.criteria.fetch.successfully=Recupero EvaluationCriteria riuscito. +evaluation.criteria.updated.successfully=EvaluationCriteria aggiornato con successo. +evaluation.criteria.deleted.successfully=EvaluationCriteria eliminato con successo. + +#faq-related messages +faq.not.found=Faq non trovata. +faq.created.successfully=Faq creata con successo. +faq.fetched.successfully=Faq recuperata con successo. +faq.updated.successfully=Faq aggiornata con successo. +faq.deleted.successfully=Faq eliminata con successo. + +#LookUpData-related message +lookupdata.not.found=LookUpData non trovato. +lookupdata.created.successfully=LookUpData creato correttamente. +lookupdata.fetched.successfully=LookUpData recuperato correttamente. +lookupdata.updated.successfully=LookUpData aggiornato correttamente. +lookupdata.deleted.successfully=LookUpData eliminato correttamente. + +#Document-related message +document.updated.successfully=Documento aggiornato con successo. +document.fetched.successfully=Documento recuperato con successo. \ No newline at end of file From 737c4b17b171cbf36cb7c81e05e5feca47580f4e Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 17:16:40 +0530 Subject: [PATCH 031/145] Updated code --- .../web/rest/api/EvaluationCriteriaApi.java | 6 +++--- .../tendermanagement/web/rest/api/LookUpDataApi.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java index 1b791f2e..41bfbc92 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java @@ -41,7 +41,7 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) - @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(value = "/criteria/{id}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> getEvaluationCriteriaById(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable Long id); @@ -56,7 +56,7 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PutMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PutMapping(value = "/criteria/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> updateEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable Long id, @@ -71,7 +71,7 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) - @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @DeleteMapping(value = "/criteria/{id}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable Long id); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java index 7ad01422..bf3afe19 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java @@ -21,7 +21,7 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) }) - @PostMapping(value = "/lookupdata", consumes = "application/json", produces = "application/json") + @PostMapping(value = "", consumes = "application/json", produces = "application/json") ResponseEntity> createLookUpData(HttpServletRequest request, @Valid @RequestBody LookUpDataRequest lookUpDataReq); @Operation(summary = "API to get LookUp Data by id", @@ -29,7 +29,7 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) }) - @GetMapping(value = "/lookupdata/{id}", produces = "application/json") + @GetMapping(value = "/{id}", produces = "application/json") ResponseEntity> getLookUpDataById(HttpServletRequest request, @PathVariable Long id); @Operation(summary = "API to update LookUp Data", @@ -38,7 +38,7 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) }) - @PutMapping(value = "/lookupdata/{id}", consumes = "application/json", produces = "application/json") + @PutMapping(value = "/{id}", consumes = "application/json", produces = "application/json") ResponseEntity> updateLookUpData(HttpServletRequest request, @PathVariable Long id, @Valid @RequestBody LookUpDataRequest lookUpDataReq); @Operation(summary = "API to delete LookUp Data", @@ -46,6 +46,6 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "204", description = "No Content"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) }) - @DeleteMapping(value = "/lookupdata/{id}") + @DeleteMapping(value = "/{id}") ResponseEntity> deleteLookUpData(HttpServletRequest request, @PathVariable Long id); } From 7804b7e103b4285122016e637f40d5410d65899d Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 26 Aug 2024 17:26:47 +0530 Subject: [PATCH 032/145] Updated code --- .../net/gepafin/tendermanagement/web/rest/api/DocumentApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java index 2ca052ad..a9354dbf 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java @@ -58,7 +58,7 @@ public interface DocumentApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) - @PostMapping(value = "/{documentId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PutMapping(value = "/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) default ResponseEntity> updateDocument(HttpServletRequest httpServletRequest, @Parameter(description = "document id", required = true) @PathVariable Long documentId, @RequestParam("file") MultipartFile file, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } From f561695db04510b0382235570739715859ac1949 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 27 Aug 2024 11:30:32 +0530 Subject: [PATCH 033/145] created api to update the call --- .../constants/GepafinConstant.java | 2 + .../gepafin/tendermanagement/dao/CallDao.java | 560 ++++++++++-------- .../tendermanagement/dao/RegionDao.java | 3 +- .../gepafin/tendermanagement/dao/RoleDao.java | 2 +- .../gepafin/tendermanagement/dao/UserDao.java | 2 +- .../entities/EvaluationCriteriaEntity.java | 12 +- .../model/request/CreateCallRequestStep1.java | 2 +- .../model/request/EvaluationCriteriaReq.java | 4 +- .../model/request/UpdateCallRequestStep1.java | 43 ++ .../EvaluationCriteriaResponseBean.java | 12 +- .../repositories/DocumentRepository.java | 5 + .../EvaluationCriteriaRepository.java | 5 + .../repositories/LookUpDataRepository.java | 2 + .../tendermanagement/service/CallService.java | 3 + .../service/impl/CallServiceImpl.java | 8 + .../tendermanagement/util/ObjectUtils.java | 20 - .../gepafin/tendermanagement/util/Utils.java | 14 + .../web/rest/api/CallApi.java | 18 + .../web/rest/api/impl/CallApiController.java | 9 + .../db/changelog/db.changelog-1.0.0.xml | 15 + src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 22 files changed, 458 insertions(+), 285 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java delete mode 100644 src/main/java/net/gepafin/tendermanagement/util/ObjectUtils.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index f8239a1d..7402a589 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -45,6 +45,8 @@ public class GepafinConstant { public static final String INVALID_DATE_MSG = "call.invalid.date"; public static final String STEP_1 = "STEP_1"; public static final String STEP_2 = "STEP_2"; + public static final String CALL_UPDATE_SUCCESSFULLY_MSG = "call.update.successfully"; + public static final String CALL_NOT_FOUND = "call.not.found"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index c6265391..2131519d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -24,12 +24,14 @@ import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.CallTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.DocumentReq; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaReq; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.request.LookUpDataReq; +import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; @@ -48,32 +50,34 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + @Component public class CallDao { - @Autowired - private CallRepository callRepository; + @Autowired + private CallRepository callRepository; - @Autowired - private DocumentRepository documentRepository; + @Autowired + private DocumentRepository documentRepository; - @Autowired - private EvaluationCriteriaRepository evaluationCriteriaRepository; + @Autowired + private EvaluationCriteriaRepository evaluationCriteriaRepository; - @Autowired - private FaqRepository faqRepository; + @Autowired + private FaqRepository faqRepository; - @Autowired - private RegionRepository regionRepository; + @Autowired + private RegionRepository regionRepository; - @Autowired - private LookUpDataRepository lookUpDataRepository; + @Autowired + private LookUpDataRepository lookUpDataRepository; - @Autowired - private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; + @Autowired + private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; - @Autowired - private UserRepository userRepository; + @Autowired + private UserRepository userRepository; public CreateCallResponseBean createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { CreateCallResponseBean createCallResponseBean = null; @@ -89,55 +93,74 @@ public class CallDao { } + public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest) { + CallEntity callEntity = new CallEntity(); + validateCallEntity(createCallRequest); + RegionEntity region = regionRepository.findById(createCallRequest.getRegionId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.REGION_NOT_FOUND))); + callEntity.setRegion(region); + callEntity.setName(createCallRequest.getName()); + callEntity.setDescriptionShort(createCallRequest.getDescriptionShort()); + callEntity.setDescriptionLong(createCallRequest.getDescriptionLong()); + callEntity.setStartDate(createCallRequest.getStartDate()); + callEntity.setEndDate(createCallRequest.getEndDate()); + callEntity.setStatus(CallTypeEnum.DRAFT.getValue()); + callEntity.setAmountMax(createCallRequest.getAmountMax()); + callEntity.setAmount(createCallRequest.getAmountMax()); + callEntity.setConfidi(false); + if (createCallRequest.getConfidi() != null) { + callEntity.setConfidi(createCallRequest.getConfidi()); + } + callEntity.setDocumentationRequested(createCallRequest.getDocumentationRequested()); + callEntity = callRepository.save(callEntity); + return callEntity; + } - public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest) { - CallEntity callEntity = new CallEntity(); - validateCallEntity(createCallRequest); - RegionEntity region = regionRepository.findById(createCallRequest.getRegionId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND))); - callEntity.setRegion(region); - callEntity.setName(createCallRequest.getName()); - callEntity.setDescriptionShort(createCallRequest.getDescriptionShort()); - callEntity.setDescriptionLong(createCallRequest.getDescriptionLong()); - callEntity.setStartDate(createCallRequest.getStartDate()); - callEntity.setEndDate(createCallRequest.getEndDate()); - callEntity.setStatus(CallTypeEnum.DRAFT.getValue()); - callEntity.setAmountMax(createCallRequest.getAmountMax()); - callEntity.setAmount(createCallRequest.getAmountMax()); - callEntity.setConfidi(false); - if(createCallRequest.getConfidi()!=null){ - callEntity.setConfidi(createCallRequest.getConfidi()); - } - callEntity.setDocumentationRequested(createCallRequest.getDocumentationRequested()); - callEntity = callRepository.save(callEntity); - return callEntity; - } + public List convertToEvaluationCriteriaEntities( + List criteriaReqList, CallEntity callEntity) { + List evaluationCriteriaEntities = criteriaReqList.stream() + .map(req -> convertToEvaluationCriteriaEntity(req, callEntity)).collect(Collectors.toList()); + evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); + return evaluationCriteriaEntities; + } - public List convertToEvaluationCriteriaEntities(List criteriaReqList, CallEntity callEntity) { - List evaluationCriteriaEntities = criteriaReqList.stream().map(req -> convertToEvaluationCriteriaEntity(req, callEntity)).collect(Collectors.toList()); - evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); - return evaluationCriteriaEntities; - } + private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, + CallEntity callEntity) { + EvaluationCriteriaEntity criteriaEntity = new EvaluationCriteriaEntity(); + LookUpDataEntity lookUpDataEntity = getOrCreateLookUpData(criteriaReq, LookUpDataTypeEnum.EVALUATION_CRITERIA); + criteriaEntity.setLookupData(lookUpDataEntity); + criteriaEntity.setScore(criteriaReq.getScore()); + criteriaEntity.setCall(callEntity); + return criteriaEntity; + } - private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, CallEntity callEntity) { - EvaluationCriteriaEntity criteriaEntity = new EvaluationCriteriaEntity(); - validateEvolutionCrieteriaEntity(criteriaReq.getName()); - criteriaEntity.setName(criteriaReq.getName()); - criteriaEntity.setDescription(criteriaReq.getValue()); - criteriaEntity.setScore(criteriaReq.getScore()); - criteriaEntity.setCall(callEntity); - return criteriaEntity; - } + private LookUpDataEntity getOrCreateLookUpData(EvaluationCriteriaReq criteriaReq, LookUpDataTypeEnum typeEnum) { + LookUpDataEntity lookUpDataEntity = null; + if (criteriaReq.getLookUpDataId() == null || criteriaReq.getLookUpDataId().equals(0l)) { + validateEvolutionCrieteriaEntity(criteriaReq.getValue()); + lookUpDataEntity = new LookUpDataEntity(); + lookUpDataEntity.setValue(criteriaReq.getValue()); + lookUpDataEntity.setType(typeEnum.getValue()); + lookUpDataRepository.save(lookUpDataEntity); + } else { + lookUpDataEntity = lookUpDataRepository.findById(null) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + } + return lookUpDataEntity; + } - public List convertToDocumentEntities(List documentReqList, CallEntity callEntity) { - List documentEntities = documentReqList.stream().map(req -> convertToDocumentEntity(req, callEntity)).collect(Collectors.toList()); - documentRepository.saveAll(documentEntities); - return documentEntities; - } + public List convertToDocumentEntities(List documentReqList, CallEntity callEntity) { + List documentEntities = documentReqList.stream() + .map(req -> convertToDocumentEntity(req, callEntity)).collect(Collectors.toList()); + documentRepository.saveAll(documentEntities); + return documentEntities; + } - private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { - validateDocumentEntity(documentReq.getId(),documentReq.getFileName()); + private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { + validateDocumentEntity(documentReq.getId(), documentReq.getFileName()); DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); @@ -147,208 +170,227 @@ public class CallDao { // documentEntity.setFileName(documentReq.getFileName()); // documentEntity.setFilePath(documentReq.getUrl()); // documentEntity.setCall(callEntity); - return documentEntity; - } + return documentEntity; + } + public List convertToFaqEntities(List faqReqList, CallEntity callEntity, Long userId) { + List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userId)) + .collect(Collectors.toList()); + faqRepository.saveAll(faqEntities); + return faqEntities; + } - public List convertToFaqEntities(List faqReqList, CallEntity callEntity, Long userId) { - List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userId)).collect(Collectors.toList()); - faqRepository.saveAll(faqEntities); - return faqEntities; - } + private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { + FaqEntity faqEntity = new FaqEntity(); + validateFaqEntity(faqReq.getQuestion()); + UserEntity userEntity = userRepository.findById(userId) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + faqEntity.setUser(userEntity); + faqEntity.setIsVisible(true); + if (faqReq.getIsVisible() != null) { + faqEntity.setIsVisible(faqReq.getIsVisible()); + } + faqEntity.setQuestionShort(faqReq.getQuestionShort()); + faqEntity.setQuestion(faqReq.getQuestion()); + if (faqReq.getResponse() != null || faqReq.getResponseShort() != null) { + faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + } + faqEntity.setResponseShort(faqReq.getResponseShort()); + faqEntity.setResponse(faqReq.getResponse()); + faqEntity.setCall(callEntity); + return faqEntity; + } - private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { - FaqEntity faqEntity = new FaqEntity(); - validateFaqEntity(faqReq.getQuestion()); - UserEntity userEntity= userRepository.findById(userId) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); - faqEntity.setUser(userEntity); - faqEntity.setIsVisible(true); - if(faqReq.getIsVisible()!=null){ - faqEntity.setIsVisible(faqReq.getIsVisible()); - } - faqEntity.setQuestionShort(faqReq.getQuestionShort()); - faqEntity.setQuestion(faqReq.getQuestion()); - if(faqReq.getResponse()!=null ||faqReq.getResponseShort()!=null){ - faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - } - faqEntity.setResponseShort(faqReq.getResponseShort()); - faqEntity.setResponse(faqReq.getResponse()); - faqEntity.setCall(callEntity); - return faqEntity; - } + public void validateFaqEntity(String question) { + if (!StringUtils.hasText(question)) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.QUESTION_NOT_EMPTY_MSG)); + } + } - public void validateFaqEntity( String question) { - if (!StringUtils.hasText(question)) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.QUESTION_NOT_EMPTY_MSG)); - } - } - - public void validateDocumentEntity(Long documentId,String name) { - if(documentId==null){ - throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND)); - } + public void validateDocumentEntity(Long documentId, String name) { + if (documentId == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND)); + } // if (!StringUtils.hasText(name)) { // throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); // } - } + } - public void validateEvolutionCrieteriaEntity(String name) { - if (!StringUtils.hasText(name)) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); - } - } + public void validateEvolutionCrieteriaEntity(String name) { + if (!StringUtils.hasText(name)) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); + } + } - public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { - if (createCallRequest.getRegionId() == null) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); - } + public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { + if (createCallRequest.getRegionId() == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); + } - if (createCallRequest.getAmount().compareTo(BigDecimal.ZERO) <= 0||createCallRequest.getAmountMax().compareTo(BigDecimal.ZERO) <= 0) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); - } - if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now())) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); - } - } - public CreateCallResponseBean convertToCallResponseBean(CallEntity callEntity) { - CreateCallResponseBean createCallResponseBean = new CreateCallResponseBean(); - createCallResponseBean.setId(callEntity.getId()); - createCallResponseBean.setName(callEntity.getName()); - createCallResponseBean.setDates(List.of(callEntity.getStartDate(), callEntity.getEndDate())); - createCallResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); - createCallResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); - createCallResponseBean.setStatus(CallTypeEnum.valueOf(callEntity.getStatus())); - createCallResponseBean.setRegionId(callEntity.getRegion().getId()); - createCallResponseBean.setAmount(callEntity.getAmount()); - createCallResponseBean.setAmountMax(callEntity.getAmountMax()); - createCallResponseBean.setContactInfo(callEntity.getContactInfo()); - createCallResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); - createCallResponseBean.setThreshold(callEntity.getThreshold()); - createCallResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); - createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); - createCallResponseBean.setCreatedDate(callEntity.getCreatedDate()); - createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); - return createCallResponseBean; - } - public EvaluationCriteriaResponseBean convertToEvaluationCriteriaResponseBean(EvaluationCriteriaEntity entity) { - EvaluationCriteriaResponseBean responseBean = new EvaluationCriteriaResponseBean(); - responseBean.setId(entity.getId()); - responseBean.setName(entity.getName()); - responseBean.setDescription(entity.getDescription()); - responseBean.setScore(entity.getScore()); - responseBean.setCreatedDate(entity.getCreatedDate()); - responseBean.setUpdatedDate(entity.getUpdatedDate()); - return responseBean; - } - public DocumentResponseBean convertToDocumentResponseBean(DocumentEntity entity) { - DocumentResponseBean responseBean = new DocumentResponseBean(); - responseBean.setId(entity.getId()); - responseBean.setName(entity.getFileName()); - responseBean.setDescription(entity.getDescription()); - responseBean.setFilePath(entity.getFilePath()); - responseBean.setCreatedDate(entity.getCreatedDate()); - responseBean.setUpdatedDate(entity.getUpdatedDate()); - return responseBean; - } - public FaqResponseBean convertToFaqResponseBean(FaqEntity entity) { - FaqResponseBean responseBean = new FaqResponseBean(); - responseBean.setId(entity.getId()); - responseBean.setQuestionShort(entity.getQuestionShort()); - responseBean.setResponseShort(entity.getResponseShort()); - responseBean.setResponse(entity.getResponse()); - responseBean.setQuestion(entity.getQuestion()); - responseBean.setUserId(entity.getUser().getId()); - responseBean.setIsVisible(entity.getIsVisible()); - responseBean.setCreatedDate(entity.getCreatedDate()); - responseBean.setUpdatedDate(entity.getUpdatedDate()); - return responseBean; - } - public CreateCallResponseBean assembleCreateCallResponseBean( - CallEntity callEntity, - List evaluationCriteriaEntities, - List documentEntities, - List faqEntities,List images) { + if (createCallRequest.getAmount().compareTo(BigDecimal.ZERO) <= 0 + || createCallRequest.getAmountMax().compareTo(BigDecimal.ZERO) <= 0) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); + } + if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) + || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); + } + } - CreateCallResponseBean callResponseBean = convertToCallResponseBean(callEntity); + public CreateCallResponseBean convertToCallResponseBean(CallEntity callEntity) { + CreateCallResponseBean createCallResponseBean = new CreateCallResponseBean(); + createCallResponseBean.setId(callEntity.getId()); + createCallResponseBean.setName(callEntity.getName()); + createCallResponseBean.setDates(List.of(callEntity.getStartDate(), callEntity.getEndDate())); + createCallResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); + createCallResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); + createCallResponseBean.setStatus(CallTypeEnum.valueOf(callEntity.getStatus())); + createCallResponseBean.setRegionId(callEntity.getRegion().getId()); + createCallResponseBean.setAmount(callEntity.getAmount()); + createCallResponseBean.setAmountMax(callEntity.getAmountMax()); + createCallResponseBean.setContactInfo(callEntity.getContactInfo()); + createCallResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); + createCallResponseBean.setThreshold(callEntity.getThreshold()); + createCallResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); + createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); + createCallResponseBean.setCreatedDate(callEntity.getCreatedDate()); + createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); + return createCallResponseBean; + } - List evaluationCriteriaResponseBeans = evaluationCriteriaEntities.stream() - .map(this::convertToEvaluationCriteriaResponseBean) - .collect(Collectors.toList()); + public EvaluationCriteriaResponseBean convertToEvaluationCriteriaResponseBean(EvaluationCriteriaEntity entity) { + EvaluationCriteriaResponseBean responseBean = new EvaluationCriteriaResponseBean(); + responseBean.setId(entity.getId()); + responseBean.setLookUpDataId(entity.getLookupData().getId()); + responseBean.setTitle(entity.getLookupData().getTitle()); + responseBean.setValue(entity.getLookupData().getValue()); + responseBean.setScore(entity.getScore()); + responseBean.setCreatedDate(entity.getCreatedDate()); + responseBean.setUpdatedDate(entity.getUpdatedDate()); + return responseBean; + } - List documentResponseBeans = documentEntities.stream() - .map(this::convertToDocumentResponseBean) - .collect(Collectors.toList()); + public DocumentResponseBean convertToDocumentResponseBean(DocumentEntity entity) { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(entity.getId()); + responseBean.setName(entity.getFileName()); + responseBean.setDescription(entity.getDescription()); + responseBean.setFilePath(entity.getFilePath()); + responseBean.setCreatedDate(entity.getCreatedDate()); + responseBean.setUpdatedDate(entity.getUpdatedDate()); + return responseBean; + } - List faqResponseBeans = faqEntities.stream() - .map(this::convertToFaqResponseBean) - .collect(Collectors.toList()); + public FaqResponseBean convertToFaqResponseBean(FaqEntity entity) { + FaqResponseBean responseBean = new FaqResponseBean(); + responseBean.setId(entity.getId()); + responseBean.setQuestionShort(entity.getQuestionShort()); + responseBean.setResponseShort(entity.getResponseShort()); + responseBean.setResponse(entity.getResponse()); + responseBean.setQuestion(entity.getQuestion()); + responseBean.setUserId(entity.getUser().getId()); + responseBean.setIsVisible(entity.getIsVisible()); + responseBean.setCreatedDate(entity.getCreatedDate()); + responseBean.setUpdatedDate(entity.getUpdatedDate()); + return responseBean; + } - List imagesResponseBean = images.stream() - .map(this::convertToDocumentResponseBean) - .collect(Collectors.toList()); - CreateCallResponseBean createCallResponseBean =callResponseBean; - createCallResponseBean.setCriteria(evaluationCriteriaResponseBeans); - createCallResponseBean.setDocs(documentResponseBeans); - createCallResponseBean.setFaq(faqResponseBeans); - createCallResponseBean.setImages(imagesResponseBean); - return createCallResponseBean; - } - public List convertLookUpDataEntities(List lookUpData, CallEntity callEntity, LookUpDataEntity.LookUpDataTypeEnum type) { - List lookUpDataEntities = lookUpData.stream() - .map(req -> convertLookUpDataRequestIntoLookUpDataEntity(req, type)) - .collect(Collectors.toList()); + public CreateCallResponseBean assembleCreateCallResponseBean(CallEntity callEntity, + List evaluationCriteriaEntities, List documentEntities, + List faqEntities, List images) { - lookUpDataRepository.saveAll(lookUpDataEntities); + CreateCallResponseBean callResponseBean = convertToCallResponseBean(callEntity); - return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities); - } + List evaluationCriteriaResponseBeans = evaluationCriteriaEntities.stream() + .map(this::convertToEvaluationCriteriaResponseBean).collect(Collectors.toList()); - private List createCallTargetAudienceCheckList(CallEntity callEntity, List lookUpDataEntities) { - List lookUpDataResponses=new ArrayList<>(); - for(LookUpDataEntity lookUpDataEntity:lookUpDataEntities){ - CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity=new CallTargetAudienceChecklistEntity(); - callTargetAudienceChecklistEntity.setIsValidated(false); - callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); - callTargetAudienceChecklistEntity.setCall(callEntity); - callTargetAudienceChecklistEntity= callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity); - lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity)); - } - return lookUpDataResponses; - } + List documentResponseBeans = documentEntities.stream() + .map(this::convertToDocumentResponseBean).collect(Collectors.toList()); - private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, LookUpDataEntity.LookUpDataTypeEnum type) { - if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { - LookUpDataEntity newEntity = new LookUpDataEntity(); - newEntity.setValue(req.getValue()); - newEntity.setType(type.getValue()); - return newEntity; - } + List faqResponseBeans = faqEntities.stream().map(this::convertToFaqResponseBean) + .collect(Collectors.toList()); - return lookUpDataRepository.findById(req.getLookUpDataId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); - } + List imagesResponseBean = images.stream().map(this::convertToDocumentResponseBean) + .collect(Collectors.toList()); + CreateCallResponseBean createCallResponseBean = callResponseBean; + createCallResponseBean.setCriteria(evaluationCriteriaResponseBeans); + createCallResponseBean.setDocs(documentResponseBeans); + createCallResponseBean.setFaq(faqResponseBeans); + createCallResponseBean.setImages(imagesResponseBean); + return createCallResponseBean; + } - public LookUpDataResponse convertToLookUpDataResponseBean(CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { - LookUpDataResponse lookUpDataResponse = new LookUpDataResponse(); - LookUpDataEntity lookUpDataEntity = callTargetAudienceChecklistEntity.getLookupData(); - lookUpDataResponse.setId(callTargetAudienceChecklistEntity.getId()); - lookUpDataResponse.setLookUpDataId(lookUpDataEntity.getId()); - lookUpDataResponse.setValue(lookUpDataEntity.getValue()); - lookUpDataResponse.setTitle(lookUpDataEntity.getTitle()); - lookUpDataResponse.setCreatedDate(lookUpDataEntity.getCreatedDate()); - lookUpDataResponse.setUpdatedDate(lookUpDataEntity.getUpdatedDate()); - return lookUpDataResponse; - } - - - public CreateCallResponseBean createCallStep2(CreateCallRequestStep2 createCallRequest, Long userId) { + public List convertLookUpDataEntities(List lookUpData, CallEntity callEntity, + LookUpDataEntity.LookUpDataTypeEnum type) { + List lookUpDataEntities = lookUpData.stream() + .map(req -> convertLookUpDataRequestIntoLookUpDataEntity(req, type)).collect(Collectors.toList()); + + lookUpDataRepository.saveAll(lookUpDataEntities); + + return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities); + } + + private List createCallTargetAudienceCheckList(CallEntity callEntity, + List lookUpDataEntities) { + List lookUpDataResponses = new ArrayList<>(); + for (LookUpDataEntity lookUpDataEntity : lookUpDataEntities) { + CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity = new CallTargetAudienceChecklistEntity(); + callTargetAudienceChecklistEntity.setIsValidated(false); + callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); + callTargetAudienceChecklistEntity.setCall(callEntity); + callTargetAudienceChecklistEntity = callTargetAudienceChecklistRepository + .save(callTargetAudienceChecklistEntity); + lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity)); + } + return lookUpDataResponses; + } + + private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, + LookUpDataEntity.LookUpDataTypeEnum type) { + if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { + LookUpDataEntity newEntity = new LookUpDataEntity(); + newEntity.setValue(req.getValue()); + newEntity.setType(type.getValue()); + return newEntity; + } + + return lookUpDataRepository.findById(req.getLookUpDataId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + } + + public LookUpDataResponse convertToLookUpDataResponseBean( + CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { + LookUpDataResponse lookUpDataResponse = new LookUpDataResponse(); + LookUpDataEntity lookUpDataEntity = callTargetAudienceChecklistEntity.getLookupData(); + lookUpDataResponse.setId(callTargetAudienceChecklistEntity.getId()); + lookUpDataResponse.setLookUpDataId(lookUpDataEntity.getId()); + lookUpDataResponse.setValue(lookUpDataEntity.getValue()); + lookUpDataResponse.setTitle(lookUpDataEntity.getTitle()); + lookUpDataResponse.setCreatedDate(callTargetAudienceChecklistEntity.getCreatedDate()); + lookUpDataResponse.setUpdatedDate(callTargetAudienceChecklistEntity.getUpdatedDate()); + return lookUpDataResponse; + } + + private CallEntity getCallById(Long callId) { + return callRepository.findById(callId).orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG))); + } + + public CreateCallResponseBean createCallStep2(CreateCallRequestStep2 createCallRequest, Long userId) { CreateCallResponseBean createCallResponseBean = null; CallEntity callEntity = callRepository.findById(createCallRequest.getCallId()) .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG))); - + Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + callEntity.setThreshold(createCallRequest.getThreshold()); callEntity.setStatus(createCallRequest.getStatus().getValue()); callRepository.save(callEntity); @@ -369,7 +411,47 @@ public class CallDao { createCallResponseBean.setCurrentStep(GepafinConstant.STEP_2); return createCallResponseBean; } + + public CreateCallResponseBean updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) { + CallEntity callEntity = getCallById(callId); + setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); + setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort, + updateCallRequest.getDescriptionShort()); + setIfUpdated(callEntity::getDescriptionLong, callEntity::setDescriptionLong, + updateCallRequest.getDescriptionLong()); + setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, updateCallRequest.getStartDate()); + setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, updateCallRequest.getEndDate()); + setIfUpdated(callEntity::getAmount, callEntity::setAmount, updateCallRequest.getAmount()); + setIfUpdated(callEntity::getAmountMax, callEntity::setAmountMax, updateCallRequest.getAmountMax()); + setIfUpdated(callEntity::getDocumentationRequested, callEntity::setDocumentationRequested, + updateCallRequest.getDocumentationRequested()); + setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); + + CreateCallResponseBean createCallResponseBean = getCallResponseBean(callEntity); + createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); + return createCallResponseBean; + } + + private CreateCallResponseBean getCallResponseBean(CallEntity callEntity) { + List documentEntities = documentRepository.findByCallIdAndType(callEntity.getId(), + DocumentTypeEnum.DOCUMENT.getValue()); + List imageEntities = documentRepository.findByCallIdAndType(callEntity.getId(), + DocumentTypeEnum.DOCUMENT.getValue()); + List faqEntities = faqRepository.findByCallId(callEntity.getId()); + List amiedTo = callTargetAudienceChecklistRepository + .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() + .map(this::convertToLookUpDataResponseBean).toList(); + + List checkList = callTargetAudienceChecklistRepository + .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.CHECKLIST.getValue()).stream() + .map(this::convertToLookUpDataResponseBean).toList(); + List evaluationCriteriaEntities = evaluationCriteriaRepository + .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue()); + + CreateCallResponseBean createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, + documentEntities, faqEntities, imageEntities); + createCallResponseBean.setAimedTo(amiedTo); + createCallResponseBean.setCheckList(checkList); + return createCallResponseBean; + } } - - - diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java index 40493b04..438160bc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java @@ -4,7 +4,6 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.enums.RegionStatusEnum; -import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.RegionReq; import net.gepafin.tendermanagement.model.response.RegionResponseBean; import net.gepafin.tendermanagement.repositories.RegionRepository; @@ -19,7 +18,7 @@ import org.springframework.stereotype.Repository; import java.util.List; import java.util.stream.Collectors; -import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Repository public class RegionDao { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index d0c6342c..c28d2808 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -19,7 +19,7 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Component public class RoleDao { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index dc06326f..0393c176 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -23,7 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Repository; -import static net.gepafin.tendermanagement.util.ObjectUtils.setIfUpdated; +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Repository public class UserDao { diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java index 539d9c30..f6178779 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java @@ -17,13 +17,11 @@ public class EvaluationCriteriaEntity extends BaseEntity { @ManyToOne @JoinColumn(name = "CALL_ID", nullable = false) private CallEntity call; - - @Column(name = "NAME", nullable = false, columnDefinition = "TEXT") - private String name; - - @Column(name = "DESCRIPTION", columnDefinition = "TEXT") - private String description; - + + @ManyToOne + @JoinColumn(name = "LOOKUP_DATA_ID") + private LookUpDataEntity lookupData; + @Column(name = "SCORE", nullable = false) private Integer score; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index 0c18cd1e..97e276a4 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -41,7 +41,7 @@ public class CreateCallRequestStep1 { @NotEmpty private String documentationRequested; - private Boolean Confidi; + private Boolean confidi; private List faq; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java index a8b90e1c..492463ec 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java @@ -3,9 +3,7 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; @Data -public class EvaluationCriteriaReq { +public class EvaluationCriteriaReq extends LookUpDataReq{ - private String name; - private String value; private Integer score; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java new file mode 100644 index 00000000..cecb7d4c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java @@ -0,0 +1,43 @@ +package net.gepafin.tendermanagement.model.request; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import lombok.Data; + +@Data +public class UpdateCallRequestStep1 { + + + private String name; + + + private String descriptionShort; + + + private String descriptionLong; + + + private LocalDateTime startDate; + + + private LocalDateTime endDate; + + + private BigDecimal amount; + + + private BigDecimal amountMax; + + + private List aimedTo; + + + private String documentationRequested; + + private Boolean confidi; + + private List faq; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java index 29cfed21..95829988 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java @@ -5,17 +5,7 @@ import lombok.Data; import java.time.LocalDateTime; @Data -public class EvaluationCriteriaResponseBean { - - private Long id; - - private String name; - - private String description; +public class EvaluationCriteriaResponseBean extends LookUpDataResponse{ private Integer score; - - private LocalDateTime createdDate; - - private LocalDateTime updatedDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index 9a2a4639..22965f89 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -1,10 +1,15 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.DocumentEntity; + +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface DocumentRepository extends JpaRepository { + List findByCallIdAndType(Long callId, String type); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java index 057566a6..3aae5b0d 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java @@ -1,7 +1,12 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; + +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; public interface EvaluationCriteriaRepository extends JpaRepository { + + List findByCallIdAndLookupDataType(Long callId, String type); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java index e4ffb08a..f3206948 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java @@ -2,6 +2,8 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +@Repository public interface LookUpDataRepository extends JpaRepository { } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index f8a07093..533d36b4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; +import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; public interface CallService { @@ -11,4 +12,6 @@ public interface CallService { CreateCallResponseBean createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest); + CreateCallResponseBean updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 53edaf6d..d22aa498 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; +import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; @@ -33,4 +34,11 @@ public class CallServiceImpl implements CallService { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); return callDao.createCallStep2(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); } + + @Override + public CreateCallResponseBean updateCallStep1(HttpServletRequest request, Long callId, + UpdateCallRequestStep1 updateCallRequest) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return callDao.updateCallStep1(callId, updateCallRequest, Long.parseLong(userInfo.get("userId").toString())); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/ObjectUtils.java b/src/main/java/net/gepafin/tendermanagement/util/ObjectUtils.java deleted file mode 100644 index 1f7d1215..00000000 --- a/src/main/java/net/gepafin/tendermanagement/util/ObjectUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.gepafin.tendermanagement.util; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class ObjectUtils { - - public static void setIfNotNull(Consumer setter, T value) { - if (value != null) { - setter.accept(value); - } - } - public static void setIfUpdated(Supplier getter, Consumer setter, T newValue) { - T currentValue = getter.get(); - if (newValue != null && !newValue.equals(currentValue)) { - setter.accept(newValue); - } - } - -} diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 21392d61..d0cba04c 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -10,6 +10,8 @@ import org.slf4j.LoggerFactory; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; public class Utils { @@ -68,5 +70,17 @@ public class Utils { byte[] decode = Base64.getDecoder().decode(decodedString.getBytes(StandardCharsets.UTF_8)); return new String(decode, StandardCharsets.UTF_8); } + + public static void setIfNotNull(Consumer setter, T value) { + if (value != null) { + setter.accept(value); + } + } + public static void setIfUpdated(Supplier getter, Consumer setter, T newValue) { + T currentValue = getter.get(); + if (newValue != null && !newValue.equals(currentValue)) { + setter.accept(newValue); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 2bf116e9..c0e8f2ab 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -9,6 +9,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; +import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -16,6 +17,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -54,5 +56,21 @@ public interface CallApi { public ResponseEntity> createCallStep2(HttpServletRequest request, @Parameter(description = "Call request object", required = true) @Valid @RequestBody CreateCallRequestStep2 createCallRequest); + + @Operation(summary = "Api to update call step 1", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PutMapping(value = "/step1/{callId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> updateCallStep1(HttpServletRequest request, + @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, + @Parameter(description = "Call request object", required = true) @Valid @RequestBody UpdateCallRequestStep1 updateCallRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 0ff654bc..9f6f99b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; +import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.CallService; @@ -41,4 +42,12 @@ public class CallApiController implements CallApi { return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); } + + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest) { + CreateCallResponseBean createCallResponseBean = callService.updateCallStep1(request, callId, updateCallRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_UPDATE_SUCCESSFULLY_MSG))); + } } \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 5293ec62..11051187 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -395,4 +395,19 @@ + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 15aa6498..345ff54e 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -45,6 +45,7 @@ document.not.found=Document not found. document.id.not.found=Document ID not found. call.created.successfully=Call created successfully. call.invalid.date=Invalid start or end date. +call.update.successfully=Call updated successfully. # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ae93ff53..6ad0869e 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -44,6 +44,7 @@ file.deleted.successfully=File eliminato con successo. document.not.found=Documento non trovato. document.id.not.found=ID documento non trovato. call.invalid.date=Data di inizio o fine non valida. +call.update.successfully=Chiamata aggiornata con successo. # Login-related messages login.successfully=Accesso effettuato con successo. From 38d806dc39094761853726278a73d77236c29c9c Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 27 Aug 2024 12:40:49 +0530 Subject: [PATCH 034/145] Update code --- src/main/java/net/gepafin/tendermanagement/dao/UserDao.java | 4 ++++ .../tendermanagement/model/request/ResetPasswordReq.java | 2 ++ .../net/gepafin/tendermanagement/web/rest/api/UserApi.java | 5 +++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index ecaf9a48..3ee707c2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -181,6 +181,10 @@ public class UserDao { log.info("Password reset attempt for non-existent user: {}", resetPasswordReq.getEmail()); throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); } + if (!resetPasswordReq.getNewPassword().equals(resetPasswordReq.getConfirmPassword())) { + log.info("User creation failed: Passwords do not match for email {}", user.getEmail()); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); + } String dbToken = user.getResetPasswordToken(); if (dbToken == null || !dbToken.equals(resetPasswordReq.getToken())) { diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java index 7a46596a..019ca582 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java @@ -7,5 +7,7 @@ public class ResetPasswordReq { private String email; private String token; private String newPassword; + private String confirmPassword; + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 2dda7d21..c60cef58 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -104,7 +104,7 @@ public interface UserApi { method = RequestMethod.POST) ResponseEntity> login( @Parameter(description = "Login request object", required = true) @Valid @RequestBody LoginReq loginReq); - @Operation(summary = "Api to initiate password reset", + @Operation(summary = "Api to initiate password reset request", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -155,7 +155,7 @@ public interface UserApi { ResponseEntity> logoutUser( @Parameter(description = "The request object is not needed for logout", required = false) HttpServletRequest request, @Parameter(description = "The response object is not needed for logout", required = false) HttpServletResponse response); - @Operation(summary = "API to update user active/deactive status", + @Operation(summary = "Api to update user active/deactive status", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -168,6 +168,7 @@ public interface UserApi { @RequestMapping(value = "/{userId}/status", produces = {"application/json"}, method = RequestMethod.PUT) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") default ResponseEntity> updateUserStatus( @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) UserStatusEnum status) { From e7fa11f35e69654a137f330a596e744facb7a722 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 27 Aug 2024 13:58:57 +0530 Subject: [PATCH 035/145] updated code --- .../gepafin/tendermanagement/dao/CallDao.java | 29 +++++++++++++++++-- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 2131519d..a1d7ebbd 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -239,10 +239,12 @@ public class CallDao { Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); } if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) - || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now())) { + || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest + .getStartDate().toLocalDate().isAfter(createCallRequest.getEndDate().toLocalDate())) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); } + } public CreateCallResponseBean convertToCallResponseBean(CallEntity callEntity) { @@ -382,7 +384,7 @@ public class CallDao { private CallEntity getCallById(Long callId) { return callRepository.findById(callId).orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG))); + Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); } public CreateCallResponseBean createCallStep2(CreateCallRequestStep2 createCallRequest, Long userId) { @@ -412,8 +414,31 @@ public class CallDao { return createCallResponseBean; } + public void isValidDateRange(UpdateCallRequestStep1 updateCallRequest, CallEntity callEntity) { + LocalDate startDate = updateCallRequest.getStartDate() != null ? updateCallRequest.getStartDate().toLocalDate() + : null; + LocalDate endDate = updateCallRequest.getEndDate() != null ? updateCallRequest.getEndDate().toLocalDate() + : null; + Boolean isValid = true; + if (startDate != null && endDate != null && startDate.isAfter(endDate)) { + isValid = false; + } else if (startDate != null && callEntity.getEndDate() != null + && startDate.isAfter(callEntity.getEndDate().toLocalDate())) { + isValid = false; + } else if (endDate != null && callEntity.getStartDate() != null + && callEntity.getStartDate().toLocalDate().isAfter(endDate)) { + isValid = false; + } + + if (Boolean.FALSE.equals(isValid)) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); + } + } + public CreateCallResponseBean updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) { CallEntity callEntity = getCallById(callId); + isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort, updateCallRequest.getDescriptionShort()); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 345ff54e..447e637b 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -46,6 +46,7 @@ document.id.not.found=Document ID not found. call.created.successfully=Call created successfully. call.invalid.date=Invalid start or end date. call.update.successfully=Call updated successfully. +call.not.found=Call not found. # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 6ad0869e..c403ea60 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -45,6 +45,7 @@ document.not.found=Documento non trovato. document.id.not.found=ID documento non trovato. call.invalid.date=Data di inizio o fine non valida. call.update.successfully=Chiamata aggiornata con successo. +call.not.found=Chiamata non trovata. # Login-related messages login.successfully=Accesso effettuato con successo. From e816fe14093d61df8602439cbd1d1c812951c586 Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 27 Aug 2024 15:39:03 +0530 Subject: [PATCH 036/145] Get Call related api added --- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/CallDao.java | 15 ++++---- .../tendermanagement/service/CallService.java | 9 +++++ .../service/impl/CallServiceImpl.java | 13 +++++++ .../web/rest/api/CallApi.java | 35 ++++++++++++++++--- .../web/rest/api/impl/CallApiController.java | 22 ++++++++++++ src/main/resources/message_en.properties | 2 ++ src/main/resources/message_it.properties | 1 + 8 files changed, 88 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 7402a589..4860513f 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -47,6 +47,7 @@ public class GepafinConstant { public static final String STEP_2 = "STEP_2"; public static final String CALL_UPDATE_SUCCESSFULLY_MSG = "call.update.successfully"; public static final String CALL_NOT_FOUND = "call.not.found"; + public static final String CALL_FETCH_SUCCESS_MSG = "call.fetch.success"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 2131519d..c6501463 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -8,6 +8,8 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.util.Utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -32,11 +34,6 @@ import net.gepafin.tendermanagement.model.request.EvaluationCriteriaReq; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.request.LookUpDataReq; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; -import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; -import net.gepafin.tendermanagement.model.response.DocumentResponseBean; -import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; -import net.gepafin.tendermanagement.model.response.FaqResponseBean; -import net.gepafin.tendermanagement.model.response.LookUpDataResponse; import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.CallTargetAudienceChecklistRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; @@ -380,7 +377,7 @@ public class CallDao { return lookUpDataResponse; } - private CallEntity getCallById(Long callId) { + public CallEntity getCallById(Long callId) { return callRepository.findById(callId).orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG))); } @@ -454,4 +451,10 @@ public class CallDao { createCallResponseBean.setCheckList(checkList); return createCallResponseBean; } + public List getAllCalls() { + return callRepository.findAll() + .stream() + .map(callEntity -> Utils.convertObject(callEntity, CreateCallResponseBean.class)) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 533d36b4..5973a593 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -1,10 +1,15 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; + +import java.util.List; public interface CallService { @@ -14,4 +19,8 @@ public interface CallService { CreateCallResponseBean updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest); + CallEntity getCallById (Long callId); + + List getAllCalls(); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index d22aa498..b2e636a9 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -3,14 +3,19 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.List; import java.util.Map; @@ -41,4 +46,12 @@ public class CallServiceImpl implements CallService { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); return callDao.updateCallStep1(callId, updateCallRequest, Long.parseLong(userInfo.get("userId").toString())); } + @Override + public CallEntity getCallById(Long callId) { + return callDao.getCallById(callId); + } + public List getAllCalls() { + return callDao.getAllCalls(); + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index c0e8f2ab..0177d76a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -7,20 +7,22 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @Validated public interface CallApi { @@ -72,5 +74,30 @@ public interface CallApi { public ResponseEntity> updateCallStep1(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, @Parameter(description = "Call request object", required = true) @Valid @RequestBody UpdateCallRequestStep1 updateCallRequest); + @Operation(summary = "Api to get call by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/{callId}", + produces = { "application/json" }) + ResponseEntity> getCallById( + @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + @Operation(summary = "Api to get all calls", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "", + produces = { "application/json" }) + ResponseEntity>> getAllCalls(); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 9f6f99b5..8a96bc45 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -3,10 +3,13 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.web.rest.api.CallApi; @@ -18,6 +21,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/call}") @@ -50,4 +55,21 @@ public class CallApiController implements CallApi { return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_UPDATE_SUCCESSFULLY_MSG))); } + @Override + @Transactional(readOnly = true) + public ResponseEntity> getCallById(Long callId) { + CallEntity callEntity = callService.getCallById(callId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(callEntity, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); + } + + @Override + @Transactional(readOnly = true) + public ResponseEntity>> getAllCalls() { + List calls = callService.getAllCalls(); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(calls, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); + + } } \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 345ff54e..3fb55680 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -46,6 +46,8 @@ document.id.not.found=Document ID not found. call.created.successfully=Call created successfully. call.invalid.date=Invalid start or end date. call.update.successfully=Call updated successfully. +call.fetch.success=Call details fetched successfully. + # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 6ad0869e..78eff025 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -45,6 +45,7 @@ document.not.found=Documento non trovato. document.id.not.found=ID documento non trovato. call.invalid.date=Data di inizio o fine non valida. call.update.successfully=Chiamata aggiornata con successo. +call.fetch.success=Dettagli della chiamata recuperati con successo. # Login-related messages login.successfully=Accesso effettuato con successo. From 21fc9a4b91cb2f3420c362d1407cedb2b0473565 Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 27 Aug 2024 16:55:50 +0530 Subject: [PATCH 037/145] Add few APIs related to call and Update Responses for Call Controller --- .../gepafin/tendermanagement/dao/CallDao.java | 36 ++++++++++-- .../tendermanagement/dao/RegionDao.java | 11 +++- .../gepafin/tendermanagement/dao/RoleDao.java | 16 ++++-- .../gepafin/tendermanagement/dao/UserDao.java | 4 +- .../response/CallDetailsResponseBean.java | 57 +++++++++++++++++++ .../tendermanagement/service/CallService.java | 5 +- .../service/RegionService.java | 2 +- .../tendermanagement/service/RoleService.java | 2 +- .../service/impl/CallServiceImpl.java | 5 +- .../service/impl/RegionServiceImpl.java | 2 +- .../service/impl/RoleServiceImpl.java | 2 +- .../web/rest/api/CallApi.java | 5 +- .../web/rest/api/RegionApi.java | 2 +- .../web/rest/api/RoleApi.java | 2 +- .../web/rest/api/impl/CallApiController.java | 11 ++-- .../rest/api/impl/RegionApiController.java | 4 +- .../web/rest/api/impl/RoleApiController.java | 6 +- 17 files changed, 136 insertions(+), 36 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 8f265740..c8e556fc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -379,10 +379,16 @@ public class CallDao { return lookUpDataResponse; } - public CallEntity getCallById(Long callId) { + public CallEntity validateCall(Long callId) { return callRepository.findById(callId).orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); } + public CreateCallResponseBean getCallById(Long callId) { + CallEntity callEntity = callRepository.findById(callId) + .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + return convertToCallResponseBean(callEntity); + } public CreateCallResponseBean createCallStep2(CreateCallRequestStep2 createCallRequest, Long userId) { CreateCallResponseBean createCallResponseBean = null; @@ -434,7 +440,7 @@ public class CallDao { } public CreateCallResponseBean updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) { - CallEntity callEntity = getCallById(callId); + CallEntity callEntity = validateCall(callId); isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort, @@ -454,6 +460,26 @@ public class CallDao { return createCallResponseBean; } + public CallDetailsResponseBean convertToCallDetailsResponseBean(CallEntity callEntity) { + CallDetailsResponseBean callDetailsResponseBean = new CallDetailsResponseBean(); + callDetailsResponseBean.setId(callEntity.getId()); + callDetailsResponseBean.setName(callEntity.getName()); + callDetailsResponseBean.setDates(List.of(callEntity.getStartDate(), callEntity.getEndDate())); + callDetailsResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); + callDetailsResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); + callDetailsResponseBean.setStatus(CallTypeEnum.valueOf(callEntity.getStatus())); + callDetailsResponseBean.setRegionId(callEntity.getRegion().getId()); + callDetailsResponseBean.setAmount(callEntity.getAmount()); + callDetailsResponseBean.setAmountMax(callEntity.getAmountMax()); + callDetailsResponseBean.setContactInfo(callEntity.getContactInfo()); + callDetailsResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); + callDetailsResponseBean.setThreshold(callEntity.getThreshold()); + callDetailsResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); + callDetailsResponseBean.setPriorityArea(callEntity.getPriorityArea()); + callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate()); + callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); + return callDetailsResponseBean; + } private CreateCallResponseBean getCallResponseBean(CallEntity callEntity) { List documentEntities = documentRepository.findByCallIdAndType(callEntity.getId(), DocumentTypeEnum.DOCUMENT.getValue()); @@ -476,10 +502,10 @@ public class CallDao { createCallResponseBean.setCheckList(checkList); return createCallResponseBean; } - public List getAllCalls() { - return callRepository.findAll() + public List getAllCalls() { + return callRepository.findAll() .stream() - .map(callEntity -> Utils.convertObject(callEntity, CreateCallResponseBean.class)) + .map(this::convertToCallDetailsResponseBean) .collect(Collectors.toList()); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java index 438160bc..5b59f2a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java @@ -76,7 +76,7 @@ public class RegionDao { public RegionResponseBean updateRegion(Long id, RegionReq regionReq) { log.info("Updating region with ID: {}", id); - RegionEntity existingRegion = getRegionById(id); + RegionEntity existingRegion = validateRegion(id); log.info("Current region details: {}", existingRegion); log.info("New region details: {}", regionReq); String newStatus = regionReq.getStatus() != null ? regionReq.getStatus().getValue() : null; @@ -102,14 +102,19 @@ public class RegionDao { return Utils.convertObject(existingRegion, RegionResponseBean.class); } - public RegionEntity getRegionById(Long id) { + public RegionEntity validateRegion(Long id) { log.info("Fetching region with ID: {}", id); RegionEntity regionEntity = regionRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); log.info("Region found: {}", regionEntity); return regionEntity; } - + public RegionResponseBean getRegionById(Long id) { + log.info("Fetching region with ID: {}", id); + RegionEntity regionEntity = regionRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); + return convertRegionEntityToRegionResponse(regionEntity); + } public void deleteById(Long id) { log.info("Deleting region with ID: {}", id); regionRepository.findById(id) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index c28d2808..16ecc749 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.RoleReq; import net.gepafin.tendermanagement.model.response.RegionResponseBean; @@ -48,7 +49,8 @@ public class RoleDao { roleEntity.setRoleType(roleReq.getRoleType()); roleEntity.setPermissions(roleReq.getPermissions()); roleEntity.setDescription(roleReq.getDescription()); - roleEntity.setRegion(regionService.getRegionById(roleReq.getRegionId())); + RegionEntity regionEntity =regionDao.validateRegion(roleReq.getRegionId()); + roleEntity.setRegion(regionEntity); return roleEntity; } @@ -68,7 +70,7 @@ public class RoleDao { public RoleResponseBean updateRole(Long id, RoleReq roleReq) { log.info("Updating role with ID: {}", id); - RoleEntity existingRole = getRoleById(id); + RoleEntity existingRole = validateRole(id); // Log changes before update log.info("Current role details: {}", existingRole); @@ -85,14 +87,20 @@ public class RoleDao { return Utils.convertObject(existingRole, RoleResponseBean.class); } - public RoleEntity getRoleById(Long id) { + public RoleEntity validateRole(Long id) { log.info("Fetching role with ID: {}", id); RoleEntity roleEntity = roleRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ROLE_NOT_FOUND))); log.info("Role found: {}", roleEntity); return roleEntity; } - + public RoleResponseBean getRoleById(Long id) { + log.info("Fetching role with ID: {}", id); + RoleEntity roleEntity = roleRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ROLE_NOT_FOUND))); + log.info("Role found: {}", roleEntity); + return convertRoleEntityToRoleResponse(roleEntity); + } public void deleteById(Long id) { log.info("Deleting role with ID: {}", id); roleRepository.findById(id) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 0393c176..efa3f283 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -81,7 +81,7 @@ public class UserDao { setIfUpdated(userEntity::getAddress, userEntity::setAddress, userReq.getAddress()); setIfUpdated(userEntity::getPhoneNumber, userEntity::setPhoneNumber, userReq.getPhoneNumber()); if (userReq.getRoleId() != null) { - RoleEntity roleEntity = roleService.getRoleById(userReq.getRoleId()); + RoleEntity roleEntity = roleDao.validateRole(userReq.getRoleId()); setIfUpdated(userEntity::getRoleEntity, userEntity::setRoleEntity, roleEntity); } userEntity = userRepository.save(userEntity); @@ -99,7 +99,7 @@ public class UserDao { userEntity.setOrganization(userReq.getOrganization()); userEntity.setAddress(userReq.getAddress()); userEntity.setPhoneNumber(userReq.getPhoneNumber()); - userEntity.setRoleEntity(roleService.getRoleById(userReq.getRoleId())); + userEntity.setRoleEntity(roleDao.validateRole(userReq.getRoleId())); return userEntity; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java new file mode 100644 index 00000000..f100446f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -0,0 +1,57 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.CallTypeEnum; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +@Data +public class CallDetailsResponseBean { + + private Long id; + + private String name; + + private String descriptionShort; + + private String descriptionLong; + + private List dates; + + private CallTypeEnum status; + + private Long regionId; + + private BigDecimal amount; + + private BigDecimal amountMax; + + private String contactInfo; + + private String submissionMethod; + + private Long threshold; + + private String priorityArea; + + private String documentationReqested; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; + + private List aimedTo; + + private List criteria; + + private List docs; + + private List faq; + + private List images; + + private List checkList; + + private String currentStep; +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 5973a593..e77f9168 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; +import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.response.RoleResponseBean; @@ -19,8 +20,8 @@ public interface CallService { CreateCallResponseBean updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest); - CallEntity getCallById (Long callId); + CreateCallResponseBean getCallById (Long callId); - List getAllCalls(); + List getAllCalls(); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/RegionService.java b/src/main/java/net/gepafin/tendermanagement/service/RegionService.java index 2288fa17..02551552 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/RegionService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/RegionService.java @@ -14,7 +14,7 @@ public interface RegionService { RegionResponseBean updateRegion(Long regionId, RegionReq regionReq); - RegionEntity getRegionById(Long regionId); + RegionResponseBean getRegionById(Long regionId); void deleteRegion(Long regionId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/RoleService.java b/src/main/java/net/gepafin/tendermanagement/service/RoleService.java index 448197b4..d0da5c48 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/RoleService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/RoleService.java @@ -11,7 +11,7 @@ public interface RoleService { RoleResponseBean updateRole(Long roleId, RoleReq roleReq); - RoleEntity getRoleById(Long roleId); + RoleResponseBean getRoleById(Long roleId); void deleteRole(Long roleId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index b2e636a9..6a3c8cff 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -8,6 +8,7 @@ import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; +import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.service.CallService; @@ -47,10 +48,10 @@ public class CallServiceImpl implements CallService { return callDao.updateCallStep1(callId, updateCallRequest, Long.parseLong(userInfo.get("userId").toString())); } @Override - public CallEntity getCallById(Long callId) { + public CreateCallResponseBean getCallById(Long callId) { return callDao.getCallById(callId); } - public List getAllCalls() { + public List getAllCalls() { return callDao.getAllCalls(); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java index 345362d3..78d30715 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/RegionServiceImpl.java @@ -32,7 +32,7 @@ public class RegionServiceImpl implements RegionService { @Override @Transactional(readOnly = true) - public RegionEntity getRegionById(Long regionId) { + public RegionResponseBean getRegionById(Long regionId) { return regionDao.getRegionById(regionId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java index 9f66415a..33096730 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/RoleServiceImpl.java @@ -31,7 +31,7 @@ public class RoleServiceImpl implements RoleService { @Override @Transactional(readOnly = true) - public RoleEntity getRoleById(Long roleId) { + public RoleResponseBean getRoleById(Long roleId) { return roleDao.getRoleById(roleId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 0177d76a..ce33e240 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -12,6 +12,7 @@ import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; +import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.Response; @@ -85,7 +86,7 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{callId}", produces = { "application/json" }) - ResponseEntity> getCallById( + ResponseEntity> getCallById( @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); @Operation(summary = "Api to get all calls", responses = { @@ -98,6 +99,6 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = { "application/json" }) - ResponseEntity>> getAllCalls(); + ResponseEntity>> getAllCalls(); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java index 3c9237a6..d49924a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java @@ -61,7 +61,7 @@ public interface RegionApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{regionId}", produces = "application/json") - ResponseEntity> getRegionById( + ResponseEntity> getRegionById( @Parameter(description = "The region id", required = true) @PathVariable("regionId") Long regionId); @Operation(summary = "Api to get all regions", diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java index 7225d87e..04bff191 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java @@ -62,7 +62,7 @@ public interface RoleApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{roleId}", produces = { "application/json" }) - ResponseEntity> getRoleById( + ResponseEntity> getRoleById( @Parameter(description = "The role ID", required = true) @PathVariable("roleId") Long roleId); @Operation(summary = "Api to get all roles", diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 8a96bc45..9b0477c3 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -8,6 +8,7 @@ import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; +import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.Response; @@ -57,16 +58,16 @@ public class CallApiController implements CallApi { } @Override @Transactional(readOnly = true) - public ResponseEntity> getCallById(Long callId) { - CallEntity callEntity = callService.getCallById(callId); + public ResponseEntity> getCallById(Long callId) { + CreateCallResponseBean createCallResponseBean = callService.getCallById(callId); return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(callEntity, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); + .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); } @Override @Transactional(readOnly = true) - public ResponseEntity>> getAllCalls() { - List calls = callService.getAllCalls(); + public ResponseEntity>> getAllCalls() { + List calls = callService.getAllCalls(); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(calls, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java index e7387562..c64258e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java @@ -52,10 +52,10 @@ public class RegionApiController implements RegionApi { } @Override - public ResponseEntity> getRegionById( + public ResponseEntity> getRegionById( @PathVariable("regionId") Long regionId) { log.info("Get Region by ID - Region ID: {}", regionId); - RegionEntity region = regionService.getRegionById(regionId); + RegionResponseBean region = regionService.getRegionById(regionId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(region, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_REGION_SUCCESS_MSG))); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java index a720bf3c..4f4c5633 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java @@ -57,11 +57,11 @@ public class RoleApiController implements RoleApi { } @Override - public ResponseEntity> getRoleById(Long roleId) { + public ResponseEntity> getRoleById(Long roleId) { log.info("Get Role by ID - Role ID: {}", roleId); - RoleEntity roleEntity = roleService.getRoleById(roleId); + RoleResponseBean roleResponseBean = roleService.getRoleById(roleId); return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(roleEntity, Status.SUCCESS, Translator.toLocale(GepafinConstant.ROLE_FETCH_SUCCESS_MSG))); + .body(new Response<>(roleResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.ROLE_FETCH_SUCCESS_MSG))); } @Override From 22e72f6cd4ddff32ebec712570d3cac22fb11610 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 28 Aug 2024 01:52:25 +0530 Subject: [PATCH 038/145] Created call api's in 2 steps and for update call --- .../gepafin/tendermanagement/dao/CallDao.java | 266 +++++++++++++----- .../tendermanagement/dao/DocumentDao.java | 7 +- .../gepafin/tendermanagement/dao/UserDao.java | 6 + .../CallTargetAudienceChecklistEntity.java | 3 + .../entities/DocumentEntity.java | 16 +- .../entities/EvaluationCriteriaEntity.java | 17 +- .../tendermanagement/entities/FaqEntity.java | 21 +- .../model/request/CreateCallRequestStep2.java | 4 - .../model/request/EvaluationCriteriaReq.java | 2 +- .../model/request/FaqReq.java | 1 + .../model/request/LookUpDataReq.java | 4 +- .../EvaluationCriteriaResponseBean.java | 2 +- .../model/response/FaqResponseBean.java | 2 +- ...CallTargetAudienceChecklistRepository.java | 5 +- .../repositories/DocumentRepository.java | 7 +- .../EvaluationCriteriaRepository.java | 5 +- .../repositories/FaqRepository.java | 5 +- .../tendermanagement/service/UserService.java | 3 + .../service/impl/UserServiceImpl.java | 6 + .../db/changelog/db.changelog-1.0.0.xml | 24 ++ 20 files changed, 287 insertions(+), 119 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index a1d7ebbd..80a1e1cc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -4,8 +4,8 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; @@ -44,7 +44,7 @@ import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; import net.gepafin.tendermanagement.repositories.FaqRepository; import net.gepafin.tendermanagement.repositories.LookUpDataRepository; import net.gepafin.tendermanagement.repositories.RegionRepository; -import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -77,17 +77,18 @@ public class CallDao { private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; @Autowired - private UserRepository userRepository; + private UserService userService; public CreateCallResponseBean createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { - CreateCallResponseBean createCallResponseBean = null; CallEntity callEntity = convertToCallEntity(createCallRequest); - List faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); - List amiedTo = convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, + convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); + convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, LookUpDataTypeEnum.AIMED_TO); - createCallResponseBean = assembleCreateCallResponseBean(callEntity, Collections.emptyList(), - Collections.emptyList(), faqEntities, Collections.emptyList()); - createCallResponseBean.setAimedTo(amiedTo); +// createCallResponseBean = assembleCreateCallResponseBean(callEntity, Collections.emptyList(), +// Collections.emptyList(), faqEntities, Collections.emptyList()); +// createCallResponseBean.setAimedTo(amiedTo); +// createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); + CreateCallResponseBean createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); return createCallResponseBean; @@ -118,62 +119,87 @@ public class CallDao { } public List convertToEvaluationCriteriaEntities( - List criteriaReqList, CallEntity callEntity) { + List criteriaReqList, CallEntity callEntity, LookUpDataTypeEnum type) { + if (criteriaReqList == null) { + return null; + } + List existingCriteria = evaluationCriteriaRepository.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue()); + + List incomingIds = criteriaReqList.stream().map(EvaluationCriteriaReq::getId) + .filter(id -> id != null && id > 0).collect(Collectors.toList()); + + existingCriteria.stream().filter(criteria -> !incomingIds.contains(criteria.getId())).forEach(this::softDeleteEvaluationCriteria); + List evaluationCriteriaEntities = criteriaReqList.stream() - .map(req -> convertToEvaluationCriteriaEntity(req, callEntity)).collect(Collectors.toList()); + .map(req -> convertToEvaluationCriteriaEntity(req, callEntity, type)).collect(Collectors.toList()); evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); return evaluationCriteriaEntities; } + + private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) { + evaluationCriteriaEntity.setIsDeleted(true); + evaluationCriteriaRepository.save(evaluationCriteriaEntity); + } private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, - CallEntity callEntity) { - EvaluationCriteriaEntity criteriaEntity = new EvaluationCriteriaEntity(); - LookUpDataEntity lookUpDataEntity = getOrCreateLookUpData(criteriaReq, LookUpDataTypeEnum.EVALUATION_CRITERIA); - criteriaEntity.setLookupData(lookUpDataEntity); - criteriaEntity.setScore(criteriaReq.getScore()); - criteriaEntity.setCall(callEntity); + CallEntity callEntity, LookUpDataTypeEnum type) { + EvaluationCriteriaEntity criteriaEntity = null; + LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(criteriaReq, type); + if (criteriaReq.getId() == null && criteriaReq.getId().equals(0l)) { + criteriaEntity = evaluationCriteriaRepository.findById(criteriaReq.getId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + } else { + criteriaEntity = new EvaluationCriteriaEntity(); + criteriaEntity.setCall(callEntity); + criteriaEntity.setLookupData(lookupDataEntity); + criteriaEntity.setIsDeleted(false); + } + setIfUpdated(criteriaEntity::getScore, criteriaEntity::setScore, criteriaReq.getScore()); + if (Boolean.FALSE.equals(criteriaEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) { + criteriaEntity.setLookupData(lookupDataEntity); + } return criteriaEntity; } - private LookUpDataEntity getOrCreateLookUpData(EvaluationCriteriaReq criteriaReq, LookUpDataTypeEnum typeEnum) { - LookUpDataEntity lookUpDataEntity = null; - if (criteriaReq.getLookUpDataId() == null || criteriaReq.getLookUpDataId().equals(0l)) { - validateEvolutionCrieteriaEntity(criteriaReq.getValue()); - lookUpDataEntity = new LookUpDataEntity(); - lookUpDataEntity.setValue(criteriaReq.getValue()); - lookUpDataEntity.setType(typeEnum.getValue()); - lookUpDataRepository.save(lookUpDataEntity); - } else { - lookUpDataEntity = lookUpDataRepository.findById(null) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + + public List convertToDocumentEntities(List documentReqList, CallEntity callEntity, + DocumentTypeEnum documentType) { + if (documentReqList == null) { + return null; } + + List existingDocuments = documentRepository + .findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), documentType.getValue()); - return lookUpDataEntity; - } + List incomingIds = documentReqList.stream().map(DocumentReq::getId).filter(id -> id != null && id > 0) + .collect(Collectors.toList()); - public List convertToDocumentEntities(List documentReqList, CallEntity callEntity) { + existingDocuments.stream().filter(document -> !incomingIds.contains(document.getId())) + .forEach(this::softDeleteDocument); List documentEntities = documentReqList.stream() .map(req -> convertToDocumentEntity(req, callEntity)).collect(Collectors.toList()); documentRepository.saveAll(documentEntities); return documentEntities; } + + private void softDeleteDocument(DocumentEntity documentEntity) { + documentEntity.setIsDeleted(true); + documentRepository.save(documentEntity); + } private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { - validateDocumentEntity(documentReq.getId(), documentReq.getFileName()); - DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()) + validateDocumentEntity(documentReq.getId()); + DocumentEntity documentEntity = documentRepository.findByIdAndCallIdAndIsDeletedFalse(documentReq.getId(), callEntity.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); -// if(documentEntity==null){ -// throw ; -// } -// documentEntity.setFileName(documentReq.getFileName()); -// documentEntity.setFilePath(documentReq.getUrl()); -// documentEntity.setCall(callEntity); return documentEntity; } public List convertToFaqEntities(List faqReqList, CallEntity callEntity, Long userId) { + if (faqReqList == null) { + return null; + } List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userId)) .collect(Collectors.toList()); faqRepository.saveAll(faqEntities); @@ -183,9 +209,8 @@ public class CallDao { private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { FaqEntity faqEntity = new FaqEntity(); validateFaqEntity(faqReq.getQuestion()); - UserEntity userEntity = userRepository.findById(userId) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + UserEntity userEntity = userService.validateUser(userId); + faqEntity.setUser(userEntity); faqEntity.setIsVisible(true); if (faqReq.getIsVisible() != null) { @@ -199,6 +224,7 @@ public class CallDao { faqEntity.setResponseShort(faqReq.getResponseShort()); faqEntity.setResponse(faqReq.getResponse()); faqEntity.setCall(callEntity); + faqEntity.setIsDeleted(false); return faqEntity; } @@ -209,18 +235,14 @@ public class CallDao { } } - public void validateDocumentEntity(Long documentId, String name) { + public void validateDocumentEntity(Long documentId) { if (documentId == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND)); } - -// if (!StringUtils.hasText(name)) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); -// } } - public void validateEvolutionCrieteriaEntity(String name) { + public void validateEvaluationCriteriaEntity(String name) { if (!StringUtils.hasText(name)) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); @@ -335,8 +357,6 @@ public class CallDao { List lookUpDataEntities = lookUpData.stream() .map(req -> convertLookUpDataRequestIntoLookUpDataEntity(req, type)).collect(Collectors.toList()); - lookUpDataRepository.saveAll(lookUpDataEntities); - return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities); } @@ -348,6 +368,7 @@ public class CallDao { callTargetAudienceChecklistEntity.setIsValidated(false); callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); callTargetAudienceChecklistEntity.setCall(callEntity); + callTargetAudienceChecklistEntity.setIsDeleted(false); callTargetAudienceChecklistEntity = callTargetAudienceChecklistRepository .save(callTargetAudienceChecklistEntity); lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity)); @@ -361,7 +382,7 @@ public class CallDao { LookUpDataEntity newEntity = new LookUpDataEntity(); newEntity.setValue(req.getValue()); newEntity.setType(type.getValue()); - return newEntity; + return lookUpDataRepository.save(newEntity); } return lookUpDataRepository.findById(req.getLookUpDataId()) @@ -388,28 +409,29 @@ public class CallDao { } public CreateCallResponseBean createCallStep2(CreateCallRequestStep2 createCallRequest, Long userId) { - CreateCallResponseBean createCallResponseBean = null; CallEntity callEntity = callRepository.findById(createCallRequest.getCallId()) .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); - callEntity.setThreshold(createCallRequest.getThreshold()); - callEntity.setStatus(createCallRequest.getStatus().getValue()); + setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); callRepository.save(callEntity); - List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities( - createCallRequest.getCriteria(), callEntity); - List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); - List imageEntities = convertToDocumentEntities(createCallRequest.getImages(), callEntity); - List checkList = convertLookUpDataEntities(createCallRequest.getCheckList(), callEntity, - LookUpDataTypeEnum.CHECKLIST); - List faqEntities = faqRepository.findByCallId(callEntity.getId()); - List amiedTo = callTargetAudienceChecklistRepository - .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() - .map(this::convertToLookUpDataResponseBean).toList(); - createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, - documentEntities, faqEntities, imageEntities); - createCallResponseBean.setAimedTo(amiedTo); - createCallResponseBean.setCheckList(checkList); + convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA); + + convertToDocumentEntities(createCallRequest.getDocs(), callEntity, DocumentTypeEnum.DOCUMENT); + + convertToDocumentEntities(createCallRequest.getImages(), callEntity, DocumentTypeEnum.IMAGES); + + updateLookUpData(callEntity, createCallRequest.getCheckList(), LookUpDataTypeEnum.CHECKLIST); + +// List faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); +// List amiedTo = callTargetAudienceChecklistRepository +// .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() +// .map(this::convertToLookUpDataResponseBean).toList(); +// createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, +// documentEntities, faqEntities, imageEntities); +// createCallResponseBean.setAimedTo(amiedTo); +// createCallResponseBean.setCheckList(checkList); + CreateCallResponseBean createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_2); return createCallResponseBean; } @@ -422,10 +444,10 @@ public class CallDao { Boolean isValid = true; if (startDate != null && endDate != null && startDate.isAfter(endDate)) { isValid = false; - } else if (startDate != null && callEntity.getEndDate() != null + } else if (startDate != null && endDate == null && callEntity.getEndDate() != null && startDate.isAfter(callEntity.getEndDate().toLocalDate())) { isValid = false; - } else if (endDate != null && callEntity.getStartDate() != null + } else if (startDate == null && endDate != null && callEntity.getStartDate() != null && callEntity.getStartDate().toLocalDate().isAfter(endDate)) { isValid = false; } @@ -438,6 +460,7 @@ public class CallDao { public CreateCallResponseBean updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) { CallEntity callEntity = getCallById(callId); + UserEntity userEntity = userService.validateUser(userId); isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort, @@ -451,27 +474,114 @@ public class CallDao { setIfUpdated(callEntity::getDocumentationRequested, callEntity::setDocumentationRequested, updateCallRequest.getDocumentationRequested()); setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); - + updateLookUpData(callEntity, updateCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO); + updateFaq(callEntity, updateCallRequest.getFaq(), userEntity); CreateCallResponseBean createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); return createCallResponseBean; } + private void updateFaq(CallEntity callEntity, List faqReqList, UserEntity userEntity) { + if(faqReqList==null) { + return; + } + List existingFaqs = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); + List incomingIds = faqReqList.stream().map(FaqReq::getId).filter(Objects::nonNull).filter(id -> id > 0) + .collect(Collectors.toList()); + existingFaqs.stream().filter(faq -> !incomingIds.contains(faq.getId())).forEach(this::softDeleteFaq); + faqReqList.forEach(faqReq -> createOrUpdateFaq(faqReq, callEntity, userEntity)); + + } + + private void softDeleteFaq(FaqEntity faqEntity) { + faqEntity.setIsDeleted(true); + faqRepository.save(faqEntity); + } + + private void createOrUpdateFaq(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity) { + FaqEntity faqEntity = null; + + if (isExistingFaq(faqReq)) { + faqEntity = faqRepository.findById(faqReq.getId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + } else { + faqEntity = new FaqEntity(); + faqEntity.setCall(callEntity); + faqEntity.setUser(userEntity); + faqEntity.setIsDeleted(false); + } + + setIfUpdated(faqEntity::getQuestionShort, faqEntity::setQuestionShort, faqReq.getQuestionShort()); + setIfUpdated(faqEntity::getQuestion, faqEntity::setQuestion, faqReq.getQuestion()); + setIfUpdated(faqEntity::getResponseShort, faqEntity::setResponseShort, faqReq.getResponseShort()); + setIfUpdated(faqEntity::getResponse, faqEntity::setResponse, faqReq.getResponse()); + setIfUpdated(faqEntity::getIsVisible, faqEntity::setIsVisible, faqReq.getIsVisible()); + faqRepository.save(faqEntity); + } + + private boolean isExistingFaq(FaqReq faqReq) { + return faqReq.getId() != null && faqReq.getId() > 0; + } + + private void updateLookUpData(CallEntity callEntity, List lookupDataReqList, LookUpDataTypeEnum type) { + if (lookupDataReqList == null) { + return; + } + List existingChecklist = callTargetAudienceChecklistRepository + .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue()); + List incomingIds = lookupDataReqList.stream().map(LookUpDataReq::getLookUpDataId) + .filter(id -> id != null && id > 0).collect(Collectors.toList()); + existingChecklist.stream().filter(checklist -> !incomingIds.contains(checklist.getLookupData().getId())) + .forEach(this::softDeleteCallTargetAudienceChecklist); + lookupDataReqList + .forEach(lookUpDataReq -> createOrUpdateCallTargetAudienceChecklist(lookUpDataReq, callEntity, type)); + } + + private void createOrUpdateCallTargetAudienceChecklist(LookUpDataReq lookUpDataReq, CallEntity callEntity, + LookUpDataTypeEnum type) { + CallTargetAudienceChecklistEntity checklistEntity = null; + LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(lookUpDataReq, type); + if (lookUpDataReq.getId() != null && lookUpDataReq.getId() > 0) { + checklistEntity = callTargetAudienceChecklistRepository.findById(lookUpDataReq.getId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + + if (Boolean.FALSE.equals(checklistEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) { + checklistEntity.setLookupData(lookupDataEntity); + } + } else { + checklistEntity = new CallTargetAudienceChecklistEntity(); + checklistEntity.setCall(callEntity); + checklistEntity.setLookupData(lookupDataEntity); + checklistEntity.setIsValidated(false); + checklistEntity.setIsDeleted(false); + } + + callTargetAudienceChecklistRepository.save(checklistEntity); + } + + private void softDeleteCallTargetAudienceChecklist( + CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { + callTargetAudienceChecklistEntity.setIsDeleted(true); + callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity); + } + private CreateCallResponseBean getCallResponseBean(CallEntity callEntity) { - List documentEntities = documentRepository.findByCallIdAndType(callEntity.getId(), + List documentEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentTypeEnum.DOCUMENT.getValue()); - List imageEntities = documentRepository.findByCallIdAndType(callEntity.getId(), + List imageEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentTypeEnum.DOCUMENT.getValue()); - List faqEntities = faqRepository.findByCallId(callEntity.getId()); + List faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); List amiedTo = callTargetAudienceChecklistRepository - .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() + .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() .map(this::convertToLookUpDataResponseBean).toList(); List checkList = callTargetAudienceChecklistRepository - .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.CHECKLIST.getValue()).stream() + .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.CHECKLIST.getValue()).stream() .map(this::convertToLookUpDataResponseBean).toList(); List evaluationCriteriaEntities = evaluationCriteriaRepository - .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue()); + .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue()); CreateCallResponseBean createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, documentEntities, faqEntities, imageEntities); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index f9603b70..c5911465 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -18,7 +18,6 @@ import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; -import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -48,6 +47,7 @@ public class DocumentDao { documentEntity.setFileName(fileName); documentEntity.setType(fileType.getValue()); documentEntity.setFilePath(filepath); + documentEntity.setIsDeleted(false); documentEntities.add(documentEntity); } catch (IOException e) {} } @@ -62,9 +62,8 @@ public class DocumentDao { .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); - String fileName = Utils.extractFileName(documentEntity.getFilePath()); - amazonS3Service.delete(fileName); - documentRepository.delete(documentEntity); + documentEntity.setIsDeleted(true); + documentRepository.save(documentEntity); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 0393c176..feed67e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -149,4 +149,10 @@ public class UserDao { log.info("Login successful for email: {}", loginReq.getEmail()); return jwtToken; } + + public UserEntity validateUser(Long userId) { + return userRepository.findById(userId) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java index be94ee59..6b14df58 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java @@ -18,6 +18,9 @@ public class CallTargetAudienceChecklistEntity extends BaseEntity{ @Column(name = "IS_VALIDATED") private Boolean isValidated; + + @Column(name ="IS_DELETED", nullable = false) + private Boolean isDeleted = false; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java index 5a15351c..057ca421 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java @@ -1,17 +1,15 @@ package net.gepafin.tendermanagement.entities; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.AllArgsConstructor; -import lombok.Builder; @Entity @Table(name = "DOCUMENT") @Data -@NoArgsConstructor -@AllArgsConstructor -@Builder public class DocumentEntity extends BaseEntity{ @Column(name = "FILE_NAME", length = 255) private String fileName; @@ -28,4 +26,8 @@ public class DocumentEntity extends BaseEntity{ @Column(name = "DESCRIPTION", columnDefinition = "TEXT") private String description; + + @Column(name ="IS_DELETED", nullable = false) + private Boolean isDeleted = false; + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java index f6178779..39b3eb05 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java @@ -1,17 +1,15 @@ package net.gepafin.tendermanagement.entities; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.AllArgsConstructor; -import lombok.Builder; @Entity @Table(name = "EVALUATION_CRITERIA") @Data -@NoArgsConstructor -@AllArgsConstructor -@Builder public class EvaluationCriteriaEntity extends BaseEntity { @ManyToOne @@ -23,6 +21,9 @@ public class EvaluationCriteriaEntity extends BaseEntity { private LookUpDataEntity lookupData; @Column(name = "SCORE", nullable = false) - private Integer score; + private Long score; + + @Column(name ="IS_DELETED", nullable = false) + private Boolean isDeleted = false; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java index aa521521..d5e47df8 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java @@ -1,19 +1,19 @@ package net.gepafin.tendermanagement.entities; -import jakarta.persistence.*; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.AllArgsConstructor; -import lombok.Builder; - import java.time.LocalDateTime; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Data; + + @Entity @Table(name = "FAQ") @Data -@NoArgsConstructor -@AllArgsConstructor -@Builder public class FaqEntity extends BaseEntity { @ManyToOne @@ -41,6 +41,9 @@ public class FaqEntity extends BaseEntity { @Column(name = "RESPONSE_DATE") private LocalDateTime responseDate; + + @Column(name ="IS_DELETED", nullable = false) + private Boolean isDeleted = false; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java index d4264977..ca3a6045 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java @@ -4,7 +4,6 @@ import java.util.List; import jakarta.validation.constraints.NotNull; import lombok.Data; -import net.gepafin.tendermanagement.enums.CallTypeEnum; @Data public class CreateCallRequestStep2 { @@ -24,7 +23,4 @@ public class CreateCallRequestStep2 { private List images; - @NotNull - private CallTypeEnum status; - } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java index 492463ec..ebc8cbd7 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationCriteriaReq.java @@ -5,5 +5,5 @@ import lombok.Data; @Data public class EvaluationCriteriaReq extends LookUpDataReq{ - private Integer score; + private Long score; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java index de9f5225..618c03c0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java @@ -5,6 +5,7 @@ import lombok.Data; @Data public class FaqReq { + private Long id; private Boolean isVisible; private String questionShort; private String question; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java index 5fe41b41..441d19b6 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java @@ -1,12 +1,12 @@ package net.gepafin.tendermanagement.model.request; -import jakarta.validation.constraints.NotNull; import lombok.Data; @Data public class LookUpDataReq { - @NotNull + private Long id; + private Long lookUpDataId; private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java index 95829988..21f60a48 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationCriteriaResponseBean.java @@ -7,5 +7,5 @@ import java.time.LocalDateTime; @Data public class EvaluationCriteriaResponseBean extends LookUpDataResponse{ - private Integer score; + private Long score; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java index fdc4be63..57431714 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java @@ -10,7 +10,7 @@ public class FaqResponseBean { private Long id; - private Long userId; + private Long userId; private Boolean isVisible; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java index 8d4912fe..8b2f4859 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.repositories; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -9,6 +10,8 @@ import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; @Repository public interface CallTargetAudienceChecklistRepository extends JpaRepository { + + Optional findById(Long id); - List findByCallIdAndLookupDataType(Long id, String value); + List findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long id, String value); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index 22965f89..fcbc6f8b 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -2,14 +2,19 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.DocumentEntity; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface DocumentRepository extends JpaRepository { + + Optional findById(Long id); - List findByCallIdAndType(Long callId, String type); + List findByCallIdAndTypeAndIsDeletedFalse(Long callId, String type); + + Optional findByIdAndCallIdAndIsDeletedFalse(Long id, Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java index 3aae5b0d..434428af 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java @@ -3,10 +3,13 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface EvaluationCriteriaRepository extends JpaRepository { + + Optional findById(Long id); - List findByCallIdAndLookupDataType(Long callId, String type); + List findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long callId, String type); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java index 7b4b7610..8ecd8535 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -3,12 +3,15 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.FaqEntity; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface FaqRepository extends JpaRepository { + + Optional findById(Long id); - List findByCallId(Long callId); + List findByCallIdAndIsDeletedFalse(Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 68912240..38df028d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.service; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; @@ -16,4 +17,6 @@ public interface UserService { void deleteUser(Long userId); JWTToken login(LoginReq loginReq); + + UserEntity validateUser(Long userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index c6205aae..d5e14972 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service.impl; import net.gepafin.tendermanagement.dao.UserDao; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; @@ -49,5 +50,10 @@ public class UserServiceImpl implements UserService { return userDao.login(loginReq); } + + @Override + public UserEntity validateUser(Long userId) { + return userDao.validateUser(userId); + } } \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 11051187..96a4f0b8 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -410,4 +410,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + From ffa07d779bda725a96d938007d6d932d94373a02 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 28 Aug 2024 03:08:22 +0530 Subject: [PATCH 039/145] updated code --- .../gepafin/tendermanagement/dao/CallDao.java | 216 ------------------ 1 file changed, 216 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index acdd43fd..95cb337a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -157,21 +157,6 @@ public class CallDao { } return criteriaEntity; } -// public List convertListOfEvaluationCriteriaReqToEvaluationCriteriaEntities(List criteriaReqList, CallEntity callEntity) { -// List evaluationCriteriaEntities = criteriaReqList.stream().map(req -> convertToEvaluationCriteriaEntity(req, callEntity)).collect(Collectors.toList()); -// evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); -// return evaluationCriteriaEntities; -// } -// -// private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, CallEntity callEntity) { -// EvaluationCriteriaEntity criteriaEntity = new EvaluationCriteriaEntity(); -// validateEvolutionCrieteriaEntity(criteriaReq.getName(),criteriaReq.getScore()); -// criteriaEntity.setName(criteriaReq.getName()); -// criteriaEntity.setDescription(criteriaReq.getValue()); -// criteriaEntity.setScore(criteriaReq.getScore()); -// criteriaEntity.setCall(callEntity); -// return criteriaEntity; -// } public List convertToDocumentEntities(List documentReqList, CallEntity callEntity, @@ -217,207 +202,6 @@ public class CallDao { return faqEntities; } -// public List convertToFaqEntities(List faqReqList, CallEntity callEntity, Long userId) { -// List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userId)).collect(Collectors.toList()); -// faqRepository.saveAll(faqEntities); -// return faqEntities; -// } -// -// public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { -// FaqEntity faqEntity = new FaqEntity(); -// validateFaqEntity(faqReq.getQuestion()); -// UserEntity userEntity = userService.validateUser(userId); -// faqEntity.setUser(userEntity); -// faqEntity.setIsVisible(true); -// if(faqReq.getIsVisible()!=null){ -// faqEntity.setIsVisible(faqReq.getIsVisible()); -// } -// faqEntity.setQuestionShort(faqReq.getQuestionShort()); -// faqEntity.setQuestion(faqReq.getQuestion()); -// if(faqReq.getResponse()!=null ||faqReq.getResponseShort()!=null){ -// faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); -// } -// faqEntity.setResponseShort(faqReq.getResponseShort()); -// faqEntity.setResponse(faqReq.getResponse()); -// faqEntity.setCall(callEntity); -// faqEntity.setIsDeleted(false); -// return faqEntity; -// } -// -// public void validateFaqEntity( String question) { -// if (!StringUtils.hasText(question)) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.QUESTION_NOT_EMPTY_MSG)); -// } -// } -// -// public void validateDocumentEntity(Long documentId,String name) { -// if(documentId==null){ -// throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND)); -// } -// -//// if (!StringUtils.hasText(name)) { -//// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); -//// } -// } -// -// public void validateEvolutionCrieteriaEntity(String name,Integer score) { -// if (!StringUtils.hasText(name)) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); -// } -// if (score == null || score <= 0) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.SCORE_NOT_NULL_MSG)); -// } -// } -// -// public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { -// if (createCallRequest.getRegionId() == null) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); -// } -// -// if (createCallRequest.getAmount().compareTo(BigDecimal.ZERO) <= 0||createCallRequest.getAmountMax().compareTo(BigDecimal.ZERO) <= 0) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); -// } -// if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now())) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); -// } -// } -// public CreateCallResponseBean convertToCallResponseBean(CallEntity callEntity) { -// CreateCallResponseBean createCallResponseBean = new CreateCallResponseBean(); -// createCallResponseBean.setId(callEntity.getId()); -// createCallResponseBean.setName(callEntity.getName()); -// createCallResponseBean.setDates(List.of(callEntity.getStartDate(), callEntity.getEndDate())); -// createCallResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); -// createCallResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); -// createCallResponseBean.setStatus(CallTypeEnum.valueOf(callEntity.getStatus())); -// createCallResponseBean.setRegionId(callEntity.getRegion().getId()); -// createCallResponseBean.setAmount(callEntity.getAmount()); -// createCallResponseBean.setAmountMax(callEntity.getAmountMax()); -// createCallResponseBean.setContactInfo(callEntity.getContactInfo()); -// createCallResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); -// createCallResponseBean.setThreshold(callEntity.getThreshold()); -// createCallResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); -// createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); -// createCallResponseBean.setCreatedDate(callEntity.getCreatedDate()); -// createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); -// return createCallResponseBean; -// } -// public EvaluationCriteriaResponseBean convertToEvaluationCriteriaResponseBean(EvaluationCriteriaEntity entity) { -// EvaluationCriteriaResponseBean responseBean = new EvaluationCriteriaResponseBean(); -// responseBean.setId(entity.getId()); -// responseBean.setName(entity.getName()); -// responseBean.setDescription(entity.getDescription()); -// responseBean.setScore(entity.getScore()); -// responseBean.setCreatedDate(entity.getCreatedDate()); -// responseBean.setUpdatedDate(entity.getUpdatedDate()); -// return responseBean; -// } -// public DocumentResponseBean convertToDocumentResponseBean(DocumentEntity entity) { -// DocumentResponseBean responseBean = new DocumentResponseBean(); -// responseBean.setId(entity.getId()); -// responseBean.setName(entity.getFileName()); -// responseBean.setDescription(entity.getDescription()); -// responseBean.setFilePath(entity.getFilePath()); -// responseBean.setCreatedDate(entity.getCreatedDate()); -// responseBean.setUpdatedDate(entity.getUpdatedDate()); -// return responseBean; -// } -// public FaqResponseBean convertToFaqResponseBean(FaqEntity entity) { -// FaqResponseBean responseBean = new FaqResponseBean(); -// responseBean.setId(entity.getId()); -// responseBean.setQuestionShort(entity.getQuestionShort()); -// responseBean.setResponseShort(entity.getResponseShort()); -// responseBean.setResponse(entity.getResponse()); -// responseBean.setQuestion(entity.getQuestion()); -// responseBean.setUserId(entity.getUser().getId()); -// responseBean.setIsVisible(entity.getIsVisible()); -// responseBean.setCreatedDate(entity.getCreatedDate()); -// responseBean.setUpdatedDate(entity.getUpdatedDate()); -// return responseBean; -// } -// public CreateCallResponseBean assembleCreateCallResponseBean( -// CallEntity callEntity, -// List evaluationCriteriaEntities, -// List documentEntities, -// List faqEntities,List images) { -// -// CreateCallResponseBean callResponseBean = convertToCallResponseBean(callEntity); -// -// List evaluationCriteriaResponseBeans = evaluationCriteriaEntities.stream() -// .map(this::convertToEvaluationCriteriaResponseBean) -// .collect(Collectors.toList()); -// -// List documentResponseBeans = documentEntities.stream() -// .map(this::convertToDocumentResponseBean) -// .collect(Collectors.toList()); -// -// List faqResponseBeans = faqEntities.stream() -// .map(this::convertToFaqResponseBean) -// .collect(Collectors.toList()); -// -// List imagesResponseBean = images.stream() -// .map(this::convertToDocumentResponseBean) -// .collect(Collectors.toList()); -// CreateCallResponseBean createCallResponseBean =callResponseBean; -// createCallResponseBean.setCriteria(evaluationCriteriaResponseBeans); -// createCallResponseBean.setDocs(documentResponseBeans); -// createCallResponseBean.setFaq(faqResponseBeans); -// createCallResponseBean.setImages(imagesResponseBean); -// return createCallResponseBean; -// } -// public List convertLookUpDataEntities(List lookUpData, CallEntity callEntity, LookUpDataEntity.LookUpDataTypeEnum type) { -// List lookUpDataEntities = lookUpData.stream() -// .map(req -> convertLookUpDataRequestIntoLookUpDataEntity(req, type)) -// .collect(Collectors.toList()); -// -// lookUpDataRepository.saveAll(lookUpDataEntities); -// -// return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities); -// } -// -// private List createCallTargetAudienceCheckList(CallEntity callEntity, List lookUpDataEntities) { -// List lookUpDataResponses=new ArrayList<>(); -// for(LookUpDataEntity lookUpDataEntity:lookUpDataEntities){ -// CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity=new CallTargetAudienceChecklistEntity(); -// callTargetAudienceChecklistEntity.setIsValidated(false); -// callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); -// callTargetAudienceChecklistEntity.setCall(callEntity); -// callTargetAudienceChecklistEntity= callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity); -// lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity)); -// } -// return lookUpDataResponses; -// } -// -// private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, LookUpDataEntity.LookUpDataTypeEnum type) { -// if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { -// LookUpDataEntity newEntity = new LookUpDataEntity(); -// newEntity.setValue(req.getValue()); -// newEntity.setType(type.getValue()); -// return newEntity; -// } -// -// return lookUpDataRepository.findById(req.getLookUpDataId()) -// .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); -// } -// -// public LookUpDataResponse convertToLookUpDataResponseBean(CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { -// LookUpDataResponse lookUpDataResponse = new LookUpDataResponse(); -// LookUpDataEntity lookUpDataEntity = callTargetAudienceChecklistEntity.getLookupData(); -// lookUpDataResponse.setId(callTargetAudienceChecklistEntity.getId()); -// lookUpDataResponse.setLookUpDataId(lookUpDataEntity.getId()); -// lookUpDataResponse.setValue(lookUpDataEntity.getValue()); -// lookUpDataResponse.setTitle(lookUpDataEntity.getTitle()); -// lookUpDataResponse.setCreatedDate(lookUpDataEntity.getCreatedDate()); -// lookUpDataResponse.setUpdatedDate(lookUpDataEntity.getUpdatedDate()); -// return lookUpDataResponse; -// } -// -// -// public CreateCallResponseBean createCallStep2(CreateCallRequestStep2 createCallRequest, Long userId) { -// CreateCallResponseBean createCallResponseBean = null; -// CallEntity callEntity = callRepository.findById(createCallRequest.getCallId()) -// .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, -// Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG))); - public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { FaqEntity faqEntity = new FaqEntity(); validateFaqEntity(faqReq.getQuestion()); From 1f8769935624f8649efea8141d15c8f96829a2e5 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 28 Aug 2024 12:33:45 +0530 Subject: [PATCH 040/145] Created an api to get look up data by type --- .../tendermanagement/dao/LookUpDataDao.java | 12 +++++ .../repositories/LookUpDataRepository.java | 4 ++ .../service/LookUpDataService.java | 5 ++ .../service/impl/LookUpDataServiceImpl.java | 7 +++ .../web/rest/api/LookUpDataApi.java | 52 +++++++++++++++---- .../api/impl/LookUpDataApiController.java | 14 +++++ 6 files changed, 83 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java index 6d9daf37..fe51facc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.entities.LookUpDataEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; import net.gepafin.tendermanagement.repositories.LookUpDataRepository; @@ -11,6 +12,9 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.stream.Collectors; + @Component public class LookUpDataDao { @@ -62,4 +66,12 @@ public class LookUpDataDao { response.setUpdatedDate(entity.getUpdatedDate()); return response; } + + public List getLookUpDataByType(LookUpDataTypeEnum type) { + return lookUpDataRepository.findByType(type.getValue()) + .stream() + .map(this::convertLookUpDataEntityToResponseBean) + .collect(Collectors.toList()); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java index f3206948..3d3d6d70 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java @@ -4,6 +4,10 @@ import net.gepafin.tendermanagement.entities.LookUpDataEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + @Repository public interface LookUpDataRepository extends JpaRepository { + List findByType(String type); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java index 0a69be9f..c7fde0f6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java @@ -1,8 +1,11 @@ package net.gepafin.tendermanagement.service; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; +import java.util.List; + public interface LookUpDataService { LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq); @@ -12,4 +15,6 @@ public interface LookUpDataService { LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq); void deleteLookUpData(Long id); + + List getLookUpDataByType(LookUpDataTypeEnum type); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java index 86a2ae6e..bba01b91 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java @@ -1,12 +1,15 @@ package net.gepafin.tendermanagement.service.impl; import net.gepafin.tendermanagement.dao.LookUpDataDao; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; import net.gepafin.tendermanagement.service.LookUpDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class LookUpDataServiceImpl implements LookUpDataService { @@ -32,4 +35,8 @@ public class LookUpDataServiceImpl implements LookUpDataService { public void deleteLookUpData(Long id) { lookUpDataDao.deleteLookUpData(id); } + @Override + public List getLookUpDataByType(LookUpDataTypeEnum type) { + return lookUpDataDao.getLookUpDataByType(type); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java index bf3afe19..b0670e4b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java @@ -4,48 +4,78 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletRequest; import javax.validation.Valid; +import java.util.List; public interface LookUpDataApi { @Operation(summary = "API to create LookUp Data", responses = { - @ApiResponse(responseCode = "201", description = "Created"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) - }) + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @PostMapping(value = "", consumes = "application/json", produces = "application/json") ResponseEntity> createLookUpData(HttpServletRequest request, @Valid @RequestBody LookUpDataRequest lookUpDataReq); @Operation(summary = "API to get LookUp Data by id", responses = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) - }) + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @GetMapping(value = "/{id}", produces = "application/json") ResponseEntity> getLookUpDataById(HttpServletRequest request, @PathVariable Long id); @Operation(summary = "API to update LookUp Data", responses = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Bad Request\" }"))), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) - }) + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @PutMapping(value = "/{id}", consumes = "application/json", produces = "application/json") ResponseEntity> updateLookUpData(HttpServletRequest request, @PathVariable Long id, @Valid @RequestBody LookUpDataRequest lookUpDataReq); @Operation(summary = "API to delete LookUp Data", responses = { @ApiResponse(responseCode = "204", description = "No Content"), - @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) - }) + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @DeleteMapping(value = "/{id}") ResponseEntity> deleteLookUpData(HttpServletRequest request, @PathVariable Long id); + + @Operation(summary = "API to get LookUp Data by type", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) + @GetMapping(value = "/type", produces = "application/json") + ResponseEntity>> getLookUpDataByType(HttpServletRequest request, @RequestParam LookUpDataTypeEnum type); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java index 79fae0de..f2c50512 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; import net.gepafin.tendermanagement.model.util.Response; @@ -15,6 +16,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/lookupdata}") public class LookUpDataApiController implements LookUpDataApi { @@ -59,4 +62,15 @@ public class LookUpDataApiController implements LookUpDataApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_DELETED_SUCCESSFULLY))); } + @Override + public ResponseEntity>> getLookUpDataByType(HttpServletRequest request, LookUpDataTypeEnum type) { + List responseBean = lookUpDataService.getLookUpDataByType(type); + if (responseBean != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response>(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_FETCHED_SUCCESSFULLY))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response>(responseBean, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + } + } } From 630643f15673c4205c9dfecbb3c514f5f1031482 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 28 Aug 2024 12:38:11 +0530 Subject: [PATCH 041/145] created validate api for call --- .../constants/GepafinConstant.java | 4 ++ .../gepafin/tendermanagement/dao/CallDao.java | 51 +++++++++++-------- ...{CallTypeEnum.java => CallStatusEnum.java} | 7 +-- .../response/CallDetailsResponseBean.java | 4 +- ...allResponseBean.java => CallResponse.java} | 8 +-- ...CallTargetAudienceChecklistRepository.java | 2 +- .../tendermanagement/service/CallService.java | 12 +++-- .../service/impl/CallServiceImpl.java | 16 ++++-- .../impl/CallValidatorServiceImpl.java | 31 +++++++++++ .../tendermanagement/util/FieldValidator.java | 40 +++++++++++++++ .../web/rest/api/CallApi.java | 28 ++++++++-- .../web/rest/api/EvaluationCriteriaApi.java | 12 ++--- .../rest/api/errors/ValidationException.java | 27 ++++++++++ .../web/rest/api/impl/CallApiController.java | 25 +++++---- .../impl/EvaluationCriteriaApiController.java | 2 +- .../api/impl/LookUpDataApiController.java | 2 +- src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 2 + 18 files changed, 214 insertions(+), 61 deletions(-) rename src/main/java/net/gepafin/tendermanagement/enums/{CallTypeEnum.java => CallStatusEnum.java} (69%) rename src/main/java/net/gepafin/tendermanagement/model/response/{CreateCallResponseBean.java => CallResponse.java} (87%) create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ValidationException.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 31e5dcbc..9f3d63ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -45,6 +45,7 @@ public class GepafinConstant { public static final String INVALID_DATE_MSG = "call.invalid.date"; public static final String STEP_1 = "STEP_1"; public static final String STEP_2 = "STEP_2"; + public static final String VALIDATE_REQUEST = "VALIDATE_REQUEST"; public static final String CALL_UPDATE_SUCCESSFULLY_MSG = "call.update.successfully"; public static final String CALL_NOT_FOUND = "call.not.found"; public static final String CALL_FETCH_SUCCESS_MSG = "call.fetch.success"; @@ -75,5 +76,8 @@ public class GepafinConstant { public static final String LOGOUT_SUCCESSFUL_MSG = "logout.successful.msg"; public static final String SUCCESS_PASSWORD_CHANGED = "success.password.changed"; public static final String UPDATE_USER_STATUS_SUCCESS_MSG = "update.user.status.success"; + public static final String FIELD_NOT_NULL = "field.not.null"; + public static final String FIELD_NOT_EMPTY = "field.not.empty"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 95cb337a..647696ab 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -24,7 +24,7 @@ import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.enums.CallTypeEnum; +import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; @@ -41,6 +41,7 @@ import net.gepafin.tendermanagement.repositories.FaqRepository; import net.gepafin.tendermanagement.repositories.LookUpDataRepository; import net.gepafin.tendermanagement.repositories.RegionRepository; import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.service.impl.CallValidatorServiceImpl; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -75,7 +76,7 @@ public class CallDao { @Autowired private UserService userService; - public CreateCallResponseBean createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { + public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { CallEntity callEntity = convertToCallEntity(createCallRequest); convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, @@ -84,7 +85,7 @@ public class CallDao { // Collections.emptyList(), faqEntities, Collections.emptyList()); // createCallResponseBean.setAimedTo(amiedTo); // createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); - CreateCallResponseBean createCallResponseBean = getCallResponseBean(callEntity); + CallResponse createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); return createCallResponseBean; @@ -102,7 +103,7 @@ public class CallDao { callEntity.setDescriptionLong(createCallRequest.getDescriptionLong()); callEntity.setStartDate(createCallRequest.getStartDate()); callEntity.setEndDate(createCallRequest.getEndDate()); - callEntity.setStatus(CallTypeEnum.DRAFT.getValue()); + callEntity.setStatus(CallStatusEnum.DRAFT.getValue()); callEntity.setAmountMax(createCallRequest.getAmountMax()); callEntity.setAmount(createCallRequest.getAmountMax()); callEntity.setConfidi(false); @@ -144,7 +145,7 @@ public class CallDao { if (criteriaReq.getId() == null && criteriaReq.getId().equals(0l)) { criteriaEntity = evaluationCriteriaRepository.findById(criteriaReq.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); } else { criteriaEntity = new EvaluationCriteriaEntity(); criteriaEntity.setCall(callEntity); @@ -264,15 +265,15 @@ public class CallDao { } - public CreateCallResponseBean convertToCallResponseBean(CallEntity callEntity) { - CreateCallResponseBean createCallResponseBean = new CreateCallResponseBean(); + public CallResponse convertToCallResponseBean(CallEntity callEntity) { + CallResponse createCallResponseBean = new CallResponse(); createCallResponseBean.setId(callEntity.getId()); createCallResponseBean.setName(callEntity.getName()); createCallResponseBean.setStartDate(callEntity.getStartDate()); createCallResponseBean.setEndDate(callEntity.getEndDate()); createCallResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); createCallResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); - createCallResponseBean.setStatus(CallTypeEnum.valueOf(callEntity.getStatus())); + createCallResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); createCallResponseBean.setRegionId(callEntity.getRegion().getId()); createCallResponseBean.setAmount(callEntity.getAmount()); createCallResponseBean.setAmountMax(callEntity.getAmountMax()); @@ -281,6 +282,7 @@ public class CallDao { createCallResponseBean.setThreshold(callEntity.getThreshold()); createCallResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); + createCallResponseBean.setConfidi(callEntity.getConfidi()); createCallResponseBean.setCreatedDate(callEntity.getCreatedDate()); createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); return createCallResponseBean; @@ -323,11 +325,11 @@ public class CallDao { return responseBean; } - public CreateCallResponseBean assembleCreateCallResponseBean(CallEntity callEntity, + public CallResponse assembleCreateCallResponseBean(CallEntity callEntity, List evaluationCriteriaEntities, List documentEntities, List faqEntities, List images) { - CreateCallResponseBean callResponseBean = convertToCallResponseBean(callEntity); + CallResponse callResponseBean = convertToCallResponseBean(callEntity); List evaluationCriteriaResponseBeans = evaluationCriteriaEntities.stream() .map(this::convertToEvaluationCriteriaResponseBean).collect(Collectors.toList()); @@ -340,7 +342,7 @@ public class CallDao { List imagesResponseBean = images.stream().map(this::convertToDocumentResponseBean) .collect(Collectors.toList()); - CreateCallResponseBean createCallResponseBean = callResponseBean; + CallResponse createCallResponseBean = callResponseBean; createCallResponseBean.setCriteria(evaluationCriteriaResponseBeans); createCallResponseBean.setDocs(documentResponseBeans); createCallResponseBean.setFaq(faqResponseBeans); @@ -403,14 +405,14 @@ public class CallDao { return callRepository.findById(callId).orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); } - public CreateCallResponseBean getCallById(Long callId) { + public CallResponse getCallById(Long callId) { CallEntity callEntity = callRepository.findById(callId) .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); return getCallResponseBean(callEntity); } - public CreateCallResponseBean createCallStep2(Long callId, CreateCallRequestStep2 createCallRequest, Long userId) { + public CallResponse createCallStep2(Long callId, CreateCallRequestStep2 createCallRequest, Long userId) { CallEntity callEntity = callRepository.findById(callId) .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); @@ -433,7 +435,7 @@ public class CallDao { // documentEntities, faqEntities, imageEntities); // createCallResponseBean.setAimedTo(amiedTo); // createCallResponseBean.setCheckList(checkList); - CreateCallResponseBean createCallResponseBean = getCallResponseBean(callEntity); + CallResponse createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_2); return createCallResponseBean; } @@ -460,7 +462,7 @@ public class CallDao { } } - public CreateCallResponseBean updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) { + public CallResponse updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) { CallEntity callEntity = validateCall(callId); UserEntity userEntity = userService.validateUser(userId); isValidDateRange(updateCallRequest, callEntity); @@ -478,7 +480,7 @@ public class CallDao { setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); updateLookUpData(callEntity, updateCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO); updateFaq(callEntity, updateCallRequest.getFaq(), userEntity); - CreateCallResponseBean createCallResponseBean = getCallResponseBean(callEntity); + CallResponse createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); return createCallResponseBean; } @@ -506,7 +508,7 @@ public class CallDao { if (isExistingFaq(faqReq)) { faqEntity = faqRepository.findById(faqReq.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); } else { faqEntity = new FaqEntity(); faqEntity.setCall(callEntity); @@ -576,7 +578,7 @@ public class CallDao { callDetailsResponseBean.setDates(List.of(callEntity.getStartDate(), callEntity.getEndDate())); callDetailsResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); callDetailsResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); - callDetailsResponseBean.setStatus(CallTypeEnum.valueOf(callEntity.getStatus())); + callDetailsResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); callDetailsResponseBean.setRegionId(callEntity.getRegion().getId()); callDetailsResponseBean.setAmount(callEntity.getAmount()); callDetailsResponseBean.setAmountMax(callEntity.getAmountMax()); @@ -589,7 +591,7 @@ public class CallDao { callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); return callDetailsResponseBean; } - private CreateCallResponseBean getCallResponseBean(CallEntity callEntity) { + private CallResponse getCallResponseBean(CallEntity callEntity) { List documentEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentTypeEnum.DOCUMENT.getValue()); List imageEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), @@ -605,7 +607,7 @@ public class CallDao { List evaluationCriteriaEntities = evaluationCriteriaRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue()); - CreateCallResponseBean createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, + CallResponse createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, documentEntities, faqEntities, imageEntities); createCallResponseBean.setAimedTo(amiedTo); createCallResponseBean.setCheckList(checkList); @@ -617,4 +619,13 @@ public class CallDao { .map(this::convertToCallDetailsResponseBean) .collect(Collectors.toList()); } + + public CallResponse validateCall(CallEntity callEntity) { + CallResponse callResponseBean = getCallResponseBean(callEntity); + CallValidatorServiceImpl.validateResponse(callResponseBean); + callEntity.setStatus(CallStatusEnum.READY_TO_PUBLISH.getValue()); + callRepository.save(callEntity); + callResponseBean.setCurrentStep(GepafinConstant.VALIDATE_REQUEST); + return callResponseBean; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/CallTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java similarity index 69% rename from src/main/java/net/gepafin/tendermanagement/enums/CallTypeEnum.java rename to src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java index 46b88869..b1befe86 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/CallTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java @@ -2,15 +2,16 @@ package net.gepafin.tendermanagement.enums; import com.fasterxml.jackson.annotation.JsonValue; -public enum CallTypeEnum { +public enum CallStatusEnum { DRAFT("DRAFT"), PUBLISH("PUBLISH"), - EXPIRE("EXPIRE"); + EXPIRE("EXPIRE"), + READY_TO_PUBLISH("READY_TO_PUBLISH"); private String value; - CallTypeEnum(String value) { + CallStatusEnum(String value) { this.value = value; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java index f100446f..0e19dd69 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -1,7 +1,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; -import net.gepafin.tendermanagement.enums.CallTypeEnum; +import net.gepafin.tendermanagement.enums.CallStatusEnum; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -19,7 +19,7 @@ public class CallDetailsResponseBean { private List dates; - private CallTypeEnum status; + private CallStatusEnum status; private Long regionId; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java similarity index 87% rename from src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java rename to src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java index 34a361d9..4deaef67 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -5,10 +5,10 @@ import java.time.LocalDateTime; import java.util.List; import lombok.Data; -import net.gepafin.tendermanagement.enums.CallTypeEnum; +import net.gepafin.tendermanagement.enums.CallStatusEnum; @Data -public class CreateCallResponseBean { +public class CallResponse { private Long id; @@ -22,7 +22,7 @@ public class CreateCallResponseBean { private LocalDateTime endDate; - private CallTypeEnum status; + private CallStatusEnum status; private Long regionId; @@ -39,6 +39,8 @@ public class CreateCallResponseBean { private String priorityArea; private String documentationReqested; + + private Boolean confidi; private LocalDateTime createdDate; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java index f631b0ed..62da59a7 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java @@ -16,5 +16,5 @@ public interface CallTargetAudienceChecklistRepository extends JpaRepository findById(@Param("id") Long id); - List findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long id, String value); + List findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long id, String type); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index f518a216..1008f062 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -7,18 +7,20 @@ import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; -import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.CallResponse; public interface CallService { - CreateCallResponseBean createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest); + CallResponse createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest); - CreateCallResponseBean createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest); + CallResponse createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest); - CreateCallResponseBean updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest); + CallResponse updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest); - CreateCallResponseBean getCallById (Long callId); + CallResponse getCallById (Long callId); List getAllCalls(); + CallResponse validateCall(Long callId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index ab5cafaa..0dc37efd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -7,7 +7,7 @@ import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; -import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -28,28 +28,28 @@ public class CallServiceImpl implements CallService { @Override @Transactional(rollbackFor = Exception.class) - public CreateCallResponseBean createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { + public CallResponse createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); return callDao.createCallStep1(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); } @Override @Transactional(rollbackFor = Exception.class) - public CreateCallResponseBean createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest) { + public CallResponse createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest) { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); return callDao.createCallStep2(callId, createCallRequest, Long.parseLong(userInfo.get("userId").toString())); } @Override @Transactional(rollbackFor = Exception.class) - public CreateCallResponseBean updateCallStep1(HttpServletRequest request, Long callId, + public CallResponse updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest) { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); return callDao.updateCallStep1(callId, updateCallRequest, Long.parseLong(userInfo.get("userId").toString())); } @Override @Transactional(readOnly = true) - public CreateCallResponseBean getCallById(Long callId) { + public CallResponse getCallById(Long callId) { return callDao.getCallById(callId); } @@ -59,4 +59,10 @@ public class CallServiceImpl implements CallService { return callDao.getAllCalls(); } + + @Override + @Transactional(rollbackFor = Exception.class) + public CallResponse validateCall(Long callId) { + return callDao.validateCall(callDao.validateCall(callId)); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java new file mode 100644 index 00000000..d2079cdf --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java @@ -0,0 +1,31 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.util.FieldValidator; + +public class CallValidatorServiceImpl { + + public static void validateResponse(CallResponse response) { + FieldValidator.create() + .notNull(response.getId(), "id") + .notNull(response.getName(), "name") + .notNull(response.getDescriptionShort(), "descriptionShort") + .notNull(response.getDescriptionLong(), "descriptionLong") + .notNull(response.getStartDate(), "startDate") + .notNull(response.getEndDate(), "endDate") + .notNull(response.getStatus(), "status") + .notNull(response.getRegionId(), "regionId") + .notNull(response.getAmount(), "amount") + .notNull(response.getAmountMax(), "amountMax") + .notNull(response.getThreshold(), "threshold") + .notNull(response.getDocumentationReqested(), "documentationReqested") + .notEmpty(response.getAimedTo(), "aimedTo") + .notEmpty(response.getCriteria(), "criteria") + .notEmpty(response.getDocs(), "docs") + .notEmpty(response.getFaq(), "faq") + .notEmpty(response.getImages(), "images") + .notEmpty(response.getCheckList(), "checkList") + .validate(); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java new file mode 100644 index 00000000..e57909d2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -0,0 +1,40 @@ +package net.gepafin.tendermanagement.util; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import net.gepafin.tendermanagement.web.rest.api.errors.ValidationException; + +public class FieldValidator { + + private final List errors = new ArrayList<>(); + + public static FieldValidator create() { + return new FieldValidator(); + } + + public FieldValidator notNull(Object object, String fieldName) { + if (Objects.isNull(object)) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_NULL), fieldName)); + } + return this; + } + + public FieldValidator notEmpty(List list, String fieldName) { + if (list == null || list.isEmpty()) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_EMPTY), fieldName)); + } + return this; + } + + public void validate() { + if (!errors.isEmpty()) { + throw new ValidationException(Status.VALIDATION_ERROR, errors); + } + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 02ffc988..1b4771a8 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -23,7 +23,7 @@ import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; -import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -42,7 +42,7 @@ public interface CallApi { }) @PostMapping(value = "/step1", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - public ResponseEntity> createCallStep1(HttpServletRequest request, + public ResponseEntity> createCallStep1(HttpServletRequest request, @Parameter(description = "Call request object", required = true) @Valid @RequestBody CreateCallRequestStep1 createCallRequest); @@ -58,7 +58,7 @@ public interface CallApi { }) @PutMapping(value = "/step2/{callId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - public ResponseEntity> createCallStep2(HttpServletRequest request, + public ResponseEntity> createCallStep2(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, @Parameter(description = "Call request object", required = true) @Valid @RequestBody CreateCallRequestStep2 createCallRequest); @@ -74,7 +74,7 @@ public interface CallApi { }) @PutMapping(value = "/step1/{callId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - public ResponseEntity> updateCallStep1(HttpServletRequest request, + public ResponseEntity> updateCallStep1(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, @Parameter(description = "Call request object", required = true) @Valid @RequestBody UpdateCallRequestStep1 updateCallRequest); @Operation(summary = "Api to get call by id", @@ -88,8 +88,10 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{callId}", produces = { "application/json" }) - ResponseEntity> getCallById( + ResponseEntity> getCallById( @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + + @Operation(summary = "Api to get all calls", responses = { @ApiResponse(responseCode = "200", description = "OK"), @@ -102,5 +104,21 @@ public interface CallApi { @GetMapping(value = "", produces = { "application/json" }) ResponseEntity>> getAllCalls(); + + + @Operation(summary = "Api to validate call", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "/validate/{callId}", produces = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> validateCall(HttpServletRequest request, + @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java index 41bfbc92..c102f42a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java @@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.*; public interface EvaluationCriteriaApi { - @Operation(summary = "API to create evaluation criteria", + @Operation(summary = "Api to create evaluation criteria", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -28,12 +28,12 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PostMapping(value = "/criteria", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> createEvaluationCriteria(HttpServletRequest request, @Parameter(description = "Evaluation criteria request object", required = true) @Valid @RequestBody EvaluationCriteriaRequest createCallRequest); - @Operation(summary = "API to get evaluation criteria by id", + @Operation(summary = "Api to get evaluation criteria by id", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -41,7 +41,7 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) - @GetMapping(value = "/criteria/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> getEvaluationCriteriaById(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable Long id); @@ -56,7 +56,7 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PutMapping(value = "/criteria/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PutMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> updateEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable Long id, @@ -71,7 +71,7 @@ public interface EvaluationCriteriaApi { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) - @DeleteMapping(value = "/criteria/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable Long id); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ValidationException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ValidationException.java new file mode 100644 index 00000000..855177db --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ValidationException.java @@ -0,0 +1,27 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import java.util.List; + +public class ValidationException extends CustomValidationException { + + private final Status status; + private static final long serialVersionUID = 1L; + private final List errors; + + public ValidationException(Status status, List errors) { + super(status, errors.toString()); + this.errors = errors; + this.status = status; + } + + + public List getErrors() { + return errors; + } + + public Status getStatus() { + return status; + } + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 176b6c49..7c96aa7e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -16,7 +16,7 @@ import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; -import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.web.rest.api.CallApi; @@ -33,31 +33,31 @@ public class CallApiController implements CallApi { @Override @Transactional(rollbackFor=Exception.class) - public ResponseEntity> createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { - CreateCallResponseBean createCallResponseBean = callService.createCallStep1(request, createCallRequest); + public ResponseEntity> createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { + CallResponse createCallResponseBean = callService.createCallStep1(request, createCallRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); } @Override @Transactional(rollbackFor=Exception.class) - public ResponseEntity> createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest) { - CreateCallResponseBean createCallResponseBean = callService.createCallStep2(request, callId, createCallRequest); + public ResponseEntity> createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest) { + CallResponse createCallResponseBean = callService.createCallStep2(request, callId, createCallRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); } @Override @Transactional(rollbackFor=Exception.class) - public ResponseEntity> updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest) { - CreateCallResponseBean createCallResponseBean = callService.updateCallStep1(request, callId, updateCallRequest); + public ResponseEntity> updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest) { + CallResponse createCallResponseBean = callService.updateCallStep1(request, callId, updateCallRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_UPDATE_SUCCESSFULLY_MSG))); } @Override @Transactional(readOnly = true) - public ResponseEntity> getCallById(Long callId) { - CreateCallResponseBean createCallResponseBean = callService.getCallById(callId); + public ResponseEntity> getCallById(Long callId) { + CallResponse createCallResponseBean = callService.getCallById(callId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); } @@ -71,4 +71,11 @@ public class CallApiController implements CallApi { .body(new Response<>(calls, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); } + @Override + public ResponseEntity> validateCall(HttpServletRequest request, Long callId) { + CallResponse call = callService.validateCall(callId); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(call, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java index 7ee581e2..6c6286ae 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java @@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("${openapi.gepafin.base-path:/v1/evaluation}") +@RequestMapping("${openapi.gepafin.base-path:/v1/evaluationCriteria}") public class EvaluationCriteriaApiController implements EvaluationCriteriaApi { @Autowired diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java index 79fae0de..eb29c622 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("${openapi.gepafin.base-path:/v1/lookupdata}") +@RequestMapping("${openapi.gepafin.base-path:/v1/lookUpData}") public class LookUpDataApiController implements LookUpDataApi { @Autowired diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index b09ba35e..17154713 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -49,6 +49,8 @@ call.update.successfully=Call updated successfully. call.fetch.success=Call details fetched successfully. call.not.found=Call not found. score.not.null=Score cannot be null or cannot be zero. +field.not.null={0} cannot be null. +field.not.empty={0} cannot be empty. # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index eeb33a23..43fd781d 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -48,6 +48,8 @@ call.update.successfully=Chiamata aggiornata con successo. call.fetch.success=Dettagli della chiamata recuperati con successo. call.not.found=Chiamata non trovata. score.not.null=Il punteggio non pu� essere nullo o zero. +field.not.null={0} non può essere nullo. +field.not.empty=la {0} non può essere vuota. # Login-related messages login.successfully=Accesso effettuato con successo. From 1b9359971acac1e21d4df8a5489a804948727eeb Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 28 Aug 2024 12:46:41 +0530 Subject: [PATCH 042/145] updated code --- .../tendermanagement/dao/DocumentDao.java | 175 +++++++++--------- .../web/rest/api/LookUpDataApi.java | 10 +- 2 files changed, 96 insertions(+), 89 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 9c7804ba..3a0b1b9b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -29,97 +29,104 @@ import java.util.List; @Component public class DocumentDao { - @Autowired - private AmazonS3Service amazonS3Service; + @Autowired + private AmazonS3Service amazonS3Service; - @Autowired - private DocumentRepository documentRepository; + @Autowired + private DocumentRepository documentRepository; - @Autowired - private CallDao callDao; + @Autowired + private CallDao callDao; - @Autowired - private CallRepository callRepository; + @Autowired + private CallRepository callRepository; - public List uploadFiles(List files,Long callId, DocumentTypeEnum fileType) { - List documentEntities = new ArrayList<>(); - CallEntity callEntity=callRepository.findById(callId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); - for (MultipartFile file : files) { - try { - uploadFileOnAmazonS3 result = uploadFileOnAmazonS3(file); - if(result!=null) { - DocumentEntity documentEntity = new DocumentEntity(); - documentEntity.setFileName(result.fileName()); - documentEntity.setCall(callEntity); - documentEntity.setType(fileType.getValue()); - documentEntity.setFilePath(result.filepath()); - documentEntity.setIsDeleted(false); - documentEntities.add(documentEntity); - } - } catch (IOException e) {} - } - documentRepository.saveAll(documentEntities); - return documentEntities.stream() - .map(callDao::convertToDocumentResponseBean) - .collect(Collectors.toList()); - } + public List uploadFiles(List files, Long callId, DocumentTypeEnum fileType) { + List documentEntities = new ArrayList<>(); + CallEntity callEntity = callRepository.findById(callId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + for (MultipartFile file : files) { + try { + uploadFileOnAmazonS3 result = uploadFileOnAmazonS3(file); + if (result != null) { + DocumentEntity documentEntity = new DocumentEntity(); + documentEntity.setFileName(result.fileName()); + documentEntity.setCall(callEntity); + documentEntity.setType(fileType.getValue()); + documentEntity.setFilePath(result.filepath()); + documentEntity.setIsDeleted(false); + documentEntities.add(documentEntity); + } + } catch (IOException e) { + } + } + documentRepository.saveAll(documentEntities); + return documentEntities.stream().map(callDao::convertToDocumentResponseBean).collect(Collectors.toList()); + } - private uploadFileOnAmazonS3 uploadFileOnAmazonS3(MultipartFile file) throws IOException { - String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - String fileName = StringUtils.cleanPath(file.getOriginalFilename()); - String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); - fileName = (firstNameContain + "." + extension); - String filepath = amazonS3Service.upload(fileName, file); - uploadFileOnAmazonS3 result = new uploadFileOnAmazonS3(fileName, filepath); - return result; - } + private uploadFileOnAmazonS3 uploadFileOnAmazonS3(MultipartFile file) throws IOException { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + String fileName = StringUtils.cleanPath(file.getOriginalFilename()); + String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); + fileName = (firstNameContain + "." + extension); + String filepath = amazonS3Service.upload(fileName, file); + uploadFileOnAmazonS3 result = new uploadFileOnAmazonS3(fileName, filepath); + return result; + } - private record uploadFileOnAmazonS3(String fileName, String filepath) { - } + private record uploadFileOnAmazonS3(String fileName, String filepath) { + } - public void deleteFile(Long documentId){ - DocumentEntity documentEntity = getDocumentEntity(documentId); - String fileName= Utils.extractFileName(documentEntity.getFilePath()); - deleteFileOnAmazonS3(fileName); - documentRepository.delete(documentEntity); - } + public void deleteFile(Long documentId) { + DocumentEntity documentEntity = getDocumentEntity(documentId); +// String fileName= Utils.extractFileName(documentEntity.getFilePath()); +// deleteFileOnAmazonS3(fileName); + documentEntity.setIsDeleted(true); + documentRepository.save(documentEntity); + } - private DocumentEntity deleteFileOnAmazonS3(String fileName) { - try { - amazonS3Service.delete(fileName); - }catch (Exception e){} - return null; - } + private DocumentEntity deleteFileOnAmazonS3(String fileName) { + try { + amazonS3Service.delete(fileName); + } catch (Exception e) { + } + return null; + } - private DocumentEntity getDocumentEntity(Long documentId) { - Optional documentEntity= documentRepository.findById(documentId); - if(documentEntity.isEmpty()){ - throw new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - return documentEntity.orElse(null); - } + private DocumentEntity getDocumentEntity(Long documentId) { + Optional documentEntity = documentRepository.findById(documentId); + if (documentEntity.isEmpty()) { + throw new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); + } + return documentEntity.orElse(null); + } - public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum){ - DocumentEntity documentEntity = getDocumentEntity(documentId); - String fileName= Utils.extractFileName(documentEntity.getFilePath()); - deleteFileOnAmazonS3(fileName); - uploadFileOnAmazonS3 result= null; - try { - result = uploadFileOnAmazonS3(file); - } catch (IOException e) {} - if(result!=null){ - documentEntity.setFilePath(result.filepath); - documentEntity.setFileName(result.fileName); - documentEntity.setType(documentTypeEnum.getValue()); - documentRepository.save(documentEntity); - } - return callDao.convertToDocumentResponseBean(documentEntity); - } - public DocumentResponseBean getDocument(Long documentId) { - Optional documentEntity= documentRepository.findById(documentId); - if(documentEntity.isEmpty()){ - new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - return callDao.convertToDocumentResponseBean(documentEntity.orElse(null)); - } - } + public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { + DocumentEntity documentEntity = getDocumentEntity(documentId); + String fileName = Utils.extractFileName(documentEntity.getFilePath()); + deleteFileOnAmazonS3(fileName); + uploadFileOnAmazonS3 result = null; + try { + result = uploadFileOnAmazonS3(file); + } catch (IOException e) { + } + if (result != null) { + documentEntity.setFilePath(result.filepath); + documentEntity.setFileName(result.fileName); + documentEntity.setType(documentTypeEnum.getValue()); + documentRepository.save(documentEntity); + } + return callDao.convertToDocumentResponseBean(documentEntity); + } + + public DocumentResponseBean getDocument(Long documentId) { + Optional documentEntity = documentRepository.findById(documentId); + if (documentEntity.isEmpty()) { + new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); + } + return callDao.convertToDocumentResponseBean(documentEntity.orElse(null)); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java index b0670e4b..5497d9a4 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java @@ -19,7 +19,7 @@ import java.util.List; public interface LookUpDataApi { - @Operation(summary = "API to create LookUp Data", + @Operation(summary = "Api to create LookUp Data", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -31,7 +31,7 @@ public interface LookUpDataApi { @PostMapping(value = "", consumes = "application/json", produces = "application/json") ResponseEntity> createLookUpData(HttpServletRequest request, @Valid @RequestBody LookUpDataRequest lookUpDataReq); - @Operation(summary = "API to get LookUp Data by id", + @Operation(summary = "Api to get LookUp Data by id", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -43,7 +43,7 @@ public interface LookUpDataApi { @GetMapping(value = "/{id}", produces = "application/json") ResponseEntity> getLookUpDataById(HttpServletRequest request, @PathVariable Long id); - @Operation(summary = "API to update LookUp Data", + @Operation(summary = "Api to update LookUp Data", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -55,7 +55,7 @@ public interface LookUpDataApi { @PutMapping(value = "/{id}", consumes = "application/json", produces = "application/json") ResponseEntity> updateLookUpData(HttpServletRequest request, @PathVariable Long id, @Valid @RequestBody LookUpDataRequest lookUpDataReq); - @Operation(summary = "API to delete LookUp Data", + @Operation(summary = "Api to delete LookUp Data", responses = { @ApiResponse(responseCode = "204", description = "No Content"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -67,7 +67,7 @@ public interface LookUpDataApi { @DeleteMapping(value = "/{id}") ResponseEntity> deleteLookUpData(HttpServletRequest request, @PathVariable Long id); - @Operation(summary = "API to get LookUp Data by type", + @Operation(summary = "Api to get LookUp Data by type", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { From 5a481e891df3d07d8f117c14ba076b3e42c75452 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 28 Aug 2024 12:47:59 +0530 Subject: [PATCH 043/145] Updated code --- .../gepafin/tendermanagement/dao/EvaluationCriteriaDao.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java index 40fad056..ab5c25b2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -75,6 +75,9 @@ public class EvaluationCriteriaDao { response.setScore(entity.getScore()); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); + response.setLookUpDataId(entity.getLookupData().getId()); + response.setTitle(entity.getLookupData().getTitle()); + response.setValue(entity.getLookupData().getValue()); return response; } } From 4be413124103ca3ab9a93fc9673e1a855a55519c Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 28 Aug 2024 12:52:30 +0530 Subject: [PATCH 044/145] updated code --- .../java/net/gepafin/tendermanagement/enums/CallStatusEnum.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java index b1befe86..c31e407f 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java @@ -6,7 +6,7 @@ public enum CallStatusEnum { DRAFT("DRAFT"), PUBLISH("PUBLISH"), - EXPIRE("EXPIRE"), + EXPIRE("EXPIRED"), READY_TO_PUBLISH("READY_TO_PUBLISH"); private String value; From d1bcc36c41d6a3e08ad8b3e32b179216bddf9b0a Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 28 Aug 2024 15:21:54 +0530 Subject: [PATCH 045/145] Implemented crud operation for form,form-field and form-template --- .../constants/GepafinConstant.java | 20 ++++ .../gepafin/tendermanagement/dao/CallDao.java | 7 ++ .../gepafin/tendermanagement/dao/FormDao.java | 107 ++++++++++++++++++ .../tendermanagement/dao/FormFieldDao.java | 87 ++++++++++++++ .../tendermanagement/dao/FormTemplateDao.java | 80 +++++++++++++ .../tendermanagement/entities/FormEntity.java | 25 ++++ .../entities/FormFieldEntity.java | 21 ++++ .../entities/FormTemplateEntity.java | 18 +++ .../model/request/FormFieldRequest.java | 13 +++ .../model/request/FormRequest.java | 14 +++ .../model/request/FormTemplateRequest.java | 11 ++ .../model/response/FormFieldResponseBean.java | 14 +++ .../model/response/FormResponseBean.java | 16 +++ .../response/FormTemplateResponseBean.java | 12 ++ .../repositories/CallRepository.java | 3 + .../repositories/FormFieldRepository.java | 9 ++ .../repositories/FormRepository.java | 13 +++ .../repositories/FormTemplateRepository.java | 9 ++ .../tendermanagement/service/CallService.java | 2 + .../service/FormFieldService.java | 20 ++++ .../tendermanagement/service/FormService.java | 23 ++++ .../service/FormTemplateService.java | 20 ++++ .../service/impl/CallServiceImpl.java | 6 + .../service/impl/FormFieldServiceImpl.java | 43 +++++++ .../service/impl/FormServiceImpl.java | 50 ++++++++ .../service/impl/FormTemplateServiceImpl.java | 42 +++++++ .../tendermanagement/util/Validator.java | 20 ++++ .../web/rest/api/FormApi.java | 96 ++++++++++++++++ .../web/rest/api/FormFieldApi.java | 78 +++++++++++++ .../web/rest/api/FormTemplateApi.java | 78 +++++++++++++ .../web/rest/api/impl/FormApiController.java | 62 ++++++++++ .../rest/api/impl/FormFieldApiController.java | 52 +++++++++ .../api/impl/FormTemplateApiController.java | 52 +++++++++ .../db/changelog/db.changelog-1.0.0.xml | 61 ++++++++++ src/main/resources/message_en.properties | 25 +++- src/main/resources/message_it.properties | 27 +++++ 36 files changed, 1235 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/FormDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FormTemplateRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/FormTemplateResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/FormFieldRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/FormTemplateRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/FormService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/util/Validator.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/FormTemplateApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormFieldApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormTemplateApiController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index ab9f75cc..4d9c9288 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -43,6 +43,26 @@ public class GepafinConstant { public static final String EMAIL_ALREADY_EXISTS = "email.already.exists"; public static final String DOCUMENT_ID_NOT_FOUND="document.id.not.found"; public static final String INVALID_DATE_MSG = "call.invalid.date"; + public static final String FORM_NOT_FOUND = "form.not.found"; + public static final String FORM_CREATED_SUCCESSFULLY = "form.created.successfully"; + public static final String FORM_UPDATED_SUCCESSFULLY = "form.updated.suucessfully"; + public static final String FORM_DELETED_SUCCESSFULLY = "form.deleted.successfully"; + public static final String FORM_FETCHED_SUCCESSFULLY = "form.fetched.successfully"; + public static final String REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM = "required.parameter.not.found.for.form"; + public static final String FORM_FIELD_NOT_FOUND = "form.field.not.found"; + public static final String FORM_FIELD_CREATED_SUCCESSFULLY = "form.field.created.successfully"; + public static final String FORM_FIELD_UPDATED_SUCCESSFULLY = "form.field.updated.suucessfully"; + public static final String FORM_FIELD_DELETED_SUCCESSFULLY = "form.field.deleted.successfully"; + public static final String FORM_FIELD_FETCHED_SUCCESSFULLY = "form.field.fetched.successfully"; + public static final String REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM_FIELD = "required.parameter.not.found.for.form.field"; + public static final String FORM_TEMPLATE_NOT_FOUND = "form.template.not.found"; + public static final String FORM_TEMPLATE_CREATED_SUCCESSFULLY = "form.template.created.successfully"; + public static final String FORM_TEMPLATE_UPDATED_SUCCESSFULLY = "form.template.updated.suucessfully"; + public static final String FORM_TEMPLATE_DELETED_SUCCESSFULLY = "form.template.deleted.successfully"; + public static final String FORM_TEMPLATE_FETCHED_SUCCESSFULLY = "form.template.fetched.successfully"; + public static final String REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM_TEMPLATE = "required.parameter.not.found.for.form.template"; + public static final String CALL_NOT_FOUND="call.not.found"; + public static final String FORM_NOT_FOUND_FOR_CALL_ID="form.not.found.for.call.id"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 0b99ceb6..d877b1fa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -366,6 +366,13 @@ public class CallDao { return createCallResponseBean; } + public CallEntity getCallEntityById(Long id){ + CallEntity callEntity=callRepository.findByIdAndStatusNotIn(id,List.of(CallTypeEnum.PUBLISH.getValue())); + if(callEntity==null){ + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); + } + return callEntity; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java new file mode 100644 index 00000000..8bc9cd3e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -0,0 +1,107 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.FormEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity; +import net.gepafin.tendermanagement.model.request.FormRequest; +import net.gepafin.tendermanagement.model.response.FormResponseBean; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.FormRepository; +import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.service.FormService; +import net.gepafin.tendermanagement.util.ObjectUtils; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class FormDao { + + @Autowired + private FormRepository formRepository; + + @Autowired + private CallService callService; + + @Autowired + private FormService formService; + + public FormEntity saveFormEntity(FormEntity formEntity){ + formEntity=formRepository.save(formEntity); + return formEntity; + } + + public FormEntity convertFormRequestToFormEntity(Long callId,FormRequest formRequest){ + FormEntity formEntity=new FormEntity(); + CallEntity callEntity=callService.getCallEntityById(callId); + formEntity.setCall(callEntity); + formEntity.setLabel(formRequest.getLabel()); + formEntity.setContent(formRequest.getContent()); + formEntity.setOrderNo(formRequest.getOrderNo()); + formEntity=saveFormEntity(formEntity); + return formEntity; + } + public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity){ + FormResponseBean formResponseBean=new FormResponseBean(); + formResponseBean.setId(formEntity.getId()); + formResponseBean.setContent(formEntity.getContent()); + formResponseBean.setLabel(formEntity.getLabel()); + formResponseBean.setCallId(formEntity.getCall().getId()); + formResponseBean.setOrderNo(formEntity.getOrderNo()); + formResponseBean.setCreatedDate(formEntity.getCreatedDate()); + formResponseBean.setUpdatedDate(formEntity.getUpdatedDate()); + return formResponseBean; + } + public FormResponseBean createForm(Long callId,FormRequest formRequest){ + validateForm(formRequest); + FormEntity formEntity=convertFormRequestToFormEntity(callId,formRequest); + return convertFormEntityToFormResponseBean(formEntity); + } + public void validateForm(FormRequest formRequest){ + if(formRequest.getContent()==null || formRequest.getLabel()==null || (formRequest.getOrderNo() == null || formRequest.getOrderNo() <= 0)){ + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM)); + } + } + public FormResponseBean updateForm(Long formId, FormRequest formRequest){ + FormEntity formEntity = formService.getFormEntityById(formId); + ObjectUtils.setIfUpdated(formEntity::getLabel,formEntity::setLabel,formRequest.getLabel()); + ObjectUtils.setIfUpdated(formEntity::getContent,formEntity::setContent,formRequest.getContent()); + if(formRequest.getOrderNo()!=null && formRequest.getOrderNo() > 0) { + ObjectUtils.setIfUpdated(formEntity::getOrderNo, formEntity::setOrderNo, formRequest.getOrderNo()); + } + formEntity=saveFormEntity(formEntity); + return convertFormEntityToFormResponseBean(formEntity); + } + + public FormEntity getFormEntity(Long formId) { + FormEntity formEntity = formRepository.findById(formId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FORM_NOT_FOUND))); + return formEntity; + } + + public FormResponseBean getFormEntityById(Long formId) { + FormEntity formEntity = formService.getFormEntityById(formId); + return convertFormEntityToFormResponseBean(formEntity); + } + public void deleteFormById(Long formId){ + FormEntity formEntity=formService.getFormEntityById(formId); + formRepository.delete(formEntity); + } + public List getFormsByCallId(Long callId){ + List formEntities=formRepository.findByCallId(callId); + if(formEntities.isEmpty()){ + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FORM_NOT_FOUND_FOR_CALL_ID)); + } + List formResponseBeanList = formEntities.stream() + .map(req -> convertFormEntityToFormResponseBean(req)) + .collect(Collectors.toList()); + return formResponseBeanList; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java new file mode 100644 index 00000000..dcda7092 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java @@ -0,0 +1,87 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.FormFieldEntity; +import net.gepafin.tendermanagement.model.request.FormFieldRequest; +import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; +import net.gepafin.tendermanagement.repositories.FormFieldRepository; +import net.gepafin.tendermanagement.service.FormFieldService; +import net.gepafin.tendermanagement.util.ObjectUtils; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class FormFieldDao { + + @Autowired + private FormFieldRepository formFieldRepository; + + @Autowired + private FormFieldService formFieldService; + + + public FormFieldEntity convertFormFieldRequestToFormFieldResponseBean(FormFieldRequest formFieldRequest) { + FormFieldEntity formFieldEntity = new FormFieldEntity(); + formFieldEntity.setLabel(formFieldRequest.getLabel()); + formFieldEntity.setDefinition(formFieldRequest.getDefinition()); + formFieldEntity.setIsActive(true); + if(formFieldRequest.getIsActive()!=null) { + formFieldEntity.setIsActive(formFieldRequest.getIsActive()); + } + formFieldEntity = saveFormFieldEntity(formFieldEntity); + return formFieldEntity; + } + + public FormFieldResponseBean convertFormFieldEntityToFormFieldResponseBean(FormFieldEntity formFieldEntity) { + FormFieldResponseBean formFieldResponseBean = new FormFieldResponseBean(); + formFieldResponseBean.setId(formFieldEntity.getId()); + formFieldResponseBean.setDefinition(formFieldEntity.getDefinition()); + formFieldResponseBean.setLabel(formFieldEntity.getLabel()); + formFieldResponseBean.setIsActive(formFieldEntity.getIsActive()); + formFieldResponseBean.setCreatedDate(formFieldEntity.getCreatedDate()); + formFieldResponseBean.setUpdatedDate(formFieldEntity.getUpdatedDate()); + return formFieldResponseBean; + } + + public FormFieldEntity saveFormFieldEntity(FormFieldEntity formFieldEntity) { + formFieldEntity = formFieldRepository.save(formFieldEntity); + return formFieldEntity; + } + + public void validateFormField(FormFieldRequest formFieldRequest) { + if (formFieldRequest.getDefinition() == null || formFieldRequest.getLabel() == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM_FIELD)); + } + } + public FormFieldResponseBean createFormField(FormFieldRequest formFieldRequest){ + validateFormField(formFieldRequest); + FormFieldEntity formFieldEntity=convertFormFieldRequestToFormFieldResponseBean(formFieldRequest); + return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); + } + public FormFieldResponseBean updateFormField(Long formFieldId,FormFieldRequest formFieldRequest){ + FormFieldEntity formFieldEntity = formFieldService.getFormFieldEntityById(formFieldId); + ObjectUtils.setIfUpdated(formFieldEntity::getLabel,formFieldEntity::setLabel,formFieldRequest.getLabel()); + ObjectUtils.setIfUpdated(formFieldEntity::getDefinition,formFieldEntity::setDefinition,formFieldRequest.getDefinition()); + ObjectUtils.setIfUpdated(formFieldEntity::getIsActive,formFieldEntity::setIsActive,formFieldRequest.getIsActive()); + formFieldEntity=saveFormFieldEntity(formFieldEntity); + return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); + } + public FormFieldEntity getFormFieldEntity(Long formFieldId) { + FormFieldEntity formFieldEntity=formFieldRepository.findById(formFieldId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FORM_FIELD_NOT_FOUND))); + return formFieldEntity; + } + + public FormFieldResponseBean getFormFieldEntityById(Long formFieldId) { + FormFieldEntity formEntity = formFieldService.getFormFieldEntityById(formFieldId); + return convertFormFieldEntityToFormFieldResponseBean(formEntity); + } + public void deleteFormById(Long formFieldId){ + FormFieldEntity formEntity=formFieldService.getFormFieldEntityById(formFieldId); + formFieldRepository.delete(formEntity); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java new file mode 100644 index 00000000..88efc0c1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java @@ -0,0 +1,80 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.FormTemplateEntity; +import net.gepafin.tendermanagement.model.request.FormTemplateRequest; +import net.gepafin.tendermanagement.model.response.FormTemplateResponseBean; +import net.gepafin.tendermanagement.repositories.FormTemplateRepository; +import net.gepafin.tendermanagement.service.FormTemplateService; +import net.gepafin.tendermanagement.util.ObjectUtils; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class FormTemplateDao { + + @Autowired + private FormTemplateRepository formTemplateRepository; + + @Autowired + private FormTemplateService formTemplateService; + + + public FormTemplateEntity convertFormTemplateRequestToFormTemplateRequest(FormTemplateRequest formTemplateRequest){ + FormTemplateEntity formTemplateEntity=new FormTemplateEntity(); + formTemplateEntity.setContent(formTemplateRequest.getContent()); + formTemplateEntity.setLabel(formTemplateRequest.getLabel()); + formTemplateEntity=saveFormTemplateEntity(formTemplateEntity); + return formTemplateEntity; + } + public FormTemplateEntity saveFormTemplateEntity(FormTemplateEntity formTemplateEntity){ + formTemplateEntity=formTemplateRepository.save(formTemplateEntity); + return formTemplateEntity; + } + public FormTemplateResponseBean convertFormTemplateEntityToFormTemplateResponseBean(FormTemplateEntity formTemplateEntity){ + FormTemplateResponseBean formTemplateResponseBean=new FormTemplateResponseBean(); + formTemplateResponseBean.setId(formTemplateEntity.getId()); + formTemplateResponseBean.setContent(formTemplateEntity.getContent()); + formTemplateResponseBean.setLabel(formTemplateEntity.getLabel()); + formTemplateResponseBean.setCreatedDate(formTemplateEntity.getCreatedDate()); + formTemplateResponseBean.setUpdatedDate(formTemplateEntity.getUpdatedDate()); + return formTemplateResponseBean; + } + + public FormTemplateResponseBean createFormTemplate(FormTemplateRequest formTemplateRequest){ + validateFormTemplate(formTemplateRequest); + FormTemplateEntity formTemplateEntity=convertFormTemplateRequestToFormTemplateRequest(formTemplateRequest); + return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); + } + public void validateFormTemplate(FormTemplateRequest formTemplateRequest){ + if(formTemplateRequest.getContent()==null || formTemplateRequest.getLabel()==null ){ + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM_TEMPLATE)); + } + } + public FormTemplateResponseBean updateFormTemplate(Long formTemplateId,FormTemplateRequest formTemplateRequest){ + FormTemplateEntity formTemplateEntity = formTemplateService.getFormEntityById(formTemplateId); + ObjectUtils.setIfUpdated(formTemplateEntity::getLabel,formTemplateEntity::setLabel,formTemplateRequest.getLabel()); + ObjectUtils.setIfUpdated(formTemplateEntity::getContent,formTemplateEntity::setContent,formTemplateRequest.getContent()); + formTemplateEntity=saveFormTemplateEntity(formTemplateEntity); + return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); + } + + public FormTemplateEntity getFormTemplateEntity(Long formTemplateId) { + FormTemplateEntity formTemplateEntity = formTemplateRepository.findById(formTemplateId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FORM_TEMPLATE_NOT_FOUND))); + return formTemplateEntity; + } + + public FormTemplateResponseBean getFormTemplateEntityById(Long formTemplateId) { + FormTemplateEntity formTemplateEntity = formTemplateService.getFormEntityById(formTemplateId); + return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); + } + public void deleteFormTemplateById(Long formTemplateId){ + FormTemplateEntity formTemplateEntity=formTemplateService.getFormEntityById(formTemplateId); + formTemplateRepository.delete(formTemplateEntity); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java new file mode 100644 index 00000000..b65d78a7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java @@ -0,0 +1,25 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.Builder; + +@Entity +@Table(name = "FORM") +@Data +@Builder +public class FormEntity extends BaseEntity{ + + @Column(name = "LABEL", length = 255) + private String label; + + @ManyToOne + @JoinColumn(name = "CALL_ID", foreignKey = @ForeignKey(name = "fk_call_form")) + private CallEntity call; + + @Column(name = "CONTENT", length = 255) + private String content; + + @Column(name = "ORDER_NO") + private Integer orderNo; +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java new file mode 100644 index 00000000..42ed1e44 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.Builder; + +@Entity +@Table(name = "FORM_FIELD") +@Data +@Builder +public class FormFieldEntity extends BaseEntity{ + + @Column(name = "LABEL", length = 255) + private String label; + + @Column(name = "DEFINITION", length = 255) + private String definition; + + @Column(name = "IS_ACTIVE") + private Boolean isActive; +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java new file mode 100644 index 00000000..976bcfc6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.Builder; + +@Entity +@Table(name = "FORM_TEMPLATE") +@Data +@Builder +public class FormTemplateEntity extends BaseEntity{ + + @Column(name = "LABEL", length = 255) + private String label; + + @Column(name = "CONTENT", length = 255) + private String content; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java new file mode 100644 index 00000000..0dec37c2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FormFieldRequest { + + private String label; + + private String definition; + + private Boolean isActive; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java new file mode 100644 index 00000000..01b2c5d9 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FormRequest { + + private String label; + + private String content; + + private Integer orderNo; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FormTemplateRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/FormTemplateRequest.java new file mode 100644 index 00000000..e229cb3e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FormTemplateRequest.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FormTemplateRequest { + + private String label; + + private String content; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java new file mode 100644 index 00000000..63c8231c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class FormFieldResponseBean extends BaseBean { + + private String label; + + private String definition; + + private Boolean isActive; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java new file mode 100644 index 00000000..a14997bf --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class FormResponseBean extends BaseBean { + + private String label; + + private Long callId; + + private String content; + + private Integer orderNo; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormTemplateResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormTemplateResponseBean.java new file mode 100644 index 00000000..ab85bf08 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormTemplateResponseBean.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class FormTemplateResponseBean extends BaseBean { + + private String label; + + private String content; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 093e4086..dd2c8b40 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -3,8 +3,11 @@ import net.gepafin.tendermanagement.entities.CallEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface CallRepository extends JpaRepository { + public CallEntity findByIdAndStatusNotIn(Long id, List status); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FormFieldRepository.java new file mode 100644 index 00000000..358e4cf9 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FormFieldRepository.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.FormFieldEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface FormFieldRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java new file mode 100644 index 00000000..6250b21b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.FormEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface FormRepository extends JpaRepository { + + List findByCallId(Long callId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FormTemplateRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FormTemplateRepository.java new file mode 100644 index 00000000..f9ce4f4d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FormTemplateRepository.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.FormTemplateEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface FormTemplateRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index f8a07093..30022ebd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; @@ -11,4 +12,5 @@ public interface CallService { CreateCallResponseBean createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest); + public CallEntity getCallEntityById(Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java b/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java new file mode 100644 index 00000000..ddbeeb27 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.FormFieldEntity; +import net.gepafin.tendermanagement.model.request.FormFieldRequest; +import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; + +public interface FormFieldService { + + public FormFieldResponseBean createFormField(HttpServletRequest request, FormFieldRequest formFieldRequest); + + public FormFieldResponseBean updateFormField(HttpServletRequest request, Long formFieldId, FormFieldRequest formFieldRequest); + + public FormFieldResponseBean getFormFieldById(HttpServletRequest request, Long formFieldId); + + public void deleteFormField(HttpServletRequest request, Long formFieldId); + + public FormFieldEntity getFormFieldEntityById(Long id); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormService.java b/src/main/java/net/gepafin/tendermanagement/service/FormService.java new file mode 100644 index 00000000..743b4b36 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/FormService.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.FormEntity; +import net.gepafin.tendermanagement.model.request.FormRequest; +import net.gepafin.tendermanagement.model.response.FormResponseBean; + +import java.util.List; + +public interface FormService { + + public FormResponseBean createForm(HttpServletRequest request,Long callId,FormRequest formRequest); + + public FormResponseBean updateForm(HttpServletRequest request, Long formId, FormRequest formRequest); + + public FormResponseBean getFormById(HttpServletRequest request, Long formId); + + public void deleteForm(HttpServletRequest request, Long formId); + + public FormEntity getFormEntityById(Long id); + + public List getFormsByCallId(HttpServletRequest request,Long callId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java b/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java new file mode 100644 index 00000000..4ab4bca7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.FormTemplateEntity; +import net.gepafin.tendermanagement.model.request.FormTemplateRequest; +import net.gepafin.tendermanagement.model.response.FormTemplateResponseBean; + +public interface FormTemplateService { + + public FormTemplateResponseBean createTemplateForm(HttpServletRequest request, FormTemplateRequest formTemplateRequest); + + public FormTemplateResponseBean updateTemplateForm(HttpServletRequest request, Long formTemplateId, FormTemplateRequest formTemplateRequest); + + public FormTemplateResponseBean getFormTemplateById(HttpServletRequest request, Long formTemplateId); + + public void deleteFormTemplate(HttpServletRequest request, Long formTemplateId); + + public FormTemplateEntity getFormEntityById(Long id); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 53edaf6d..58ee7be2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; +import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; @@ -33,4 +34,9 @@ public class CallServiceImpl implements CallService { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); return callDao.createCallStep2(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); } + + @Override + public CallEntity getCallEntityById(Long id){ + return callDao.getCallEntityById(id); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java new file mode 100644 index 00000000..ae231ea4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java @@ -0,0 +1,43 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.FormFieldDao; +import net.gepafin.tendermanagement.entities.FormFieldEntity; +import net.gepafin.tendermanagement.model.request.FormFieldRequest; +import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; +import net.gepafin.tendermanagement.service.FormFieldService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class FormFieldServiceImpl implements FormFieldService { + + @Autowired + private FormFieldDao formFieldDao; + + @Override + public FormFieldResponseBean createFormField(HttpServletRequest request, FormFieldRequest formFieldRequest) { + return formFieldDao.createFormField(formFieldRequest); + } + + @Override + public FormFieldResponseBean updateFormField(HttpServletRequest request, Long formFieldId, FormFieldRequest formFieldRequest) { + return formFieldDao.updateFormField(formFieldId,formFieldRequest); + } + + @Override + public FormFieldResponseBean getFormFieldById(HttpServletRequest request, Long formFieldId) { + return formFieldDao.getFormFieldEntityById(formFieldId); + } + + @Override + public void deleteFormField(HttpServletRequest request, Long formFieldId) { + formFieldDao.deleteFormById(formFieldId); + return; + } + + @Override + public FormFieldEntity getFormFieldEntityById(Long id) { + return formFieldDao.getFormFieldEntity(id); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java new file mode 100644 index 00000000..378a4dce --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java @@ -0,0 +1,50 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.FormDao; +import net.gepafin.tendermanagement.entities.FormEntity; +import net.gepafin.tendermanagement.model.request.FormRequest; +import net.gepafin.tendermanagement.model.response.FormResponseBean; +import net.gepafin.tendermanagement.service.FormService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FormServiceImpl implements FormService { + + @Autowired + private FormDao formDao; + + @Override + public FormResponseBean createForm(HttpServletRequest request,Long callId, FormRequest formRequest) { + return formDao.createForm(callId,formRequest); + } + + @Override + public FormResponseBean updateForm(HttpServletRequest request, Long formId, FormRequest formRequest) { + return formDao.updateForm(formId,formRequest); + } + + @Override + public FormResponseBean getFormById(HttpServletRequest request, Long formId) { + return formDao.getFormEntityById(formId); + } + + @Override + public void deleteForm(HttpServletRequest request, Long formId) { + formDao.deleteFormById(formId); + return; + } + + @Override + public FormEntity getFormEntityById(Long id) { + return formDao.getFormEntity(id); + } + + @Override + public List getFormsByCallId(HttpServletRequest request, Long callId) { + return formDao.getFormsByCallId(callId); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java new file mode 100644 index 00000000..25ea75fb --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java @@ -0,0 +1,42 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.FormTemplateDao; +import net.gepafin.tendermanagement.entities.FormTemplateEntity; +import net.gepafin.tendermanagement.model.request.FormTemplateRequest; +import net.gepafin.tendermanagement.model.response.FormTemplateResponseBean; +import net.gepafin.tendermanagement.service.FormTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class FormTemplateServiceImpl implements FormTemplateService { + + @Autowired + private FormTemplateDao formTemplateDao; + + @Override + public FormTemplateResponseBean createTemplateForm(HttpServletRequest request, FormTemplateRequest formTemplateRequest) { + return formTemplateDao.createFormTemplate(formTemplateRequest); + } + + @Override + public FormTemplateResponseBean updateTemplateForm(HttpServletRequest request, Long formTemplateId, FormTemplateRequest formTemplateRequest) { + return formTemplateDao.updateFormTemplate(formTemplateId,formTemplateRequest); + } + + @Override + public FormTemplateResponseBean getFormTemplateById(HttpServletRequest request, Long formTemplateId) { + return formTemplateDao.getFormTemplateEntityById(formTemplateId); + } + + @Override + public void deleteFormTemplate(HttpServletRequest request, Long formTemplateId) { + formTemplateDao.deleteFormTemplateById(formTemplateId); + } + + @Override + public FormTemplateEntity getFormEntityById(Long id) { + return formTemplateDao.getFormTemplateEntity(id); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java new file mode 100644 index 00000000..70263878 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.util; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Component +public class Validator { + + @Autowired + private TokenProvider tokenProvider; + + public Map getUserInfoFromToken(HttpServletRequest request) { + return tokenProvider.getUserInfoAndUserIdFromToken(request); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java new file mode 100644 index 00000000..001de040 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java @@ -0,0 +1,96 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.FormRequest; +import net.gepafin.tendermanagement.model.response.FormResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +public interface FormApi { + + @Operation(summary = "Api to create form", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "/call/{callId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> createForm(HttpServletRequest request,@Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId, + @Parameter(description = "form request object", required = true) + @Valid @RequestBody FormRequest formRequest); + + + @Operation(summary = "Api to update form", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PutMapping(value = "/{formId}", + produces = { "application/json" }) + ResponseEntity> updateForm(HttpServletRequest request, + @Parameter(description = "The form ID", required = true) @PathVariable("formId") Long formId, + @Parameter(description = "form request object", required = true) @Valid @RequestBody FormRequest formRequest); + + @Operation(summary = "Api to get form by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/{formId}", + produces = { "application/json" }) + ResponseEntity> getFormById(HttpServletRequest request, + @Parameter(description = "The form ID", required = true) @PathVariable("formId") Long formId); + + + @Operation(summary = "Api to delete form", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @DeleteMapping(value = "/{formId}") + ResponseEntity> deleteForm(HttpServletRequest request, + @Parameter(description = "The form ID", required = true) @PathVariable("formId") Long formId); + + @Operation(summary = "Api to get forms by callId", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/call/{callId}", + produces = { "application/json" }) + ResponseEntity>> getFormsByCallId(HttpServletRequest request, + @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java new file mode 100644 index 00000000..cc76814e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java @@ -0,0 +1,78 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.FormFieldRequest; +import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +public interface FormFieldApi { + + @Operation(summary = "Api to create form field", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> createFormField(HttpServletRequest request, + @Parameter(description = "form field request object", required = true) + @Valid @RequestBody FormFieldRequest formFieldRequest); + + + @Operation(summary = "Api to update form field", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PutMapping(value = "/{formFieldId}", + produces = { "application/json" }) + ResponseEntity> updateFormField(HttpServletRequest request, + @Parameter(description = "The form field ID", required = true) @PathVariable("formFieldId") Long formFieldId, + @Parameter(description = "form field request object", required = true) @Valid @RequestBody FormFieldRequest formFieldRequest); + + @Operation(summary = "Api to get form field by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/{formFieldId}", + produces = { "application/json" }) + ResponseEntity> getFormFieldById(HttpServletRequest request, + @Parameter(description = "The form field ID", required = true) @PathVariable("formFieldId") Long formFieldId); + + + @Operation(summary = "Api to delete form field", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @DeleteMapping(value = "/{formFieldId}") + ResponseEntity> deleteForm(HttpServletRequest request, + @Parameter(description = "The form field ID", required = true) @PathVariable("formFieldId") Long formFieldId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormTemplateApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormTemplateApi.java new file mode 100644 index 00000000..add01265 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormTemplateApi.java @@ -0,0 +1,78 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.FormTemplateRequest; +import net.gepafin.tendermanagement.model.response.FormTemplateResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +public interface FormTemplateApi { + + @Operation(summary = "Api to create form template", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> createFormTemplate(HttpServletRequest request, + @Parameter(description = "form template request object", required = true) + @Valid @RequestBody FormTemplateRequest formTemplateRequest); + + + @Operation(summary = "Api to update form template", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PutMapping(value = "/{formTemplateId}", + produces = { "application/json" }) + ResponseEntity> updateFormTemplate(HttpServletRequest request, + @Parameter(description = "The form template ID", required = true) @PathVariable("formTemplateId") Long formTemplateId, + @Parameter(description = "form template request object", required = true) @Valid @RequestBody FormTemplateRequest formTemplateRequest); + + @Operation(summary = "Api to get form template by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/{formTemplateId}", + produces = { "application/json" }) + ResponseEntity> getFormTemplateById(HttpServletRequest request, + @Parameter(description = "The form template ID", required = true) @PathVariable("formTemplateId") Long formTemplateId); + + + @Operation(summary = "Api to delete form template", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @DeleteMapping(value = "/{formTemplateId}") + ResponseEntity> deleteFormTemplate(HttpServletRequest request, + @Parameter(description = "The form template ID", required = true) @PathVariable("formTemplateId") Long formTemplateId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormApiController.java new file mode 100644 index 00000000..72e8bd2b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormApiController.java @@ -0,0 +1,62 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.FormRequest; +import net.gepafin.tendermanagement.model.response.FormResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.FormService; +import net.gepafin.tendermanagement.web.rest.api.FormApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/form}") +public class FormApiController implements FormApi { + + @Autowired + private FormService formService; + + @Override + public ResponseEntity> createForm(HttpServletRequest request,Long callId, FormRequest formRequest) { + FormResponseBean formResponseBean = formService.createForm(request,callId, formRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(formResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> updateForm(HttpServletRequest request, Long formId, FormRequest formRequest) { + FormResponseBean formResponseBean = formService.updateForm(request, formId, formRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(formResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_UPDATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getFormById(HttpServletRequest request, Long formId) { + FormResponseBean formResponseBean=formService.getFormById(request,formId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(formResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_FETCHED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> deleteForm(HttpServletRequest request, Long formId) { + formService.deleteForm(request,formId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_DELETED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity>> getFormsByCallId(HttpServletRequest request, Long callId) { + List formResponseBean=formService.getFormsByCallId(request,callId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(formResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_FETCHED_SUCCESSFULLY))); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormFieldApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormFieldApiController.java new file mode 100644 index 00000000..9445ec14 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormFieldApiController.java @@ -0,0 +1,52 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.FormFieldRequest; +import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.FormFieldService; +import net.gepafin.tendermanagement.web.rest.api.FormFieldApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/formField}") +public class FormFieldApiController implements FormFieldApi { + + @Autowired + private FormFieldService formFieldService; + + @Override + public ResponseEntity> createFormField(HttpServletRequest request, FormFieldRequest formFieldRequest) { + FormFieldResponseBean formFieldResponseBean=formFieldService.createFormField(request,formFieldRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(formFieldResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_FIELD_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> updateFormField(HttpServletRequest request, Long formFieldId, FormFieldRequest formFieldRequest) { + FormFieldResponseBean formFieldResponseBean=formFieldService.updateFormField(request,formFieldId,formFieldRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(formFieldResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_FIELD_UPDATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getFormFieldById(HttpServletRequest request, Long formFieldId) { + FormFieldResponseBean formFieldResponseBean=formFieldService.getFormFieldById(request,formFieldId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(formFieldResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_FIELD_FETCHED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> deleteForm(HttpServletRequest request, Long formFieldId) { + formFieldService.deleteFormField(request,formFieldId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_FIELD_DELETED_SUCCESSFULLY))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormTemplateApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormTemplateApiController.java new file mode 100644 index 00000000..52a56f5e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormTemplateApiController.java @@ -0,0 +1,52 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.FormTemplateRequest; +import net.gepafin.tendermanagement.model.response.FormTemplateResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.FormTemplateService; +import net.gepafin.tendermanagement.web.rest.api.FormTemplateApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/formTemplate}") +public class FormTemplateApiController implements FormTemplateApi { + + @Autowired + private FormTemplateService formTemplateService; + + @Override + public ResponseEntity> createFormTemplate(HttpServletRequest request, FormTemplateRequest formTemplateRequest) { + FormTemplateResponseBean formTemplateResponseBean=formTemplateService.createTemplateForm(request,formTemplateRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(formTemplateResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_TEMPLATE_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> updateFormTemplate(HttpServletRequest request, Long formTemplateId, FormTemplateRequest formTemplateRequest) { + FormTemplateResponseBean formTemplateResponseBean=formTemplateService.updateTemplateForm(request,formTemplateId,formTemplateRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(formTemplateResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_TEMPLATE_UPDATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getFormTemplateById(HttpServletRequest request, Long formTemplateId) { + FormTemplateResponseBean formTemplateResponseBean=formTemplateService.getFormTemplateById(request, formTemplateId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(formTemplateResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_TEMPLATE_FETCHED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> deleteFormTemplate(HttpServletRequest request, Long formTemplateId) { + formTemplateService.deleteFormTemplate(request,formTemplateId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_TEMPLATE_DELETED_SUCCESSFULLY))); + } +} diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 5293ec62..c1999952 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -395,4 +395,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 15aa6498..ebacb43f 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -43,8 +43,9 @@ call.created.successfully=Call created successfully. file.deleted.successfully=File deleted successfully. document.not.found=Document not found. document.id.not.found=Document ID not found. -call.created.successfully=Call created successfully. call.invalid.date=Invalid start or end date. +call.not.found=Call not found. +call.id.not.null=Call id cannot be null. # Login-related messages login.successfully=Login successfully. @@ -57,7 +58,29 @@ invalid_signature=Invalid token. invalid_login=Invalid username or password. req_validation_er=Request Validation Error +#Form-related messages +form.not.found=Form not found. +form.created.successfully=Form created successfully. +form.updated.suucessfully=Form updated successfully. +form.deleted.successfully=Form deleted successfully. +form.fetched.successfully=Form fetched successfully. +required.parameter.not.found.for.form=Label, content, or orderNo cannot be null. +form.not.found.for.call.id=Form not found for corresponding call. +#Form-field-related messages +form.field.not.found=Form field not found. +form.field.created.successfully=Form field created successfully. +form.field.updated.suucessfully=Form field updated successfully. +form.field.deleted.successfully=Form field deleted successfully. +form.field.fetched.successfully=Form field fetched successfully. +required.parameter.not.found.for.form.field=Label or definition cannot be null. +#Form-template-related messages +form.template.not.found=Form template not found. +form.template.created.successfully=Form template created successfully. +form.template.updated.suucessfully=Form template updated successfully. +form.template.deleted.successfully=Form template deleted successfully. +form.template.fetched.successfully=Form template fetched successfully. +required.parameter.not.found.for.form.template=Label or content cannot be null. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ae93ff53..f53b6d0f 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -44,6 +44,8 @@ file.deleted.successfully=File eliminato con successo. document.not.found=Documento non trovato. document.id.not.found=ID documento non trovato. call.invalid.date=Data di inizio o fine non valida. +call.not.found=Chiamata non trovata. +call.id.not.null=L'ID della chiamata non può essere nullo. # Login-related messages login.successfully=Accesso effettuato con successo. @@ -55,3 +57,28 @@ common_message=qualcosa é andato storto. Per favore riprova invalid_signature=Gettone non valido. invalid_login=Nome utente o password errati req_validation_er=Errore di convalida + +#Form-related messages +form.not.found=Modulo non trovato. +form.created.successfully=Modulo creato correttamente. +form.updated.suucessfully=Modulo aggiornato correttamente. +form.deleted.successfully=Modulo eliminato correttamente. +form.fetched.successfully=Modulo recuperato correttamente. +required.parameter.not.found.for.form=Etichetta, contenuto o orderNo non possono essere nulli. +form.not.found.for.call.id=Modulo non trovato per la chiamata corrispondente. + +#Form-field-related messages +form.field.not.found=Campo modulo non trovato. +form.field.created.successfully=Campo del modulo creato correttamente. +form.field.updated.suucessfully=Campo del modulo aggiornato correttamente. +form.field.deleted.successfully=Campo del modulo eliminato correttamente. +form.field.fetched.successfully=Campo del modulo recuperato correttamente. +required.parameter.not.found.for.form.field=Etichetta o definizione non possono essere nulli. + +#Form-template-related messages +form.template.not.found=Modello di modulo non trovato. +form.template.created.successfully=Modello di modulo creato correttamente. +form.template.updated.suucessfully=Modello di modulo aggiornato correttamente. +form.template.deleted.successfully=Modello di modulo eliminato correttamente. +form.template.fetched.successfully=Modello di modulo recuperato correttamente. +required.parameter.not.found.for.form.template=Etichetta o contenuto non possono essere nulli. From 3f2834ed5d27d23db801fba90fa4cf2d599bc295 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 28 Aug 2024 16:09:20 +0530 Subject: [PATCH 046/145] update call status --- .../constants/GepafinConstant.java | 6 +- .../gepafin/tendermanagement/dao/CallDao.java | 84 ++++++++++++++----- .../tendermanagement/service/CallService.java | 5 ++ .../service/impl/CallServiceImpl.java | 9 ++ .../web/rest/api/CallApi.java | 30 +++++-- .../web/rest/api/impl/CallApiController.java | 10 +++ src/main/resources/message_en.properties | 6 +- src/main/resources/message_it.properties | 5 ++ 8 files changed, 124 insertions(+), 31 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 9f3d63ef..144f8f65 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -78,6 +78,10 @@ public class GepafinConstant { public static final String UPDATE_USER_STATUS_SUCCESS_MSG = "update.user.status.success"; public static final String FIELD_NOT_NULL = "field.not.null"; public static final String FIELD_NOT_EMPTY = "field.not.empty"; - + public static final String UPDATE_CALL_STATUS_SUCCESS_MSG = "update_call_status_success_msg"; + public static final String STATUS_SAME_ERROR = "status.same.error"; + public static final String INVALID_STATUS_CHANGE_FROM_DRAFT = "invalid.status.change.from.draft"; + public static final String STATUS_CANNOT_BE_CHANGED = "status.cannot.be.changed"; + public static final String INVALID_STATUS_TRANSITION = "invalid.status.transition"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 647696ab..65dae9ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.response.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -120,26 +121,26 @@ public class CallDao { if (criteriaReqList == null) { return null; } - List existingCriteria = evaluationCriteriaRepository.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue()); + List existingCriteria = evaluationCriteriaRepository.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue()); List incomingIds = criteriaReqList.stream().map(EvaluationCriteriaReq::getId) .filter(id -> id != null && id > 0).collect(Collectors.toList()); existingCriteria.stream().filter(criteria -> !incomingIds.contains(criteria.getId())).forEach(this::softDeleteEvaluationCriteria); - + List evaluationCriteriaEntities = criteriaReqList.stream() .map(req -> convertToEvaluationCriteriaEntity(req, callEntity, type)).collect(Collectors.toList()); evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); return evaluationCriteriaEntities; } - + private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) { evaluationCriteriaEntity.setIsDeleted(true); evaluationCriteriaRepository.save(evaluationCriteriaEntity); } private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, - CallEntity callEntity, LookUpDataTypeEnum type) { + CallEntity callEntity, LookUpDataTypeEnum type) { EvaluationCriteriaEntity criteriaEntity = null; LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(criteriaReq, type); if (criteriaReq.getId() == null && criteriaReq.getId().equals(0l)) { @@ -161,11 +162,11 @@ public class CallDao { public List convertToDocumentEntities(List documentReqList, CallEntity callEntity, - DocumentTypeEnum documentType) { + DocumentTypeEnum documentType) { if (documentReqList == null) { return null; } - + List existingDocuments = documentRepository .findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), documentType.getValue()); @@ -179,7 +180,7 @@ public class CallDao { documentRepository.saveAll(documentEntities); return documentEntities; } - + private void softDeleteDocument(DocumentEntity documentEntity) { documentEntity.setIsDeleted(true); documentRepository.save(documentEntity); @@ -203,10 +204,10 @@ public class CallDao { return faqEntities; } - public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { - FaqEntity faqEntity = new FaqEntity(); - validateFaqEntity(faqReq.getQuestion()); - UserEntity userEntity = userService.validateUser(userId); + public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { + FaqEntity faqEntity = new FaqEntity(); + validateFaqEntity(faqReq.getQuestion()); + UserEntity userEntity = userService.validateUser(userId); faqEntity.setUser(userEntity); faqEntity.setIsVisible(true); if (faqReq.getIsVisible() != null) { @@ -258,11 +259,11 @@ public class CallDao { } if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest - .getStartDate().toLocalDate().isAfter(createCallRequest.getEndDate().toLocalDate())) { + .getStartDate().toLocalDate().isAfter(createCallRequest.getEndDate().toLocalDate())) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); } - + } public CallResponse convertToCallResponseBean(CallEntity callEntity) { @@ -326,8 +327,8 @@ public class CallDao { } public CallResponse assembleCreateCallResponseBean(CallEntity callEntity, - List evaluationCriteriaEntities, List documentEntities, - List faqEntities, List images) { + List evaluationCriteriaEntities, List documentEntities, + List faqEntities, List images) { CallResponse callResponseBean = convertToCallResponseBean(callEntity); @@ -351,7 +352,7 @@ public class CallDao { } public List convertLookUpDataEntities(List lookUpData, CallEntity callEntity, - LookUpDataEntity.LookUpDataTypeEnum type) { + LookUpDataEntity.LookUpDataTypeEnum type) { List lookUpDataEntities = lookUpData.stream() .map(req -> convertLookUpDataRequestIntoLookUpDataEntity(req, type)).collect(Collectors.toList()); @@ -359,7 +360,7 @@ public class CallDao { } private List createCallTargetAudienceCheckList(CallEntity callEntity, - List lookUpDataEntities) { + List lookUpDataEntities) { List lookUpDataResponses = new ArrayList<>(); for (LookUpDataEntity lookUpDataEntity : lookUpDataEntities) { CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity = new CallTargetAudienceChecklistEntity(); @@ -375,7 +376,7 @@ public class CallDao { } private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, - LookUpDataEntity.LookUpDataTypeEnum type) { + LookUpDataEntity.LookUpDataTypeEnum type) { if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { LookUpDataEntity newEntity = new LookUpDataEntity(); newEntity.setValue(req.getValue()); @@ -405,6 +406,7 @@ public class CallDao { return callRepository.findById(callId).orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); } + public CallResponse getCallById(Long callId) { CallEntity callEntity = callRepository.findById(callId) .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, @@ -420,13 +422,13 @@ public class CallDao { setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); callRepository.save(callEntity); convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA); - + convertToDocumentEntities(createCallRequest.getDocs(), callEntity, DocumentTypeEnum.DOCUMENT); - + convertToDocumentEntities(createCallRequest.getImages(), callEntity, DocumentTypeEnum.IMAGES); updateLookUpData(callEntity, createCallRequest.getCheckList(), LookUpDataTypeEnum.CHECKLIST); - + // List faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); // List amiedTo = callTargetAudienceChecklistRepository // .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() @@ -486,7 +488,7 @@ public class CallDao { } private void updateFaq(CallEntity callEntity, List faqReqList, UserEntity userEntity) { - if(faqReqList==null) { + if (faqReqList == null) { return; } List existingFaqs = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); @@ -543,7 +545,7 @@ public class CallDao { } private void createOrUpdateCallTargetAudienceChecklist(LookUpDataReq lookUpDataReq, CallEntity callEntity, - LookUpDataTypeEnum type) { + LookUpDataTypeEnum type) { CallTargetAudienceChecklistEntity checklistEntity = null; LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(lookUpDataReq, type); if (lookUpDataReq.getId() != null && lookUpDataReq.getId() > 0) { @@ -591,6 +593,7 @@ public class CallDao { callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); return callDetailsResponseBean; } + private CallResponse getCallResponseBean(CallEntity callEntity) { List documentEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentTypeEnum.DOCUMENT.getValue()); @@ -613,6 +616,7 @@ public class CallDao { createCallResponseBean.setCheckList(checkList); return createCallResponseBean; } + public List getAllCalls() { return callRepository.findAll() .stream() @@ -628,4 +632,38 @@ public class CallDao { callResponseBean.setCurrentStep(GepafinConstant.VALIDATE_REQUEST); return callResponseBean; } + + public CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq) { + CallEntity callEntity = callRepository.findById(callId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus()); + validateStatusChange(currentStatus, statusReq); + callEntity.setStatus(statusReq.getValue()); + callEntity = callRepository.save(callEntity); + return convertToCallResponseBean(callEntity); + } + + private void validateStatusChange(CallStatusEnum currentStatus, CallStatusEnum newStatus) { + if (currentStatus == newStatus) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.STATUS_SAME_ERROR)); + } + + switch (currentStatus) { + case DRAFT: + if (newStatus == CallStatusEnum.READY_TO_PUBLISH || newStatus == CallStatusEnum.PUBLISH) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_STATUS_CHANGE_FROM_DRAFT)); + } + break; + case PUBLISH: + case EXPIRE: + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.STATUS_CANNOT_BE_CHANGED)); + default: + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_STATUS_TRANSITION)); + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 1008f062..9be1c8ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -3,11 +3,14 @@ package net.gepafin.tendermanagement.service; import java.util.List; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.UserResponseBean; public interface CallService { @@ -23,4 +26,6 @@ public interface CallService { CallResponse validateCall(Long callId); + CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 0dc37efd..d151b6c5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -3,11 +3,14 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; +import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -65,4 +68,10 @@ public class CallServiceImpl implements CallService { public CallResponse validateCall(Long callId) { return callDao.validateCall(callDao.validateCall(callId)); } + @Override + @Transactional(rollbackFor = Exception.class) + public CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq) { + return callDao.updateCallStatus(callId, statusReq); + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 1b4771a8..1c604fc7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -2,15 +2,15 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; +import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.response.UserResponseBean; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -120,5 +120,23 @@ public interface CallApi { @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") public ResponseEntity> validateCall(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId); - + @Operation(summary = "Api to update call status", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)})) + }) + @RequestMapping(value = "/{callId}/status", + produces = {"application/json"}, + method = RequestMethod.PUT) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + default ResponseEntity> updateCallStatus( + @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) CallStatusEnum status) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 7c96aa7e..38c42a3e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -2,11 +2,16 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import java.util.List; +import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.response.UserResponseBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; @@ -78,4 +83,9 @@ public class CallApiController implements CallApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(call, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); } + @Override + public ResponseEntity> updateCallStatus(@PathVariable Long callId, @RequestParam CallStatusEnum status) { + CallResponse updateCall = callService.updateCallStatus(callId, status); + return ResponseEntity.ok(new Response<>(updateCall, Status.SUCCESS, Translator.toLocale(GepafinConstant.UPDATE_CALL_STATUS_SUCCESS_MSG))); + } } \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 17154713..d95d85e3 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -43,7 +43,6 @@ call.created.successfully=Call created successfully. file.deleted.successfully=File deleted successfully. document.not.found=Document not found. document.id.not.found=Document ID not found. -call.created.successfully=Call created successfully. call.invalid.date=Invalid start or end date. call.update.successfully=Call updated successfully. call.fetch.success=Call details fetched successfully. @@ -51,6 +50,11 @@ call.not.found=Call not found. score.not.null=Score cannot be null or cannot be zero. field.not.null={0} cannot be null. field.not.empty={0} cannot be empty. +update_call_status_success_msg=The call status has been updated successfully. +status.same.error=Status is already set. +invalid.status.change.from.draft=Status cannot be changed to READY_TO_PUBLISH or PUBLISH from DRAFT. +status.cannot.be.changed=Status cannot be changed. +invalid.status.transition=Invalid status transition. # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 43fd781d..993d8693 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -50,6 +50,11 @@ call.not.found=Chiamata non trovata. score.not.null=Il punteggio non pu� essere nullo o zero. field.not.null={0} non può essere nullo. field.not.empty=la {0} non può essere vuota. +update_call_status_success_msg=Lo stato della chiamata è stato aggiornato con successo. +status.same.error=Lo stato è già impostato. +invalid.status.change.from.draft=Lo stato non può essere cambiato in READY_TO_PUBLISH o PUBLISH da DRAFT. +status.cannot.be.changed=Lo stato non può essere cambiato. +invalid.status.transition=Transizione di stato non valida. # Login-related messages login.successfully=Accesso effettuato con successo. From 5a14cb090b598b208b8ad692ab097ab720e267bf Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 28 Aug 2024 16:39:30 +0530 Subject: [PATCH 047/145] update lookupdata endpoint --- .../net/gepafin/tendermanagement/dao/LookUpDataDao.java | 7 ++++--- .../tendermanagement/service/LookUpDataService.java | 2 +- .../service/impl/LookUpDataServiceImpl.java | 4 ++-- .../tendermanagement/web/rest/api/LookUpDataApi.java | 2 +- .../web/rest/api/impl/LookUpDataApiController.java | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java index fe51facc..612b1d7b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java @@ -67,11 +67,12 @@ public class LookUpDataDao { return response; } - public List getLookUpDataByType(LookUpDataTypeEnum type) { - return lookUpDataRepository.findByType(type.getValue()) - .stream() + public List getLookUpDataByTypes(List types) { + return types.stream() + .flatMap(type -> lookUpDataRepository.findByType(type.getValue()).stream()) .map(this::convertLookUpDataEntityToResponseBean) .collect(Collectors.toList()); } + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java index c7fde0f6..2a0ff7dc 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java @@ -16,5 +16,5 @@ public interface LookUpDataService { void deleteLookUpData(Long id); - List getLookUpDataByType(LookUpDataTypeEnum type); + List getLookUpDataByType(List type); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java index bba01b91..a8f28d07 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java @@ -36,7 +36,7 @@ public class LookUpDataServiceImpl implements LookUpDataService { lookUpDataDao.deleteLookUpData(id); } @Override - public List getLookUpDataByType(LookUpDataTypeEnum type) { - return lookUpDataDao.getLookUpDataByType(type); + public List getLookUpDataByType( List type) { + return lookUpDataDao.getLookUpDataByTypes(type); } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java index 5497d9a4..5a2cd19f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java @@ -77,5 +77,5 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @GetMapping(value = "/type", produces = "application/json") - ResponseEntity>> getLookUpDataByType(HttpServletRequest request, @RequestParam LookUpDataTypeEnum type); + ResponseEntity>> getLookUpDataByType(HttpServletRequest request, @RequestParam List types); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java index f07f75e2..3f79198c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LookUpDataApiController.java @@ -63,7 +63,7 @@ public class LookUpDataApiController implements LookUpDataApi { .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOOKUP_DATA_DELETED_SUCCESSFULLY))); } @Override - public ResponseEntity>> getLookUpDataByType(HttpServletRequest request, LookUpDataTypeEnum type) { + public ResponseEntity>> getLookUpDataByType(HttpServletRequest request, List type) { List responseBean = lookUpDataService.getLookUpDataByType(type); if (responseBean != null) { return ResponseEntity.status(HttpStatus.OK) From 75db09eb1210c17cb5ad465550351642866a2d31 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 28 Aug 2024 17:44:20 +0530 Subject: [PATCH 048/145] remove null checks for call and put some other validation --- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/CallDao.java | 114 ++++++++++++------ .../gepafin/tendermanagement/dao/FaqDao.java | 11 +- .../tendermanagement/entities/CallEntity.java | 16 +-- .../enums/CallStatusEnum.java | 2 +- .../model/request/CreateCallRequestStep1.java | 17 +-- .../model/request/CreateCallRequestStep2.java | 3 - .../model/request/UpdateCallRequestStep1.java | 31 ++--- .../model/response/CallResponse.java | 4 +- .../impl/CallValidatorServiceImpl.java | 17 ++- .../web/rest/api/CallApi.java | 4 +- .../web/rest/api/impl/CallApiController.java | 2 - .../db/changelog/db.changelog-1.0.0.xml | 11 ++ src/main/resources/message_en.properties | 3 + src/main/resources/message_it.properties | 2 + 15 files changed, 134 insertions(+), 104 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 144f8f65..ce95453b 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -83,5 +83,6 @@ public class GepafinConstant { public static final String INVALID_STATUS_CHANGE_FROM_DRAFT = "invalid.status.change.from.draft"; public static final String STATUS_CANNOT_BE_CHANGED = "status.cannot.be.changed"; public static final String INVALID_STATUS_TRANSITION = "invalid.status.transition"; + public static final String PUBLISHED_CALL_NOT_UPDATE = "published.call.not.update"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 65dae9ef..cc5b00ed 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.dao; -import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; @@ -8,7 +7,6 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.response.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -78,8 +76,10 @@ public class CallDao { private UserService userService; public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { + UserEntity userEntity = userService.validateUser(userId); + createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId()); CallEntity callEntity = convertToCallEntity(createCallRequest); - convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); + convertToFaqEntities(createCallRequest.getFaq(), callEntity, userEntity); convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, LookUpDataTypeEnum.AIMED_TO); // createCallResponseBean = assembleCreateCallResponseBean(callEntity, Collections.emptyList(), @@ -94,7 +94,7 @@ public class CallDao { public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest) { CallEntity callEntity = new CallEntity(); - validateCallEntity(createCallRequest); +// validateCallEntity(createCallRequest); RegionEntity region = regionRepository.findById(createCallRequest.getRegionId()) .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND))); @@ -102,8 +102,13 @@ public class CallDao { callEntity.setName(createCallRequest.getName()); callEntity.setDescriptionShort(createCallRequest.getDescriptionShort()); callEntity.setDescriptionLong(createCallRequest.getDescriptionLong()); - callEntity.setStartDate(createCallRequest.getStartDate()); - callEntity.setEndDate(createCallRequest.getEndDate()); + List dates = createCallRequest.getDates(); + if(dates!=null) { + if(dates.size()>1) { + callEntity.setStartDate(dates.get(0)); + callEntity.setEndDate(dates.get(1)); + } + } callEntity.setStatus(CallStatusEnum.DRAFT.getValue()); callEntity.setAmountMax(createCallRequest.getAmountMax()); callEntity.setAmount(createCallRequest.getAmountMax()); @@ -194,20 +199,19 @@ public class CallDao { return documentEntity; } - public List convertToFaqEntities(List faqReqList, CallEntity callEntity, Long userId) { + public List convertToFaqEntities(List faqReqList, CallEntity callEntity, UserEntity userEntity) { if (faqReqList == null) { return null; } - List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userId)) + List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userEntity)) .collect(Collectors.toList()); faqRepository.saveAll(faqEntities); return faqEntities; } - public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { + public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity) { FaqEntity faqEntity = new FaqEntity(); validateFaqEntity(faqReq.getQuestion()); - UserEntity userEntity = userService.validateUser(userId); faqEntity.setUser(userEntity); faqEntity.setIsVisible(true); if (faqReq.getIsVisible() != null) { @@ -246,32 +250,38 @@ public class CallDao { } } - public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { - if (createCallRequest.getRegionId() == null) { - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); - } - - if (createCallRequest.getAmount().compareTo(BigDecimal.ZERO) <= 0 - || createCallRequest.getAmountMax().compareTo(BigDecimal.ZERO) <= 0) { - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); - } - if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) - || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest - .getStartDate().toLocalDate().isAfter(createCallRequest.getEndDate().toLocalDate())) { - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); - } - - } +// public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { +// if (createCallRequest.getRegionId() == null) { +// throw new CustomValidationException(Status.VALIDATION_ERROR, +// Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); +// } +// +// if (createCallRequest.getAmount().compareTo(BigDecimal.ZERO) <= 0 +// || createCallRequest.getAmountMax().compareTo(BigDecimal.ZERO) <= 0) { +// throw new CustomValidationException(Status.VALIDATION_ERROR, +// Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); +// } +// if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) +// || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest +// .getStartDate().toLocalDate().isAfter(createCallRequest.getEndDate().toLocalDate())) { +// throw new CustomValidationException(Status.VALIDATION_ERROR, +// Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); +// } +// +// } public CallResponse convertToCallResponseBean(CallEntity callEntity) { CallResponse createCallResponseBean = new CallResponse(); createCallResponseBean.setId(callEntity.getId()); createCallResponseBean.setName(callEntity.getName()); - createCallResponseBean.setStartDate(callEntity.getStartDate()); - createCallResponseBean.setEndDate(callEntity.getEndDate()); + List dates = new ArrayList<>(); + if(callEntity.getStartDate() != null) { + dates.add(callEntity.getStartDate()); + } + if(callEntity.getStartDate() != null) { + dates.add(callEntity.getEndDate()); + } + createCallResponseBean.setDates(dates); createCallResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); createCallResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); createCallResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); @@ -353,6 +363,9 @@ public class CallDao { public List convertLookUpDataEntities(List lookUpData, CallEntity callEntity, LookUpDataEntity.LookUpDataTypeEnum type) { + if(lookUpData == null) { + return null; + } List lookUpDataEntities = lookUpData.stream() .map(req -> convertLookUpDataRequestIntoLookUpDataEntity(req, type)).collect(Collectors.toList()); @@ -418,7 +431,7 @@ public class CallDao { CallEntity callEntity = callRepository.findById(callId) .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); - + validateUpdate(callEntity); setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); callRepository.save(callEntity); convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA); @@ -442,11 +455,24 @@ public class CallDao { return createCallResponseBean; } + private void validateUpdate(CallEntity callEntity) { + if(callEntity.getStatus().equals(CallStatusEnum.PUBLISH.getValue())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.PUBLISHED_CALL_NOT_UPDATE)); + } + } + public void isValidDateRange(UpdateCallRequestStep1 updateCallRequest, CallEntity callEntity) { - LocalDate startDate = updateCallRequest.getStartDate() != null ? updateCallRequest.getStartDate().toLocalDate() - : null; - LocalDate endDate = updateCallRequest.getEndDate() != null ? updateCallRequest.getEndDate().toLocalDate() - : null; + List dates = updateCallRequest.getDates(); + + LocalDate startDate = (dates != null && dates.size() > 0 && dates.get(0) != null) + ? dates.get(0).toLocalDate() + : null; + + LocalDate endDate = (dates != null && dates.size() > 1 && dates.get(1) != null) + ? dates.get(1).toLocalDate() + : null; + Boolean isValid = true; if (startDate != null && endDate != null && startDate.isAfter(endDate)) { isValid = false; @@ -473,8 +499,18 @@ public class CallDao { updateCallRequest.getDescriptionShort()); setIfUpdated(callEntity::getDescriptionLong, callEntity::setDescriptionLong, updateCallRequest.getDescriptionLong()); - setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, updateCallRequest.getStartDate()); - setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, updateCallRequest.getEndDate()); + List dates=updateCallRequest.getDates(); + + if (dates != null && dates.size()>1) { + if (dates.size() > 0) { + setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, dates.get(0)); + } + if (dates.size() > 1) { + setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1)); + } + } +// setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, updateCallRequest.getStartDate()); +// setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, updateCallRequest.getEndDate()); setIfUpdated(callEntity::getAmount, callEntity::setAmount, updateCallRequest.getAmount()); setIfUpdated(callEntity::getAmountMax, callEntity::setAmountMax, updateCallRequest.getAmountMax()); setIfUpdated(callEntity::getDocumentationRequested, callEntity::setDocumentationRequested, @@ -657,7 +693,7 @@ public class CallDao { } break; case PUBLISH: - case EXPIRE: + case EXPIRED: throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.STATUS_CANNOT_BE_CHANGED)); default: diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java index c7ad05a2..8d38dfa4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java @@ -9,7 +9,7 @@ import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.response.FaqResponseBean; import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.FaqRepository; -import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -25,7 +25,7 @@ public class FaqDao { private FaqRepository faqRepository; @Autowired - private UserRepository userRepository; + private UserService userService; @Autowired private CallDao callDao; @@ -38,7 +38,8 @@ public class FaqDao { CallEntity callEntity = callRepository.findById(callId) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); - entity = callDao.convertToFaqEntity(faqRequest, callEntity, userId); + UserEntity userEntity = userService.validateUser(userId); + entity = callDao.convertToFaqEntity(faqRequest, callEntity, userEntity); faqRepository.save(entity); return convertFaqEntityToResponseBean(entity); } @@ -81,9 +82,7 @@ public class FaqDao { private void updateFaqEntity(FaqEntity faqEntity, FaqReq faqReq, Long userId, CallEntity callEntity) { faqEntity.setQuestion(faqReq.getQuestion()); - UserEntity userEntity = userRepository.findById(userId) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + UserEntity userEntity = userService.validateUser(userId); faqEntity.setUser(userEntity); faqEntity.setIsVisible(true); if (faqReq.getIsVisible() != null) { diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index 81da7209..b83b8dc8 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -17,7 +17,7 @@ import java.time.LocalDateTime; @Builder public class CallEntity extends BaseEntity { - @Column(name = "NAME", nullable = false, length = 255) + @Column(name = "NAME", length = 255) private String name; @Column(name = "DESCRIPTION_SHORT", columnDefinition = "TEXT") @@ -26,23 +26,23 @@ public class CallEntity extends BaseEntity { @Column(name = "DESCRIPTION_LONG", columnDefinition = "TEXT") private String descriptionLong; - @Column(name = "START_DATE", nullable = false) + @Column(name = "START_DATE") private LocalDateTime startDate; - @Column(name = "END_DATE", nullable = false) + @Column(name = "END_DATE") private LocalDateTime endDate; - @Column(name = "STATUS", nullable = false, length = 255) + @Column(name = "STATUS", length = 255) private String status; @ManyToOne - @JoinColumn(name = "REGION_ID", nullable = false, foreignKey = @ForeignKey(name = "fk_region_call")) + @JoinColumn(name = "REGION_ID", foreignKey = @ForeignKey(name = "fk_region_call")) private RegionEntity region; - @Column(name = "AMOUNT", nullable = false) + @Column(name = "AMOUNT") private BigDecimal amount; - @Column(name = "AMOUNT_MAX", nullable = false) + @Column(name = "AMOUNT_MAX") private BigDecimal amountMax; @Column(name = "CONTACT_INFO", columnDefinition = "TEXT") @@ -51,7 +51,7 @@ public class CallEntity extends BaseEntity { @Column(name = "SUBMISSION_METHOD", columnDefinition = "TEXT") private String submissionMethod; - @Column(name = "THRESHOLD", nullable = false) + @Column(name = "THRESHOLD") private Long threshold; @Column(name="DOCUMENTATION_REQUESTED",columnDefinition = "TEXT") diff --git a/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java index c31e407f..cf5f49c3 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java @@ -6,7 +6,7 @@ public enum CallStatusEnum { DRAFT("DRAFT"), PUBLISH("PUBLISH"), - EXPIRE("EXPIRED"), + EXPIRED("EXPIRED"), READY_TO_PUBLISH("READY_TO_PUBLISH"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index 97e276a4..bfa0e84d 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -3,42 +3,27 @@ package net.gepafin.tendermanagement.model.request; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import lombok.Data; @Data public class CreateCallRequestStep1 { - @NotEmpty private String name; - @NotEmpty private String descriptionShort; - @NotEmpty private String descriptionLong; - @NotNull - private LocalDateTime startDate; + private List dates; - @NotNull - private LocalDateTime endDate; - - @NotNull private Long regionId; - @NotNull private BigDecimal amount; - @NotNull private BigDecimal amountMax; - @NotNull private List aimedTo; - @NotEmpty private String documentationRequested; private Boolean confidi; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java index 3e339d3e..6538b672 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.model.request; import java.util.List; -import jakarta.validation.constraints.NotNull; import lombok.Data; @Data @@ -10,10 +9,8 @@ public class CreateCallRequestStep2 { private Long threshold; - @NotNull private List criteria; - @NotNull private List checkList; private List docs; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java index cecb7d4c..4d4de6e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java @@ -9,35 +9,24 @@ import lombok.Data; @Data public class UpdateCallRequestStep1 { - - private String name; + private String name; - - private String descriptionShort; + private String descriptionShort; - - private String descriptionLong; + private String descriptionLong; - - private LocalDateTime startDate; + private List dates; - - private LocalDateTime endDate; + private BigDecimal amount; - - private BigDecimal amount; + private BigDecimal amountMax; - - private BigDecimal amountMax; + private List aimedTo; - - private List aimedTo; + private String documentationRequested; - - private String documentationRequested; + private Boolean confidi; - private Boolean confidi; - - private List faq; + private List faq; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java index 4deaef67..2557327e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -18,9 +18,7 @@ public class CallResponse { private String descriptionLong; - private LocalDateTime startDate; - - private LocalDateTime endDate; + private List dates; private CallStatusEnum status; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java index d2079cdf..f9225677 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java @@ -1,7 +1,13 @@ package net.gepafin.tendermanagement.service.impl; +import java.time.LocalDate; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.util.FieldValidator; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; public class CallValidatorServiceImpl { @@ -11,8 +17,8 @@ public class CallValidatorServiceImpl { .notNull(response.getName(), "name") .notNull(response.getDescriptionShort(), "descriptionShort") .notNull(response.getDescriptionLong(), "descriptionLong") - .notNull(response.getStartDate(), "startDate") - .notNull(response.getEndDate(), "endDate") + .notNull(response.getDates().get(0), "startDate") + .notNull(response.getDates().get(1), "endDate") .notNull(response.getStatus(), "status") .notNull(response.getRegionId(), "regionId") .notNull(response.getAmount(), "amount") @@ -26,6 +32,13 @@ public class CallValidatorServiceImpl { .notEmpty(response.getImages(), "images") .notEmpty(response.getCheckList(), "checkList") .validate(); + + if (response.getDates().get(0).toLocalDate().isBefore(LocalDate.now()) + || response.getDates().get(1).toLocalDate().isBefore(LocalDate.now()) || + response.getDates().get(0).toLocalDate().isAfter(response.getDates().get(1).toLocalDate())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); + } } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 1c604fc7..e32e62cd 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -3,8 +3,6 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.enums.UserStatusEnum; -import net.gepafin.tendermanagement.model.response.UserResponseBean; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -46,7 +44,7 @@ public interface CallApi { @Parameter(description = "Call request object", required = true) @Valid @RequestBody CreateCallRequestStep1 createCallRequest); - @Operation(summary = "Api to create call step 2", + @Operation(summary = "Api to update call step 2", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 38c42a3e..4131dd84 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -3,8 +3,6 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import java.util.List; import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.enums.UserStatusEnum; -import net.gepafin.tendermanagement.model.response.UserResponseBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 857689ad..662534fb 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -441,5 +441,16 @@ + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index d95d85e3..2a18fd0c 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -55,6 +55,9 @@ status.same.error=Status is already set. invalid.status.change.from.draft=Status cannot be changed to READY_TO_PUBLISH or PUBLISH from DRAFT. status.cannot.be.changed=Status cannot be changed. invalid.status.transition=Invalid status transition. +published.call.not.update=Published call cannot be updated. + + # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 993d8693..948477f9 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -55,6 +55,8 @@ status.same.error=Lo stato invalid.status.change.from.draft=Lo stato non può essere cambiato in READY_TO_PUBLISH o PUBLISH da DRAFT. status.cannot.be.changed=Lo stato non può essere cambiato. invalid.status.transition=Transizione di stato non valida. +published.call.not.update=Il bando pubblicato non può essere aggiornato. + # Login-related messages login.successfully=Accesso effettuato con successo. From b4548876a9259a2c0a86419b391757ef25e970f3 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 28 Aug 2024 18:01:29 +0530 Subject: [PATCH 049/145] updated code --- .../java/net/gepafin/tendermanagement/dao/CallDao.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index cc5b00ed..3b9773b3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -275,12 +275,8 @@ public class CallDao { createCallResponseBean.setId(callEntity.getId()); createCallResponseBean.setName(callEntity.getName()); List dates = new ArrayList<>(); - if(callEntity.getStartDate() != null) { - dates.add(callEntity.getStartDate()); - } - if(callEntity.getStartDate() != null) { - dates.add(callEntity.getEndDate()); - } + dates.add(callEntity.getStartDate()); + dates.add(callEntity.getEndDate()); createCallResponseBean.setDates(dates); createCallResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); createCallResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); From 74fceb94c10a2249f1264a889f2b07efa90ac811 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 29 Aug 2024 02:02:17 +0530 Subject: [PATCH 050/145] updated code for get all call api --- .../net/gepafin/tendermanagement/dao/CallDao.java | 12 ++++++++---- .../model/response/CallDetailsResponseBean.java | 15 +-------------- .../model/response/CallResponse.java | 2 +- .../service/impl/CallValidatorServiceImpl.java | 2 +- 4 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 3b9773b3..61e840a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -213,7 +213,7 @@ public class CallDao { FaqEntity faqEntity = new FaqEntity(); validateFaqEntity(faqReq.getQuestion()); faqEntity.setUser(userEntity); - faqEntity.setIsVisible(true); + faqEntity.setIsVisible(false); if (faqReq.getIsVisible() != null) { faqEntity.setIsVisible(faqReq.getIsVisible()); } @@ -287,7 +287,7 @@ public class CallDao { createCallResponseBean.setContactInfo(callEntity.getContactInfo()); createCallResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); createCallResponseBean.setThreshold(callEntity.getThreshold()); - createCallResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); + createCallResponseBean.setDocumentationRequested(callEntity.getDocumentationRequested()); createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); createCallResponseBean.setConfidi(callEntity.getConfidi()); createCallResponseBean.setCreatedDate(callEntity.getCreatedDate()); @@ -547,6 +547,7 @@ public class CallDao { faqEntity = new FaqEntity(); faqEntity.setCall(callEntity); faqEntity.setUser(userEntity); + faqEntity.setIsVisible(false); faqEntity.setIsDeleted(false); } @@ -609,7 +610,10 @@ public class CallDao { CallDetailsResponseBean callDetailsResponseBean = new CallDetailsResponseBean(); callDetailsResponseBean.setId(callEntity.getId()); callDetailsResponseBean.setName(callEntity.getName()); - callDetailsResponseBean.setDates(List.of(callEntity.getStartDate(), callEntity.getEndDate())); + List dates = new ArrayList<>(); + dates.add(callEntity.getStartDate()); + dates.add(callEntity.getEndDate()); + callDetailsResponseBean.setDates(dates); callDetailsResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); callDetailsResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); callDetailsResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); @@ -619,7 +623,7 @@ public class CallDao { callDetailsResponseBean.setContactInfo(callEntity.getContactInfo()); callDetailsResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); callDetailsResponseBean.setThreshold(callEntity.getThreshold()); - callDetailsResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); + callDetailsResponseBean.setDocumentationRequested(callEntity.getDocumentationRequested()); callDetailsResponseBean.setPriorityArea(callEntity.getPriorityArea()); callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate()); callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java index 0e19dd69..a7bf60b7 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -35,23 +35,10 @@ public class CallDetailsResponseBean { private String priorityArea; - private String documentationReqested; + private String documentationRequested; private LocalDateTime createdDate; private LocalDateTime updatedDate; - private List aimedTo; - - private List criteria; - - private List docs; - - private List faq; - - private List images; - - private List checkList; - - private String currentStep; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java index 2557327e..f8fa4908 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -36,7 +36,7 @@ public class CallResponse { private String priorityArea; - private String documentationReqested; + private String documentationRequested; private Boolean confidi; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java index f9225677..0d2f651d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java @@ -24,7 +24,7 @@ public class CallValidatorServiceImpl { .notNull(response.getAmount(), "amount") .notNull(response.getAmountMax(), "amountMax") .notNull(response.getThreshold(), "threshold") - .notNull(response.getDocumentationReqested(), "documentationReqested") + .notNull(response.getDocumentationRequested(), "documentationRequested") .notEmpty(response.getAimedTo(), "aimedTo") .notEmpty(response.getCriteria(), "criteria") .notEmpty(response.getDocs(), "docs") From f4cdf415cacb802345a161fb4b68d071e9597a71 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 29 Aug 2024 16:43:56 +0530 Subject: [PATCH 051/145] Added lookUpDate in Faq --- .../constants/GepafinConstant.java | 1 - .../gepafin/tendermanagement/dao/CallDao.java | 27 ++++++++++++++----- .../gepafin/tendermanagement/dao/FaqDao.java | 3 ++- .../tendermanagement/entities/FaqEntity.java | 4 +++ .../entities/LookUpDataEntity.java | 3 ++- .../model/request/FaqReq.java | 2 +- .../model/response/FaqResponseBean.java | 8 ++++++ .../repositories/FaqRepository.java | 3 +++ .../db/changelog/db.changelog-1.0.0.xml | 9 +++++++ src/main/resources/message_en.properties | 1 - src/main/resources/message_it.properties | 1 - 11 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index ce95453b..ed1b30d4 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -82,7 +82,6 @@ public class GepafinConstant { public static final String STATUS_SAME_ERROR = "status.same.error"; public static final String INVALID_STATUS_CHANGE_FROM_DRAFT = "invalid.status.change.from.draft"; public static final String STATUS_CANNOT_BE_CHANGED = "status.cannot.be.changed"; - public static final String INVALID_STATUS_TRANSITION = "invalid.status.transition"; public static final String PUBLISHED_CALL_NOT_UPDATE = "published.call.not.update"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 3b9773b3..a822d672 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -79,7 +79,7 @@ public class CallDao { UserEntity userEntity = userService.validateUser(userId); createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId()); CallEntity callEntity = convertToCallEntity(createCallRequest); - convertToFaqEntities(createCallRequest.getFaq(), callEntity, userEntity); + convertToFaqEntities(createCallRequest.getFaq(), callEntity, userEntity,LookUpDataTypeEnum.FAQ); convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, LookUpDataTypeEnum.AIMED_TO); // createCallResponseBean = assembleCreateCallResponseBean(callEntity, Collections.emptyList(), @@ -199,21 +199,33 @@ public class CallDao { return documentEntity; } - public List convertToFaqEntities(List faqReqList, CallEntity callEntity, UserEntity userEntity) { + public List convertToFaqEntities(List faqReqList, CallEntity callEntity, UserEntity userEntity, LookUpDataTypeEnum type) { if (faqReqList == null) { return null; } - List faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userEntity)) + List existingFaqEntities = faqRepository.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue()); + List incomingIds = faqReqList.stream() + .map(FaqReq::getId) + .filter(id -> id != null && id > 0) + .collect(Collectors.toList()); + existingFaqEntities.stream() + .filter(entity -> !incomingIds.contains(entity.getId())) + .forEach(this::softDeleteFaq); + List faqEntities = faqReqList.stream() + .map(req -> convertToFaqEntity(req, callEntity, userEntity, type)) .collect(Collectors.toList()); faqRepository.saveAll(faqEntities); return faqEntities; } - public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity) { + + public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity,LookUpDataTypeEnum type) { FaqEntity faqEntity = new FaqEntity(); + LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(faqReq, type); validateFaqEntity(faqReq.getQuestion()); faqEntity.setUser(userEntity); faqEntity.setIsVisible(true); + faqEntity.setLookupData(lookupDataEntity); if (faqReq.getIsVisible() != null) { faqEntity.setIsVisible(faqReq.getIsVisible()); } @@ -321,6 +333,9 @@ public class CallDao { public FaqResponseBean convertToFaqResponseBean(FaqEntity entity) { FaqResponseBean responseBean = new FaqResponseBean(); responseBean.setId(entity.getId()); + responseBean.setLookUpDataId(entity.getLookupData().getId()); + responseBean.setValue(entity.getLookupData().getValue()); + responseBean.setTitle(entity.getLookupData().getTitle()); responseBean.setQuestionShort(entity.getQuestionShort()); responseBean.setResponseShort(entity.getResponseShort()); responseBean.setResponse(entity.getResponse()); @@ -662,6 +677,7 @@ public class CallDao { callEntity.setStatus(CallStatusEnum.READY_TO_PUBLISH.getValue()); callRepository.save(callEntity); callResponseBean.setCurrentStep(GepafinConstant.VALIDATE_REQUEST); + callResponseBean.setStatus(CallStatusEnum.READY_TO_PUBLISH); return callResponseBean; } @@ -692,9 +708,6 @@ public class CallDao { case EXPIRED: throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.STATUS_CANNOT_BE_CHANGED)); - default: - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.INVALID_STATUS_TRANSITION)); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java index 8d38dfa4..0b8d02c6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java @@ -4,6 +4,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.FaqEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.response.FaqResponseBean; @@ -39,7 +40,7 @@ public class FaqDao { .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); UserEntity userEntity = userService.validateUser(userId); - entity = callDao.convertToFaqEntity(faqRequest, callEntity, userEntity); + entity = callDao.convertToFaqEntity(faqRequest, callEntity, userEntity, LookUpDataEntity.LookUpDataTypeEnum.FAQ); faqRepository.save(entity); return convertFaqEntityToResponseBean(entity); } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java index d5e47df8..04a1c11b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java @@ -39,6 +39,10 @@ public class FaqEntity extends BaseEntity { @Column(name = "RESPONSE", columnDefinition = "TEXT") private String response; + @ManyToOne + @JoinColumn(name = "LOOKUP_DATA_ID") + private LookUpDataEntity lookupData; + @Column(name = "RESPONSE_DATE") private LocalDateTime responseDate; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java index 41ca9ba7..5941b7b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java @@ -21,7 +21,8 @@ public class LookUpDataEntity extends BaseEntity{ public enum LookUpDataTypeEnum { CHECKLIST("CHECKLIST"), AIMED_TO("AIMED_TO"), - EVALUATION_CRITERIA("EVALUATION_CRITERIA"); + EVALUATION_CRITERIA("EVALUATION_CRITERIA"), + FAQ("FAQ"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java index 618c03c0..b8bd81fb 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java @@ -3,7 +3,7 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; @Data -public class FaqReq { +public class FaqReq extends LookUpDataReq{ private Long id; private Boolean isVisible; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java index 48529d1d..c6846e25 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java @@ -23,4 +23,12 @@ public class FaqResponseBean extends BaseBean { private LocalDateTime responseDate; + private Long lookUpDataId; + + private String title; + + private String value; + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java index 4d4927a3..7c1faaad 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.repositories; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.entities.FaqEntity; import java.util.List; @@ -17,4 +18,6 @@ public interface FaqRepository extends JpaRepository { Optional findById(@Param("id") Long id); List findByCallIdAndIsDeletedFalse(Long callId); + + List findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long callId, String type); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 662534fb..6fc805d6 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -453,4 +453,13 @@ + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 2a18fd0c..10f36d79 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -54,7 +54,6 @@ update_call_status_success_msg=The call status has been updated successfully. status.same.error=Status is already set. invalid.status.change.from.draft=Status cannot be changed to READY_TO_PUBLISH or PUBLISH from DRAFT. status.cannot.be.changed=Status cannot be changed. -invalid.status.transition=Invalid status transition. published.call.not.update=Published call cannot be updated. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 948477f9..2d1fcc5f 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -54,7 +54,6 @@ update_call_status_success_msg=Lo stato della chiamata status.same.error=Lo stato è già impostato. invalid.status.change.from.draft=Lo stato non può essere cambiato in READY_TO_PUBLISH o PUBLISH da DRAFT. status.cannot.be.changed=Lo stato non può essere cambiato. -invalid.status.transition=Transizione di stato non valida. published.call.not.update=Il bando pubblicato non può essere aggiornato. From 4ac0d31e43de4f88832f1c11eb688c28ad2b4ad1 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 29 Aug 2024 20:57:52 +0530 Subject: [PATCH 052/145] updated code for faq update api --- .../gepafin/tendermanagement/dao/CallDao.java | 22 ++++++++++++------- .../web/rest/api/DocumentApi.java | 6 ++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 0d4f7217..568321d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -148,7 +148,7 @@ public class CallDao { CallEntity callEntity, LookUpDataTypeEnum type) { EvaluationCriteriaEntity criteriaEntity = null; LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(criteriaReq, type); - if (criteriaReq.getId() == null && criteriaReq.getId().equals(0l)) { + if (criteriaReq.getId() != null && criteriaReq.getId() > 0) { criteriaEntity = evaluationCriteriaRepository.findById(criteriaReq.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); @@ -224,7 +224,7 @@ public class CallDao { LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(faqReq, type); validateFaqEntity(faqReq.getQuestion()); faqEntity.setUser(userEntity); - faqEntity.setIsVisible(true); + faqEntity.setIsVisible(false); faqEntity.setLookupData(lookupDataEntity); if (faqReq.getIsVisible() != null) { faqEntity.setIsVisible(faqReq.getIsVisible()); @@ -249,7 +249,7 @@ public class CallDao { } public void validateDocumentEntity(Long documentId) { - if (documentId == null) { + if (documentId == null || documentId < 1) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND)); } @@ -528,13 +528,13 @@ public class CallDao { updateCallRequest.getDocumentationRequested()); setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); updateLookUpData(callEntity, updateCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO); - updateFaq(callEntity, updateCallRequest.getFaq(), userEntity); + updateFaq(callEntity, updateCallRequest.getFaq(), userEntity, LookUpDataTypeEnum.FAQ); CallResponse createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); return createCallResponseBean; } - private void updateFaq(CallEntity callEntity, List faqReqList, UserEntity userEntity) { + private void updateFaq(CallEntity callEntity, List faqReqList, UserEntity userEntity, LookUpDataTypeEnum type) { if (faqReqList == null) { return; } @@ -542,7 +542,7 @@ public class CallDao { List incomingIds = faqReqList.stream().map(FaqReq::getId).filter(Objects::nonNull).filter(id -> id > 0) .collect(Collectors.toList()); existingFaqs.stream().filter(faq -> !incomingIds.contains(faq.getId())).forEach(this::softDeleteFaq); - faqReqList.forEach(faqReq -> createOrUpdateFaq(faqReq, callEntity, userEntity)); + faqReqList.forEach(faqReq -> createOrUpdateFaq(faqReq, callEntity, userEntity, type)); } @@ -551,8 +551,10 @@ public class CallDao { faqRepository.save(faqEntity); } - private void createOrUpdateFaq(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity) { + private void createOrUpdateFaq(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity, LookUpDataTypeEnum type) { FaqEntity faqEntity = null; + + LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(faqReq, type); if (isExistingFaq(faqReq)) { faqEntity = faqRepository.findById(faqReq.getId()) @@ -562,10 +564,14 @@ public class CallDao { faqEntity = new FaqEntity(); faqEntity.setCall(callEntity); faqEntity.setUser(userEntity); + faqEntity.setLookupData(lookupDataEntity); faqEntity.setIsVisible(false); faqEntity.setIsDeleted(false); } - + + if (Boolean.FALSE.equals(faqEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) { + faqEntity.setLookupData(lookupDataEntity); + } setIfUpdated(faqEntity::getQuestionShort, faqEntity::setQuestionShort, faqReq.getQuestionShort()); setIfUpdated(faqEntity::getQuestion, faqEntity::setQuestion, faqReq.getQuestion()); setIfUpdated(faqEntity::getResponseShort, faqEntity::setResponseShort, faqReq.getResponseShort()); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java index a9354dbf..026fa690 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java @@ -30,7 +30,7 @@ public interface DocumentApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) @PostMapping(value = "/uploadFile/call/{callId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, @Parameter(description = "call id", required = true) @PathVariable Long callId, @RequestParam("file") List files, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, @Parameter(description = "call id", required = true) @PathVariable("callId") Long callId, @RequestParam("file") List files, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -59,7 +59,7 @@ public interface DocumentApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) @PutMapping(value = "/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - default ResponseEntity> updateDocument(HttpServletRequest httpServletRequest, @Parameter(description = "document id", required = true) @PathVariable Long documentId, @RequestParam("file") MultipartFile file, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + default ResponseEntity> updateDocument(HttpServletRequest httpServletRequest, @Parameter(description = "document id", required = true) @PathVariable("id") Long documentId, @RequestParam("file") MultipartFile file, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @Operation(summary = "API to get document by id", @@ -73,6 +73,6 @@ public interface DocumentApi { @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> getDocumentById(HttpServletRequest request, @Parameter(description = "document id", required = true) - @PathVariable Long id); + @PathVariable("id") Long id); } From 7af37db2ffb357bc45e65ba31a04d7d2e0dbabc2 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 30 Aug 2024 11:52:31 +0530 Subject: [PATCH 053/145] Updated form field response bean --- .../gepafin/tendermanagement/dao/FormDao.java | 15 +++--- .../tendermanagement/dao/FormFieldDao.java | 42 +++++++++++------ .../tendermanagement/dao/FormTemplateDao.java | 2 +- .../tendermanagement/entities/FormEntity.java | 4 ++ .../entities/FormFieldEntity.java | 15 ++++-- .../entities/FormTemplateEntity.java | 4 ++ .../model/request/ContentRequestBean.java | 18 +++++++ .../model/request/FormFieldRequest.java | 9 +++- .../model/request/FormRequest.java | 4 +- .../model/request/SettingRequestBean.java | 11 +++++ .../model/response/ContentResponseBean.java | 17 +++++++ .../model/response/FormFieldResponseBean.java | 14 ++++-- .../model/response/FormResponseBean.java | 8 +++- .../model/response/SettingResponseBean.java | 11 +++++ .../service/FormFieldService.java | 4 ++ .../service/impl/FormFieldServiceImpl.java | 7 +++ .../gepafin/tendermanagement/util/Utils.java | 47 +++++++++++++++++++ .../web/rest/api/FormFieldApi.java | 16 +++++++ .../rest/api/impl/FormFieldApiController.java | 9 ++++ .../db/changelog/db.changelog-1.0.0.xml | 11 +++-- 20 files changed, 229 insertions(+), 39 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/SettingRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/SettingResponseBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 7902e72e..60aba2ea 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -4,7 +4,9 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.FormEntity; +import net.gepafin.tendermanagement.model.request.ContentRequestBean; import net.gepafin.tendermanagement.model.request.FormRequest; +import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.repositories.FormRepository; import net.gepafin.tendermanagement.service.CallService; @@ -37,11 +39,11 @@ public class FormDao { } public FormEntity convertFormRequestToFormEntity(Long callId,FormRequest formRequest){ - FormEntity formEntity=null; + FormEntity formEntity=new FormEntity(); CallEntity callEntity=callService.getCallEntityById(callId); formEntity.setCall(callEntity); formEntity.setLabel(formRequest.getLabel()); - formEntity.setContent(formRequest.getContent()); + formEntity.setContent(setContentResponseBean(formRequest.getContent())); formEntity.setOrderNo(formRequest.getOrderNo()); formEntity=saveFormEntity(formEntity); return formEntity; @@ -49,12 +51,10 @@ public class FormDao { public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity){ FormResponseBean formResponseBean=new FormResponseBean(); formResponseBean.setId(formEntity.getId()); - formResponseBean.setContent(formEntity.getContent()); + formResponseBean.setContent(Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class)); formResponseBean.setLabel(formEntity.getLabel()); formResponseBean.setCallId(formEntity.getCall().getId()); formResponseBean.setOrderNo(formEntity.getOrderNo()); - formResponseBean.setCreatedDate(formEntity.getCreatedDate()); - formResponseBean.setUpdatedDate(formEntity.getUpdatedDate()); return formResponseBean; } public FormResponseBean createForm(Long callId,FormRequest formRequest){ @@ -70,7 +70,7 @@ public class FormDao { public FormResponseBean updateForm(Long formId, FormRequest formRequest){ FormEntity formEntity = formService.getFormEntityById(formId); Utils.setIfUpdated(formEntity::getLabel,formEntity::setLabel,formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent,formEntity::setContent,formRequest.getContent()); + Utils.setIfUpdated(formEntity::getContent,formEntity::setContent,setContentResponseBean(formRequest.getContent())); if(formRequest.getOrderNo()!=null && formRequest.getOrderNo() > 0) { Utils.setIfUpdated(formEntity::getOrderNo, formEntity::setOrderNo, formRequest.getOrderNo()); } @@ -102,4 +102,7 @@ public class FormDao { .collect(Collectors.toList()); return formResponseBeanList; } + public String setContentResponseBean(List contentRequestBeans){ + return Utils.convertListToJsonString(contentRequestBeans); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java index c1f2fedf..6f0149b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java @@ -4,7 +4,9 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.FormFieldEntity; import net.gepafin.tendermanagement.model.request.FormFieldRequest; +import net.gepafin.tendermanagement.model.request.SettingRequestBean; import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; +import net.gepafin.tendermanagement.model.response.SettingResponseBean; import net.gepafin.tendermanagement.repositories.FormFieldRepository; import net.gepafin.tendermanagement.service.FormFieldService; import net.gepafin.tendermanagement.util.Utils; @@ -14,6 +16,9 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.stream.Collectors; + @Component public class FormFieldDao { @@ -24,14 +29,12 @@ public class FormFieldDao { private FormFieldService formFieldService; - public FormFieldEntity convertFormFieldRequestToFormFieldResponseBean(FormFieldRequest formFieldRequest) { - FormFieldEntity formFieldEntity = null; + public FormFieldEntity convertFormFieldRequestToFormFieldEntity(FormFieldRequest formFieldRequest) { + FormFieldEntity formFieldEntity = new FormFieldEntity(); formFieldEntity.setLabel(formFieldRequest.getLabel()); - formFieldEntity.setDefinition(formFieldRequest.getDefinition()); - formFieldEntity.setIsActive(true); - if(formFieldRequest.getIsActive()!=null) { - formFieldEntity.setIsActive(formFieldRequest.getIsActive()); - } + formFieldEntity.setName(formFieldRequest.getName()); + formFieldEntity.setValidators(Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); + formFieldEntity.setSettings(setSettingRequestBean(formFieldRequest.getSettings())); formFieldEntity = saveFormFieldEntity(formFieldEntity); return formFieldEntity; } @@ -39,11 +42,10 @@ public class FormFieldDao { public FormFieldResponseBean convertFormFieldEntityToFormFieldResponseBean(FormFieldEntity formFieldEntity) { FormFieldResponseBean formFieldResponseBean = new FormFieldResponseBean(); formFieldResponseBean.setId(formFieldEntity.getId()); - formFieldResponseBean.setDefinition(formFieldEntity.getDefinition()); + formFieldResponseBean.setName(formFieldEntity.getName()); + formFieldResponseBean.setSettings(Utils.convertJsonStringToList(formFieldEntity.getSettings(), SettingResponseBean.class)); formFieldResponseBean.setLabel(formFieldEntity.getLabel()); - formFieldResponseBean.setIsActive(formFieldEntity.getIsActive()); - formFieldResponseBean.setCreatedDate(formFieldEntity.getCreatedDate()); - formFieldResponseBean.setUpdatedDate(formFieldEntity.getUpdatedDate()); + formFieldResponseBean.setValidators(Utils.convertIntoJson(formFieldEntity.getValidators())); return formFieldResponseBean; } @@ -53,20 +55,21 @@ public class FormFieldDao { } public void validateFormField(FormFieldRequest formFieldRequest) { - if (formFieldRequest.getDefinition() == null || formFieldRequest.getLabel() == null) { + if (formFieldRequest.getSettings() == null || formFieldRequest.getLabel() == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM_FIELD)); } } public FormFieldResponseBean createFormField(FormFieldRequest formFieldRequest){ validateFormField(formFieldRequest); - FormFieldEntity formFieldEntity=convertFormFieldRequestToFormFieldResponseBean(formFieldRequest); + FormFieldEntity formFieldEntity=convertFormFieldRequestToFormFieldEntity(formFieldRequest); return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); } public FormFieldResponseBean updateFormField(Long formFieldId,FormFieldRequest formFieldRequest){ FormFieldEntity formFieldEntity = formFieldService.getFormFieldEntityById(formFieldId); + Utils.setIfUpdated(formFieldEntity::getName,formFieldEntity::setName,formFieldRequest.getName()); Utils.setIfUpdated(formFieldEntity::getLabel,formFieldEntity::setLabel,formFieldRequest.getLabel()); - Utils.setIfUpdated(formFieldEntity::getDefinition,formFieldEntity::setDefinition,formFieldRequest.getDefinition()); - Utils.setIfUpdated(formFieldEntity::getIsActive,formFieldEntity::setIsActive,formFieldRequest.getIsActive()); + Utils.setIfUpdated(formFieldEntity::getSettings,formFieldEntity::setSettings,setSettingRequestBean(formFieldRequest.getSettings())); + Utils.setIfUpdated(formFieldEntity::getValidators,formFieldEntity::setValidators,Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); formFieldEntity=saveFormFieldEntity(formFieldEntity); return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); } @@ -84,4 +87,13 @@ public class FormFieldDao { FormFieldEntity formEntity=formFieldService.getFormFieldEntityById(formFieldId); formFieldRepository.delete(formEntity); } + public String setSettingRequestBean(List settingRequestBeans){ + return Utils.convertListToJsonString(settingRequestBeans); + } + public List getAllFormField(){ + List formFieldEntities=formFieldRepository.findAll(); + List formFieldResponseBeans = formFieldEntities.stream() + .map(req -> convertFormFieldEntityToFormFieldResponseBean(req)).collect(Collectors.toList()); + return formFieldResponseBeans; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java index 9d13ccab..b383a623 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java @@ -25,7 +25,7 @@ public class FormTemplateDao { public FormTemplateEntity convertFormTemplateRequestToFormTemplateRequest(FormTemplateRequest formTemplateRequest){ - FormTemplateEntity formTemplateEntity=null; + FormTemplateEntity formTemplateEntity=new FormTemplateEntity(); formTemplateEntity.setContent(formTemplateRequest.getContent()); formTemplateEntity.setLabel(formTemplateRequest.getLabel()); formTemplateEntity=saveFormTemplateEntity(formTemplateEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java index b65d78a7..d4a8c5f2 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java @@ -1,12 +1,16 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.Builder; +import lombok.NoArgsConstructor; @Entity @Table(name = "FORM") @Data +@NoArgsConstructor +@AllArgsConstructor @Builder public class FormEntity extends BaseEntity{ diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java index 42ed1e44..bffa49be 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java @@ -1,21 +1,28 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.Builder; +import lombok.NoArgsConstructor; @Entity @Table(name = "FORM_FIELD") @Data +@NoArgsConstructor +@AllArgsConstructor @Builder public class FormFieldEntity extends BaseEntity{ + @Column(name = "NAME", length = 255) + private String name; + @Column(name = "LABEL", length = 255) private String label; - @Column(name = "DEFINITION", length = 255) - private String definition; + @Column(name = "SETTINGS") + private String settings; - @Column(name = "IS_ACTIVE") - private Boolean isActive; + @Column(name = "VALIDATORS") + private String validators; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java index 976bcfc6..897a9dfd 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java @@ -1,12 +1,16 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.Builder; +import lombok.NoArgsConstructor; @Entity @Table(name = "FORM_TEMPLATE") @Data +@NoArgsConstructor +@AllArgsConstructor @Builder public class FormTemplateEntity extends BaseEntity{ diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java new file mode 100644 index 00000000..f0399ead --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class ContentRequestBean { + + private String id; + private String name; + private String label; + private List settings; + private Map validators; + private Integer dbId; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java index 0dec37c2..30ddd40b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java @@ -2,12 +2,17 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; +import java.util.List; +import java.util.Map; + @Data public class FormFieldRequest { + private String name; + private String label; - private String definition; + private List settings; - private Boolean isActive; + private Map validators; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java index 01b2c5d9..af541630 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java @@ -2,12 +2,14 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; +import java.util.List; + @Data public class FormRequest { private String label; - private String content; + private List content; private Integer orderNo; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/SettingRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/SettingRequestBean.java new file mode 100644 index 00000000..98db2c59 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/SettingRequestBean.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class SettingRequestBean { + + private String name; + + private String value; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java new file mode 100644 index 00000000..6ee1367d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class ContentResponseBean { + + private String id; + private String name; + private String label; + private List settings; + private Map validators; + private Integer dbId; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java index 63c8231c..b779b353 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java @@ -1,14 +1,20 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; -import net.gepafin.tendermanagement.model.BaseBean; + +import java.util.List; +import java.util.Map; @Data -public class FormFieldResponseBean extends BaseBean { +public class FormFieldResponseBean { + + private Long id; + + private String name; private String label; - private String definition; + private List settings; - private Boolean isActive; + private Map validators; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java index a14997bf..3c347901 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java @@ -3,14 +3,18 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; import net.gepafin.tendermanagement.model.BaseBean; +import java.util.List; + @Data -public class FormResponseBean extends BaseBean { +public class FormResponseBean { + + private Long id; private String label; private Long callId; - private String content; + private List content; private Integer orderNo; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/SettingResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/SettingResponseBean.java new file mode 100644 index 00000000..dcddf149 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/SettingResponseBean.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class SettingResponseBean { + + private String name; + + private String value; +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java b/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java index ddbeeb27..94c67190 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java @@ -5,6 +5,8 @@ import net.gepafin.tendermanagement.entities.FormFieldEntity; import net.gepafin.tendermanagement.model.request.FormFieldRequest; import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; +import java.util.List; + public interface FormFieldService { public FormFieldResponseBean createFormField(HttpServletRequest request, FormFieldRequest formFieldRequest); @@ -17,4 +19,6 @@ public interface FormFieldService { public FormFieldEntity getFormFieldEntityById(Long id); + public List getAllFormField(HttpServletRequest request); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java index ae231ea4..07b7bdcc 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java @@ -9,6 +9,8 @@ import net.gepafin.tendermanagement.service.FormFieldService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class FormFieldServiceImpl implements FormFieldService { @@ -40,4 +42,9 @@ public class FormFieldServiceImpl implements FormFieldService { public FormFieldEntity getFormFieldEntityById(Long id) { return formFieldDao.getFormFieldEntity(id); } + + @Override + public List getAllFormField(HttpServletRequest request) { + return formFieldDao.getAllFormField(); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index d0cba04c..c1819495 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -1,19 +1,25 @@ package net.gepafin.tendermanagement.util; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.json.JsonReadFeature; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import io.micrometer.common.util.StringUtils; +import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.List; +import java.util.Map; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; + public class Utils { public static final Logger log = LoggerFactory.getLogger(Utils.class); @@ -82,5 +88,46 @@ public class Utils { setter.accept(newValue); } } + public static String convertListToJsonString(List list) { + try { + return mapper.writeValueAsString(list); + } catch (JsonProcessingException e) { + e.printStackTrace(); + // Handle exception or throw a custom exception + return null; + } + } + public static List convertJsonStringToList(String jsonString, Class clazz) { + try { + return mapper.readValue(jsonString, new TypeReference>() {}); + } catch (Exception e) { + e.printStackTrace(); + // Handle the exception appropriately (e.g., throw a custom exception) + return null; + } + } + public static String convertMapIntoJsonString(Map map) { + try { + ObjectMapper mapper = new ObjectMapper(); + if (MapUtils.isNotEmpty(map)) { + return mapper.writeValueAsString(map); + } + } catch (JsonProcessingException e) { + log.error(e.getMessage()); + } + return null; + } + public static Map convertIntoJson(String jsonString) { + if (jsonString != null && !jsonString.isEmpty()) { + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true); + return mapper.readValue(jsonString, Map.class); + } catch (Exception e) { + log.error(e.getMessage()); + } + } + return null; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java index cc76814e..341b3fed 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java @@ -15,6 +15,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + public interface FormFieldApi { @Operation(summary = "Api to create form field", @@ -75,4 +77,18 @@ public interface FormFieldApi { @DeleteMapping(value = "/{formFieldId}") ResponseEntity> deleteForm(HttpServletRequest request, @Parameter(description = "The form field ID", required = true) @PathVariable("formFieldId") Long formFieldId); + + @Operation(summary = "Api to get all form field", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "", + produces = { "application/json" }) + ResponseEntity>> getAllFormField(HttpServletRequest request); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormFieldApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormFieldApiController.java index 9445ec14..e491d498 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormFieldApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormFieldApiController.java @@ -15,6 +15,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/formField}") public class FormFieldApiController implements FormFieldApi { @@ -49,4 +51,11 @@ public class FormFieldApiController implements FormFieldApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_FIELD_DELETED_SUCCESSFULLY))); } + + @Override + public ResponseEntity>> getAllFormField(HttpServletRequest request) { + List formFieldResponseBeans=formFieldService.getAllFormField(request); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(formFieldResponseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_FIELD_FETCHED_SUCCESSFULLY))); + } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 5ff6deb7..2198fabe 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -395,7 +395,7 @@ - + @@ -438,14 +438,17 @@ + + + - + - - + + From 98d1405a7c2cf00a91fc8c71a73b9396dc2b7ad4 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 30 Aug 2024 12:52:18 +0530 Subject: [PATCH 054/145] Updated response of call api Step2 --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 568321d5..5e5a1c6c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -655,7 +655,7 @@ public class CallDao { List documentEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentTypeEnum.DOCUMENT.getValue()); List imageEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), - DocumentTypeEnum.DOCUMENT.getValue()); + DocumentTypeEnum.IMAGES.getValue()); List faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); List amiedTo = callTargetAudienceChecklistRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() From 1184420f895230b8f68c31283646e7a47e07a116 Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 30 Aug 2024 16:29:02 +0530 Subject: [PATCH 055/145] Api to get user from token --- .../config/jwt/TokenProvider.java | 48 ++++++++++++++----- .../constants/GepafinConstant.java | 1 + .../tendermanagement/service/UserService.java | 2 + .../service/impl/UserServiceImpl.java | 14 +++++- .../web/rest/api/UserApi.java | 16 ++++++- .../web/rest/api/impl/UserApiController.java | 10 ++++ src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 8 files changed, 80 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java index 3068fefb..15c51b7a 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java @@ -6,12 +6,18 @@ import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import jakarta.annotation.PostConstruct; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import net.gepafin.tendermanagement.web.rest.api.errors.UnauthorizedAccessException; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -40,23 +46,43 @@ public class TokenProvider { @Value("${security.authentication.jwt.token-validity-in-seconds}") private long tokenValidityInSeconds; + @Autowired + private UserRepository userRepository; private SecretKey key; private static final String AUTHORITIES_KEY = "auth"; private static final String MERCHANTID="merchantId"; - public static final String INVALID_USER = "invalid_user"; static final String AUTH_SECRET = "X-Api-Secret"; private final Set invalidatedTokens = new HashSet<>(); + private static final String USER_ID = "userId"; + public UserEntity validateUser(Map userInfo) { + if (userInfo == null || userInfo.get(USER_ID) == null) { + throw new UnauthorizedAccessException(Status.UNAUTHORIZED, Translator.toLocale(GepafinConstant.INVALID_USER)); + } + + Long userId = Long.valueOf(userInfo.get(USER_ID).toString()); + UserEntity userEntity = userRepository.findById(userId).orElse(null); + + if (userEntity == null) { + throw new UnauthorizedAccessException(Status.UNAUTHORIZED, Translator.toLocale(GepafinConstant.INVALID_USER)); + } + + if (!userEntity.getStatus().equals("ACTIVE")) { + throw new UnauthorizedAccessException(Status.UNAUTHORIZED, Translator.toLocale(GepafinConstant.INVALID_USER)); + } + + return userEntity; + } @PostConstruct public void init() { this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); log.info("JWT Secret Key initialized."); } - public String createToken(Authentication authentication, Boolean rememberMe, UserEntity user) { + public String createToken(Authentication authentication, Boolean rememberMe, UserEntity user) { String authorities = authentication.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.joining(",")); @@ -72,11 +98,11 @@ public class TokenProvider { validity = new Date(now + (this.tokenValidityInSeconds * 1000)); log.info("Creating token with standard validity of {} seconds.", this.tokenValidityInSeconds); } - + String payload = authentication.getName(); if(user != null) { - payload += ":"+user.getId(); - } + payload += ":"+user.getId(); + } String token = Jwts.builder() .setSubject(payload) @@ -160,7 +186,7 @@ public class TokenProvider { // isSuperAdmin = true; // // } else - if (!isEmpty(authSecretHeader)) { + if (!isEmpty(authSecretHeader)) { String secret = Utils.decodeBase64String(authSecretHeader); String[] tokenArr = secret.split("\\.", 2); String[] merchant = tokenArr[0].split("-"); @@ -175,12 +201,12 @@ public class TokenProvider { if (payload != null && !isSuperAdmin) { String[] payloadString = payload.split(":");{ - if (payloadString.length > 1) { + if (payloadString.length > 1) { // userInfo.put(MERCHANTID, payloadString[1]); // userInfo.put("associatedTags", payloadString[2]); - userInfo.put("userId", payloadString[1]); + userInfo.put("userId", payloadString[1]); + } } - } if (payloadString.length > 1) { // userInfo.put(MERCHANTID, payloadString[1]); @@ -203,7 +229,7 @@ public class TokenProvider { Gson g = new Gson(); return g.fromJson(new String(decoder.decode(parts[1])), Map.class); } -// public String getSuperUserToken() { + // public String getSuperUserToken() { // return superUserToken; // } public String getUserDetails(String token) { @@ -218,4 +244,4 @@ public class TokenProvider { return null; // Return null if token is not found or not in Bearer format } -} +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index ed1b30d4..8d03b817 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -83,5 +83,6 @@ public class GepafinConstant { public static final String INVALID_STATUS_CHANGE_FROM_DRAFT = "invalid.status.change.from.draft"; public static final String STATUS_CANNOT_BE_CHANGED = "status.cannot.be.changed"; public static final String PUBLISHED_CALL_NOT_UPDATE = "published.call.not.update"; + public static final String INVALID_USER = "invalid_user"; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 7764c98f..f925d7dd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -33,4 +33,6 @@ public interface UserService { void logoutUser(HttpServletRequest request, HttpServletResponse response); UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq); + + UserResponseBean getValidUser(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index bb2446b7..9dc8378e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.UserDao; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.LoginReq; @@ -16,12 +17,16 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Map; + @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; + @Autowired + private TokenProvider tokenProvider; @Transactional(rollbackFor = Exception.class) public UserResponseBean createUser(UserReq userReq) { @@ -52,7 +57,7 @@ public class UserServiceImpl implements UserService { return userDao.login(loginReq); } - + @Override public UserEntity validateUser(Long userId) { return userDao.validateUser(userId); @@ -81,4 +86,11 @@ public class UserServiceImpl implements UserService { return userDao.updateUserStatus(userId, statusReq); } + @Override + @Transactional(readOnly = true) + public UserResponseBean getValidUser(HttpServletRequest request) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + UserEntity user=tokenProvider.validateUser(userInfo); + return userDao.getUserById(user.getId()); + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index c60cef58..fcf6b41e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -11,6 +11,7 @@ import jakarta.validation.Valid; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; @@ -22,6 +23,8 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + @Validated public interface UserApi { @@ -174,7 +177,18 @@ public interface UserApi { @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) UserStatusEnum status) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } - + @Operation(summary = "Api to get valid user from token", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/me", + produces = { "application/json" }) + ResponseEntity> getValidUser(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index fb4801b7..b42c869d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -9,6 +9,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; @@ -23,6 +24,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/user}") @Validated @@ -118,5 +121,12 @@ public class UserApiController implements UserApi { UserResponseBean updatedUser = userService.updateUserStatus(userId, status); return ResponseEntity.ok(new Response<>(updatedUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.UPDATE_USER_STATUS_SUCCESS_MSG))); } + @Override + public ResponseEntity> getValidUser(HttpServletRequest request) { + log.info("Get Valid User Detail"); + UserResponseBean user = userService.getValidUser(request); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); + } } \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 10f36d79..590f845e 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -62,6 +62,7 @@ published.call.not.update=Published call cannot be updated. login.successfully=Login successfully. pass.min.len.msg=Password must be at least 8 characters long. email.already.exists=A user with this email already exists. +invalid_user=User validation failed. Check user info, account status, and token expiration. #Global messages common_message=Something went wrong..Please try again.. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 2d1fcc5f..dbceec17 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -61,6 +61,7 @@ published.call.not.update=Il bando pubblicato non pu login.successfully=Accesso effettuato con successo. pass.min.len.msg=La password deve essere lunga almeno 8 caratteri. email.already.exists=Esiste gi� un utente con questa email. +invalid_user=Validazione utente fallita. Controlla le informazioni, lo stato dell'account e la scadenza del token. #Global messages common_message=qualcosa é andato storto. Per favore riprova From e88b368f98ad99e91110ab88e96bc5d49ad97270 Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 30 Aug 2024 17:43:04 +0530 Subject: [PATCH 056/145] Update permission in role to array --- .../gepafin/tendermanagement/dao/RoleDao.java | 17 ++++++++++++----- .../tendermanagement/model/request/RoleReq.java | 4 +++- .../model/response/RoleResponseBean.java | 3 ++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index 2f5627cc..200b9916 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -16,6 +16,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -30,7 +32,7 @@ public class RoleDao { @Autowired private RegionDao regionDao; - + private RoleEntity roleEntity; public RoleResponseBean createRole(RoleReq roleReq) { log.info("Creating new role with details: {}", roleReq); RoleEntity roleEntity = convertRoleRequestToRoleEntity(roleReq); @@ -43,7 +45,7 @@ public class RoleDao { RoleEntity roleEntity = new RoleEntity(); roleEntity.setRoleName(roleReq.getRoleName()); roleEntity.setRoleType(roleReq.getRoleType()); - roleEntity.setPermissions(roleReq.getPermissions()); + roleEntity.setPermissions(String.join(",", roleReq.getPermissions())); roleEntity.setDescription(roleReq.getDescription()); RegionEntity regionEntity =regionDao.validateRegion(roleReq.getRegionId()); roleEntity.setRegion(regionEntity); @@ -51,6 +53,7 @@ public class RoleDao { } public RoleResponseBean convertRoleEntityToRoleResponse(RoleEntity roleEntity) { + this.roleEntity = roleEntity; RoleResponseBean roleResponseBean = new RoleResponseBean(); roleResponseBean.setId(roleEntity.getId()); roleResponseBean.setCreatedDate(roleEntity.getCreatedDate()); @@ -58,7 +61,11 @@ public class RoleDao { roleResponseBean.setRoleName(roleEntity.getRoleName()); roleResponseBean.setRoleType(roleEntity.getRoleType()); roleResponseBean.setDescription(roleEntity.getDescription()); - roleResponseBean.setPermissions(roleEntity.getPermissions()); + String permissionsString = roleEntity.getPermissions(); + List permissionsList = permissionsString != null && !permissionsString.isEmpty() + ? Arrays.asList(permissionsString.split(",")) + : new ArrayList<>(); + roleResponseBean.setPermissions(permissionsList); RegionResponseBean regionResponseBean = regionDao.convertRegionEntityToRegionResponse(roleEntity.getRegion()); roleResponseBean.setRegion(regionResponseBean); return roleResponseBean; @@ -75,7 +82,7 @@ public class RoleDao { setIfUpdated(existingRole::getRoleName, existingRole::setRoleName, roleReq.getRoleName()); setIfUpdated(existingRole::getRoleType, existingRole::setRoleType, roleReq.getRoleType()); setIfUpdated(existingRole::getDescription, existingRole::setDescription, roleReq.getDescription()); - setIfUpdated(existingRole::getPermissions, existingRole::setPermissions, roleReq.getPermissions()); + setIfUpdated(existingRole::getPermissions, existingRole::setPermissions, String.join(",", roleReq.getPermissions())); existingRole = roleRepository.save(existingRole); @@ -109,7 +116,7 @@ public class RoleDao { log.info("Fetching all roles"); List roles = roleRepository.findAll() .stream() - .map(roleEntity -> Utils.convertObject(roleEntity, RoleResponseBean.class)) + .map(this::convertRoleEntityToRoleResponse) .collect(Collectors.toList()); log.info("Total roles found: {}", roles.size()); return roles; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java index 50cf17ce..cd5e81d1 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter public class RoleReq { @@ -16,7 +18,7 @@ public class RoleReq { private String description; - private String permissions; + private List permissions; private Long regionId; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java index da097f48..93917e99 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java @@ -7,12 +7,13 @@ import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.model.BaseBean; import java.time.LocalDateTime; +import java.util.List; @Data public class RoleResponseBean extends BaseBean { private String roleName; private String description; - private String permissions; + private List permissions; private RegionResponseBean region; private String roleType; } From 18c40eaf03f7dff206b858242f321555dfd00112 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 30 Aug 2024 18:41:40 +0530 Subject: [PATCH 057/145] Updated response of form template --- .../gepafin/tendermanagement/dao/FormDao.java | 5 +- .../tendermanagement/dao/FormFieldDao.java | 3 + .../tendermanagement/dao/FormTemplateDao.java | 25 +++- .../model/request/FormTemplateRequest.java | 4 +- .../response/FormTemplateResponseBean.java | 10 +- .../service/FormTemplateService.java | 4 + .../service/impl/FormTemplateServiceImpl.java | 8 ++ .../web/rest/api/FormTemplateApi.java | 16 +++ .../api/impl/FormTemplateApiController.java | 9 ++ .../db/changelog/db.changelog-1.0.0.xml | 10 +- .../inserted_form_field_data_30_08_2024.sql | 128 ++++++++++++++++++ src/main/resources/message_en.properties | 2 +- src/main/resources/message_it.properties | 2 +- 13 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/db/dump/inserted_form_field_data_30_08_2024.sql diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 60aba2ea..4b9ada4f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -11,6 +11,7 @@ import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.repositories.FormRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.FormService; +import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -18,6 +19,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -63,7 +65,7 @@ public class FormDao { return convertFormEntityToFormResponseBean(formEntity); } public void validateForm(FormRequest formRequest){ - if(formRequest.getContent()==null || formRequest.getLabel()==null || (formRequest.getOrderNo() == null || formRequest.getOrderNo() <= 0)){ + if(formRequest.getContent()==null || formRequest.getLabel()==null ){ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM)); } } @@ -74,6 +76,7 @@ public class FormDao { if(formRequest.getOrderNo()!=null && formRequest.getOrderNo() > 0) { Utils.setIfUpdated(formEntity::getOrderNo, formEntity::setOrderNo, formRequest.getOrderNo()); } + formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); formEntity=saveFormEntity(formEntity); return convertFormEntityToFormResponseBean(formEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java index 6f0149b0..c69e777d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java @@ -9,6 +9,7 @@ import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; import net.gepafin.tendermanagement.model.response.SettingResponseBean; import net.gepafin.tendermanagement.repositories.FormFieldRepository; import net.gepafin.tendermanagement.service.FormFieldService; +import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -16,6 +17,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -70,6 +72,7 @@ public class FormFieldDao { Utils.setIfUpdated(formFieldEntity::getLabel,formFieldEntity::setLabel,formFieldRequest.getLabel()); Utils.setIfUpdated(formFieldEntity::getSettings,formFieldEntity::setSettings,setSettingRequestBean(formFieldRequest.getSettings())); Utils.setIfUpdated(formFieldEntity::getValidators,formFieldEntity::setValidators,Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); + formFieldEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); formFieldEntity=saveFormFieldEntity(formFieldEntity); return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java index b383a623..e9bb787c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java @@ -3,10 +3,13 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.FormTemplateEntity; +import net.gepafin.tendermanagement.model.request.ContentRequestBean; import net.gepafin.tendermanagement.model.request.FormTemplateRequest; +import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormTemplateResponseBean; import net.gepafin.tendermanagement.repositories.FormTemplateRepository; import net.gepafin.tendermanagement.service.FormTemplateService; +import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -14,6 +17,10 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + @Component public class FormTemplateDao { @@ -26,7 +33,7 @@ public class FormTemplateDao { public FormTemplateEntity convertFormTemplateRequestToFormTemplateRequest(FormTemplateRequest formTemplateRequest){ FormTemplateEntity formTemplateEntity=new FormTemplateEntity(); - formTemplateEntity.setContent(formTemplateRequest.getContent()); + formTemplateEntity.setContent(setContentResponseBean(formTemplateRequest.getContent())); formTemplateEntity.setLabel(formTemplateRequest.getLabel()); formTemplateEntity=saveFormTemplateEntity(formTemplateEntity); return formTemplateEntity; @@ -38,10 +45,8 @@ public class FormTemplateDao { public FormTemplateResponseBean convertFormTemplateEntityToFormTemplateResponseBean(FormTemplateEntity formTemplateEntity){ FormTemplateResponseBean formTemplateResponseBean=new FormTemplateResponseBean(); formTemplateResponseBean.setId(formTemplateEntity.getId()); - formTemplateResponseBean.setContent(formTemplateEntity.getContent()); + formTemplateResponseBean.setContent(Utils.convertJsonStringToList(formTemplateEntity.getContent(), ContentResponseBean.class)); formTemplateResponseBean.setLabel(formTemplateEntity.getLabel()); - formTemplateResponseBean.setCreatedDate(formTemplateEntity.getCreatedDate()); - formTemplateResponseBean.setUpdatedDate(formTemplateEntity.getUpdatedDate()); return formTemplateResponseBean; } @@ -58,7 +63,8 @@ public class FormTemplateDao { public FormTemplateResponseBean updateFormTemplate(Long formTemplateId,FormTemplateRequest formTemplateRequest){ FormTemplateEntity formTemplateEntity = formTemplateService.getFormEntityById(formTemplateId); Utils.setIfUpdated(formTemplateEntity::getLabel,formTemplateEntity::setLabel,formTemplateRequest.getLabel()); - Utils.setIfUpdated(formTemplateEntity::getContent,formTemplateEntity::setContent,formTemplateRequest.getContent()); + Utils.setIfUpdated(formTemplateEntity::getContent,formTemplateEntity::setContent,setContentResponseBean(formTemplateRequest.getContent())); + formTemplateEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); formTemplateEntity=saveFormTemplateEntity(formTemplateEntity); return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); } @@ -77,4 +83,13 @@ public class FormTemplateDao { FormTemplateEntity formTemplateEntity=formTemplateService.getFormEntityById(formTemplateId); formTemplateRepository.delete(formTemplateEntity); } + public String setContentResponseBean(List contentRequestBeans){ + return Utils.convertListToJsonString(contentRequestBeans); + } + public List getAllFormTemplate(){ + List formTemplateEntities=formTemplateRepository.findAll(); + List formTemplateResponseBeans=formTemplateEntities.stream() + .map(req -> convertFormTemplateEntityToFormTemplateResponseBean(req)).collect(Collectors.toList()); + return formTemplateResponseBeans; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FormTemplateRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/FormTemplateRequest.java index e229cb3e..7e587852 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FormTemplateRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FormTemplateRequest.java @@ -2,10 +2,12 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; +import java.util.List; + @Data public class FormTemplateRequest { private String label; - private String content; + private List content; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormTemplateResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormTemplateResponseBean.java index ab85bf08..9e9503d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FormTemplateResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormTemplateResponseBean.java @@ -1,12 +1,16 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; -import net.gepafin.tendermanagement.model.BaseBean; + +import java.util.List; @Data -public class FormTemplateResponseBean extends BaseBean { +public class FormTemplateResponseBean { + + private Long id; private String label; - private String content; + private List content; + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java b/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java index 4ab4bca7..7f69ae2e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java @@ -5,6 +5,8 @@ import net.gepafin.tendermanagement.entities.FormTemplateEntity; import net.gepafin.tendermanagement.model.request.FormTemplateRequest; import net.gepafin.tendermanagement.model.response.FormTemplateResponseBean; +import java.util.List; + public interface FormTemplateService { public FormTemplateResponseBean createTemplateForm(HttpServletRequest request, FormTemplateRequest formTemplateRequest); @@ -17,4 +19,6 @@ public interface FormTemplateService { public FormTemplateEntity getFormEntityById(Long id); + public List getAllFormTemplate(HttpServletRequest request); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java index 25ea75fb..a4bf1cdf 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java @@ -9,6 +9,8 @@ import net.gepafin.tendermanagement.service.FormTemplateService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class FormTemplateServiceImpl implements FormTemplateService { @@ -39,4 +41,10 @@ public class FormTemplateServiceImpl implements FormTemplateService { public FormTemplateEntity getFormEntityById(Long id) { return formTemplateDao.getFormTemplateEntity(id); } + + @Override + public List getAllFormTemplate(HttpServletRequest request) { + List formTemplateResponseBeans=formTemplateDao.getAllFormTemplate(); + return formTemplateResponseBeans; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormTemplateApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormTemplateApi.java index add01265..7b3db788 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormTemplateApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormTemplateApi.java @@ -15,6 +15,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + public interface FormTemplateApi { @Operation(summary = "Api to create form template", @@ -75,4 +77,18 @@ public interface FormTemplateApi { @DeleteMapping(value = "/{formTemplateId}") ResponseEntity> deleteFormTemplate(HttpServletRequest request, @Parameter(description = "The form template ID", required = true) @PathVariable("formTemplateId") Long formTemplateId); + + @Operation(summary = "Api to get all form template", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "", + produces = { "application/json" }) + ResponseEntity>> getAllFormTemplate(HttpServletRequest request); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormTemplateApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormTemplateApiController.java index 52a56f5e..058e1655 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormTemplateApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormTemplateApiController.java @@ -15,6 +15,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/formTemplate}") public class FormTemplateApiController implements FormTemplateApi { @@ -49,4 +51,11 @@ public class FormTemplateApiController implements FormTemplateApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_TEMPLATE_DELETED_SUCCESSFULLY))); } + + @Override + public ResponseEntity>> getAllFormTemplate(HttpServletRequest request) { + List formTemplateResponseBeans=formTemplateService.getAllFormTemplate(request); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(formTemplateResponseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_FIELD_FETCHED_SUCCESSFULLY))); + } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 2198fabe..891b525b 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -505,5 +505,13 @@ - + + + select + setval('gepafin_schema.form_field_id_seq', (select + max(id)+1 + from gepafin_schema.form_field), false) + + diff --git a/src/main/resources/db/dump/inserted_form_field_data_30_08_2024.sql b/src/main/resources/db/dump/inserted_form_field_data_30_08_2024.sql new file mode 100644 index 00000000..06e02a9f --- /dev/null +++ b/src/main/resources/db/dump/inserted_form_field_data_30_08_2024.sql @@ -0,0 +1,128 @@ +INSERT INTO FORM_FIELD (NAME, LABEL, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES ( + 'textinput', + 'Text Input', + '[ + { + "name": "label", + "value": "Text input" + }, + { + "name": "placeholder", + "value": "Placeholder text" + } + ]', + '{ + "isRequired": false, + "minLength": null, + "maxLength": null, + "pattern": null, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +); +INSERT INTO FORM_FIELD (NAME, LABEL, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +( 'textarea', + 'Text Area', + '[ + { + "name": "label", + "value": "Text area" + }, + { + "name": "placeholder", + "value": "Placeholder text" + } + ]', + '{ + "isRequired": false, + "minLength": null, + "maxLength": null, + "pattern": null, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +); + +INSERT INTO FORM_FIELD ( NAME, LABEL, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +( 'textinput', + 'Number Input', + '[ + { + "name": "label", + "value": "Number" + }, + { + "name": "placeholder", + "value": "" + } + ]', + '{ + "isRequired": false, + "min": null, + "max": null, + "pattern": null, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +); + +INSERT INTO FORM_FIELD (NAME, LABEL, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +( 'textinput', + 'P.IVA', + '[ + { + "name": "label", + "value": "P.IVA" + }, + { + "name": "placeholder", + "value": "Insert p.iva number" + } + ]', + '{ + "isRequired": true, + "minLength": null, + "maxLength": null, + "pattern": null, + "custom": "isValidVAT" + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +); + +INSERT INTO FORM_FIELD (NAME, LABEL, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +( 'radio', + 'Radio Input', + '[ + { + "name": "label", + "value": "Radio input" + }, + { + "name": "options", + "value": [ + { + "name": "opt1", + "label": "Opt1" + } + ] + } + ]', + '{ + "isRequired": false, + "min": null, + "max": null, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +); + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 6675d2d1..ff1311e4 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -74,7 +74,7 @@ form.created.successfully=Form created successfully. form.updated.suucessfully=Form updated successfully. form.deleted.successfully=Form deleted successfully. form.fetched.successfully=Form fetched successfully. -required.parameter.not.found.for.form=Label, content, or orderNo cannot be null. +required.parameter.not.found.for.form=Label or content cannot be null. form.not.found.for.call.id=Form not found for corresponding call. #EvaluationCriteria-related messages evaluation.criteria.not.found=EvaluationCriteria not found. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 9670e87b..2485a61c 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -74,7 +74,7 @@ form.created.successfully=Modulo creato correttamente. form.updated.suucessfully=Modulo aggiornato correttamente. form.deleted.successfully=Modulo eliminato correttamente. form.fetched.successfully=Modulo recuperato correttamente. -required.parameter.not.found.for.form=Etichetta, contenuto o orderNo non possono essere nulli. +required.parameter.not.found.for.form=L'etichetta o il contenuto non possono essere nulli. form.not.found.for.call.id=Modulo non trovato per la chiamata corrispondente. #Form-field-related messages From 18e6c87a6a3b308e1ad75a28f24844f09aeb794b Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 2 Sep 2024 15:14:13 +0530 Subject: [PATCH 058/145] updated code --- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/CallDao.java | 33 +++++++++++++------ .../tendermanagement/service/CallService.java | 2 +- .../service/impl/CallServiceImpl.java | 4 +-- .../web/rest/api/CallApi.java | 6 ++-- .../web/rest/api/impl/CallApiController.java | 4 +-- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 8 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 70257104..37cb88b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -100,6 +100,7 @@ public class GepafinConstant { public static final String UPDATE_CALL_STATUS_SUCCESS_MSG = "update_call_status_success_msg"; public static final String STATUS_SAME_ERROR = "status.same.error"; public static final String INVALID_STATUS_CHANGE_FROM_DRAFT = "invalid.status.change.from.draft"; + public static final String INVALID_STATUS_CHANGE_FROM_PUBLISH = "invalid.status.change.from.publish"; public static final String STATUS_CANNOT_BE_CHANGED = "status.cannot.be.changed"; public static final String PUBLISHED_CALL_NOT_UPDATE = "published.call.not.update"; public static final String INVALID_USER = "invalid_user"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index cc7f8d80..6c671129 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -503,6 +503,7 @@ public class CallDao { public CallResponse updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) { CallEntity callEntity = validateCall(callId); + validateUpdate(callEntity); UserEntity userEntity = userService.validateUser(userId); isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); @@ -682,12 +683,13 @@ public class CallDao { } public CallResponse validateCall(CallEntity callEntity) { + validateUpdate(callEntity); CallResponse callResponseBean = getCallResponseBean(callEntity); CallValidatorServiceImpl.validateResponse(callResponseBean); callEntity.setStatus(CallStatusEnum.READY_TO_PUBLISH.getValue()); callRepository.save(callEntity); callResponseBean.setCurrentStep(GepafinConstant.VALIDATE_REQUEST); - callResponseBean.setStatus(CallStatusEnum.READY_TO_PUBLISH); + callResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); return callResponseBean; } public CallEntity getCallEntityById(Long id){ @@ -715,16 +717,27 @@ public class CallDao { } switch (currentStatus) { - case DRAFT: - if (newStatus == CallStatusEnum.READY_TO_PUBLISH || newStatus == CallStatusEnum.PUBLISH) { - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.INVALID_STATUS_CHANGE_FROM_DRAFT)); - } - break; - case PUBLISH: - case EXPIRED: + case DRAFT: + if (newStatus == CallStatusEnum.READY_TO_PUBLISH || newStatus == CallStatusEnum.PUBLISH) { throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.STATUS_CANNOT_BE_CHANGED)); + Translator.toLocale(GepafinConstant.INVALID_STATUS_CHANGE_FROM_DRAFT)); + } + break; + case PUBLISH: + if (newStatus == CallStatusEnum.READY_TO_PUBLISH || newStatus == CallStatusEnum.DRAFT) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_STATUS_CHANGE_FROM_PUBLISH)); + } + break; + + case EXPIRED: + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.STATUS_CANNOT_BE_CHANGED)); + case READY_TO_PUBLISH: + break; + default: + break; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 636392e5..4e52e945 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -29,6 +29,6 @@ public interface CallService { public CallEntity getCallEntityById(Long id); - CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq); + CallResponse updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum statusReq); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 2fed41ee..bbf15bbb 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -5,13 +5,11 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; -import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -76,7 +74,7 @@ public class CallServiceImpl implements CallService { } @Override @Transactional(rollbackFor = Exception.class) - public CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq) { + public CallResponse updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum statusReq) { return callDao.updateCallStatus(callId, statusReq); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index e32e62cd..78c19c8d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -132,9 +132,7 @@ public interface CallApi { produces = {"application/json"}, method = RequestMethod.PUT) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - default ResponseEntity> updateCallStatus( + public ResponseEntity> updateCallStatus(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, - @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) CallStatusEnum status) { - return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); - } + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) CallStatusEnum status); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 4131dd84..9885aa84 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -82,8 +82,8 @@ public class CallApiController implements CallApi { .body(new Response<>(call, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); } @Override - public ResponseEntity> updateCallStatus(@PathVariable Long callId, @RequestParam CallStatusEnum status) { - CallResponse updateCall = callService.updateCallStatus(callId, status); + public ResponseEntity> updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum status) { + CallResponse updateCall = callService.updateCallStatus(request, callId, status); return ResponseEntity.ok(new Response<>(updateCall, Status.SUCCESS, Translator.toLocale(GepafinConstant.UPDATE_CALL_STATUS_SUCCESS_MSG))); } } \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 444f8a64..369b16f0 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -56,6 +56,7 @@ status.same.error=Status is already set. invalid.status.change.from.draft=Status cannot be changed to READY_TO_PUBLISH or PUBLISH from DRAFT. status.cannot.be.changed=Status cannot be changed. published.call.not.update=Published call cannot be updated. +invalid.status.change.from.publish=Status cannot be changed to READY_TO_PUBLISH or DRAFT from PUBLISH. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 8d7352f9..c4d1ee77 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -56,6 +56,7 @@ status.same.error=Lo stato � gi� impostato. invalid.status.change.from.draft=Lo stato non pu� essere cambiato in READY_TO_PUBLISH o PUBLISH da DRAFT. status.cannot.be.changed=Lo stato non pu� essere cambiato. published.call.not.update=Il bando pubblicato non pu� essere aggiornato. +invalid.status.change.from.publish=Lo stato non può essere modificato in READY_TO_PUBLISH o DRAFT da PUBLISH. # Login-related messages From c05a5d22eefed7f55835c74ec68c1d301d7c65b4 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 2 Sep 2024 19:37:22 +0530 Subject: [PATCH 059/145] updated code for form table removed orderNo and update the data type of form table --- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 5 ----- .../net/gepafin/tendermanagement/entities/FormEntity.java | 3 --- .../gepafin/tendermanagement/model/request/FormRequest.java | 2 -- .../tendermanagement/model/request/SettingRequestBean.java | 2 +- .../tendermanagement/model/response/FormResponseBean.java | 2 -- .../model/response/SettingResponseBean.java | 2 +- src/main/resources/application.properties | 1 + src/main/resources/db/changelog/db.changelog-1.0.0.xml | 6 ++++++ 8 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 4b9ada4f..c3dd2f0f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -46,7 +46,6 @@ public class FormDao { formEntity.setCall(callEntity); formEntity.setLabel(formRequest.getLabel()); formEntity.setContent(setContentResponseBean(formRequest.getContent())); - formEntity.setOrderNo(formRequest.getOrderNo()); formEntity=saveFormEntity(formEntity); return formEntity; } @@ -56,7 +55,6 @@ public class FormDao { formResponseBean.setContent(Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class)); formResponseBean.setLabel(formEntity.getLabel()); formResponseBean.setCallId(formEntity.getCall().getId()); - formResponseBean.setOrderNo(formEntity.getOrderNo()); return formResponseBean; } public FormResponseBean createForm(Long callId,FormRequest formRequest){ @@ -73,9 +71,6 @@ public class FormDao { FormEntity formEntity = formService.getFormEntityById(formId); Utils.setIfUpdated(formEntity::getLabel,formEntity::setLabel,formRequest.getLabel()); Utils.setIfUpdated(formEntity::getContent,formEntity::setContent,setContentResponseBean(formRequest.getContent())); - if(formRequest.getOrderNo()!=null && formRequest.getOrderNo() > 0) { - Utils.setIfUpdated(formEntity::getOrderNo, formEntity::setOrderNo, formRequest.getOrderNo()); - } formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); formEntity=saveFormEntity(formEntity); return convertFormEntityToFormResponseBean(formEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java index d4a8c5f2..588619a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java @@ -23,7 +23,4 @@ public class FormEntity extends BaseEntity{ @Column(name = "CONTENT", length = 255) private String content; - - @Column(name = "ORDER_NO") - private Integer orderNo; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java index af541630..118ec040 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FormRequest.java @@ -11,6 +11,4 @@ public class FormRequest { private List content; - private Integer orderNo; - } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/SettingRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/SettingRequestBean.java index 98db2c59..fc724554 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/SettingRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/SettingRequestBean.java @@ -7,5 +7,5 @@ public class SettingRequestBean { private String name; - private String value; + private Object value; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java index 3c347901..0be2957d 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java @@ -15,6 +15,4 @@ public class FormResponseBean { private Long callId; private List content; - - private Integer orderNo; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/SettingResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/SettingResponseBean.java index dcddf149..49f208cb 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/SettingResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/SettingResponseBean.java @@ -7,5 +7,5 @@ public class SettingResponseBean { private String name; - private String value; + private Object value; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 06b3a98e..07fcf32f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,6 +21,7 @@ spring.liquibase.enabled=true # Swagger Configuration springdoc.api-docs.path=/v1/api-docs +springdoc.swagger-ui.tagsSorter=alpha #aws configuration diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index ad959c40..3e221a3a 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -534,4 +534,10 @@ + + + + + From 5b2cfcd594764f84147bbc582d556012da8fb22c Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 3 Sep 2024 14:52:07 +0530 Subject: [PATCH 060/145] added validation in call api --- .../tendermanagement/constants/GepafinConstant.java | 2 +- .../java/net/gepafin/tendermanagement/dao/CallDao.java | 5 ++++- .../net/gepafin/tendermanagement/dao/LookUpDataDao.java | 9 +++++++++ .../tendermanagement/service/LookUpDataService.java | 2 ++ .../service/impl/LookUpDataServiceImpl.java | 5 +++++ src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 7 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 37cb88b5..e59ff236 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -18,7 +18,7 @@ public class GepafinConstant { public static final String ROLE_FETCH_SUCCESS_MSG = "role.fetch.success"; public static final String ROLE_NOT_FOUND = "role.not.found"; - + public static final String VALUE_CANNOT_BE_EMPTY = "lookupdata.value.cannot.be.empty"; public static final String REGION_CREATED_SUCCESS_MSG = "region.created.success"; public static final String REGION_UPDATED_SUCCESS_MSG = "region.updated.success"; public static final String GET_REGION_SUCCESS_MSG = "get.region.success"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 6c671129..33260c52 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -8,6 +8,7 @@ import java.util.Objects; import java.util.stream.Collectors; import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.service.LookUpDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -65,7 +66,8 @@ public class CallDao { @Autowired private RegionRepository regionRepository; - + @Autowired + private LookUpDataService lookUpDataService; @Autowired private LookUpDataRepository lookUpDataRepository; @@ -405,6 +407,7 @@ public class CallDao { LookUpDataEntity newEntity = new LookUpDataEntity(); newEntity.setValue(req.getValue()); newEntity.setType(type.getValue()); + lookUpDataService.validateLookUpDataEntity(newEntity); return lookUpDataRepository.save(newEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java index 612b1d7b..4d6c8455 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; import net.gepafin.tendermanagement.repositories.LookUpDataRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.config.Translator; @@ -30,10 +31,18 @@ public class LookUpDataDao { entity.setTitle(lookUpDataReq.getTitle()); entity.setType(lookUpDataReq.getType().getValue()); entity.setValue(lookUpDataReq.getValue()); + validateLookUpDataEntity(entity); lookUpDataRepository.save(entity); return entity; } + public void validateLookUpDataEntity(LookUpDataEntity entity) { + if (entity.getValue() == null || entity.getValue().trim().isEmpty()) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.VALUE_CANNOT_BE_EMPTY)); + } + } + + public LookUpDataResponseBean getLookUpDataById(Long id) { return lookUpDataRepository.findById(id) .map(this::convertLookUpDataEntityToResponseBean) diff --git a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java index 2a0ff7dc..29c18203 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.service; +import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; @@ -15,6 +16,7 @@ public interface LookUpDataService { LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq); void deleteLookUpData(Long id); + void validateLookUpDataEntity(LookUpDataEntity lookUpDataEntity); List getLookUpDataByType(List type); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java index a8f28d07..f6381e59 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service.impl; import net.gepafin.tendermanagement.dao.LookUpDataDao; +import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; @@ -31,6 +32,10 @@ public class LookUpDataServiceImpl implements LookUpDataService { return lookUpDataDao.updateLookUpData(id, lookUpDataReq); } + public void validateLookUpDataEntity(LookUpDataEntity lookUpDataEntity) + { + lookUpDataDao.validateLookUpDataEntity(lookUpDataEntity); + } @Override public void deleteLookUpData(Long id) { lookUpDataDao.deleteLookUpData(id); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 369b16f0..b154e270 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -128,6 +128,7 @@ lookupdata.created.successfully=LookUpData created successfully. lookupdata.fetched.successfully=LookUpData fetched successfully. lookupdata.updated.successfully=LookUpData updated successfully. lookupdata.deleted.successfully=LookUpData deleted successfully. +lookupdata.value.cannot.be.empty=Value field cannot be empty #Document-related message document.updated.successfully=Document updated successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index c4d1ee77..d73e36c1 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -115,6 +115,7 @@ lookupdata.created.successfully=LookUpData creato correttamente. lookupdata.fetched.successfully=LookUpData recuperato correttamente. lookupdata.updated.successfully=LookUpData aggiornato correttamente. lookupdata.deleted.successfully=LookUpData eliminato correttamente. +lookupdata.value.cannot.be.empty=Il campo valore non può essere vuoto #Document-related message document.updated.successfully=Documento aggiornato con successo. From fea784c4dd950b214bbcc9c7765f0e88117cbcff Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 3 Sep 2024 18:47:52 +0530 Subject: [PATCH 061/145] Removed validation from form --- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index c3dd2f0f..0a93a090 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -92,9 +92,6 @@ public class FormDao { } public List getFormsByCallId(Long callId){ List formEntities=formRepository.findByCallId(callId); - if(formEntities.isEmpty()){ - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FORM_NOT_FOUND_FOR_CALL_ID)); - } List formResponseBeanList = formEntities.stream() .map(req -> convertFormEntityToFormResponseBean(req)) .collect(Collectors.toList()); From e4e43f2a6cd39ca989239c4d03bbe843937fe676 Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 3 Sep 2024 19:26:17 +0530 Subject: [PATCH 062/145] refactored user,role and region code --- .../gepafin/tendermanagement/dao/RegionDao.java | 6 ++---- .../net/gepafin/tendermanagement/dao/RoleDao.java | 6 ++---- .../net/gepafin/tendermanagement/dao/UserDao.java | 14 +++++--------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java index 5b59f2a5..46643d3a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java @@ -111,14 +111,12 @@ public class RegionDao { } public RegionResponseBean getRegionById(Long id) { log.info("Fetching region with ID: {}", id); - RegionEntity regionEntity = regionRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); + RegionEntity regionEntity = validateRegion(id); return convertRegionEntityToRegionResponse(regionEntity); } public void deleteById(Long id) { log.info("Deleting region with ID: {}", id); - regionRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); + validateRegion(id); regionRepository.deleteById(id); log.info("Region deleted with ID: {}", id); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index 200b9916..b3e93971 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -99,15 +99,13 @@ public class RoleDao { } public RoleResponseBean getRoleById(Long id) { log.info("Fetching role with ID: {}", id); - RoleEntity roleEntity = roleRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ROLE_NOT_FOUND))); + RoleEntity roleEntity = validateRole(id); log.info("Role found: {}", roleEntity); return convertRoleEntityToRoleResponse(roleEntity); } public void deleteById(Long id) { log.info("Deleting role with ID: {}", id); - roleRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ROLE_NOT_FOUND))); + validateRole(id); roleRepository.deleteById(id); log.info("Role deleted with ID: {}", id); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 79cbf0b0..81033b05 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -65,8 +65,7 @@ public class UserDao { public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { log.info("Updating user with ID: {}", userId); - UserEntity userEntity = userRepository.findById(userId) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG))); + UserEntity userEntity=validateUser(userId); log.info("Current user details: {}", userEntity); log.info("New user details: {}", userReq); String newStatus = userReq.getStatus() != null ? userReq.getStatus().getValue() : null; @@ -123,8 +122,7 @@ public class UserDao { public UserResponseBean getUserById(Long id) { log.info("Fetching user with ID: {}", id); - UserEntity userEntity = userRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + UserEntity userEntity=validateUser(id); // if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) { // log.info("User with ID: {} is not active", id); // throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); @@ -135,8 +133,7 @@ public class UserDao { public void deleteUser(Long id) { log.info("Deleting user with ID: {}", id); - userRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + validateUser(id); userRepository.deleteById(id); log.info("User deleted with ID: {}", id); } @@ -150,7 +147,7 @@ public class UserDao { public UserEntity validateUser(Long userId) { return userRepository.findById(userId) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); } public String generateSecureToken() { @@ -223,8 +220,7 @@ public class UserDao { public UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq) { log.info("Updating status for user with ID: {}", userId); - UserEntity userEntity = userRepository.findById(userId) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + UserEntity userEntity=validateUser(userId); userEntity.setStatus(statusReq.getValue()); userEntity = userRepository.save(userEntity); log.info("User status updated to {} for user ID: {}", statusReq, userId); From 64f0d7ab85a7b88499e3590129e3db61eba8e62d Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 3 Sep 2024 19:34:52 +0530 Subject: [PATCH 063/145] Applied validation for call in form --- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 0a93a090..1c3f3dec 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -91,6 +91,11 @@ public class FormDao { formRepository.delete(formEntity); } public List getFormsByCallId(Long callId){ + CallEntity callEntity=callService.getCallEntityById(callId); + if(callEntity== null){ + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); + } List formEntities=formRepository.findByCallId(callId); List formResponseBeanList = formEntities.stream() .map(req -> convertFormEntityToFormResponseBean(req)) From 3752afdfd4051ca7b46e63c31963fadf32e2d845 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 3 Sep 2024 20:11:29 +0530 Subject: [PATCH 064/145] refactored code --- .../gepafin/tendermanagement/dao/CallDao.java | 27 ++-- .../tendermanagement/dao/DocumentDao.java | 31 ++-- .../dao/EvaluationCriteriaDao.java | 116 +++++++------- .../gepafin/tendermanagement/dao/FaqDao.java | 12 +- .../gepafin/tendermanagement/dao/FormDao.java | 12 +- .../tendermanagement/dao/FormFieldDao.java | 144 +++++++++--------- .../tendermanagement/dao/FormTemplateDao.java | 133 ++++++++-------- .../tendermanagement/dao/LookUpDataDao.java | 20 +-- .../gepafin/tendermanagement/dao/RoleDao.java | 4 +- .../model/request/LogoutReq.java | 2 - .../model/request/RegionReq.java | 8 +- .../model/request/UserReq.java | 7 +- .../model/response/FormResponseBean.java | 1 - .../model/response/RegionResponseBean.java | 33 ++-- .../model/response/RoleResponseBean.java | 4 - .../model/response/UserResponseBean.java | 4 - .../repositories/FaqRepository.java | 1 - .../repositories/LookUpDataRepository.java | 1 - .../tendermanagement/service/CallService.java | 8 +- .../service/FormFieldService.java | 2 +- .../tendermanagement/service/FormService.java | 2 +- .../service/FormTemplateService.java | 2 +- .../service/LookUpDataService.java | 2 + .../service/RegionService.java | 2 - .../tendermanagement/service/RoleService.java | 1 - .../service/impl/AuthenticationService.java | 1 - .../service/impl/CallServiceImpl.java | 10 +- .../service/impl/FormFieldServiceImpl.java | 4 +- .../service/impl/FormServiceImpl.java | 4 +- .../service/impl/FormTemplateServiceImpl.java | 4 +- .../service/impl/LookUpDataServiceImpl.java | 5 + .../web/rest/api/CallApi.java | 3 +- .../web/rest/api/EvaluationCriteriaApi.java | 6 +- .../tendermanagement/web/rest/api/FaqApi.java | 8 +- .../web/rest/api/LookUpDataApi.java | 8 +- .../web/rest/api/RegionApi.java | 3 - .../web/rest/api/RoleApi.java | 1 - .../web/rest/api/UserApi.java | 3 - .../web/rest/api/impl/CallApiController.java | 6 +- .../api/impl/CustomUserDetailsService.java | 4 - .../rest/api/impl/RegionApiController.java | 2 - .../web/rest/api/impl/RoleApiController.java | 1 - .../web/rest/api/impl/UserApiController.java | 7 +- 43 files changed, 310 insertions(+), 349 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 33260c52..265061dc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -98,7 +98,7 @@ public class CallDao { CallEntity callEntity = new CallEntity(); // validateCallEntity(createCallRequest); RegionEntity region = regionRepository.findById(createCallRequest.getRegionId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND))); callEntity.setRegion(region); callEntity.setName(createCallRequest.getName()); @@ -152,7 +152,7 @@ public class CallDao { LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(criteriaReq, type); if (criteriaReq.getId() != null && criteriaReq.getId() > 0) { criteriaEntity = evaluationCriteriaRepository.findById(criteriaReq.getId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); } else { criteriaEntity = new EvaluationCriteriaEntity(); @@ -196,7 +196,7 @@ public class CallDao { private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { validateDocumentEntity(documentReq.getId()); DocumentEntity documentEntity = documentRepository.findByIdAndCallIdAndIsDeletedFalse(documentReq.getId(), callEntity.getId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); return documentEntity; } @@ -412,7 +412,7 @@ public class CallDao { } return lookUpDataRepository.findById(req.getLookUpDataId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); } @@ -430,21 +430,17 @@ public class CallDao { } public CallEntity validateCall(Long callId) { - return callRepository.findById(callId).orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, + return callRepository.findById(callId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); } public CallResponse getCallById(Long callId) { - CallEntity callEntity = callRepository.findById(callId) - .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + CallEntity callEntity = validateCall(callId); return getCallResponseBean(callEntity); } public CallResponse createCallStep2(Long callId, CreateCallRequestStep2 createCallRequest, Long userId) { - CallEntity callEntity = callRepository.findById(callId) - .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + CallEntity callEntity = validateCall(callId); validateUpdate(callEntity); setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); callRepository.save(callEntity); @@ -562,7 +558,7 @@ public class CallDao { if (isExistingFaq(faqReq)) { faqEntity = faqRepository.findById(faqReq.getId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); } else { faqEntity = new FaqEntity(); @@ -608,7 +604,7 @@ public class CallDao { LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(lookUpDataReq, type); if (lookUpDataReq.getId() != null && lookUpDataReq.getId() > 0) { checklistEntity = callTargetAudienceChecklistRepository.findById(lookUpDataReq.getId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); if (Boolean.FALSE.equals(checklistEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) { @@ -685,7 +681,7 @@ public class CallDao { .collect(Collectors.toList()); } - public CallResponse validateCall(CallEntity callEntity) { + public CallResponse validateCallData(CallEntity callEntity) { validateUpdate(callEntity); CallResponse callResponseBean = getCallResponseBean(callEntity); CallValidatorServiceImpl.validateResponse(callResponseBean); @@ -704,8 +700,7 @@ public class CallDao { } public CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq) { - CallEntity callEntity = callRepository.findById(callId) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + CallEntity callEntity = validateCall(callId); CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus()); validateStatusChange(currentStatus, statusReq); callEntity.setStatus(statusReq.getValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 3a0b1b9b..c079a40f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -1,7 +1,6 @@ package net.gepafin.tendermanagement.dao; import java.io.IOException; -import java.util.*; import java.util.stream.Collectors; import org.apache.commons.io.FilenameUtils; @@ -16,9 +15,9 @@ import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; -import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; +import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -39,13 +38,11 @@ public class DocumentDao { private CallDao callDao; @Autowired - private CallRepository callRepository; + private CallService callService; public List uploadFiles(List files, Long callId, DocumentTypeEnum fileType) { List documentEntities = new ArrayList<>(); - CallEntity callEntity = callRepository.findById(callId) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + CallEntity callEntity = callService.validateCall(callId); for (MultipartFile file : files) { try { uploadFileOnAmazonS3 result = uploadFileOnAmazonS3(file); @@ -79,7 +76,7 @@ public class DocumentDao { } public void deleteFile(Long documentId) { - DocumentEntity documentEntity = getDocumentEntity(documentId); + DocumentEntity documentEntity = validateDocument(documentId); // String fileName= Utils.extractFileName(documentEntity.getFilePath()); // deleteFileOnAmazonS3(fileName); documentEntity.setIsDeleted(true); @@ -94,17 +91,13 @@ public class DocumentDao { return null; } - private DocumentEntity getDocumentEntity(Long documentId) { - Optional documentEntity = documentRepository.findById(documentId); - if (documentEntity.isEmpty()) { - throw new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - return documentEntity.orElse(null); + public DocumentEntity validateDocument(Long id) { + return documentRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); } public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { - DocumentEntity documentEntity = getDocumentEntity(documentId); + DocumentEntity documentEntity = validateDocument(documentId); String fileName = Utils.extractFileName(documentEntity.getFilePath()); deleteFileOnAmazonS3(fileName); uploadFileOnAmazonS3 result = null; @@ -122,11 +115,7 @@ public class DocumentDao { } public DocumentResponseBean getDocument(Long documentId) { - Optional documentEntity = documentRepository.findById(documentId); - if (documentEntity.isEmpty()) { - new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - return callDao.convertToDocumentResponseBean(documentEntity.orElse(null)); + DocumentEntity documentEntity = validateDocument(documentId); + return callDao.convertToDocumentResponseBean(documentEntity); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java index ab5c25b2..f747d38f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -7,77 +7,81 @@ import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; -import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; -import net.gepafin.tendermanagement.repositories.LookUpDataRepository; +import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.service.LookUpDataService; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Component; - @Component public class EvaluationCriteriaDao { - @Autowired - private EvaluationCriteriaRepository evaluationCriteriaRepository; + @Autowired + private EvaluationCriteriaRepository evaluationCriteriaRepository; - @Autowired - private CallRepository callRepository; - - @Autowired - private LookUpDataRepository lookUpDataRepository; + @Autowired + private CallService callService; - public EvaluationCriteriaResponseBean createEvaluationCriteria(EvaluationCriteriaRequest evaluationCriteriaRequest) { - EvaluationCriteriaEntity entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(evaluationCriteriaRequest); - return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); - } + @Autowired + private LookUpDataService lookUpDataService; - private EvaluationCriteriaEntity convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(EvaluationCriteriaRequest evaluationCriteriaRequest) { - EvaluationCriteriaEntity entity = new EvaluationCriteriaEntity(); - CallEntity callEntity = callRepository.findById(evaluationCriteriaRequest.getCallId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); - LookUpDataEntity looDataEntity = lookUpDataRepository.findById(evaluationCriteriaRequest.getLookUpDataId()) + public EvaluationCriteriaResponseBean createEvaluationCriteria( + EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaEntity entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity( + evaluationCriteriaRequest); + return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); + } + + private EvaluationCriteriaEntity convertEvaluationCriteriaRequestToEvaluationCriteriaEntity( + EvaluationCriteriaRequest evaluationCriteriaRequest) { + EvaluationCriteriaEntity entity = new EvaluationCriteriaEntity(); + CallEntity callEntity = callService.validateCall(evaluationCriteriaRequest.getCallId()); + LookUpDataEntity looDataEntity = lookUpDataService + .validateLookUpData(evaluationCriteriaRequest.getLookUpDataId()); + entity.setCall(callEntity); + entity.setLookupData(looDataEntity); + entity.setScore(evaluationCriteriaRequest.getScore()); + entity = evaluationCriteriaRepository.save(entity); + return entity; + } + + public EvaluationCriteriaResponseBean getEvaluationCriteriaById(Long id) { + return evaluationCriteriaRepository.findById(id) + .map(this::convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); - entity.setCall(callEntity); - entity.setLookupData(looDataEntity); - entity.setScore(evaluationCriteriaRequest.getScore()); - entity = evaluationCriteriaRepository.save(entity); - return entity; - } + Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + } - public EvaluationCriteriaResponseBean getEvaluationCriteriaById(Long id) { - return evaluationCriteriaRepository.findById(id) - .map(this::convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); - } + public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest request) { + EvaluationCriteriaEntity entity = evaluationCriteriaRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(request); + return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); + } - public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest request) { - EvaluationCriteriaEntity entity = evaluationCriteriaRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); - entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(request); - return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); - } + public void deleteEvaluationCriteria(Long id) { + try { + evaluationCriteriaRepository.deleteById(id); + } catch (EmptyResultDataAccessException e) { + throw new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)); + } + } - public void deleteEvaluationCriteria(Long id) { - try { - evaluationCriteriaRepository.deleteById(id); - } catch (EmptyResultDataAccessException e) { - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)); - } - } - - private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(EvaluationCriteriaEntity entity) { - EvaluationCriteriaResponseBean response = new EvaluationCriteriaResponseBean(); - response.setId(entity.getId()); - response.setScore(entity.getScore()); - response.setCreatedDate(entity.getCreatedDate()); - response.setUpdatedDate(entity.getUpdatedDate()); - response.setLookUpDataId(entity.getLookupData().getId()); - response.setTitle(entity.getLookupData().getTitle()); - response.setValue(entity.getLookupData().getValue()); - return response; - } + private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean( + EvaluationCriteriaEntity entity) { + EvaluationCriteriaResponseBean response = new EvaluationCriteriaResponseBean(); + response.setId(entity.getId()); + response.setScore(entity.getScore()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + response.setLookUpDataId(entity.getLookupData().getId()); + response.setTitle(entity.getLookupData().getTitle()); + response.setValue(entity.getLookupData().getValue()); + return response; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java index 0b8d02c6..dcd60c65 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java @@ -8,8 +8,8 @@ import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.response.FaqResponseBean; -import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.FaqRepository; +import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -32,15 +32,15 @@ public class FaqDao { private CallDao callDao; @Autowired - private CallRepository callRepository; + private CallService callService; public FaqResponseBean createFaq(FaqReq faqRequest, Long userId, Long callId) { FaqEntity entity = new FaqEntity(); - CallEntity callEntity = callRepository.findById(callId) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + CallEntity callEntity = callService.validateCall(callId); + ; UserEntity userEntity = userService.validateUser(userId); - entity = callDao.convertToFaqEntity(faqRequest, callEntity, userEntity, LookUpDataEntity.LookUpDataTypeEnum.FAQ); + entity = callDao.convertToFaqEntity(faqRequest, callEntity, userEntity, + LookUpDataEntity.LookUpDataTypeEnum.FAQ); faqRepository.save(entity); return convertFaqEntityToResponseBean(entity); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 1c3f3dec..dd11b579 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -10,7 +10,6 @@ import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.repositories.FormRepository; import net.gepafin.tendermanagement.service.CallService; -import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -32,9 +31,6 @@ public class FormDao { @Autowired private CallService callService; - @Autowired - private FormService formService; - public FormEntity saveFormEntity(FormEntity formEntity){ formEntity=formRepository.save(formEntity); return formEntity; @@ -68,7 +64,7 @@ public class FormDao { } } public FormResponseBean updateForm(Long formId, FormRequest formRequest){ - FormEntity formEntity = formService.getFormEntityById(formId); + FormEntity formEntity = validateForm(formId); Utils.setIfUpdated(formEntity::getLabel,formEntity::setLabel,formRequest.getLabel()); Utils.setIfUpdated(formEntity::getContent,formEntity::setContent,setContentResponseBean(formRequest.getContent())); formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); @@ -76,18 +72,18 @@ public class FormDao { return convertFormEntityToFormResponseBean(formEntity); } - public FormEntity getFormEntity(Long formId) { + public FormEntity validateForm(Long formId) { FormEntity formEntity = formRepository.findById(formId) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FORM_NOT_FOUND))); return formEntity; } public FormResponseBean getFormEntityById(Long formId) { - FormEntity formEntity = formService.getFormEntityById(formId); + FormEntity formEntity = validateForm(formId); return convertFormEntityToFormResponseBean(formEntity); } public void deleteFormById(Long formId){ - FormEntity formEntity=formService.getFormEntityById(formId); + FormEntity formEntity = validateForm(formId); formRepository.delete(formEntity); } public List getFormsByCallId(Long callId){ diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java index c69e777d..beda3eaa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java @@ -8,7 +8,6 @@ import net.gepafin.tendermanagement.model.request.SettingRequestBean; import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; import net.gepafin.tendermanagement.model.response.SettingResponseBean; import net.gepafin.tendermanagement.repositories.FormFieldRepository; -import net.gepafin.tendermanagement.service.FormFieldService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -24,79 +23,86 @@ import java.util.stream.Collectors; @Component public class FormFieldDao { - @Autowired - private FormFieldRepository formFieldRepository; + @Autowired + private FormFieldRepository formFieldRepository; - @Autowired - private FormFieldService formFieldService; + public FormFieldEntity convertFormFieldRequestToFormFieldEntity(FormFieldRequest formFieldRequest) { + FormFieldEntity formFieldEntity = new FormFieldEntity(); + formFieldEntity.setLabel(formFieldRequest.getLabel()); + formFieldEntity.setName(formFieldRequest.getName()); + formFieldEntity.setValidators(Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); + formFieldEntity.setSettings(setSettingRequestBean(formFieldRequest.getSettings())); + formFieldEntity = saveFormFieldEntity(formFieldEntity); + return formFieldEntity; + } + public FormFieldResponseBean convertFormFieldEntityToFormFieldResponseBean(FormFieldEntity formFieldEntity) { + FormFieldResponseBean formFieldResponseBean = new FormFieldResponseBean(); + formFieldResponseBean.setId(formFieldEntity.getId()); + formFieldResponseBean.setName(formFieldEntity.getName()); + formFieldResponseBean + .setSettings(Utils.convertJsonStringToList(formFieldEntity.getSettings(), SettingResponseBean.class)); + formFieldResponseBean.setLabel(formFieldEntity.getLabel()); + formFieldResponseBean.setValidators(Utils.convertIntoJson(formFieldEntity.getValidators())); + return formFieldResponseBean; + } - public FormFieldEntity convertFormFieldRequestToFormFieldEntity(FormFieldRequest formFieldRequest) { - FormFieldEntity formFieldEntity = new FormFieldEntity(); - formFieldEntity.setLabel(formFieldRequest.getLabel()); - formFieldEntity.setName(formFieldRequest.getName()); - formFieldEntity.setValidators(Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); - formFieldEntity.setSettings(setSettingRequestBean(formFieldRequest.getSettings())); - formFieldEntity = saveFormFieldEntity(formFieldEntity); - return formFieldEntity; - } + public FormFieldEntity saveFormFieldEntity(FormFieldEntity formFieldEntity) { + formFieldEntity = formFieldRepository.save(formFieldEntity); + return formFieldEntity; + } - public FormFieldResponseBean convertFormFieldEntityToFormFieldResponseBean(FormFieldEntity formFieldEntity) { - FormFieldResponseBean formFieldResponseBean = new FormFieldResponseBean(); - formFieldResponseBean.setId(formFieldEntity.getId()); - formFieldResponseBean.setName(formFieldEntity.getName()); - formFieldResponseBean.setSettings(Utils.convertJsonStringToList(formFieldEntity.getSettings(), SettingResponseBean.class)); - formFieldResponseBean.setLabel(formFieldEntity.getLabel()); - formFieldResponseBean.setValidators(Utils.convertIntoJson(formFieldEntity.getValidators())); - return formFieldResponseBean; - } + public void validateFormField(FormFieldRequest formFieldRequest) { + if (formFieldRequest.getSettings() == null || formFieldRequest.getLabel() == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM_FIELD)); + } + } - public FormFieldEntity saveFormFieldEntity(FormFieldEntity formFieldEntity) { - formFieldEntity = formFieldRepository.save(formFieldEntity); - return formFieldEntity; - } + public FormFieldResponseBean createFormField(FormFieldRequest formFieldRequest) { + validateFormField(formFieldRequest); + FormFieldEntity formFieldEntity = convertFormFieldRequestToFormFieldEntity(formFieldRequest); + return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); + } - public void validateFormField(FormFieldRequest formFieldRequest) { - if (formFieldRequest.getSettings() == null || formFieldRequest.getLabel() == null) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM_FIELD)); - } - } - public FormFieldResponseBean createFormField(FormFieldRequest formFieldRequest){ - validateFormField(formFieldRequest); - FormFieldEntity formFieldEntity=convertFormFieldRequestToFormFieldEntity(formFieldRequest); - return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); - } - public FormFieldResponseBean updateFormField(Long formFieldId,FormFieldRequest formFieldRequest){ - FormFieldEntity formFieldEntity = formFieldService.getFormFieldEntityById(formFieldId); - Utils.setIfUpdated(formFieldEntity::getName,formFieldEntity::setName,formFieldRequest.getName()); - Utils.setIfUpdated(formFieldEntity::getLabel,formFieldEntity::setLabel,formFieldRequest.getLabel()); - Utils.setIfUpdated(formFieldEntity::getSettings,formFieldEntity::setSettings,setSettingRequestBean(formFieldRequest.getSettings())); - Utils.setIfUpdated(formFieldEntity::getValidators,formFieldEntity::setValidators,Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); - formFieldEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formFieldEntity=saveFormFieldEntity(formFieldEntity); - return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); - } - public FormFieldEntity getFormFieldEntity(Long formFieldId) { - FormFieldEntity formFieldEntity=formFieldRepository.findById(formFieldId) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FORM_FIELD_NOT_FOUND))); - return formFieldEntity; - } + public FormFieldResponseBean updateFormField(Long formFieldId, FormFieldRequest formFieldRequest) { + FormFieldEntity formFieldEntity = validateFormField(formFieldId); + Utils.setIfUpdated(formFieldEntity::getName, formFieldEntity::setName, formFieldRequest.getName()); + Utils.setIfUpdated(formFieldEntity::getLabel, formFieldEntity::setLabel, formFieldRequest.getLabel()); + Utils.setIfUpdated(formFieldEntity::getSettings, formFieldEntity::setSettings, + setSettingRequestBean(formFieldRequest.getSettings())); + Utils.setIfUpdated(formFieldEntity::getValidators, formFieldEntity::setValidators, + Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); + formFieldEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formFieldEntity = saveFormFieldEntity(formFieldEntity); + return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); + } - public FormFieldResponseBean getFormFieldEntityById(Long formFieldId) { - FormFieldEntity formEntity = formFieldService.getFormFieldEntityById(formFieldId); - return convertFormFieldEntityToFormFieldResponseBean(formEntity); - } - public void deleteFormById(Long formFieldId){ - FormFieldEntity formEntity=formFieldService.getFormFieldEntityById(formFieldId); - formFieldRepository.delete(formEntity); - } - public String setSettingRequestBean(List settingRequestBeans){ - return Utils.convertListToJsonString(settingRequestBeans); - } - public List getAllFormField(){ - List formFieldEntities=formFieldRepository.findAll(); - List formFieldResponseBeans = formFieldEntities.stream() - .map(req -> convertFormFieldEntityToFormFieldResponseBean(req)).collect(Collectors.toList()); - return formFieldResponseBeans; - } + public FormFieldEntity validateFormField(Long formFieldId) { + FormFieldEntity formFieldEntity = formFieldRepository.findById(formFieldId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.FORM_FIELD_NOT_FOUND))); + return formFieldEntity; + } + + public FormFieldResponseBean getFormFieldEntityById(Long formFieldId) { + FormFieldEntity formEntity = validateFormField(formFieldId); + return convertFormFieldEntityToFormFieldResponseBean(formEntity); + } + + public void deleteFormById(Long formFieldId) { + FormFieldEntity formEntity = validateFormField(formFieldId); + formFieldRepository.delete(formEntity); + } + + public String setSettingRequestBean(List settingRequestBeans) { + return Utils.convertListToJsonString(settingRequestBeans); + } + + public List getAllFormField() { + List formFieldEntities = formFieldRepository.findAll(); + List formFieldResponseBeans = formFieldEntities.stream() + .map(req -> convertFormFieldEntityToFormFieldResponseBean(req)).collect(Collectors.toList()); + return formFieldResponseBeans; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java index e9bb787c..2042f2fa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormTemplateDao.java @@ -8,7 +8,6 @@ import net.gepafin.tendermanagement.model.request.FormTemplateRequest; import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormTemplateResponseBean; import net.gepafin.tendermanagement.repositories.FormTemplateRepository; -import net.gepafin.tendermanagement.service.FormTemplateService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -24,72 +23,80 @@ import java.util.stream.Collectors; @Component public class FormTemplateDao { - @Autowired - private FormTemplateRepository formTemplateRepository; + @Autowired + private FormTemplateRepository formTemplateRepository; - @Autowired - private FormTemplateService formTemplateService; + public FormTemplateEntity convertFormTemplateRequestToFormTemplateRequest(FormTemplateRequest formTemplateRequest) { + FormTemplateEntity formTemplateEntity = new FormTemplateEntity(); + formTemplateEntity.setContent(setContentResponseBean(formTemplateRequest.getContent())); + formTemplateEntity.setLabel(formTemplateRequest.getLabel()); + formTemplateEntity = saveFormTemplateEntity(formTemplateEntity); + return formTemplateEntity; + } + public FormTemplateEntity saveFormTemplateEntity(FormTemplateEntity formTemplateEntity) { + formTemplateEntity = formTemplateRepository.save(formTemplateEntity); + return formTemplateEntity; + } - public FormTemplateEntity convertFormTemplateRequestToFormTemplateRequest(FormTemplateRequest formTemplateRequest){ - FormTemplateEntity formTemplateEntity=new FormTemplateEntity(); - formTemplateEntity.setContent(setContentResponseBean(formTemplateRequest.getContent())); - formTemplateEntity.setLabel(formTemplateRequest.getLabel()); - formTemplateEntity=saveFormTemplateEntity(formTemplateEntity); - return formTemplateEntity; - } - public FormTemplateEntity saveFormTemplateEntity(FormTemplateEntity formTemplateEntity){ - formTemplateEntity=formTemplateRepository.save(formTemplateEntity); - return formTemplateEntity; - } - public FormTemplateResponseBean convertFormTemplateEntityToFormTemplateResponseBean(FormTemplateEntity formTemplateEntity){ - FormTemplateResponseBean formTemplateResponseBean=new FormTemplateResponseBean(); - formTemplateResponseBean.setId(formTemplateEntity.getId()); - formTemplateResponseBean.setContent(Utils.convertJsonStringToList(formTemplateEntity.getContent(), ContentResponseBean.class)); - formTemplateResponseBean.setLabel(formTemplateEntity.getLabel()); - return formTemplateResponseBean; - } + public FormTemplateResponseBean convertFormTemplateEntityToFormTemplateResponseBean( + FormTemplateEntity formTemplateEntity) { + FormTemplateResponseBean formTemplateResponseBean = new FormTemplateResponseBean(); + formTemplateResponseBean.setId(formTemplateEntity.getId()); + formTemplateResponseBean + .setContent(Utils.convertJsonStringToList(formTemplateEntity.getContent(), ContentResponseBean.class)); + formTemplateResponseBean.setLabel(formTemplateEntity.getLabel()); + return formTemplateResponseBean; + } - public FormTemplateResponseBean createFormTemplate(FormTemplateRequest formTemplateRequest){ - validateFormTemplate(formTemplateRequest); - FormTemplateEntity formTemplateEntity=convertFormTemplateRequestToFormTemplateRequest(formTemplateRequest); - return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); - } - public void validateFormTemplate(FormTemplateRequest formTemplateRequest){ - if(formTemplateRequest.getContent()==null || formTemplateRequest.getLabel()==null ){ - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM_TEMPLATE)); - } - } - public FormTemplateResponseBean updateFormTemplate(Long formTemplateId,FormTemplateRequest formTemplateRequest){ - FormTemplateEntity formTemplateEntity = formTemplateService.getFormEntityById(formTemplateId); - Utils.setIfUpdated(formTemplateEntity::getLabel,formTemplateEntity::setLabel,formTemplateRequest.getLabel()); - Utils.setIfUpdated(formTemplateEntity::getContent,formTemplateEntity::setContent,setContentResponseBean(formTemplateRequest.getContent())); - formTemplateEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formTemplateEntity=saveFormTemplateEntity(formTemplateEntity); - return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); - } + public FormTemplateResponseBean createFormTemplate(FormTemplateRequest formTemplateRequest) { + validateFormTemplate(formTemplateRequest); + FormTemplateEntity formTemplateEntity = convertFormTemplateRequestToFormTemplateRequest(formTemplateRequest); + return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); + } - public FormTemplateEntity getFormTemplateEntity(Long formTemplateId) { - FormTemplateEntity formTemplateEntity = formTemplateRepository.findById(formTemplateId) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FORM_TEMPLATE_NOT_FOUND))); - return formTemplateEntity; - } + public void validateFormTemplate(FormTemplateRequest formTemplateRequest) { + if (formTemplateRequest.getContent() == null || formTemplateRequest.getLabel() == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM_TEMPLATE)); + } + } - public FormTemplateResponseBean getFormTemplateEntityById(Long formTemplateId) { - FormTemplateEntity formTemplateEntity = formTemplateService.getFormEntityById(formTemplateId); - return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); - } - public void deleteFormTemplateById(Long formTemplateId){ - FormTemplateEntity formTemplateEntity=formTemplateService.getFormEntityById(formTemplateId); - formTemplateRepository.delete(formTemplateEntity); - } - public String setContentResponseBean(List contentRequestBeans){ - return Utils.convertListToJsonString(contentRequestBeans); - } - public List getAllFormTemplate(){ - List formTemplateEntities=formTemplateRepository.findAll(); - List formTemplateResponseBeans=formTemplateEntities.stream() - .map(req -> convertFormTemplateEntityToFormTemplateResponseBean(req)).collect(Collectors.toList()); - return formTemplateResponseBeans; - } + public FormTemplateResponseBean updateFormTemplate(Long formTemplateId, FormTemplateRequest formTemplateRequest) { + FormTemplateEntity formTemplateEntity = validateFormTemplate(formTemplateId); + Utils.setIfUpdated(formTemplateEntity::getLabel, formTemplateEntity::setLabel, formTemplateRequest.getLabel()); + Utils.setIfUpdated(formTemplateEntity::getContent, formTemplateEntity::setContent, + setContentResponseBean(formTemplateRequest.getContent())); + formTemplateEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formTemplateEntity = saveFormTemplateEntity(formTemplateEntity); + return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); + } + + public FormTemplateEntity validateFormTemplate(Long formTemplateId) { + FormTemplateEntity formTemplateEntity = formTemplateRepository.findById(formTemplateId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.FORM_TEMPLATE_NOT_FOUND))); + return formTemplateEntity; + } + + public FormTemplateResponseBean getFormTemplateEntityById(Long formTemplateId) { + FormTemplateEntity formTemplateEntity = validateFormTemplate(formTemplateId); + return convertFormTemplateEntityToFormTemplateResponseBean(formTemplateEntity); + } + + public void deleteFormTemplateById(Long formTemplateId) { + FormTemplateEntity formTemplateEntity = validateFormTemplate(formTemplateId); + formTemplateRepository.delete(formTemplateEntity); + } + + public String setContentResponseBean(List contentRequestBeans) { + return Utils.convertListToJsonString(contentRequestBeans); + } + + public List getAllFormTemplate() { + List formTemplateEntities = formTemplateRepository.findAll(); + List formTemplateResponseBeans = formTemplateEntities.stream() + .map(req -> convertFormTemplateEntityToFormTemplateResponseBean(req)).collect(Collectors.toList()); + return formTemplateResponseBeans; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java index 4d6c8455..0c700b00 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java @@ -35,23 +35,24 @@ public class LookUpDataDao { lookUpDataRepository.save(entity); return entity; } - + public void validateLookUpDataEntity(LookUpDataEntity entity) { if (entity.getValue() == null || entity.getValue().trim().isEmpty()) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.VALUE_CANNOT_BE_EMPTY)); } } - - - public LookUpDataResponseBean getLookUpDataById(Long id) { - return lookUpDataRepository.findById(id) - .map(this::convertLookUpDataEntityToResponseBean) + + public LookUpDataEntity validateLookUpData(Long id) { + return lookUpDataRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); } + public LookUpDataResponseBean getLookUpDataById(Long id) { + return convertLookUpDataEntityToResponseBean(validateLookUpData(id)); + } + public LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq) { - LookUpDataEntity entity = lookUpDataRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + LookUpDataEntity entity = validateLookUpData(id); entity.setTitle(lookUpDataReq.getTitle()); entity.setType(lookUpDataReq.getType().getValue()); entity.setValue(lookUpDataReq.getValue()); @@ -60,8 +61,7 @@ public class LookUpDataDao { } public void deleteLookUpData(Long id) { - LookUpDataEntity entity = lookUpDataRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.LOOKUP_DATA_NOT_FOUND))); + LookUpDataEntity entity = validateLookUpData(id); lookUpDataRepository.deleteById(entity.getId()); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index b3e93971..ef80acbb 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -32,7 +32,7 @@ public class RoleDao { @Autowired private RegionDao regionDao; - private RoleEntity roleEntity; + public RoleResponseBean createRole(RoleReq roleReq) { log.info("Creating new role with details: {}", roleReq); RoleEntity roleEntity = convertRoleRequestToRoleEntity(roleReq); @@ -53,7 +53,7 @@ public class RoleDao { } public RoleResponseBean convertRoleEntityToRoleResponse(RoleEntity roleEntity) { - this.roleEntity = roleEntity; + RoleResponseBean roleResponseBean = new RoleResponseBean(); roleResponseBean.setId(roleEntity.getId()); roleResponseBean.setCreatedDate(roleEntity.getCreatedDate()); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java index 00c07a25..e655f6bb 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LogoutReq.java @@ -1,7 +1,5 @@ package net.gepafin.tendermanagement.model.request; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import lombok.Data; @Data diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java index d078155c..1fd415ee 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/RegionReq.java @@ -1,15 +1,11 @@ package net.gepafin.tendermanagement.model.request; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; import net.gepafin.tendermanagement.enums.RegionStatusEnum; import java.math.BigDecimal; -@Getter -@Setter +@Data public class RegionReq { private String regionName; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java index 54841e9b..7dacab15 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -4,12 +4,9 @@ import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; -import net.gepafin.tendermanagement.enums.UserStatusEnum; +import lombok.Data; -@Getter -@Setter +@Data public class UserReq { @NotBlank diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java index 0be2957d..7e3ebce1 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java @@ -1,7 +1,6 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; -import net.gepafin.tendermanagement.model.BaseBean; import java.util.List; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java index 23a4088a..2a5459a4 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RegionResponseBean.java @@ -1,27 +1,24 @@ package net.gepafin.tendermanagement.model.response; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; import net.gepafin.tendermanagement.enums.RegionStatusEnum; import net.gepafin.tendermanagement.model.BaseBean; import java.math.BigDecimal; -import java.time.LocalDateTime; -@Getter -@Setter +@Data public class RegionResponseBean extends BaseBean { - private String regionName; - private String description; - private String country; - private RegionStatusEnum status; - private String priorityArea; - private Long population; - private BigDecimal areaSize; - private BigDecimal gdp; - private BigDecimal unemploymentRate; - private BigDecimal infrastructureScore; - private BigDecimal educationLevel; - private BigDecimal healthcareAccess; - private BigDecimal environmentalScore; + private String regionName; + private String description; + private String country; + private RegionStatusEnum status; + private String priorityArea; + private Long population; + private BigDecimal areaSize; + private BigDecimal gdp; + private BigDecimal unemploymentRate; + private BigDecimal infrastructureScore; + private BigDecimal educationLevel; + private BigDecimal healthcareAccess; + private BigDecimal environmentalScore; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java index 93917e99..0f0cda0d 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java @@ -1,12 +1,8 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; -import lombok.Getter; -import lombok.Setter; -import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.model.BaseBean; -import java.time.LocalDateTime; import java.util.List; @Data diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java index f23b6978..5c1a8ef2 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java @@ -1,11 +1,7 @@ package net.gepafin.tendermanagement.model.response; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; -import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.BaseBean; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java index 7c1faaad..6ceec35f 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.repositories; -import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.entities.FaqEntity; import java.util.List; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java index 3d3d6d70..67edec0a 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/LookUpDataRepository.java @@ -5,7 +5,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; -import java.util.Optional; @Repository public interface LookUpDataRepository extends JpaRepository { diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 4e52e945..cc961ba5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -5,13 +5,11 @@ import java.util.List; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; -import net.gepafin.tendermanagement.model.response.UserResponseBean; public interface CallService { @@ -25,10 +23,12 @@ public interface CallService { List getAllCalls(); - CallResponse validateCall(Long callId); + CallResponse validateCallData(Long callId); - public CallEntity getCallEntityById(Long id); + CallEntity getCallEntityById(Long id); CallResponse updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum statusReq); + + CallEntity validateCall(Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java b/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java index 94c67190..87261dfe 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FormFieldService.java @@ -17,7 +17,7 @@ public interface FormFieldService { public void deleteFormField(HttpServletRequest request, Long formFieldId); - public FormFieldEntity getFormFieldEntityById(Long id); + public FormFieldEntity validateFormField(Long id); public List getAllFormField(HttpServletRequest request); diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormService.java b/src/main/java/net/gepafin/tendermanagement/service/FormService.java index 743b4b36..7945c753 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FormService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FormService.java @@ -17,7 +17,7 @@ public interface FormService { public void deleteForm(HttpServletRequest request, Long formId); - public FormEntity getFormEntityById(Long id); + public FormEntity validateForm(Long id); public List getFormsByCallId(HttpServletRequest request,Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java b/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java index 7f69ae2e..c50cd8c6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FormTemplateService.java @@ -17,7 +17,7 @@ public interface FormTemplateService { public void deleteFormTemplate(HttpServletRequest request, Long formTemplateId); - public FormTemplateEntity getFormEntityById(Long id); + public FormTemplateEntity validateFormTemplate(Long id); public List getAllFormTemplate(HttpServletRequest request); diff --git a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java index 29c18203..1a3e448b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java @@ -19,4 +19,6 @@ public interface LookUpDataService { void validateLookUpDataEntity(LookUpDataEntity lookUpDataEntity); List getLookUpDataByType(List type); + + LookUpDataEntity validateLookUpData(Long lookUpDataId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/RegionService.java b/src/main/java/net/gepafin/tendermanagement/service/RegionService.java index 02551552..aba66fe5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/RegionService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/RegionService.java @@ -1,9 +1,7 @@ package net.gepafin.tendermanagement.service; -import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.model.request.RegionReq; import net.gepafin.tendermanagement.model.response.RegionResponseBean; -import net.gepafin.tendermanagement.model.request.UpdateRegionReq; import java.util.List; diff --git a/src/main/java/net/gepafin/tendermanagement/service/RoleService.java b/src/main/java/net/gepafin/tendermanagement/service/RoleService.java index d0da5c48..6c9c519d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/RoleService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/RoleService.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.service; -import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.RoleReq; import net.gepafin.tendermanagement.model.response.RoleResponseBean; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 62ead6f2..bf853124 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -9,7 +9,6 @@ import net.gepafin.tendermanagement.dao.RoleDao; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.LoginReq; -import net.gepafin.tendermanagement.model.request.LogoutReq; import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index bbf15bbb..85b3086d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -64,18 +64,24 @@ public class CallServiceImpl implements CallService { @Override @Transactional(rollbackFor = Exception.class) - public CallResponse validateCall(Long callId) { - return callDao.validateCall(callDao.validateCall(callId)); + public CallResponse validateCallData(Long callId) { + return callDao.validateCallData(callDao.validateCall(callId)); } @Override public CallEntity getCallEntityById(Long id){ return callDao.getCallEntityById(id); } + @Override @Transactional(rollbackFor = Exception.class) public CallResponse updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum statusReq) { return callDao.updateCallStatus(callId, statusReq); } + + @Override + public CallEntity validateCall(Long callId) { + return callDao.validateCall(callId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java index 07b7bdcc..37741e6e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormFieldServiceImpl.java @@ -39,8 +39,8 @@ public class FormFieldServiceImpl implements FormFieldService { } @Override - public FormFieldEntity getFormFieldEntityById(Long id) { - return formFieldDao.getFormFieldEntity(id); + public FormFieldEntity validateFormField(Long id) { + return formFieldDao.validateFormField(id); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java index 378a4dce..b8c9ab39 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java @@ -39,8 +39,8 @@ public class FormServiceImpl implements FormService { } @Override - public FormEntity getFormEntityById(Long id) { - return formDao.getFormEntity(id); + public FormEntity validateForm(Long id) { + return formDao.validateForm(id); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java index a4bf1cdf..f594cf20 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormTemplateServiceImpl.java @@ -38,8 +38,8 @@ public class FormTemplateServiceImpl implements FormTemplateService { } @Override - public FormTemplateEntity getFormEntityById(Long id) { - return formTemplateDao.getFormTemplateEntity(id); + public FormTemplateEntity validateFormTemplate(Long id) { + return formTemplateDao.validateFormTemplate(id); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java index f6381e59..420e4372 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java @@ -44,4 +44,9 @@ public class LookUpDataServiceImpl implements LookUpDataService { public List getLookUpDataByType( List type) { return lookUpDataDao.getLookUpDataByTypes(type); } + + @Override + public LookUpDataEntity validateLookUpData(Long lookUpDataId) { + return lookUpDataDao.validateLookUpData(lookUpDataId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 78c19c8d..357176db 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -3,7 +3,6 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; import net.gepafin.tendermanagement.enums.CallStatusEnum; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -116,7 +115,7 @@ public interface CallApi { }) @PostMapping(value = "/validate/{callId}", produces = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - public ResponseEntity> validateCall(HttpServletRequest request, + public ResponseEntity> validateCallData(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId); @Operation(summary = "Api to update call status", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java index c102f42a..4274cccb 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java @@ -44,7 +44,7 @@ public interface EvaluationCriteriaApi { @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> getEvaluationCriteriaById(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) - @PathVariable Long id); + @PathVariable("id") Long id); @Operation(summary = "API to update evaluation criteria", responses = { @@ -59,7 +59,7 @@ public interface EvaluationCriteriaApi { @PutMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> updateEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) - @PathVariable Long id, + @PathVariable("id") Long id, @Parameter(description = "Evaluation criteria request object", required = true) @Valid @RequestBody EvaluationCriteriaRequest evaluationCriteriaRequest); @@ -74,5 +74,5 @@ public interface EvaluationCriteriaApi { @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) - @PathVariable Long id); + @PathVariable("id") Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java index 2d76f286..e174621d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java @@ -24,7 +24,7 @@ public interface FaqApi { }) @PostMapping(value = "/call/{callId}", consumes = "application/json", produces = "application/json") ResponseEntity> createFaq(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) - @PathVariable Long id, @Valid @RequestBody FaqReq faqRequest); + @PathVariable("callId") Long callId, @Valid @RequestBody FaqReq faqRequest); @Operation(summary = "API to get FAQ by id", responses = { @@ -33,7 +33,7 @@ public interface FaqApi { }) @GetMapping(value = "/{id}", produces = "application/json") ResponseEntity> getFaqById(HttpServletRequest request, - @PathVariable Long id); + @PathVariable("id") Long id); @Operation(summary = "API to update FAQ", responses = { @@ -43,7 +43,7 @@ public interface FaqApi { }) @PutMapping(value = "/{id}", consumes = "application/json", produces = "application/json") ResponseEntity> updateFaq(HttpServletRequest request, - @PathVariable Long id, + @PathVariable("id") Long id, @Valid @RequestBody FaqReq faqRequest); @Operation(summary = "API to delete FAQ", @@ -53,5 +53,5 @@ public interface FaqApi { }) @DeleteMapping(value = "/{id}") ResponseEntity> deleteFaq(HttpServletRequest request, - @PathVariable Long id); + @PathVariable("id") Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java index 5a2cd19f..d4044016 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LookUpDataApi.java @@ -41,7 +41,7 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @GetMapping(value = "/{id}", produces = "application/json") - ResponseEntity> getLookUpDataById(HttpServletRequest request, @PathVariable Long id); + ResponseEntity> getLookUpDataById(HttpServletRequest request, @PathVariable("id") Long id); @Operation(summary = "Api to update LookUp Data", responses = { @@ -53,7 +53,7 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @PutMapping(value = "/{id}", consumes = "application/json", produces = "application/json") - ResponseEntity> updateLookUpData(HttpServletRequest request, @PathVariable Long id, @Valid @RequestBody LookUpDataRequest lookUpDataReq); + ResponseEntity> updateLookUpData(HttpServletRequest request, @PathVariable("id") Long id, @Valid @RequestBody LookUpDataRequest lookUpDataReq); @Operation(summary = "Api to delete LookUp Data", responses = { @@ -65,7 +65,7 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @DeleteMapping(value = "/{id}") - ResponseEntity> deleteLookUpData(HttpServletRequest request, @PathVariable Long id); + ResponseEntity> deleteLookUpData(HttpServletRequest request, @PathVariable("id") Long id); @Operation(summary = "Api to get LookUp Data by type", responses = { @@ -77,5 +77,5 @@ public interface LookUpDataApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @GetMapping(value = "/type", produces = "application/json") - ResponseEntity>> getLookUpDataByType(HttpServletRequest request, @RequestParam List types); + ResponseEntity>> getLookUpDataByType(HttpServletRequest request, @RequestParam("type") List types); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java index d49924a0..3876250f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RegionApi.java @@ -1,10 +1,7 @@ package net.gepafin.tendermanagement.web.rest.api; -import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.model.request.RegionReq; import net.gepafin.tendermanagement.model.response.RegionResponseBean; -import net.gepafin.tendermanagement.model.request.UpdateRegionReq; -import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.Response; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java index 04bff191..fbee0b1e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/RoleApi.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.web.rest.api; -import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.RoleReq; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.Response; diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index fcf6b41e..8eaeca2d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -8,10 +8,8 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; -import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; @@ -23,7 +21,6 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; @Validated public interface UserApi { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 9885aa84..34ea5fd6 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -7,9 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; @@ -75,8 +73,8 @@ public class CallApiController implements CallApi { } @Override - public ResponseEntity> validateCall(HttpServletRequest request, Long callId) { - CallResponse call = callService.validateCall(callId); + public ResponseEntity> validateCallData(HttpServletRequest request, Long callId) { + CallResponse call = callService.validateCallData(callId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(call, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java index 7345d13e..71f60387 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java @@ -1,12 +1,8 @@ package net.gepafin.tendermanagement.web.rest.api.impl; -import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.repositories.UserRepository; -import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; -import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java index c64258e5..b3f3a4bf 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RegionApiController.java @@ -3,10 +3,8 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.validation.Valid; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.model.request.RegionReq; import net.gepafin.tendermanagement.model.response.RegionResponseBean; -import net.gepafin.tendermanagement.model.request.UpdateRegionReq; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.RegionService; import net.gepafin.tendermanagement.web.rest.api.RegionApi; diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java index 4f4c5633..284552ba 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/RoleApiController.java @@ -4,7 +4,6 @@ import java.util.List; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.model.request.RoleReq; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.util.Response; diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index b42c869d..d036a7f0 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -4,12 +4,9 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; @@ -24,7 +21,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/user}") @@ -32,8 +28,7 @@ import java.util.List; public class UserApiController implements UserApi { private final Logger log = LoggerFactory.getLogger(UserApiController.class); - @Autowired - private TokenProvider tokenProvider; + @Autowired private UserService userService; From e51c86806a9121c9e461ed2fbf459406b7ddce51 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 4 Sep 2024 14:44:33 +0530 Subject: [PATCH 065/145] updated form field data --- .../db/changelog/db.changelog-1.0.0.xml | 9 ++ .../update_form_field_data_04_09_2024.sql | 110 ++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 src/main/resources/db/dump/update_form_field_data_04_09_2024.sql diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 3e221a3a..58cddda8 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -539,5 +539,14 @@ + + + + TRUNCATE TABLE FORM_FIELD RESTART IDENTITY; + + + + diff --git a/src/main/resources/db/dump/update_form_field_data_04_09_2024.sql b/src/main/resources/db/dump/update_form_field_data_04_09_2024.sql new file mode 100644 index 00000000..fbf9b951 --- /dev/null +++ b/src/main/resources/db/dump/update_form_field_data_04_09_2024.sql @@ -0,0 +1,110 @@ +INSERT INTO FORM_FIELD (NAME, LABEL, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) VALUES +( + 'textinput', + 'Text Input', + '[ + {"name": "label", "value": "Text input"}, + {"name": "placeholder", "value": "Placeholder text"} + ]', + '{ + "isRequired": false, + "minLength": null, + "maxLength": null, + "pattern": null, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +), +( + 'textarea', + 'Text Area', + '[ + {"name": "label", "value": "Text area"}, + {"name": "placeholder", "value": "Placeholder text"} + ]', + '{ + "isRequired": false, + "minLength": null, + "maxLength": null, + "pattern": null, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +), +( + 'numberinput', + 'Number Input', + '[ + {"name": "label", "value": "Number"}, + {"name": "placeholder", "value": 0} + ]', + '{ + "isRequired": false, + "min": null, + "max": null, + "pattern": null, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +), +( + 'textinput', + 'P.IVA', + '[ + {"name": "label", "value": "P.IVA"}, + {"name": "placeholder", "value": "Insert p.iva number"} + ]', + '{ + "isRequired": true, + "minLength": null, + "maxLength": null, + "pattern": null, + "custom": "isValidVAT" + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +), +( + 'radio', + 'Radio Input', + '[ + {"name": "label", "value": "Radio input"}, + {"name": "options", "value": []} + ]', + '{ + "isRequired": false, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +), +( + 'select', + 'Select', + '[ + {"name": "label", "value": "Select"}, + {"name": "options", "value": []} + ]', + '{ + "isRequired": false, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +), +( + 'datepicker', + 'Datepicker', + '[ + {"name": "label", "value": "Datepicker"} + ]', + '{ + "isRequired": false, + "custom": null + }', + '2024-08-30T09:50:31.926Z', + '2024-08-30T09:50:31.926Z' +); From 286baa9c218d830ae3558375ad9466167cdbcc31 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 4 Sep 2024 19:21:32 +0530 Subject: [PATCH 066/145] Refactored code for faq --- .../gepafin/tendermanagement/dao/CallDao.java | 171 ++---------------- .../gepafin/tendermanagement/dao/FaqDao.java | 123 +++++++------ .../tendermanagement/dao/LookUpDataDao.java | 18 ++ .../tendermanagement/entities/FaqEntity.java | 17 +- .../entities/LookUpDataEntity.java | 5 +- .../model/request/FaqReq.java | 10 +- .../model/request/LookUpDataReq.java | 4 + .../model/response/FaqResponseBean.java | 18 +- .../repositories/FaqRepository.java | 3 +- .../tendermanagement/service/FaqService.java | 11 ++ .../service/LookUpDataService.java | 4 + .../service/impl/FaqServiceImpl.java | 30 ++- .../service/impl/LookUpDataServiceImpl.java | 7 + .../tendermanagement/util/Validator.java | 11 ++ .../db/changelog/db.changelog-1.0.0.xml | 16 ++ 15 files changed, 203 insertions(+), 245 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 265061dc..ae87ecf2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -4,10 +4,10 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.service.FaqService; import net.gepafin.tendermanagement.service.LookUpDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -38,11 +38,9 @@ import net.gepafin.tendermanagement.repositories.CallTargetAudienceChecklistRepo import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; import net.gepafin.tendermanagement.repositories.FaqRepository; -import net.gepafin.tendermanagement.repositories.LookUpDataRepository; import net.gepafin.tendermanagement.repositories.RegionRepository; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.impl.CallValidatorServiceImpl; -import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -66,28 +64,29 @@ public class CallDao { @Autowired private RegionRepository regionRepository; + @Autowired private LookUpDataService lookUpDataService; - @Autowired - private LookUpDataRepository lookUpDataRepository; @Autowired private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; @Autowired private UserService userService; + + @Autowired + private FaqService faqService; public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { UserEntity userEntity = userService.validateUser(userId); createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId()); CallEntity callEntity = convertToCallEntity(createCallRequest); - convertToFaqEntities(createCallRequest.getFaq(), callEntity, userEntity,LookUpDataTypeEnum.FAQ); + + updateFaq(createCallRequest.getFaq(), callEntity, userEntity,LookUpDataTypeEnum.FAQ); + convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, LookUpDataTypeEnum.AIMED_TO); -// createCallResponseBean = assembleCreateCallResponseBean(callEntity, Collections.emptyList(), -// Collections.emptyList(), faqEntities, Collections.emptyList()); -// createCallResponseBean.setAimedTo(amiedTo); -// createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); + CallResponse createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); return createCallResponseBean; @@ -149,7 +148,7 @@ public class CallDao { private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, CallEntity callEntity, LookUpDataTypeEnum type) { EvaluationCriteriaEntity criteriaEntity = null; - LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(criteriaReq, type); + LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(criteriaReq, type); if (criteriaReq.getId() != null && criteriaReq.getId() > 0) { criteriaEntity = evaluationCriteriaRepository.findById(criteriaReq.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, @@ -201,11 +200,11 @@ public class CallDao { return documentEntity; } - public List convertToFaqEntities(List faqReqList, CallEntity callEntity, UserEntity userEntity, LookUpDataTypeEnum type) { + public List updateFaq(List faqReqList, CallEntity callEntity, UserEntity userEntity, LookUpDataTypeEnum type) { if (faqReqList == null) { return null; } - List existingFaqEntities = faqRepository.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue()); + List existingFaqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); List incomingIds = faqReqList.stream() .map(FaqReq::getId) .filter(id -> id != null && id > 0) @@ -214,42 +213,12 @@ public class CallDao { .filter(entity -> !incomingIds.contains(entity.getId())) .forEach(this::softDeleteFaq); List faqEntities = faqReqList.stream() - .map(req -> convertToFaqEntity(req, callEntity, userEntity, type)) + .map(req -> faqService.createOrUpdateFaqEntity(req, callEntity, userEntity, type)) .collect(Collectors.toList()); - faqRepository.saveAll(faqEntities); return faqEntities; } - public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity,LookUpDataTypeEnum type) { - FaqEntity faqEntity = new FaqEntity(); - LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(faqReq, type); - validateFaqEntity(faqReq.getQuestion()); - faqEntity.setUser(userEntity); - faqEntity.setIsVisible(false); - faqEntity.setLookupData(lookupDataEntity); - if (faqReq.getIsVisible() != null) { - faqEntity.setIsVisible(faqReq.getIsVisible()); - } - faqEntity.setQuestionShort(faqReq.getQuestionShort()); - faqEntity.setQuestion(faqReq.getQuestion()); - if (faqReq.getResponse() != null || faqReq.getResponseShort() != null) { - faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - } - faqEntity.setResponseShort(faqReq.getResponseShort()); - faqEntity.setResponse(faqReq.getResponse()); - faqEntity.setCall(callEntity); - faqEntity.setIsDeleted(false); - return faqEntity; - } - - public void validateFaqEntity(String question) { - if (!StringUtils.hasText(question)) { - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.QUESTION_NOT_EMPTY_MSG)); - } - } - public void validateDocumentEntity(Long documentId) { if (documentId == null || documentId < 1) { throw new CustomValidationException(Status.VALIDATION_ERROR, @@ -264,26 +233,6 @@ public class CallDao { } } -// public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { -// if (createCallRequest.getRegionId() == null) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, -// Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); -// } -// -// if (createCallRequest.getAmount().compareTo(BigDecimal.ZERO) <= 0 -// || createCallRequest.getAmountMax().compareTo(BigDecimal.ZERO) <= 0) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, -// Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); -// } -// if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) -// || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest -// .getStartDate().toLocalDate().isAfter(createCallRequest.getEndDate().toLocalDate())) { -// throw new CustomValidationException(Status.VALIDATION_ERROR, -// Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); -// } -// -// } - public CallResponse convertToCallResponseBean(CallEntity callEntity) { CallResponse createCallResponseBean = new CallResponse(); createCallResponseBean.setId(callEntity.getId()); @@ -332,26 +281,9 @@ public class CallDao { return responseBean; } - public FaqResponseBean convertToFaqResponseBean(FaqEntity entity) { - FaqResponseBean responseBean = new FaqResponseBean(); - responseBean.setId(entity.getId()); - responseBean.setLookUpDataId(entity.getLookupData().getId()); - responseBean.setValue(entity.getLookupData().getValue()); - responseBean.setTitle(entity.getLookupData().getTitle()); - responseBean.setQuestionShort(entity.getQuestionShort()); - responseBean.setResponseShort(entity.getResponseShort()); - responseBean.setResponse(entity.getResponse()); - responseBean.setQuestion(entity.getQuestion()); - responseBean.setUserId(entity.getUser().getId()); - responseBean.setIsVisible(entity.getIsVisible()); - responseBean.setCreatedDate(entity.getCreatedDate()); - responseBean.setUpdatedDate(entity.getUpdatedDate()); - return responseBean; - } - public CallResponse assembleCreateCallResponseBean(CallEntity callEntity, - List evaluationCriteriaEntities, List documentEntities, - List faqEntities, List images) { + List evaluationCriteriaEntities, List documentEntities, + List images) { CallResponse callResponseBean = convertToCallResponseBean(callEntity); @@ -361,15 +293,12 @@ public class CallDao { List documentResponseBeans = documentEntities.stream() .map(this::convertToDocumentResponseBean).collect(Collectors.toList()); - List faqResponseBeans = faqEntities.stream().map(this::convertToFaqResponseBean) - .collect(Collectors.toList()); List imagesResponseBean = images.stream().map(this::convertToDocumentResponseBean) .collect(Collectors.toList()); CallResponse createCallResponseBean = callResponseBean; createCallResponseBean.setCriteria(evaluationCriteriaResponseBeans); createCallResponseBean.setDocs(documentResponseBeans); - createCallResponseBean.setFaq(faqResponseBeans); createCallResponseBean.setImages(imagesResponseBean); return createCallResponseBean; } @@ -380,7 +309,7 @@ public class CallDao { return null; } List lookUpDataEntities = lookUpData.stream() - .map(req -> convertLookUpDataRequestIntoLookUpDataEntity(req, type)).collect(Collectors.toList()); + .map(req -> lookUpDataService.getOrCreateLookUpDataEntity(req, type)).collect(Collectors.toList()); return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities); } @@ -401,21 +330,6 @@ public class CallDao { return lookUpDataResponses; } - private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, - LookUpDataEntity.LookUpDataTypeEnum type) { - if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { - LookUpDataEntity newEntity = new LookUpDataEntity(); - newEntity.setValue(req.getValue()); - newEntity.setType(type.getValue()); - lookUpDataService.validateLookUpDataEntity(newEntity); - return lookUpDataRepository.save(newEntity); - } - - return lookUpDataRepository.findById(req.getLookUpDataId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); - } - public LookUpDataResponse convertToLookUpDataResponseBean( CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { LookUpDataResponse lookUpDataResponse = new LookUpDataResponse(); @@ -528,62 +442,17 @@ public class CallDao { updateCallRequest.getDocumentationRequested()); setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); updateLookUpData(callEntity, updateCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO); - updateFaq(callEntity, updateCallRequest.getFaq(), userEntity, LookUpDataTypeEnum.FAQ); + updateFaq(updateCallRequest.getFaq(), callEntity, userEntity, LookUpDataTypeEnum.FAQ); CallResponse createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); return createCallResponseBean; } - private void updateFaq(CallEntity callEntity, List faqReqList, UserEntity userEntity, LookUpDataTypeEnum type) { - if (faqReqList == null) { - return; - } - List existingFaqs = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); - List incomingIds = faqReqList.stream().map(FaqReq::getId).filter(Objects::nonNull).filter(id -> id > 0) - .collect(Collectors.toList()); - existingFaqs.stream().filter(faq -> !incomingIds.contains(faq.getId())).forEach(this::softDeleteFaq); - faqReqList.forEach(faqReq -> createOrUpdateFaq(faqReq, callEntity, userEntity, type)); - - } - private void softDeleteFaq(FaqEntity faqEntity) { faqEntity.setIsDeleted(true); faqRepository.save(faqEntity); } - private void createOrUpdateFaq(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity, LookUpDataTypeEnum type) { - FaqEntity faqEntity = null; - - LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(faqReq, type); - - if (isExistingFaq(faqReq)) { - faqEntity = faqRepository.findById(faqReq.getId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); - } else { - faqEntity = new FaqEntity(); - faqEntity.setCall(callEntity); - faqEntity.setUser(userEntity); - faqEntity.setLookupData(lookupDataEntity); - faqEntity.setIsVisible(false); - faqEntity.setIsDeleted(false); - } - - if (Boolean.FALSE.equals(faqEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) { - faqEntity.setLookupData(lookupDataEntity); - } - setIfUpdated(faqEntity::getQuestionShort, faqEntity::setQuestionShort, faqReq.getQuestionShort()); - setIfUpdated(faqEntity::getQuestion, faqEntity::setQuestion, faqReq.getQuestion()); - setIfUpdated(faqEntity::getResponseShort, faqEntity::setResponseShort, faqReq.getResponseShort()); - setIfUpdated(faqEntity::getResponse, faqEntity::setResponse, faqReq.getResponse()); - setIfUpdated(faqEntity::getIsVisible, faqEntity::setIsVisible, faqReq.getIsVisible()); - faqRepository.save(faqEntity); - } - - private boolean isExistingFaq(FaqReq faqReq) { - return faqReq.getId() != null && faqReq.getId() > 0; - } - private void updateLookUpData(CallEntity callEntity, List lookupDataReqList, LookUpDataTypeEnum type) { if (lookupDataReqList == null) { return; @@ -601,7 +470,7 @@ public class CallDao { private void createOrUpdateCallTargetAudienceChecklist(LookUpDataReq lookUpDataReq, CallEntity callEntity, LookUpDataTypeEnum type) { CallTargetAudienceChecklistEntity checklistEntity = null; - LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(lookUpDataReq, type); + LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(lookUpDataReq, type); if (lookUpDataReq.getId() != null && lookUpDataReq.getId() > 0) { checklistEntity = callTargetAudienceChecklistRepository.findById(lookUpDataReq.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, @@ -656,7 +525,6 @@ public class CallDao { DocumentTypeEnum.DOCUMENT.getValue()); List imageEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentTypeEnum.IMAGES.getValue()); - List faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); List amiedTo = callTargetAudienceChecklistRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() .map(this::convertToLookUpDataResponseBean).toList(); @@ -668,7 +536,8 @@ public class CallDao { .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue()); CallResponse createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, - documentEntities, faqEntities, imageEntities); + documentEntities, imageEntities); + createCallResponseBean.setFaq(faqService.getFaqByCallId(callEntity.getId())); createCallResponseBean.setAimedTo(amiedTo); createCallResponseBean.setCheckList(checkList); return createCallResponseBean; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java index dcd60c65..482191e3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java @@ -6,18 +6,22 @@ import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.FaqEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.response.FaqResponseBean; import net.gepafin.tendermanagement.repositories.FaqRepository; import net.gepafin.tendermanagement.service.CallService; -import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.service.LookUpDataService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + import java.time.LocalDateTime; +import java.util.List; @Component public class FaqDao { @@ -25,77 +29,92 @@ public class FaqDao { @Autowired private FaqRepository faqRepository; - @Autowired - private UserService userService; - - @Autowired - private CallDao callDao; - @Autowired private CallService callService; + + @Autowired + private LookUpDataService lookUpDataService; - public FaqResponseBean createFaq(FaqReq faqRequest, Long userId, Long callId) { + public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId) { FaqEntity entity = new FaqEntity(); CallEntity callEntity = callService.validateCall(callId); - ; - UserEntity userEntity = userService.validateUser(userId); - entity = callDao.convertToFaqEntity(faqRequest, callEntity, userEntity, + entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity, LookUpDataEntity.LookUpDataTypeEnum.FAQ); faqRepository.save(entity); - return convertFaqEntityToResponseBean(entity); + return convertToFaqResponseBean(entity); } public FaqResponseBean getFaqById(Long id) { - return faqRepository.findById(id).map(this::convertFaqEntityToResponseBean) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + return convertToFaqResponseBean(validateFaq(id)); } - public FaqResponseBean updateFaq(Long id, FaqReq faqRequest, Long userId) { - FaqEntity entity = faqRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); - updateFaqEntity(entity, faqRequest, userId, entity.getCall()); - faqRepository.save(entity); - return convertFaqEntityToResponseBean(entity); + public FaqResponseBean updateFaq(Long id, FaqReq faqRequest, UserEntity userEntity) { + FaqEntity entity = validateFaq(id); + faqRequest.setId(entity.getId()); + createOrUpdateFaqEntity(faqRequest, entity.getCall(), userEntity, LookUpDataEntity.LookUpDataTypeEnum.FAQ); + return convertToFaqResponseBean(entity); } public void deleteFaq(Long id) { - FaqEntity entity = faqRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + FaqEntity faqEntity = validateFaq(id); + faqEntity.setIsDeleted(Boolean.TRUE); + faqRepository.save(faqEntity); + } + + public FaqEntity validateFaq(Long id) { + return faqRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); - faqRepository.deleteById(entity.getId()); - + } + + public List getFaqByCallId(Long callId) { + callService.validateCall(callId); + return faqRepository.findByCallIdAndIsDeletedFalse(callId).stream().map(this::convertToFaqResponseBean) + .toList(); } - private FaqResponseBean convertFaqEntityToResponseBean(FaqEntity entity) { - FaqResponseBean response = new FaqResponseBean(); - response.setId(entity.getId()); - response.setUserId(entity.getUser().getId()); - response.setIsVisible(entity.getIsVisible()); - response.setUpdatedDate(entity.getUpdatedDate()); - response.setCreatedDate(entity.getCreatedDate()); - response.setQuestionShort(entity.getQuestionShort()); - response.setQuestion(entity.getQuestion()); - response.setResponseShort(entity.getResponseShort()); - response.setResponse(entity.getResponse()); - response.setResponseDate(entity.getResponseDate()); - return response; - } - - private void updateFaqEntity(FaqEntity faqEntity, FaqReq faqReq, Long userId, CallEntity callEntity) { - faqEntity.setQuestion(faqReq.getQuestion()); - UserEntity userEntity = userService.validateUser(userId); - faqEntity.setUser(userEntity); - faqEntity.setIsVisible(true); - if (faqReq.getIsVisible() != null) { - faqEntity.setIsVisible(faqReq.getIsVisible()); + + public FaqEntity createOrUpdateFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity, + LookUpDataTypeEnum type) { + FaqEntity faqEntity = null; + if (isExistingFaq(faqReq)) { + faqEntity = faqRepository.findByIdAndCallIdAndIsDeletedFalse(faqReq.getId(), callEntity.getId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); + } else { + lookUpDataService.getOrCreateLookUpDataEntity(faqReq, type); + faqEntity = new FaqEntity(); + faqEntity.setCall(callEntity); + faqEntity.setUser(userEntity); + faqEntity.setIsVisible(false); + faqEntity.setIsDeleted(false); } - faqEntity.setQuestionShort(faqReq.getQuestionShort()); - faqEntity.setQuestion(faqReq.getQuestion()); - if (faqReq.getResponse() != null || faqReq.getResponseShort() != null) { + if (faqReq.getResponse() != null && (faqEntity.getResponse() == null + || Boolean.FALSE.equals(faqReq.getResponse().equals(faqEntity.getResponse())))) { faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); } - faqEntity.setResponseShort(faqReq.getResponseShort()); - faqEntity.setResponse(faqReq.getResponse()); - faqEntity.setCall(callEntity); + setIfUpdated(faqEntity::getTitle, faqEntity::setTitle, faqReq.getTitle()); + setIfUpdated(faqEntity::getValue, faqEntity::setValue, faqReq.getValue()); + setIfUpdated(faqEntity::getResponse, faqEntity::setResponse, faqReq.getResponse()); + setIfUpdated(faqEntity::getIsVisible, faqEntity::setIsVisible, faqReq.getIsVisible()); + return faqRepository.save(faqEntity); } + + private boolean isExistingFaq(FaqReq faqReq) { + return faqReq.getId() != null && faqReq.getId() > 0; + } + + public FaqResponseBean convertToFaqResponseBean(FaqEntity entity) { + FaqResponseBean responseBean = new FaqResponseBean(); + responseBean.setId(entity.getId()); + responseBean.setUserId(entity.getUser().getId()); + responseBean.setTitle(entity.getTitle()); + responseBean.setValue(entity.getValue()); + responseBean.setResponse(entity.getResponse()); + responseBean.setResponseDate(entity.getResponseDate()); + responseBean.setIsVisible(entity.getIsVisible()); + responseBean.setCreatedDate(entity.getCreatedDate()); + responseBean.setUpdatedDate(entity.getUpdatedDate()); + return responseBean; + } + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java index 0c700b00..f83d7c76 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; +import net.gepafin.tendermanagement.model.request.LookUpDataReq; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; import net.gepafin.tendermanagement.repositories.LookUpDataRepository; @@ -82,6 +83,23 @@ public class LookUpDataDao { .map(this::convertLookUpDataEntityToResponseBean) .collect(Collectors.toList()); } + + public LookUpDataEntity getOrCreateLookUpDataEntity(LookUpDataReq req, + LookUpDataEntity.LookUpDataTypeEnum type) { + if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { + LookUpDataEntity newEntity = new LookUpDataEntity(); + newEntity.setTitle(req.getTitle()); + newEntity.setValue(req.getValue()); + newEntity.setResponse(req.getResponse()); + newEntity.setType(type.getValue()); + validateLookUpDataEntity(newEntity); + return lookUpDataRepository.save(newEntity); + } + + return lookUpDataRepository.findById(req.getLookUpDataId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java index 04a1c11b..38cd3b2b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java @@ -27,22 +27,15 @@ public class FaqEntity extends BaseEntity { @Column(name = "IS_VISIBLE", nullable = false) private Boolean isVisible; - @Column(name = "QUESTION_SHORT", length = 255) - private String questionShort; - - @Column(name = "QUESTION", columnDefinition = "TEXT") - private String question; - - @Column(name = "RESPONSE_SHORT", length = 255) - private String responseShort; + @Column(name = "TITLE", columnDefinition = "TEXT") + private String title; + + @Column(name = "VALUE", columnDefinition = "TEXT") + private String value; @Column(name = "RESPONSE", columnDefinition = "TEXT") private String response; - @ManyToOne - @JoinColumn(name = "LOOKUP_DATA_ID") - private LookUpDataEntity lookupData; - @Column(name = "RESPONSE_DATE") private LocalDateTime responseDate; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java index 5941b7b8..1afe87aa 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java @@ -9,7 +9,7 @@ import lombok.Data; @Data public class LookUpDataEntity extends BaseEntity{ - @Column(name = "TITLE", length = 255, nullable = true) + @Column(name = "TITLE", columnDefinition = "TEXT", nullable = true) private String title; @Column(name = "TYPE", length = 255, nullable = false) @@ -17,6 +17,9 @@ public class LookUpDataEntity extends BaseEntity{ @Column(name = "VALUE", columnDefinition = "TEXT", nullable = true) private String value; + + @Column(name = "RESPONSE", columnDefinition = "TEXT") + private String response; public enum LookUpDataTypeEnum { CHECKLIST("CHECKLIST"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java index b8bd81fb..0018689e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FaqReq.java @@ -3,12 +3,8 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; @Data -public class FaqReq extends LookUpDataReq{ +public class FaqReq extends LookUpDataReq { - private Long id; - private Boolean isVisible; - private String questionShort; - private String question; - private String responseShort; - private String response; + private Boolean isVisible; + private String response; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java index 441d19b6..e3ffc634 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java @@ -8,6 +8,10 @@ public class LookUpDataReq { private Long id; private Long lookUpDataId; + + private String title; private String value; + + private String response; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java index c6846e25..133e3327 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FaqResponseBean.java @@ -11,24 +11,14 @@ public class FaqResponseBean extends BaseBean { private Long userId; - private Boolean isVisible; - - private String questionShort; - - private String question; - - private String responseShort; - - private String response; - - private LocalDateTime responseDate; - - private Long lookUpDataId; - private String title; private String value; + private String response; + private LocalDateTime responseDate; + + private Boolean isVisible; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java index 6ceec35f..3727e4ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -17,6 +17,7 @@ public interface FaqRepository extends JpaRepository { Optional findById(@Param("id") Long id); List findByCallIdAndIsDeletedFalse(Long callId); + + Optional findByIdAndCallIdAndIsDeletedFalse(Long id, Long callId); - List findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long callId, String type); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/FaqService.java b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java index 58ca8234..55adc950 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FaqService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java @@ -1,5 +1,11 @@ package net.gepafin.tendermanagement.service; +import java.util.List; + import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.response.FaqResponseBean; @@ -12,4 +18,9 @@ public interface FaqService { FaqResponseBean updateFaq(HttpServletRequest request, Long id, FaqReq faqRequest); void deleteFaq(HttpServletRequest request, Long id); + + FaqEntity createOrUpdateFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity, + LookUpDataTypeEnum type); + + List getFaqByCallId(Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java index 1a3e448b..24767dc3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/LookUpDataService.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.service; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; +import net.gepafin.tendermanagement.model.request.LookUpDataReq; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; @@ -21,4 +22,7 @@ public interface LookUpDataService { List getLookUpDataByType(List type); LookUpDataEntity validateLookUpData(Long lookUpDataId); + + LookUpDataEntity getOrCreateLookUpDataEntity(LookUpDataReq req, + LookUpDataEntity.LookUpDataTypeEnum type); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java index 252935f2..78a458f3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java @@ -1,14 +1,19 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.FaqDao; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.response.FaqResponseBean; import net.gepafin.tendermanagement.service.FaqService; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Map; +import java.util.List; @Service public class FaqServiceImpl implements FaqService { @@ -17,12 +22,12 @@ public class FaqServiceImpl implements FaqService { private FaqDao faqDao; @Autowired - private TokenProvider tokenProvider; + private Validator validator; @Override public FaqResponseBean createFaq(HttpServletRequest request,Long callId, FaqReq faqRequest) { - Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - return faqDao.createFaq(faqRequest,Long.parseLong(userInfo.get("userId").toString()),callId); + UserEntity userEntity = validator.validateUser(request); + return faqDao.createFaq(faqRequest, userEntity,callId); } @Override @@ -32,13 +37,24 @@ public class FaqServiceImpl implements FaqService { @Override public FaqResponseBean updateFaq(HttpServletRequest request, Long id, FaqReq faqRequest) { - Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - return faqDao.updateFaq(id, faqRequest,Long.parseLong(userInfo.get("userId").toString())); + UserEntity userEntity = validator.validateUser(request); + return faqDao.updateFaq(id, faqRequest, userEntity); } @Override public void deleteFaq(HttpServletRequest request, Long id) { faqDao.deleteFaq(id); } + + @Override + public FaqEntity createOrUpdateFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity, + LookUpDataTypeEnum type) { + return faqDao.createOrUpdateFaqEntity(faqReq, callEntity, userEntity, type); + } + + @Override + public List getFaqByCallId(Long callId) { + return faqDao.getFaqByCallId(callId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java index 420e4372..3d53c8fa 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/LookUpDataServiceImpl.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.service.impl; import net.gepafin.tendermanagement.dao.LookUpDataDao; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; +import net.gepafin.tendermanagement.model.request.LookUpDataReq; import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; import net.gepafin.tendermanagement.service.LookUpDataService; @@ -49,4 +50,10 @@ public class LookUpDataServiceImpl implements LookUpDataService { public LookUpDataEntity validateLookUpData(Long lookUpDataId) { return lookUpDataDao.validateLookUpData(lookUpDataId); } + + @Override + public LookUpDataEntity getOrCreateLookUpDataEntity(LookUpDataReq req, + LookUpDataEntity.LookUpDataTypeEnum type) { + return lookUpDataDao.getOrCreateLookUpDataEntity(req, type); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 70263878..a831c2dc 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -2,6 +2,9 @@ package net.gepafin.tendermanagement.util; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.jwt.TokenProvider; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.service.UserService; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -12,9 +15,17 @@ public class Validator { @Autowired private TokenProvider tokenProvider; + + @Autowired + private UserService userService; public Map getUserInfoFromToken(HttpServletRequest request) { return tokenProvider.getUserInfoAndUserIdFromToken(request); } + public UserEntity validateUser(HttpServletRequest request) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return userService.validateUser(Long.parseLong(userInfo.get("userId").toString())); + } + } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 58cddda8..c70e4ab9 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -548,5 +548,21 @@ path="db/dump/update_form_field_data_04_09_2024.sql" /> + + + + + + + + + + + + + + + + From d6995b98e4fa63ac76e03a3eff39309055b2aa11 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 4 Sep 2024 21:35:59 +0530 Subject: [PATCH 067/145] added response field in lookupData response --- .../java/net/gepafin/tendermanagement/dao/CallDao.java | 2 ++ .../gepafin/tendermanagement/dao/LookUpDataDao.java | 10 +++++++--- .../model/request/LookUpDataRequest.java | 1 + .../model/response/LookUpDataResponse.java | 2 ++ .../model/response/LookUpDataResponseBean.java | 2 ++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index ae87ecf2..905aa0dc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -264,6 +264,7 @@ public class CallDao { responseBean.setLookUpDataId(entity.getLookupData().getId()); responseBean.setTitle(entity.getLookupData().getTitle()); responseBean.setValue(entity.getLookupData().getValue()); + responseBean.setResponse(entity.getLookupData().getResponse()); responseBean.setScore(entity.getScore()); responseBean.setCreatedDate(entity.getCreatedDate()); responseBean.setUpdatedDate(entity.getUpdatedDate()); @@ -338,6 +339,7 @@ public class CallDao { lookUpDataResponse.setLookUpDataId(lookUpDataEntity.getId()); lookUpDataResponse.setValue(lookUpDataEntity.getValue()); lookUpDataResponse.setTitle(lookUpDataEntity.getTitle()); + lookUpDataResponse.setResponse(lookUpDataEntity.getResponse()); lookUpDataResponse.setCreatedDate(callTargetAudienceChecklistEntity.getCreatedDate()); lookUpDataResponse.setUpdatedDate(callTargetAudienceChecklistEntity.getUpdatedDate()); return lookUpDataResponse; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java index f83d7c76..1a31c306 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java @@ -17,6 +17,8 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + @Component public class LookUpDataDao { @@ -32,6 +34,7 @@ public class LookUpDataDao { entity.setTitle(lookUpDataReq.getTitle()); entity.setType(lookUpDataReq.getType().getValue()); entity.setValue(lookUpDataReq.getValue()); + entity.setValue(lookUpDataReq.getResponse()); validateLookUpDataEntity(entity); lookUpDataRepository.save(entity); return entity; @@ -54,9 +57,9 @@ public class LookUpDataDao { public LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq) { LookUpDataEntity entity = validateLookUpData(id); - entity.setTitle(lookUpDataReq.getTitle()); - entity.setType(lookUpDataReq.getType().getValue()); - entity.setValue(lookUpDataReq.getValue()); + setIfUpdated(entity::getTitle, entity::setTitle, lookUpDataReq.getTitle()); + setIfUpdated(entity::getValue, entity::setValue, lookUpDataReq.getValue()); + setIfUpdated(entity::getResponse, entity::setResponse, lookUpDataReq.getResponse()); lookUpDataRepository.save(entity); return convertLookUpDataEntityToResponseBean(entity); } @@ -72,6 +75,7 @@ public class LookUpDataDao { response.setTitle(entity.getTitle()); response.setType(LookUpDataEntity.LookUpDataTypeEnum.valueOf(entity.getType())); response.setValue(entity.getValue()); + response.setResponse(entity.getResponse()); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); return response; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java index 459e1416..98e15d52 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataRequest.java @@ -9,4 +9,5 @@ public class LookUpDataRequest { private String title; private LookUpDataTypeEnum type; private String value; + private String response; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java index 4fb3f5d9..d61e20d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponse.java @@ -11,5 +11,7 @@ public class LookUpDataResponse extends BaseBean { private String title; private String value; + + private String response; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java index 554db7bd..b3c873de 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/LookUpDataResponseBean.java @@ -10,6 +10,8 @@ public class LookUpDataResponseBean extends BaseBean { private String title; private String value; + + private String response; private LookUpDataTypeEnum type; } From 2d5aeb95b51fcba1607bae249214ff174cf4618c Mon Sep 17 00:00:00 2001 From: rbonazzo-KZ <66477605+rbonazzo-KZ@users.noreply.github.com> Date: Thu, 5 Sep 2024 14:17:46 +0200 Subject: [PATCH 068/145] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d48d3162..c79beeee 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # GEPAFIN-BE Back Gepafin Project +Please add doc here From 4929dc01ce2d2180ecebd13e2cdc51ee7d3eea0e Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 10 Sep 2024 12:16:59 +0530 Subject: [PATCH 069/145] Updated Document entity to work with sourceId instead of callId --- .../gepafin/tendermanagement/dao/CallDao.java | 23 ++++++++------- .../tendermanagement/dao/DocumentDao.java | 22 +++++++++++++-- .../entities/DocumentEntity.java | 13 ++++----- .../enums/DocumentSourceTypeEnum.java | 17 +++++++++++ .../model/response/DocumentResponseBean.java | 9 +++++- .../repositories/DocumentRepository.java | 4 +-- .../service/DocumentService.java | 3 +- .../service/impl/DocumentServiceImpl.java | 5 ++-- .../web/rest/api/DocumentApi.java | 5 ++-- .../rest/api/impl/DocumentApiController.java | 5 ++-- .../db/changelog/db.changelog-1.0.0.xml | 28 ++++++++++++------- 11 files changed, 94 insertions(+), 40 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 905aa0dc..24b8d435 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.FaqService; import net.gepafin.tendermanagement.service.LookUpDataService; @@ -167,14 +168,14 @@ public class CallDao { } - public List convertToDocumentEntities(List documentReqList, CallEntity callEntity, + public List convertToDocumentEntities(List documentReqList, Long sourceId, DocumentTypeEnum documentType) { if (documentReqList == null) { return null; } List existingDocuments = documentRepository - .findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), documentType.getValue()); + .findBySourceIdAndTypeAndIsDeletedFalse(sourceId, documentType.getValue()); List incomingIds = documentReqList.stream().map(DocumentReq::getId).filter(id -> id != null && id > 0) .collect(Collectors.toList()); @@ -182,7 +183,7 @@ public class CallDao { existingDocuments.stream().filter(document -> !incomingIds.contains(document.getId())) .forEach(this::softDeleteDocument); List documentEntities = documentReqList.stream() - .map(req -> convertToDocumentEntity(req, callEntity)).collect(Collectors.toList()); + .map(req -> convertToDocumentEntity(req, sourceId)).collect(Collectors.toList()); documentRepository.saveAll(documentEntities); return documentEntities; } @@ -192,9 +193,9 @@ public class CallDao { documentRepository.save(documentEntity); } - private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { + private DocumentEntity convertToDocumentEntity(DocumentReq documentReq,Long sourceId) { validateDocumentEntity(documentReq.getId()); - DocumentEntity documentEntity = documentRepository.findByIdAndCallIdAndIsDeletedFalse(documentReq.getId(), callEntity.getId()) + DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndIsDeletedFalse(documentReq.getId(),sourceId) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); return documentEntity; @@ -275,7 +276,9 @@ public class CallDao { DocumentResponseBean responseBean = new DocumentResponseBean(); responseBean.setId(entity.getId()); responseBean.setName(entity.getFileName()); - responseBean.setDescription(entity.getDescription()); + responseBean.setType(DocumentTypeEnum.valueOf(entity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(entity.getSource())); + responseBean.setSourceId(entity.getSourceId()); responseBean.setFilePath(entity.getFilePath()); responseBean.setCreatedDate(entity.getCreatedDate()); responseBean.setUpdatedDate(entity.getUpdatedDate()); @@ -362,9 +365,9 @@ public class CallDao { callRepository.save(callEntity); convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA); - convertToDocumentEntities(createCallRequest.getDocs(), callEntity, DocumentTypeEnum.DOCUMENT); + convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT); - convertToDocumentEntities(createCallRequest.getImages(), callEntity, DocumentTypeEnum.IMAGES); + convertToDocumentEntities(createCallRequest.getImages(), callEntity.getId(), DocumentTypeEnum.IMAGES); updateLookUpData(callEntity, createCallRequest.getCheckList(), LookUpDataTypeEnum.CHECKLIST); @@ -523,9 +526,9 @@ public class CallDao { } private CallResponse getCallResponseBean(CallEntity callEntity) { - List documentEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), + List documentEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentTypeEnum.DOCUMENT.getValue()); - List imageEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), + List imageEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentTypeEnum.IMAGES.getValue()); List amiedTo = callTargetAudienceChecklistRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index c079a40f..374c741b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.dao; import java.io.IOException; import java.util.stream.Collectors; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -40,16 +41,17 @@ public class DocumentDao { @Autowired private CallService callService; - public List uploadFiles(List files, Long callId, DocumentTypeEnum fileType) { + public List uploadFiles(List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) { List documentEntities = new ArrayList<>(); - CallEntity callEntity = callService.validateCall(callId); + Long source = resolveSourceId(sourceId, sourceType); for (MultipartFile file : files) { try { uploadFileOnAmazonS3 result = uploadFileOnAmazonS3(file); if (result != null) { DocumentEntity documentEntity = new DocumentEntity(); documentEntity.setFileName(result.fileName()); - documentEntity.setCall(callEntity); + documentEntity.setSource(sourceType.getValue()); + documentEntity.setSourceId(source); documentEntity.setType(fileType.getValue()); documentEntity.setFilePath(result.filepath()); documentEntity.setIsDeleted(false); @@ -61,6 +63,18 @@ public class DocumentDao { documentRepository.saveAll(documentEntities); return documentEntities.stream().map(callDao::convertToDocumentResponseBean).collect(Collectors.toList()); } + private Long resolveSourceId(Long sourceId, DocumentSourceTypeEnum sourceType) { + if (sourceType == DocumentSourceTypeEnum.CALL) { + CallEntity callEntity = callService.validateCall(sourceId); + return callEntity.getId(); + } +// else if (sourceType == SourceTypeEnum.APPLICATION) { +// ApplicationEntity applicationEntity = applicationService.validateApplication(sourceId); +// return applicationEntity.getId(); // Assuming ApplicationEntity has getId() +// } +// + return sourceId; + } private uploadFileOnAmazonS3 uploadFileOnAmazonS3(MultipartFile file) throws IOException { String extension = FilenameUtils.getExtension(file.getOriginalFilename()); @@ -109,6 +123,8 @@ public class DocumentDao { documentEntity.setFilePath(result.filepath); documentEntity.setFileName(result.fileName); documentEntity.setType(documentTypeEnum.getValue()); + documentEntity.setSource(documentEntity.getSource()); + documentEntity.setSourceId(documentEntity.getSourceId()); documentRepository.save(documentEntity); } return callDao.convertToDocumentResponseBean(documentEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java index 057ca421..fc15a82d 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java @@ -20,14 +20,13 @@ public class DocumentEntity extends BaseEntity{ @Column(name="TYPE") private String type; - @ManyToOne - @JoinColumn(name = "CALL_ID") - private CallEntity call; + @Column(name="SOURCE") + private String source; + + @Column(name="SOURCE_ID") + private Long sourceId; - @Column(name = "DESCRIPTION", columnDefinition = "TEXT") - private String description; - @Column(name ="IS_DELETED", nullable = false) private Boolean isDeleted = false; - + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java new file mode 100644 index 00000000..123c6f8c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.enums; + +public enum DocumentSourceTypeEnum { + CALL("CALL"), + + APPLICATION("APPLICATION"); + + private String value; + + DocumentSourceTypeEnum(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java index 82aa9b9a..f5706b10 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java @@ -1,6 +1,9 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; + import java.time.LocalDateTime; @@ -13,7 +16,11 @@ public class DocumentResponseBean { private String filePath; - private String description; + private DocumentTypeEnum type; + + private DocumentSourceTypeEnum source; + + private Long sourceId; private LocalDateTime createdDate; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index d6d86138..40361cd9 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -15,9 +15,9 @@ public interface DocumentRepository extends JpaRepository @Query("SELECT d FROM DocumentEntity d WHERE d.id = :id AND d.isDeleted = false") Optional findById(@Param("id") Long id); - List findByCallIdAndTypeAndIsDeletedFalse(Long callId, String type); + List findBySourceIdAndTypeAndIsDeletedFalse(Long sourceId, String type); - Optional findByIdAndCallIdAndIsDeletedFalse(Long id, Long callId); + Optional findByIdAndSourceIdAndIsDeletedFalse(Long id, Long sourceId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java index f55636df..4c57d3ca 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import org.springframework.web.multipart.MultipartFile; @@ -9,7 +10,7 @@ import java.util.List; public interface DocumentService { - public List uploadFile(List files,Long callId, DocumentTypeEnum fileType); + public List uploadFile(List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType); public void deleteFile(Long documentId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java index 15e278bf..5cbc8634 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -4,6 +4,7 @@ import java.util.List; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.DocumentDao; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.service.DocumentService; @@ -21,8 +22,8 @@ public class DocumentServiceImpl implements DocumentService { private DocumentDao documentDao; @Override - public List uploadFile(List files,Long callId,DocumentTypeEnum fileType) { - return documentDao.uploadFiles(files,callId,fileType); + public List uploadFile(List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) { + return documentDao.uploadFiles(files,sourceId,sourceType,fileType); } @Override public void deleteFile(Long documentId){ diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java index 026fa690..9c2cedcc 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.model.util.Response; @@ -29,8 +30,8 @@ public interface DocumentApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) - @PostMapping(value = "/uploadFile/call/{callId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, @Parameter(description = "call id", required = true) @PathVariable("callId") Long callId, @RequestParam("file") List files, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + @PostMapping(value = "/uploadFile/source/{sourceId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, @Parameter(description = "Source Id", required = true) @PathVariable("sourceId") Long sourceId, @RequestParam DocumentSourceTypeEnum sourceType, @RequestParam("file") List files, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java index 5f986716..7141a256 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.model.util.Response; @@ -27,10 +28,10 @@ DocumentApiController implements DocumentApi { private DocumentService documentService; @Override - public ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, Long callId, + public ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, Long sourceId, DocumentSourceTypeEnum sourceType, List files, DocumentTypeEnum fileType) { try { - List responseBeans = documentService.uploadFile(files, callId, fileType); + List responseBeans = documentService.uploadFile(files, sourceId,sourceType, fileType); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); } catch (CustomValidationException ex) { diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index c70e4ab9..2234c515 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -540,15 +540,15 @@ columnName="order_no" /> - - - TRUNCATE TABLE FORM_FIELD RESTART IDENTITY; - - + + TRUNCATE TABLE FORM_FIELD RESTART IDENTITY; + + - - - + + + @@ -563,6 +563,14 @@ - - + + + + + + + + + + From c93c7a031e00c7f60374cc845fc7f19bd67bb788 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 10 Sep 2024 18:39:50 +0530 Subject: [PATCH 070/145] Done ticket GEPAFINBE-20 --- .../constants/GepafinConstant.java | 5 +- .../gepafin/tendermanagement/dao/FlowDao.java | 175 ++++++++++++++++++ .../tendermanagement/entities/CallEntity.java | 6 + .../entities/FlowDataEntity.java | 26 +++ .../entities/FlowEdgesEntity.java | 28 +++ .../model/request/FlowDataRequestBean.java | 13 ++ .../model/request/FlowEdgesRequestBean.java | 13 ++ .../model/request/FlowRequestBean.java | 17 ++ .../model/response/FlowDataResponseBean.java | 16 ++ .../model/response/FlowEdgesResponseBean.java | 16 ++ .../model/response/FlowResponseBean.java | 22 +++ .../repositories/FlowDataRepository.java | 13 ++ .../repositories/FlowEdgesRepository.java | 13 ++ .../tendermanagement/service/FlowService.java | 12 ++ .../service/impl/FlowServiceImpl.java | 26 +++ .../web/rest/api/FlowApi.java | 58 ++++++ .../web/rest/api/impl/FlowApiController.java | 43 +++++ .../db/changelog/db.changelog-1.0.0.xml | 74 +++++++- src/main/resources/message_en.properties | 6 + src/main/resources/message_it.properties | 5 + 20 files changed, 585 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/FlowDataEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FlowDataRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FlowEdgesRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FlowRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/FlowDataResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/FlowEdgesResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/FlowEdgesRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/FlowService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index e59ff236..5c77aa3b 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -104,5 +104,8 @@ public class GepafinConstant { public static final String STATUS_CANNOT_BE_CHANGED = "status.cannot.be.changed"; public static final String PUBLISHED_CALL_NOT_UPDATE = "published.call.not.update"; public static final String INVALID_USER = "invalid_user"; - + public static final String FLOW_CREATED_SUCCESSFULLY="flow.created.successfully"; + public static final String FLOW_FETCHED_SUCCESSFULLY="flow.fetched.successfully"; + public static final String FLOW_ALREADY_EXISTS="flow.already.exists"; + public static final String FLOW_REQUEST_NOT_PROPER="flow.request.not.complete"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java new file mode 100644 index 00000000..985560f3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java @@ -0,0 +1,175 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.FlowDataEntity; +import net.gepafin.tendermanagement.entities.FlowDataEntity; +import net.gepafin.tendermanagement.entities.FlowEdgesEntity; +import net.gepafin.tendermanagement.model.request.FlowDataRequestBean; +import net.gepafin.tendermanagement.model.request.FlowEdgesRequestBean; +import net.gepafin.tendermanagement.model.request.FlowRequestBean; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.model.response.FlowDataResponseBean; +import net.gepafin.tendermanagement.model.response.FlowEdgesResponseBean; +import net.gepafin.tendermanagement.model.response.FlowResponseBean; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.FlowDataRepository; +import net.gepafin.tendermanagement.repositories.FlowDataRepository; +import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; +import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; +import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.service.FormService; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class FlowDao { + + @Autowired + private FlowDataRepository flowDataRepository; + + @Autowired + private FlowEdgesRepository flowEdgesRepository; + + @Autowired + private CallRepository callRepository; + + @Autowired + private CallService callService; + + @Autowired + private FormService formService; + + public FlowResponseBean createFlow(FlowRequestBean flowRequestBean, Long callId) { + validateFlowRequestBean(flowRequestBean); + CallEntity call = setInitialAndFinalFormInCall(flowRequestBean, callId); + checkIfFlowExits(callId); + validateFlowRequest(flowRequestBean); + List flowDataEntities = createFlowData(flowRequestBean,call); + List flowEdgesEntities = createFlowEdges(flowRequestBean,call); + FlowResponseBean flowResponseBean = getFlowByCallId(call.getId()); + return flowResponseBean; + } + + public void validateFlowRequestBean(FlowRequestBean flowRequestBean){ + if(flowRequestBean.getFlowData()==null || flowRequestBean.getFlowEdges()==null){ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.FLOW_REQUEST_NOT_PROPER)); + } + } + + public void checkIfFlowExits(Long callId) { + List flowDataEntities = flowDataRepository.findByCallId(callId); + List flowEdgesEntities = flowEdgesRepository.findByCallId(callId); + if (!flowDataEntities.isEmpty() || !flowEdgesEntities.isEmpty()) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.FLOW_ALREADY_EXISTS)); + } + } + + public void validateFlowRequest(FlowRequestBean flowRequestBean) { + formService.validateForm(flowRequestBean.getInitialForm()); + formService.validateForm(flowRequestBean.getFinalForm()); + flowRequestBean.getFlowData().forEach(flowData -> formService.validateForm(flowData.getFormId())); + } + + private List createFlowEdgesResponseBean(List flowEdgesEntities) { + List flowEdgesResponseBeans = flowEdgesEntities.stream() + .map(this::convertFlowEdgesEntityToFlowEdgesResponseBean).collect(Collectors.toList()); + return flowEdgesResponseBeans; + } + + private List createFlowDataResponseBean(List flowDataEntities) { + List flowDataResponseBeans = flowDataEntities.stream() + .map(this::convertFlowDataEntityToFlowDataResponseBean).collect(Collectors.toList()); + return flowDataResponseBeans; + } + + public FlowResponseBean setInitialAndFinalFormInFlowResponseBean(FlowResponseBean flowResponseBean, CallEntity call) { + flowResponseBean.setInitialForm(call.getInitialForm()); + flowResponseBean.setFinalForm(call.getFinalForm()); + return flowResponseBean; + } + + private CallEntity setInitialAndFinalFormInCall(FlowRequestBean flowRequestBean, Long callId) { + CallEntity call = callService.validateCall(callId); + call.setInitialForm(flowRequestBean.getInitialForm()); + call.setFinalForm(flowRequestBean.getFinalForm()); + call = callRepository.save(call); + return call; + } + + public List createFlowData(FlowRequestBean flowRequestBean, CallEntity call) { + List flowDataEntities = flowRequestBean.getFlowData().stream() + .map(flowDataRequestBean -> createFlowDataEntity(flowDataRequestBean, call)) + .collect(Collectors.toList()); + return flowDataRepository.saveAll(flowDataEntities); + } + + public FlowDataEntity createFlowDataEntity(FlowDataRequestBean flowDataRequestBean,CallEntity call) { + FlowDataEntity flowDataEntity = new FlowDataEntity(); + flowDataEntity.setFormId(flowDataRequestBean.getFormId()); + flowDataEntity.setChoosenField(flowDataRequestBean.getChosenField()); + flowDataEntity.setChoosenValue(flowDataRequestBean.getChosenValue()); + flowDataEntity.setCallId(call.getId()); + return flowDataEntity; + } + + public List createFlowEdges(FlowRequestBean flowRequestBean, CallEntity call) { + List flowEdgesEntities = flowRequestBean.getFlowEdges().stream() + .map(flowEdgesRequestBean -> createFlowEdgesEntity(flowEdgesRequestBean, call)) + .collect(Collectors.toList()); + return flowEdgesRepository.saveAll(flowEdgesEntities); + } + + public FlowEdgesEntity createFlowEdgesEntity(FlowEdgesRequestBean flowEdgesRequestBean,CallEntity call) { + FlowEdgesEntity flowEdgesEntity = new FlowEdgesEntity(); + flowEdgesEntity.setSourceId(Long.valueOf(flowEdgesRequestBean.getSource())); + flowEdgesEntity.setTargetId(Long.valueOf(flowEdgesRequestBean.getTarget())); + flowEdgesEntity.setType(flowEdgesRequestBean.getType()); + flowEdgesEntity.setCallId(call.getId()); + return flowEdgesEntity; + } + + public FlowDataResponseBean convertFlowDataEntityToFlowDataResponseBean(FlowDataEntity flowDataEntity) { + FlowDataResponseBean flowDataResponseBean = new FlowDataResponseBean(); + flowDataResponseBean.setId(flowDataEntity.getId()); + flowDataResponseBean.setFormId(flowDataEntity.getFormId()); + flowDataResponseBean.setChosenField(flowDataEntity.getChoosenField()); + flowDataResponseBean.setChosenValue(flowDataEntity.getChoosenValue()); + return flowDataResponseBean; + } + + public FlowEdgesResponseBean convertFlowEdgesEntityToFlowEdgesResponseBean(FlowEdgesEntity flowEdgesEntity) { + FlowEdgesResponseBean flowEdgesResponseBean = new FlowEdgesResponseBean(); + flowEdgesResponseBean.setId(flowEdgesEntity.getId()); + flowEdgesResponseBean.setType(flowEdgesEntity.getType()); + flowEdgesResponseBean.setSource(String.valueOf(flowEdgesEntity.getSourceId())); + flowEdgesResponseBean.setTarget(String.valueOf(flowEdgesEntity.getTargetId())); + return flowEdgesResponseBean; + } + + public FlowResponseBean getFlowByCallId(Long callId){ + CallEntity call= callService.validateCall(callId); + FlowResponseBean flowResponseBean=new FlowResponseBean(); + List flowDataEntities=flowDataRepository.findByCallId(call.getId()); + List flowEdgesEntities=flowEdgesRepository.findByCallId(call.getId()); + List flowDataResponseBeans=createFlowDataResponseBean(flowDataEntities); + List flowEdgesResponseBeans=createFlowEdgesResponseBean(flowEdgesEntities); + flowResponseBean.setFlowData(flowDataResponseBeans); + flowResponseBean.setFlowEdges(flowEdgesResponseBeans); + if(flowResponseBean.getFlowData().isEmpty() || flowResponseBean.getFlowEdges().isEmpty()){ + return null; + } + flowResponseBean.setCallId(call.getId()); + flowResponseBean.setInitialForm(call.getInitialForm()); + flowResponseBean.setFinalForm(call.getFinalForm()); + return flowResponseBean; + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index b83b8dc8..02c53fca 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -62,5 +62,11 @@ public class CallEntity extends BaseEntity { @Column(name = "CONFIDI") private Boolean confidi; + + @Column(name="INITIAL_FORM") + private Long initialForm; + + @Column(name="FINAL_FORM") + private Long finalForm; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FlowDataEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FlowDataEntity.java new file mode 100644 index 00000000..cdffe410 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/FlowDataEntity.java @@ -0,0 +1,26 @@ +package net.gepafin.tendermanagement.entities; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "FLOW_DATA") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class FlowDataEntity extends BaseEntity{ + + @Column(name = "FORM_ID") + private Long formId; + + @Column(name = "CHOOSEN_FIELD") + private String choosenField; + + @Column(name = "CHOOSEN_VALUE") + private String choosenValue; + + @Column(name="CALL_ID") + private Long callId; +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java new file mode 100644 index 00000000..685c484c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "FLOW_EDGES") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class FlowEdgesEntity extends BaseEntity { + + @Column(name = "SOURCE_ID") + private Long sourceId; + + @Column(name = "TARGET_ID") + private Long targetId; + + @Column(name = "TYPE", length = 255) + private String type; + + @Column(name="CALL_ID") + private Long callId; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FlowDataRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/FlowDataRequestBean.java new file mode 100644 index 00000000..58432432 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FlowDataRequestBean.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FlowDataRequestBean { + + private Long formId; + + private String chosenField; + + private String chosenValue; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FlowEdgesRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/FlowEdgesRequestBean.java new file mode 100644 index 00000000..45d4195f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FlowEdgesRequestBean.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FlowEdgesRequestBean { + + private String source; + + private String target; + + private String type; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FlowRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/FlowRequestBean.java new file mode 100644 index 00000000..eb938e19 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FlowRequestBean.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import java.util.List; + +@Data +public class FlowRequestBean { + + private Long initialForm; + + private Long finalForm; + + private List flowData; + + private List flowEdges; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FlowDataResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FlowDataResponseBean.java new file mode 100644 index 00000000..f95a8f2c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FlowDataResponseBean.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class FlowDataResponseBean { + + private Long id; + + private Long formId; + + private String chosenField; + + private String chosenValue; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FlowEdgesResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FlowEdgesResponseBean.java new file mode 100644 index 00000000..0ffa3c62 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FlowEdgesResponseBean.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; +import org.springframework.security.core.parameters.P; + +@Data +public class FlowEdgesResponseBean { + private Long id; + + private String source; + + private String target; + + private String type; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java new file mode 100644 index 00000000..289f44b1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.request.FlowDataRequestBean; +import net.gepafin.tendermanagement.model.request.FlowEdgesRequestBean; + +import java.util.List; + +@Data +public class FlowResponseBean { + + private Long callId; + + private Long initialForm; + + private Long finalForm; + + private List flowData; + + private List flowEdges; +} + diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java new file mode 100644 index 00000000..0f74d12b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.FlowDataEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface FlowDataRepository extends JpaRepository { + + public List findByCallId(Long callId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FlowEdgesRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FlowEdgesRepository.java new file mode 100644 index 00000000..ef4fbe91 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FlowEdgesRepository.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.FlowEdgesEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface FlowEdgesRepository extends JpaRepository { + + public List findByCallId(Long callId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/FlowService.java b/src/main/java/net/gepafin/tendermanagement/service/FlowService.java new file mode 100644 index 00000000..16d76f8d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/FlowService.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.FlowRequestBean; +import net.gepafin.tendermanagement.model.response.FlowResponseBean; + +public interface FlowService { + + public FlowResponseBean createFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId); + + public FlowResponseBean getFlowByCallId(HttpServletRequest request, Long callId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java new file mode 100644 index 00000000..7f173472 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java @@ -0,0 +1,26 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.FlowDao; +import net.gepafin.tendermanagement.model.request.FlowRequestBean; +import net.gepafin.tendermanagement.model.response.FlowResponseBean; +import net.gepafin.tendermanagement.service.FlowService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class FlowServiceImpl implements FlowService { + + @Autowired + private FlowDao flowDao; + + @Override + public FlowResponseBean createFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId) { + return flowDao.createFlow(flowRequestBean,callId); + } + + @Override + public FlowResponseBean getFlowByCallId(HttpServletRequest request, Long callId) { + return flowDao.getFlowByCallId(callId); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java new file mode 100644 index 00000000..126dedd6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java @@ -0,0 +1,58 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.FlowRequestBean; +import net.gepafin.tendermanagement.model.response.FlowResponseBean; +import net.gepafin.tendermanagement.model.response.FormResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@Validated +public interface FlowApi { + + @Operation(summary = "Api to create flow", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PostMapping(value = "/call/{callId}", + produces = { "application/json" }) + ResponseEntity> createFlow(HttpServletRequest request, + @Parameter(description = " Flow request object", required = true) @Valid @RequestBody FlowRequestBean flowRequestBean, + @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + + @Operation(summary = "Api to get flow by callId", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/call/{callId}", + produces = { "application/json" }) + ResponseEntity> getFlowByCallId(HttpServletRequest request, + @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java new file mode 100644 index 00000000..e2e41cb3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java @@ -0,0 +1,43 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.FlowRequestBean; +import net.gepafin.tendermanagement.model.response.FlowResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.FlowService; +import net.gepafin.tendermanagement.web.rest.api.FlowApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/flow}") +public class FlowApiController implements FlowApi { + + @Autowired + private FlowService flowService; + + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> createFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId) { + FlowResponseBean flowResponseBean=flowService.createFlow(httpServletRequest,flowRequestBean,callId); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(flowResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FLOW_CREATED_SUCCESSFULLY))); + } + + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> getFlowByCallId(HttpServletRequest request, Long callId) { + FlowResponseBean flowResponseBean=flowService.getFlowByCallId(request,callId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(flowResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FLOW_FETCHED_SUCCESSFULLY))); + } +} diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index c70e4ab9..db048379 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -563,6 +563,78 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index b154e270..ccbdb47d 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -133,3 +133,9 @@ lookupdata.value.cannot.be.empty=Value field cannot be empty #Document-related message document.updated.successfully=Document updated successfully. document.fetched.successfully=Document fetched successfully. + +#Flow-related message +flow.created.successfully=Flow created successfully. +flow.fetched.successfully=Flow fetched successfully. +flow.already.exists= Flow already exist for this call. +flow.request.not.complete=Flow request is not complete. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index d73e36c1..52234e76 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -130,3 +130,8 @@ logout.successful.msg=Logout riuscito. Sei stato disconnesso con successo. update.user.status.success=Lo stato dell'utente � stato aggiornato con successo. +#Flow-related message +flow.created.successfully=Flusso creato con successo. +flow.fetched.successfully=Flusso recuperato con successo. +flow.already.exists= Il flusso esiste già per questa chiamata. +flow.request.not.complete=La richiesta di flusso non è completa. \ No newline at end of file From 02bb5877b67d904933a129fb3a36c9d834bbb314 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 10 Sep 2024 19:49:20 +0530 Subject: [PATCH 071/145] Updated code --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index db048379..a18178e7 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -569,9 +569,6 @@ - - - @@ -636,5 +633,4 @@ - From 492317be2e56e8d73d4a432c7e64f7dfae1a9d15 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 12 Sep 2024 15:33:09 +0530 Subject: [PATCH 072/145] Done ticket --- .../constants/GepafinConstant.java | 14 + .../tendermanagement/dao/ApplicationDao.java | 250 ++++++++++++++++++ .../gepafin/tendermanagement/dao/FormDao.java | 48 +++- .../entities/ApplicationEntity.java | 36 +++ .../entities/ApplicationFormEntity.java | 24 ++ .../entities/ApplicationFormFieldEntity.java | 27 ++ .../enums/ApplicationStatusTypeEnum.java | 22 ++ .../ApplicationFormFieldRequestBean.java | 16 ++ .../model/request/ApplicationRequestBean.java | 15 ++ .../model/request/FieldValidatorBean.java | 18 ++ .../ApplicationFormFieldResponseBean.java | 16 ++ .../response/ApplicationResponseBean.java | 26 ++ .../ApplicationFormFieldRepository.java | 15 ++ .../ApplicationFormRepository.java | 18 ++ .../repositories/ApplicationRepository.java | 22 ++ .../service/ApplicationService.java | 21 ++ .../tendermanagement/service/FormService.java | 5 + .../service/impl/ApplicationServiceImpl.java | 59 +++++ .../service/impl/FormServiceImpl.java | 9 + .../tendermanagement/util/FieldValidator.java | 20 ++ .../gepafin/tendermanagement/util/Utils.java | 21 +- .../web/rest/api/ApplicationApi.java | 77 ++++++ .../api/impl/ApplicationApiController.java | 64 +++++ .../db/changelog/db.changelog-1.0.0.xml | 36 +++ src/main/resources/message_en.properties | 17 ++ src/main/resources/message_it.properties | 25 +- 26 files changed, 913 insertions(+), 8 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormFieldEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationFormFieldRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FieldValidatorBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 5c77aa3b..6c206c00 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -108,4 +108,18 @@ public class GepafinConstant { public static final String FLOW_FETCHED_SUCCESSFULLY="flow.fetched.successfully"; public static final String FLOW_ALREADY_EXISTS="flow.already.exists"; public static final String FLOW_REQUEST_NOT_PROPER="flow.request.not.complete"; + public static final String APPLICATION_CREATED_SUCCESS_MSG = "application.created.success"; + public static final String APPLICATION_UPDATED_SUCCESS_MSG = "application.updated.success"; + public static final String DELETE_APPLICATION_SUCCESS_MSG = "application.deleted.success"; + public static final String GET_APPLICATION_SUCCESS_MSG = "application.get.success"; + public static final String APPLICATION_NOT_FOUND_MSG = "application.not.found"; + public static final String APPLICATION_FORM_FIELD_NOT_FOUND="application.form.field.not.found"; + public static final String FORM_ID_DOES_NOT_MACTHES="Form.not.matches.to.call.initial.form"; + public static final String VALIDATION_FIELD_REQUIRED = "validation.field.required"; + public static final String VALIDATION_FIELD_MIN_LENGTH = "validation.field.min_length"; + public static final String VALIDATION_FIELD_MAX_LENGTH = "validation.field.max_length"; + public static final String VALIDATION_FIELD_PATTERN = "validation.field.pattern"; + public static final String VALIDATION_FIELD_NOT_NULL = "validation.field.not_null"; + public static final String VALIDATION_FIELD_NOT_EMPTY = "validation.field.not_empty"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java new file mode 100644 index 00000000..f273704c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -0,0 +1,250 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository; +import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.service.FormService; +import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class ApplicationDao { + + private final Logger log = LoggerFactory.getLogger(ApplicationDao.class); + + + @Autowired + private CallService callService; + + @Autowired + private UserService userService; + + @Autowired + private ApplicationRepository applicationRepository; + + @Autowired + private ApplicationFormRepository applicationFormRepository; + + @Autowired + private ApplicationFormFieldRepository applicationFormFieldRepository; + + @Autowired + private FormService formService; + + public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long callId) { + CallEntity call = callService.validateCall(callId); + FormEntity formEntity = formService.validateForm(applicationRequestBean.getFormId()); + ApplicationEntity applicationEntity = getApplicationOrCreate(userEntity, call, formEntity); + formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); + ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity); + createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity); + return getApplicationById(applicationEntity.getId(),formEntity.getId()); + } + + public ApplicationFormEntity saveApplicationFormEntity(ApplicationFormEntity applicationFormEntity) { + ApplicationFormEntity applicationFormEntity1 = applicationFormRepository.save(applicationFormEntity); + return applicationFormEntity1; + } + + public void validateFormId(FormEntity formEntity, CallEntity callEntity) { + if (Boolean.FALSE.equals(formEntity.getId().equals(callEntity.getInitialForm()))) { + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.FORM_ID_DOES_NOT_MACTHES)); + } + } + + public ApplicationFormEntity createApplicationFormEntity(ApplicationEntity application, FormEntity formEntity) { + ApplicationFormEntity applicationFormEntity = new ApplicationFormEntity(); + applicationFormEntity.setApplication(application); + applicationFormEntity.setForm(formEntity); + applicationFormEntity = saveApplicationFormEntity(applicationFormEntity); + return applicationFormEntity; + } + + public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call) { + ApplicationEntity entity = new ApplicationEntity(); + entity.setUser(user); + entity.setCall(call); + entity.setIsDeleted(false); + entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue()); + return entity; + } + + public ApplicationResponseBean getApplicationById(Long id,Long formId) { + log.info("Fetching application with ID: {}", id); + + ApplicationEntity applicationEntity = validateApplication(id); + List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationEntity.getId()); + List applicationFormFieldResponseBeans=new ArrayList<>(); + ApplicationFormFieldResponseBean applicationFormFieldResponseBeans1=null; + for (ApplicationFormEntity applicationFormEntity:applicationFormEntities){ + List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); + for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntities) { + applicationFormFieldResponseBeans1 = convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(applicationFormFieldEntity, applicationFormEntity.getId()); + applicationFormFieldResponseBeans.add(applicationFormFieldResponseBeans1); + } + } + ApplicationResponseBean applicationResponseBean= convertApplicationEntityToApplicationResponseBean(applicationEntity); + applicationResponseBean.setFormFields(applicationFormFieldResponseBeans); + applicationResponseBean.setCurrentFormId(formId); + return applicationResponseBean; + } + + public void deleteById(Long id) { + log.info("Deleting application with ID: {}", id); + + ApplicationEntity applicationEntity= validateApplication(id); + applicationEntity.setIsDeleted(true); + applicationEntity=saveApplicationEntity(applicationEntity); + log.info("Application deleted with ID: {}", id); + } + + public List getAllApplications(Map userInfo) { + log.info("Fetching all applications"); + String userIdStr = (String) userInfo.get("userId"); + Long userId = Long.parseLong(userIdStr); + List applicationEntities = applicationRepository.findByUserIdAndIsDeletedFalse(userId); + List applicationIds = applicationEntities.stream() + .map(ApplicationEntity::getId) + .collect(Collectors.toList()); + + List applicationFormEntities = applicationFormRepository.findByApplicationIdIn(applicationIds); + + List applicationFormIds = applicationFormEntities.stream() + .map(ApplicationFormEntity::getId) + .collect(Collectors.toList()); + + List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormIdIn(applicationFormIds); + + + return applicationEntities.stream().map(applicationEntity -> { + ApplicationResponseBean responseBean = new ApplicationResponseBean(); + + responseBean.setCallId(applicationEntity.getCall().getId()); + responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); + responseBean.setStatus(applicationEntity.getStatus()); + responseBean.setComments(applicationEntity.getComments()); + + List formFieldResponseBeans = applicationFormFieldEntities.stream() + .filter(field -> field.getApplicationForm().getApplication().getId().equals(applicationEntity.getId())) + .map(field -> { + ApplicationFormFieldResponseBean fieldResponseBean = new ApplicationFormFieldResponseBean(); + fieldResponseBean.setId(field.getId()); + fieldResponseBean.setFieldId(field.getFieldId()); + fieldResponseBean.setApplicationFormId(field.getApplicationForm().getId()); + fieldResponseBean.setFieldValue(field.getFieldValue()); + return fieldResponseBean; + }).collect(Collectors.toList()); + + responseBean.setFormFields(formFieldResponseBeans); + + return responseBean; + }).collect(Collectors.toList()); + } + + public ApplicationEntity validateApplication(Long id) { + ApplicationEntity applicationEntity= applicationRepository.findById(id).orElseThrow(() ->new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))); + return applicationEntity; + } + + private ApplicationResponseBean convertApplicationEntityToApplicationResponseBean(ApplicationEntity entity) { + ApplicationResponseBean response = new ApplicationResponseBean(); + response.setId(entity.getId()); + response.setSubmissionDate(entity.getSubmissionDate()); + response.setStatus(entity.getStatus()); + response.setComments(entity.getComments()); + response.setCallId(entity.getCall().getId()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + return response; + } + + public ApplicationEntity getApplicationOrCreate(UserEntity userEntity, CallEntity callEntity, FormEntity formEntity) { + ApplicationEntity applicationEntity = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), callEntity.getId()); + if (applicationEntity == null) { + validateFormId(formEntity, callEntity); + applicationEntity = createApplicationEntity(userEntity, callEntity); + applicationEntity=saveApplicationEntity(applicationEntity); + } + return applicationEntity; + } + private ApplicationFormEntity getApplicationFormOrCreate(FormEntity formEntity, ApplicationEntity applicationEntity) { + ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId()); + if(applicationFormEntity == null){ + applicationFormEntity = createApplicationFormEntity(applicationEntity, formEntity); + } + return applicationFormEntity; + } + + public List createOrUpdateMultipleFormFields(List formFieldResponseBeans, ApplicationFormEntity applicationFormEntity) { + List applicationFormFieldEntity = formFieldResponseBeans.stream() + .map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity)) + .collect(Collectors.toList()); + return applicationFormFieldEntity; + } + + public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity) { + ApplicationFormFieldEntity applicationFormFieldEntity; + if (applicationFormFieldRequestBean.getId() == null || applicationFormFieldRequestBean.getId() == 0) { + applicationFormFieldEntity = new ApplicationFormFieldEntity(); + applicationFormFieldEntity.setApplicationForm(applicationFormEntity); + } else { + applicationFormFieldEntity = validateApplicationFormField(applicationFormFieldRequestBean.getId()); + } + Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); + Utils.setIfUpdated(applicationFormFieldEntity::getFieldValue, applicationFormFieldEntity::setFieldValue, applicationFormFieldRequestBean.getFieldValue()); + return applicationFormFieldRepository.save(applicationFormFieldEntity); + } + + public ApplicationFormFieldEntity validateApplicationFormField(Long applicationFormFieldId) { + Optional applicationFormFieldEntity = applicationFormFieldRepository.findById(applicationFormFieldId); + if (applicationFormFieldEntity.isEmpty()) { + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_FORM_FIELD_NOT_FOUND)); + } + return applicationFormFieldEntity.get(); + } + + public List saveApplicationFormFieldEntities(List applicationFormFieldEntities) { + List applicationFormFieldEntities1 = applicationFormFieldRepository.saveAll(applicationFormFieldEntities); + return applicationFormFieldEntities1; + } + + public List convertApplicationFormFieldEntitiesToApplicationFormFieldResponseBeans(List applicationFormFieldEntities, Long applicationFormId) { + return applicationFormFieldEntities.stream() + .map(requestBean -> convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(requestBean, applicationFormId)) + .collect(Collectors.toList()); + } + + public ApplicationFormFieldResponseBean convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(ApplicationFormFieldEntity applicationFormFieldEntity, Long applicationFormId) { + ApplicationFormFieldResponseBean applicationFormFieldResponseBean = new ApplicationFormFieldResponseBean(); + applicationFormFieldResponseBean.setApplicationFormId(applicationFormId); + applicationFormFieldResponseBean.setFieldId(applicationFormFieldEntity.getFieldId()); + applicationFormFieldResponseBean.setFieldValue(applicationFormFieldEntity.getFieldValue()); + applicationFormFieldResponseBean.setId(applicationFormFieldEntity.getId()); + applicationFormFieldResponseBean.setCreatedDate(applicationFormFieldEntity.getCreatedDate()); + applicationFormFieldResponseBean.setUpdatedDate(applicationFormFieldEntity.getUpdatedDate()); + return applicationFormFieldResponseBean; + } + public ApplicationEntity saveApplicationEntity(ApplicationEntity application){ + ApplicationEntity applicationEntity=applicationRepository.save(application); + return applicationEntity; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index dd11b579..c20db699 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -2,15 +2,19 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.CallEntity; -import net.gepafin.tendermanagement.entities.FormEntity; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.request.ContentRequestBean; +import net.gepafin.tendermanagement.model.request.FieldValidatorBean; import net.gepafin.tendermanagement.model.request.FormRequest; import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; +import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.FormRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -20,6 +24,7 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @Component @@ -31,6 +36,12 @@ public class FormDao { @Autowired private CallService callService; + @Autowired + private ApplicationRepository applicationRepository; + + @Autowired + private ApplicationFormRepository applicationFormRepository; + public FormEntity saveFormEntity(FormEntity formEntity){ formEntity=formRepository.save(formEntity); return formEntity; @@ -101,4 +112,37 @@ public class FormDao { public String setContentResponseBean(List contentRequestBeans){ return Utils.convertListToJsonString(contentRequestBeans); } + + public void validateFormField(List applicationFormFieldRequestList, ApplicationEntity applicationEntity, FormEntity formEntity) { + + Map formFieldMap = applicationFormFieldRequestList.stream() + .collect(Collectors.toMap(ApplicationFormFieldRequestBean::getFieldId, ApplicationFormFieldRequestBean::getFieldValue)); + FormResponseBean formResponseBean = convertFormEntityToFormResponseBean(formEntity); + ApplicationFormEntity applicationFormEntity=applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),formEntity.getId()); + Boolean isApplicationFormExist= getApplicationFormExist(applicationFormEntity); + FieldValidator validator = FieldValidator.create(); + formResponseBean.getContent().forEach(contentResponseBean -> { + String fieldId = contentResponseBean.getId(); + String value = formFieldMap.get(fieldId); + if(value == null && isApplicationFormExist) { + return; + } + FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean, FieldValidatorBean.class); + validator + .notNull(value, fieldId) + .minLength(value, fieldValidatorBean.getMinLength(), fieldId) // Only applies if minLength is not null + .maxLength(value, fieldValidatorBean.getMaxLength(), fieldId) // Only applies if maxLength is not null + .matchesPattern(value, fieldValidatorBean.getPattern(), fieldId); // Only applies if pattern is present + }); + + validator.validate(); + + } + + private Boolean getApplicationFormExist(ApplicationFormEntity applicationFormEntity) { + if(applicationFormEntity !=null) { + return true; + } + return false; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java new file mode 100644 index 00000000..8c9156e3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -0,0 +1,36 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "APPLICATION") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ApplicationEntity extends BaseEntity { + + @ManyToOne + @JoinColumn(name = "USER_ID", nullable = false) + private UserEntity user; + + @Column(name = "SUBMISSION_DATE") + private LocalDateTime submissionDate; + + @Column(name = "STATUS", length = 255) + private String status; + + @Column(name = "COMMENTS", columnDefinition = "TEXT") + private String comments; + + @ManyToOne + @JoinColumn(name = "CALL_ID", nullable = false) + private CallEntity call; + + @Column(name="IS_DELETED") + private Boolean isDeleted; + + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java new file mode 100644 index 00000000..c795d5ef --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "APPLICATION_FORM") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ApplicationFormEntity extends BaseEntity { + + @ManyToOne + @JoinColumn(name = "APPLICATION_ID", nullable = false) + private ApplicationEntity application; + + @ManyToOne + @JoinColumn(name = "FORM_ID", nullable = false) + private FormEntity form; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormFieldEntity.java new file mode 100644 index 00000000..fbab986d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormFieldEntity.java @@ -0,0 +1,27 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "APPLICATION_FORM_FIELD") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ApplicationFormFieldEntity extends BaseEntity { + + @ManyToOne + @JoinColumn(name = "APPLICATION_FORM_ID", nullable = false) + private ApplicationFormEntity applicationForm; + + @Column(name = "FIELD_ID") + private String fieldId; + + @Column(name = "FIELD_VALUE", length = 255) + private String fieldValue; + +} + diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java new file mode 100644 index 00000000..df120d29 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum ApplicationStatusTypeEnum { + + DRAFT("DRAFT"), + SUBMIT("SUBMIT"), + EXPIRED("EXPIRED"), + READY_TO_SUBMIT("READY_TO_SUBMIT"); + + private String value; + + ApplicationStatusTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationFormFieldRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationFormFieldRequestBean.java new file mode 100644 index 00000000..065c2f3f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationFormFieldRequestBean.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.request; + +import jakarta.persistence.Column; +import lombok.Data; +import net.gepafin.tendermanagement.entities.ApplicationFormEntity; + +@Data +public class ApplicationFormFieldRequestBean { + + private Long id; + + private String fieldId; + + private String fieldValue; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequestBean.java new file mode 100644 index 00000000..ce95d9d6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequestBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.request; + +import jakarta.persistence.Column; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class ApplicationRequestBean { + + private Long formId; + + private List formFields; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FieldValidatorBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/FieldValidatorBean.java new file mode 100644 index 00000000..be94ffc0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FieldValidatorBean.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FieldValidatorBean { + + private Boolean isRequired; + + private Long minLength; + + private Long maxLength; + + private String pattern; + + private String custom; + +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java new file mode 100644 index 00000000..f625d991 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class ApplicationFormFieldResponseBean extends BaseBean { + + private Long id; + + private Long applicationFormId; + + private String fieldId; + + private String fieldValue; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java new file mode 100644 index 00000000..6c0a42f8 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java @@ -0,0 +1,26 @@ +package net.gepafin.tendermanagement.model.response; + +import jakarta.persistence.Column; +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class ApplicationResponseBean extends BaseBean { + + private Long callId; + + private LocalDateTime submissionDate; + + private String status; + + private String comments; + + private List formFields; + + private Long currentFormId; + + private Long nextFormId; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java new file mode 100644 index 00000000..baac36b2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.ApplicationFormFieldEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ApplicationFormFieldRepository extends JpaRepository { + + public List findByApplicationFormIdIn(List applicationFormIds); + + public List findByApplicationFormId(Long applicationFormId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java new file mode 100644 index 00000000..f742925b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.ApplicationFormEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ApplicationFormRepository extends JpaRepository { + + public ApplicationFormEntity findByApplicationIdAndFormId(Long applicationId,Long formId); + + List findByApplicationIdIn(List applicationIds); + + public List findByApplicationId(Long applicationId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java new file mode 100644 index 00000000..efdc0655 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface ApplicationRepository extends JpaRepository { + + public ApplicationEntity findByUserIdAndCallIdAndIsDeletedFalse(Long userId,Long callId); + + public List findByUserIdAndIsDeletedFalse(Long userId); + + @Query("SELECT a FROM ApplicationEntity a WHERE a.id = :id AND a.isDeleted = false") + Optional findById(@Param("id") Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java new file mode 100644 index 00000000..a0534401 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; + +import java.util.List; + +public interface ApplicationService { + + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long callId); + + ApplicationResponseBean getApplicationById(HttpServletRequest request, Long applicationId); + + List getAllApplications(HttpServletRequest request); + + void deleteApplication(HttpServletRequest request, Long applicationId); + + public ApplicationEntity validateApplication(Long userId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormService.java b/src/main/java/net/gepafin/tendermanagement/service/FormService.java index 7945c753..cf896b73 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FormService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FormService.java @@ -1,7 +1,10 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.FormEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.request.FormRequest; import net.gepafin.tendermanagement.model.response.FormResponseBean; @@ -20,4 +23,6 @@ public interface FormService { public FormEntity validateForm(Long id); public List getFormsByCallId(HttpServletRequest request,Long callId); + + void validateFormField(List formFields, ApplicationEntity applicationEntity, FormEntity formEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java new file mode 100644 index 00000000..58bb221a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -0,0 +1,59 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.ApplicationDao; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + + +@Service +public class ApplicationServiceImpl implements ApplicationService { + + @Autowired + private ApplicationDao applicationDao; + + @Autowired + private Validator validator; + + @Override + @Transactional(rollbackFor = Exception.class) + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long callId) { + UserEntity userEntity = validator.validateUser(request); + return applicationDao.createApplication(applicationRequestBean,userEntity,callId); + } + + @Override + @Transactional(readOnly = true) + public ApplicationResponseBean getApplicationById(HttpServletRequest request, Long applicationId) { + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteApplication(HttpServletRequest request, Long applicationId) { + applicationDao.deleteById(applicationId); + } + + @Override + public ApplicationEntity validateApplication(Long id) { + return applicationDao.validateApplication(id); + } + + @Override + @Transactional(readOnly = true) + public List getAllApplications(HttpServletRequest request) { + Map userInfo=validator.getUserInfoFromToken(request); + return applicationDao.getAllApplications(userInfo); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java index b8c9ab39..ee56bf88 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java @@ -2,7 +2,10 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.FormDao; +import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.FormEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.request.FormRequest; import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.service.FormService; @@ -47,4 +50,10 @@ public class FormServiceImpl implements FormService { public List getFormsByCallId(HttpServletRequest request, Long callId) { return formDao.getFormsByCallId(callId); } + + @Override + public void validateFormField(List formFields, ApplicationEntity applicationEntity, FormEntity formEntity) { + formDao.validateFormField(formFields,applicationEntity, formEntity); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index e57909d2..4b92ddd6 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -37,4 +37,24 @@ public class FieldValidator { throw new ValidationException(Status.VALIDATION_ERROR, errors); } } + public FieldValidator minLength(String value, Long minLength, String fieldName) { + if (minLength != null && value != null && value.length() < minLength) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN_LENGTH), fieldName, minLength)); + } + return this; + } + + public FieldValidator maxLength(String value, Long maxLength, String fieldName) { + if (maxLength != null && value != null && value.length() > maxLength) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX_LENGTH), fieldName, maxLength)); + } + return this; + } + + public FieldValidator matchesPattern(String value, String pattern, String fieldName) { + if (value != null && pattern != null && !value.matches(pattern)) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_PATTERN), fieldName)); + } + return this; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index c1819495..5560809f 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -5,12 +5,14 @@ import com.fasterxml.jackson.core.json.JsonReadFeature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import io.micrometer.common.util.StringUtils; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.List; @@ -99,7 +101,13 @@ public class Utils { } public static List convertJsonStringToList(String jsonString, Class clazz) { try { - return mapper.readValue(jsonString, new TypeReference>() {}); + TypeReference> typeRef = new TypeReference>() { + @Override + public Type getType() { + return TypeFactory.defaultInstance().constructCollectionType(List.class, clazz); + } + }; + return mapper.readValue(jsonString, typeRef); } catch (Exception e) { e.printStackTrace(); // Handle the exception appropriately (e.g., throw a custom exception) @@ -129,5 +137,14 @@ public class Utils { } return null; } - + public static U convertSourceObjectToDestinationObject(T source, Class destinationClass) { + try { + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + mapper.registerModule(new JavaTimeModule()); + return mapper.convertValue(source, destinationClass); + } catch (Exception e) { + log.error("Error converting object: " + e.getMessage(), e); + } + return null; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java new file mode 100644 index 00000000..a251100a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -0,0 +1,77 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Validated +public interface ApplicationApi { + + @Operation(summary = "Api to create or update application", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PutMapping(value = "/call/{callId}", + produces = { "application/json" }) + ResponseEntity> createApplication(HttpServletRequest request, + @Parameter(description = " Flow request object", required = true) @Valid @RequestBody ApplicationRequestBean applicationRequestBean, + @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + + @Operation(summary = "Api to get an application by id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/{applicationId}", produces = "application/json") + ResponseEntity> getApplicationById(HttpServletRequest request, + @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); + + @Operation(summary = "Api to get all applications", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "", produces = "application/json") + ResponseEntity>> getAllApplications(HttpServletRequest request); + + @Operation(summary = "Api to delete application", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @DeleteMapping(value = "/{applicationId}") + ResponseEntity> deleteApplication(HttpServletRequest request, + @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); +} + diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java new file mode 100644 index 00000000..00664319 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -0,0 +1,64 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.FlowResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.web.rest.api.ApplicationApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.slf4j.Logger; + +import java.util.List; + + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/application}") +public class ApplicationApiController implements ApplicationApi { + + private final Logger log = LoggerFactory.getLogger(ApplicationApiController.class); + + @Autowired + private ApplicationService applicationService; + + @Override + public ResponseEntity> createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long callId) { + ApplicationResponseBean applicationResponseBean= applicationService.createApplication(request,applicationRequestBean,callId); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG))); } + + @Override + public ResponseEntity> getApplicationById(HttpServletRequest request, + Long applicationId) { + log.info("Get Application by ID - Application ID: {}", applicationId); + ApplicationResponseBean application = applicationService.getApplicationById(request,applicationId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> deleteApplication(HttpServletRequest request, + Long applicationId) { + log.info("Delete Application - Application ID: {}", applicationId); + applicationService.deleteApplication(request,applicationId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_APPLICATION_SUCCESS_MSG))); + } + + @Override + public ResponseEntity>> getAllApplications(HttpServletRequest request) { + List applications = applicationService.getAllApplications(request); + log.info("Get All Applications"); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); + } +} diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index a18178e7..93ff31fc 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -633,4 +633,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index ccbdb47d..633130b3 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -139,3 +139,20 @@ flow.created.successfully=Flow created successfully. flow.fetched.successfully=Flow fetched successfully. flow.already.exists= Flow already exist for this call. flow.request.not.complete=Flow request is not complete. + +# Application related messages +application.created.success=Application successfully created. +application.updated.success=Application successfully updated. +application.deleted.success=Application successfully deleted. +application.get.success=Application details fetched successfully. +application.not.found=Application not found with the given ID. +application.form.field.not.found=Application form field not found. +Form.not.matches.to.call.initial.form=Form id does not matches to initial form id of call. + +#Validation related messages +validation.field.required=Field {0} is required. +validation.field.min_length=Field {0} must be at least {1} characters long. +validation.field.max_length=Field {0} must be no more than {1} characters long. +validation.field.pattern=Field {0} does not match the required pattern. +validation.field.not_null=Field {0} must not be null. +validation.field.not_empty=Field {0} must not be empty. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 52234e76..7990d89c 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -56,7 +56,7 @@ status.same.error=Lo stato � gi� impostato. invalid.status.change.from.draft=Lo stato non pu� essere cambiato in READY_TO_PUBLISH o PUBLISH da DRAFT. status.cannot.be.changed=Lo stato non pu� essere cambiato. published.call.not.update=Il bando pubblicato non pu� essere aggiornato. -invalid.status.change.from.publish=Lo stato non può essere modificato in READY_TO_PUBLISH o DRAFT da PUBLISH. +invalid.status.change.from.publish=Lo stato non pu� essere modificato in READY_TO_PUBLISH o DRAFT da PUBLISH. # Login-related messages @@ -115,7 +115,7 @@ lookupdata.created.successfully=LookUpData creato correttamente. lookupdata.fetched.successfully=LookUpData recuperato correttamente. lookupdata.updated.successfully=LookUpData aggiornato correttamente. lookupdata.deleted.successfully=LookUpData eliminato correttamente. -lookupdata.value.cannot.be.empty=Il campo valore non può essere vuoto +lookupdata.value.cannot.be.empty=Il campo valore non pu� essere vuoto #Document-related message document.updated.successfully=Documento aggiornato con successo. @@ -133,5 +133,22 @@ update.user.status.success=Lo stato dell'utente � stato aggiornato con success #Flow-related message flow.created.successfully=Flusso creato con successo. flow.fetched.successfully=Flusso recuperato con successo. -flow.already.exists= Il flusso esiste già per questa chiamata. -flow.request.not.complete=La richiesta di flusso non è completa. \ No newline at end of file +flow.already.exists= Il flusso esiste gi� per questa chiamata. +flow.request.not.complete=La richiesta di flusso non � completa. + +# Application related messages +application.created.success=Applicazione creata con successo. +application.updated.success=Applicazione aggiornata con successo. +application.deleted.success=Applicazione eliminata con successo. +application.get.success=Dettagli dell'applicazione recuperati con successo. +application.not.found=Applicazione non trovata con l'ID fornito. +application.form.field.not.found=Campo del modulo di domanda non trovato. +Form.not.matches.to.call.initial.form=L'ID del modulo non corrisponde all'ID del modulo iniziale della chiamata. + +#Validation related messages +validation.field.required=Il campo {0} � obbligatorio. +validation.field.min_length=Il campo {0} deve essere lungo almeno {1} caratteri. +validation.field.max_length=Il campo {0} deve essere lungo al massimo {1} caratteri. +validation.field.pattern=Il campo {0} non corrisponde al modello richiesto. +validation.field.not_null=Il campo {0} non deve essere nullo. +validation.field.not_empty=Il campo {0} non deve essere vuoto. \ No newline at end of file From 2afb092070a66920e79ac9d3560a210da268b6bb Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 12 Sep 2024 15:49:32 +0530 Subject: [PATCH 073/145] updated code --- .../gepafin/tendermanagement/dao/FaqDao.java | 5 ++++- .../enums/RoleStatusEnum.java | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java index 482191e3..b8ebd278 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.FaqEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.response.FaqResponseBean; @@ -81,7 +82,9 @@ public class FaqDao { .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); } else { - lookUpDataService.getOrCreateLookUpDataEntity(faqReq, type); + if (Boolean.FALSE.equals(userEntity.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()))) { + lookUpDataService.getOrCreateLookUpDataEntity(faqReq, type); + } faqEntity = new FaqEntity(); faqEntity.setCall(callEntity); faqEntity.setUser(userEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java new file mode 100644 index 00000000..3659856d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum RoleStatusEnum { + + ROLE_BENEFICIARY("ROLE_BENEFICIARY"), + ROLE_SUPER_ADMIN("ROLE_SUPER_ADMIN"), + ROLE_PRE_INSTRUCTOR("ROLE_PRE_INSTRUCTOR"), + ROLE_GEPAFIN_OPERATOR("ROLE_GEPAFIN_OPERATOR"); + + private String value; + + RoleStatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} From 9938b95c8571f629836261dd20654ccbc6d8ed24 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 12 Sep 2024 19:29:04 +0530 Subject: [PATCH 074/145] Updated endpoint to create flow --- .../gepafin/tendermanagement/dao/FlowDao.java | 51 ++++++++++++------- .../entities/FlowEdgesEntity.java | 3 ++ .../model/request/FlowEdgesRequestBean.java | 2 + .../model/response/FlowEdgesResponseBean.java | 2 +- .../tendermanagement/service/FlowService.java | 2 +- .../service/impl/FlowServiceImpl.java | 7 ++- .../web/rest/api/FlowApi.java | 11 ++-- .../web/rest/api/impl/FlowApiController.java | 6 +-- .../db/changelog/db.changelog-1.0.0.xml | 6 +++ 9 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java index 985560f3..8b6931bc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java @@ -20,11 +20,13 @@ import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.FormService; +import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -47,10 +49,11 @@ public class FlowDao { @Autowired private FormService formService; - public FlowResponseBean createFlow(FlowRequestBean flowRequestBean, Long callId) { + public FlowResponseBean createOrUpdateFlow(FlowRequestBean flowRequestBean, Long callId) { validateFlowRequestBean(flowRequestBean); - CallEntity call = setInitialAndFinalFormInCall(flowRequestBean, callId); - checkIfFlowExits(callId); + CallEntity call = callService.validateCall(callId); + checkIfFlowExits(call); + call= setInitialAndFinalFormInCall(flowRequestBean, call); validateFlowRequest(flowRequestBean); List flowDataEntities = createFlowData(flowRequestBean,call); List flowEdgesEntities = createFlowEdges(flowRequestBean,call); @@ -59,23 +62,29 @@ public class FlowDao { } public void validateFlowRequestBean(FlowRequestBean flowRequestBean){ - if(flowRequestBean.getFlowData()==null || flowRequestBean.getFlowEdges()==null){ - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.FLOW_REQUEST_NOT_PROPER)); + if (flowRequestBean.getFlowEdges() == null || flowRequestBean.getFlowEdges().isEmpty()) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.FLOW_REQUEST_NOT_PROPER)); } } - public void checkIfFlowExits(Long callId) { - List flowDataEntities = flowDataRepository.findByCallId(callId); - List flowEdgesEntities = flowEdgesRepository.findByCallId(callId); - if (!flowDataEntities.isEmpty() || !flowEdgesEntities.isEmpty()) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.FLOW_ALREADY_EXISTS)); + public void checkIfFlowExits(CallEntity call) { + List flowDataEntities = flowDataRepository.findByCallId(call.getId()); + List flowEdgesEntities = flowEdgesRepository.findByCallId(call.getId()); + if (Boolean.FALSE.equals(flowDataEntities.isEmpty()) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty())) { + call.setInitialForm(null); + call.setFinalForm(null); + call=callRepository.save(call); + flowDataRepository.deleteAll(flowDataEntities); + flowEdgesRepository.deleteAll(flowEdgesEntities); } } public void validateFlowRequest(FlowRequestBean flowRequestBean) { formService.validateForm(flowRequestBean.getInitialForm()); formService.validateForm(flowRequestBean.getFinalForm()); - flowRequestBean.getFlowData().forEach(flowData -> formService.validateForm(flowData.getFormId())); + if(flowRequestBean.getFlowData()!=null && !flowRequestBean.getFlowData().isEmpty()) { + flowRequestBean.getFlowData().forEach(flowData -> formService.validateForm(flowData.getFormId())); + } } private List createFlowEdgesResponseBean(List flowEdgesEntities) { @@ -96,19 +105,22 @@ public class FlowDao { return flowResponseBean; } - private CallEntity setInitialAndFinalFormInCall(FlowRequestBean flowRequestBean, Long callId) { - CallEntity call = callService.validateCall(callId); + private CallEntity setInitialAndFinalFormInCall(FlowRequestBean flowRequestBean, CallEntity call) { call.setInitialForm(flowRequestBean.getInitialForm()); call.setFinalForm(flowRequestBean.getFinalForm()); + call.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); call = callRepository.save(call); return call; } public List createFlowData(FlowRequestBean flowRequestBean, CallEntity call) { - List flowDataEntities = flowRequestBean.getFlowData().stream() - .map(flowDataRequestBean -> createFlowDataEntity(flowDataRequestBean, call)) - .collect(Collectors.toList()); - return flowDataRepository.saveAll(flowDataEntities); + if (flowRequestBean.getFlowData() != null || !flowRequestBean.getFlowEdges().isEmpty()) { + List flowDataEntities = flowRequestBean.getFlowData().stream() + .map(flowDataRequestBean -> createFlowDataEntity(flowDataRequestBean, call)) + .collect(Collectors.toList()); + return flowDataRepository.saveAll(flowDataEntities); + } + return null; } public FlowDataEntity createFlowDataEntity(FlowDataRequestBean flowDataRequestBean,CallEntity call) { @@ -129,6 +141,7 @@ public class FlowDao { public FlowEdgesEntity createFlowEdgesEntity(FlowEdgesRequestBean flowEdgesRequestBean,CallEntity call) { FlowEdgesEntity flowEdgesEntity = new FlowEdgesEntity(); + flowEdgesEntity.setTrackingId(flowEdgesRequestBean.getId()); flowEdgesEntity.setSourceId(Long.valueOf(flowEdgesRequestBean.getSource())); flowEdgesEntity.setTargetId(Long.valueOf(flowEdgesRequestBean.getTarget())); flowEdgesEntity.setType(flowEdgesRequestBean.getType()); @@ -147,7 +160,7 @@ public class FlowDao { public FlowEdgesResponseBean convertFlowEdgesEntityToFlowEdgesResponseBean(FlowEdgesEntity flowEdgesEntity) { FlowEdgesResponseBean flowEdgesResponseBean = new FlowEdgesResponseBean(); - flowEdgesResponseBean.setId(flowEdgesEntity.getId()); + flowEdgesResponseBean.setId(flowEdgesEntity.getTrackingId()); flowEdgesResponseBean.setType(flowEdgesEntity.getType()); flowEdgesResponseBean.setSource(String.valueOf(flowEdgesEntity.getSourceId())); flowEdgesResponseBean.setTarget(String.valueOf(flowEdgesEntity.getTargetId())); @@ -163,7 +176,7 @@ public class FlowDao { List flowEdgesResponseBeans=createFlowEdgesResponseBean(flowEdgesEntities); flowResponseBean.setFlowData(flowDataResponseBeans); flowResponseBean.setFlowEdges(flowEdgesResponseBeans); - if(flowResponseBean.getFlowData().isEmpty() || flowResponseBean.getFlowEdges().isEmpty()){ + if( flowResponseBean.getFlowEdges().isEmpty()){ return null; } flowResponseBean.setCallId(call.getId()); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java index 685c484c..119af700 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java @@ -25,4 +25,7 @@ public class FlowEdgesEntity extends BaseEntity { @Column(name="CALL_ID") private Long callId; + @Column(name="TRACKING_ID") + private String trackingId; + } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FlowEdgesRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/FlowEdgesRequestBean.java index 45d4195f..57a0e7a7 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FlowEdgesRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FlowEdgesRequestBean.java @@ -5,6 +5,8 @@ import lombok.Data; @Data public class FlowEdgesRequestBean { + private String id; + private String source; private String target; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FlowEdgesResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FlowEdgesResponseBean.java index 0ffa3c62..9424a79a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FlowEdgesResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FlowEdgesResponseBean.java @@ -6,7 +6,7 @@ import org.springframework.security.core.parameters.P; @Data public class FlowEdgesResponseBean { - private Long id; + private String id; private String source; diff --git a/src/main/java/net/gepafin/tendermanagement/service/FlowService.java b/src/main/java/net/gepafin/tendermanagement/service/FlowService.java index 16d76f8d..7c38a01f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FlowService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FlowService.java @@ -6,7 +6,7 @@ import net.gepafin.tendermanagement.model.response.FlowResponseBean; public interface FlowService { - public FlowResponseBean createFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId); + public FlowResponseBean createOrUpdateFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId); public FlowResponseBean getFlowByCallId(HttpServletRequest request, Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java index 7f173472..2ae5546f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java @@ -7,6 +7,7 @@ import net.gepafin.tendermanagement.model.response.FlowResponseBean; import net.gepafin.tendermanagement.service.FlowService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class FlowServiceImpl implements FlowService { @@ -15,11 +16,13 @@ public class FlowServiceImpl implements FlowService { private FlowDao flowDao; @Override - public FlowResponseBean createFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId) { - return flowDao.createFlow(flowRequestBean,callId); + @Transactional(rollbackFor = Exception.class) + public FlowResponseBean createOrUpdateFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId) { + return flowDao.createOrUpdateFlow(flowRequestBean,callId); } @Override + @org.springframework.transaction.annotation.Transactional(readOnly = true) public FlowResponseBean getFlowByCallId(HttpServletRequest request, Long callId) { return flowDao.getFlowByCallId(callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java index 126dedd6..63d813e6 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java @@ -15,17 +15,14 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.*; import java.util.List; @Validated public interface FlowApi { - @Operation(summary = "Api to create flow", + @Operation(summary = "Api to create or update flow", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -34,9 +31,9 @@ public interface FlowApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PostMapping(value = "/call/{callId}", + @PutMapping(value = "/call/{callId}", produces = { "application/json" }) - ResponseEntity> createFlow(HttpServletRequest request, + ResponseEntity> createOrUpdateFlow(HttpServletRequest request, @Parameter(description = " Flow request object", required = true) @Valid @RequestBody FlowRequestBean flowRequestBean, @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java index e2e41cb3..6245a420 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java @@ -26,15 +26,13 @@ public class FlowApiController implements FlowApi { private FlowService flowService; @Override - @Transactional(rollbackFor=Exception.class) - public ResponseEntity> createFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId) { - FlowResponseBean flowResponseBean=flowService.createFlow(httpServletRequest,flowRequestBean,callId); + public ResponseEntity> createOrUpdateFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId) { + FlowResponseBean flowResponseBean=flowService.createOrUpdateFlow(httpServletRequest,flowRequestBean,callId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(flowResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FLOW_CREATED_SUCCESSFULLY))); } @Override - @Transactional(rollbackFor=Exception.class) public ResponseEntity> getFlowByCallId(HttpServletRequest request, Long callId) { FlowResponseBean flowResponseBean=flowService.getFlowByCallId(request,callId); return ResponseEntity.status(HttpStatus.OK) diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index a18178e7..4f664bd0 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -633,4 +633,10 @@ + + + + + + From 7e2a22c81763f091093cbcc414c4a5698957615d Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 13 Sep 2024 15:22:43 +0530 Subject: [PATCH 075/145] Added few validation in call api --- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/CallDao.java | 53 +++++++++----- .../enums/CallStatusEnum.java | 20 ++++++ .../repositories/CallRepository.java | 3 +- .../tendermanagement/service/CallService.java | 2 +- .../service/impl/CallServiceImpl.java | 7 +- .../impl/CallValidatorServiceImpl.java | 71 +++++++++++-------- .../tendermanagement/util/FieldValidator.java | 5 ++ .../web/rest/api/CallApi.java | 2 +- .../web/rest/api/impl/CallApiController.java | 4 +- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 9 +-- 12 files changed, 120 insertions(+), 58 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 5c77aa3b..ce0f53b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -108,4 +108,5 @@ public class GepafinConstant { public static final String FLOW_FETCHED_SUCCESSFULLY="flow.fetched.successfully"; public static final String FLOW_ALREADY_EXISTS="flow.already.exists"; public static final String FLOW_REQUEST_NOT_PROPER="flow.request.not.complete"; + public static final String FLOW_NOT_FOUND = "flow.not.found"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 905aa0dc..1fb5ca68 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -3,13 +3,20 @@ package net.gepafin.tendermanagement.dao; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.model.response.*; -import net.gepafin.tendermanagement.service.FaqService; -import net.gepafin.tendermanagement.service.LookUpDataService; +import net.gepafin.tendermanagement.service.*; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -39,13 +46,14 @@ import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; import net.gepafin.tendermanagement.repositories.FaqRepository; import net.gepafin.tendermanagement.repositories.RegionRepository; -import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.impl.CallValidatorServiceImpl; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import static net.gepafin.tendermanagement.enums.RoleStatusEnum.ROLE_SUPER_ADMIN; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; +import static org.springframework.security.authorization.AuthorityReactiveAuthorizationManager.hasRole; @Component public class CallDao { @@ -64,7 +72,7 @@ public class CallDao { @Autowired private RegionRepository regionRepository; - + @Autowired private LookUpDataService lookUpDataService; @@ -73,20 +81,24 @@ public class CallDao { @Autowired private UserService userService; - + @Autowired private FaqService faqService; + @Autowired + private FlowDao flowDao; + @Autowired + private FormDao formDao; public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { UserEntity userEntity = userService.validateUser(userId); createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId()); CallEntity callEntity = convertToCallEntity(createCallRequest); - + updateFaq(createCallRequest.getFaq(), callEntity, userEntity,LookUpDataTypeEnum.FAQ); - + convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, LookUpDataTypeEnum.AIMED_TO); - + CallResponse createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); return createCallResponseBean; @@ -391,12 +403,12 @@ public class CallDao { public void isValidDateRange(UpdateCallRequestStep1 updateCallRequest, CallEntity callEntity) { List dates = updateCallRequest.getDates(); - LocalDate startDate = (dates != null && dates.size() > 0 && dates.get(0) != null) - ? dates.get(0).toLocalDate() + LocalDate startDate = (dates != null && dates.size() > 0 && dates.get(0) != null) + ? dates.get(0).toLocalDate() : null; - LocalDate endDate = (dates != null && dates.size() > 1 && dates.get(1) != null) - ? dates.get(1).toLocalDate() + LocalDate endDate = (dates != null && dates.size() > 1 && dates.get(1) != null) + ? dates.get(1).toLocalDate() : null; Boolean isValid = true; @@ -427,7 +439,7 @@ public class CallDao { setIfUpdated(callEntity::getDescriptionLong, callEntity::setDescriptionLong, updateCallRequest.getDescriptionLong()); List dates=updateCallRequest.getDates(); - + if (dates != null && dates.size()>1) { if (dates.size() > 0) { setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, dates.get(0)); @@ -545,9 +557,14 @@ public class CallDao { return createCallResponseBean; } - public List getAllCalls() { - return callRepository.findAll() - .stream() + public List getAllCalls(UserEntity user) { + String type=user.getRoleEntity().getRoleType(); + List callStatusList =CallStatusEnum.getStatusValues(); + if (Boolean.FALSE.equals(ROLE_SUPER_ADMIN.getValue().equals(type))) { + callStatusList = List.of(CallStatusEnum.PUBLISH.getValue()); + } + List calls = callRepository.findByStatusIn(callStatusList); + return calls.stream() .map(this::convertToCallDetailsResponseBean) .collect(Collectors.toList()); } @@ -555,7 +572,9 @@ public class CallDao { public CallResponse validateCallData(CallEntity callEntity) { validateUpdate(callEntity); CallResponse callResponseBean = getCallResponseBean(callEntity); - CallValidatorServiceImpl.validateResponse(callResponseBean); + FlowResponseBean flowResponseBean = flowDao.getFlowByCallId(callEntity.getId()); + List formResponseBean = formDao.getFormsByCallId(callEntity.getId()); + CallValidatorServiceImpl.validateResponse(callResponseBean,flowResponseBean,formResponseBean); callEntity.setStatus(CallStatusEnum.READY_TO_PUBLISH.getValue()); callRepository.save(callEntity); callResponseBean.setCurrentStep(GepafinConstant.VALIDATE_REQUEST); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java index cf5f49c3..2ae07e15 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/CallStatusEnum.java @@ -1,7 +1,12 @@ package net.gepafin.tendermanagement.enums; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + public enum CallStatusEnum { DRAFT("DRAFT"), @@ -19,4 +24,19 @@ public enum CallStatusEnum { public String getValue() { return value; } + + @JsonCreator + public static CallStatusEnum fromValue(String value) { + for (CallStatusEnum b : CallStatusEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } + public static List getStatusValues() { + return Arrays.stream(CallStatusEnum.values()) + .map(CallStatusEnum::getValue) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index dd2c8b40..23f83f04 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.enums.CallStatusEnum; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -9,5 +10,5 @@ import java.util.List; public interface CallRepository extends JpaRepository { public CallEntity findByIdAndStatusNotIn(Long id, List status); - + List findByStatusIn(List callStatus); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index cc961ba5..500eb854 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -21,7 +21,7 @@ public interface CallService { CallResponse getCallById (Long callId); - List getAllCalls(); + List getAllCalls(HttpServletRequest request); CallResponse validateCallData(Long callId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 85b3086d..5ba8952d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; @@ -57,8 +58,10 @@ public class CallServiceImpl implements CallService { @Override @Transactional(readOnly = true) - public List getAllCalls() { - return callDao.getAllCalls(); + public List getAllCalls(HttpServletRequest request) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + UserEntity user=tokenProvider.validateUser(userInfo); + return callDao.getAllCalls(user); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java index 0d2f651d..402727b2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java @@ -1,44 +1,55 @@ package net.gepafin.tendermanagement.service.impl; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.FlowResponseBean; +import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; public class CallValidatorServiceImpl { - - public static void validateResponse(CallResponse response) { - FieldValidator.create() - .notNull(response.getId(), "id") - .notNull(response.getName(), "name") - .notNull(response.getDescriptionShort(), "descriptionShort") - .notNull(response.getDescriptionLong(), "descriptionLong") - .notNull(response.getDates().get(0), "startDate") - .notNull(response.getDates().get(1), "endDate") - .notNull(response.getStatus(), "status") - .notNull(response.getRegionId(), "regionId") - .notNull(response.getAmount(), "amount") - .notNull(response.getAmountMax(), "amountMax") - .notNull(response.getThreshold(), "threshold") - .notNull(response.getDocumentationRequested(), "documentationRequested") - .notEmpty(response.getAimedTo(), "aimedTo") - .notEmpty(response.getCriteria(), "criteria") - .notEmpty(response.getDocs(), "docs") - .notEmpty(response.getFaq(), "faq") - .notEmpty(response.getImages(), "images") - .notEmpty(response.getCheckList(), "checkList") - .validate(); - - if (response.getDates().get(0).toLocalDate().isBefore(LocalDate.now()) - || response.getDates().get(1).toLocalDate().isBefore(LocalDate.now()) || - response.getDates().get(0).toLocalDate().isAfter(response.getDates().get(1).toLocalDate())) { - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); - } - } + public static void validateResponse(CallResponse response, FlowResponseBean flowResponse, List formResponses) { + // Validate CallResponse (existing logic) + FieldValidator data = FieldValidator.create() + .notNull(response.getId(), "id") + .notNull(response.getName(), "name") + .notNull(response.getDescriptionShort(), "descriptionShort") + .notNull(response.getDescriptionLong(), "descriptionLong") + .notNull(response.getDates().get(0), "startDate") + .notNull(response.getDates().get(1), "endDate") + .notNull(response.getStatus(), "status") + .notNull(response.getRegionId(), "regionId") + .notNull(response.getAmount(), "amount") + .notNull(response.getAmountMax(), "amountMax") + .notNull(response.getThreshold(), "threshold") + .notNull(response.getDocumentationRequested(), "documentationRequested") + .notEmpty(response.getAimedTo(), "aimedTo") + .notEmpty(response.getCriteria(), "criteria") + .notEmpty(response.getDocs(), "docs") + .notEmpty(response.getFaq(), "faq") + .notEmpty(response.getImages(), "images") + .notEmpty(response.getCheckList(), "checkList"); + + if (response.getDates().get(0) == null || response.getDates().get(1) == null + || response.getDates().get(0).toLocalDate().isBefore(LocalDate.now()) + || response.getDates().get(1).toLocalDate().isBefore(LocalDate.now()) + || response.getDates().get(0).toLocalDate().isAfter(response.getDates().get(1).toLocalDate())) { + data = data.addError(Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); + } + if (flowResponse == null || ((flowResponse.getFlowData() == null || flowResponse.getFlowData().isEmpty()) + && (flowResponse.getFlowEdges() == null || flowResponse.getFlowEdges().isEmpty()))) { + data.addError(Translator.toLocale(GepafinConstant.FLOW_NOT_FOUND)); + } + if (formResponses == null || formResponses.isEmpty()) { + data.addError(Translator.toLocale(GepafinConstant.FORM_NOT_FOUND)); + } + data.validate(); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index e57909d2..7309dbd2 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -37,4 +37,9 @@ public class FieldValidator { throw new ValidationException(Status.VALIDATION_ERROR, errors); } } + + public FieldValidator addError( String errorMessage) { + errors.add(errorMessage); + return this; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 357176db..cc7f985a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -100,7 +100,7 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = { "application/json" }) - ResponseEntity>> getAllCalls(); + ResponseEntity>> getAllCalls(HttpServletRequest request); @Operation(summary = "Api to validate call", diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 34ea5fd6..e4680428 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -65,8 +65,8 @@ public class CallApiController implements CallApi { @Override @Transactional(readOnly = true) - public ResponseEntity>> getAllCalls() { - List calls = callService.getAllCalls(); + public ResponseEntity>> getAllCalls(HttpServletRequest request) { + List calls = callService.getAllCalls(request); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(calls, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index ccbdb47d..091922ff 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -139,3 +139,4 @@ flow.created.successfully=Flow created successfully. flow.fetched.successfully=Flow fetched successfully. flow.already.exists= Flow already exist for this call. flow.request.not.complete=Flow request is not complete. +flow.not.found=Flow not found. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 52234e76..fda677e8 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -56,7 +56,7 @@ status.same.error=Lo stato � gi� impostato. invalid.status.change.from.draft=Lo stato non pu� essere cambiato in READY_TO_PUBLISH o PUBLISH da DRAFT. status.cannot.be.changed=Lo stato non pu� essere cambiato. published.call.not.update=Il bando pubblicato non pu� essere aggiornato. -invalid.status.change.from.publish=Lo stato non può essere modificato in READY_TO_PUBLISH o DRAFT da PUBLISH. +invalid.status.change.from.publish=Lo stato non pu� essere modificato in READY_TO_PUBLISH o DRAFT da PUBLISH. # Login-related messages @@ -115,7 +115,7 @@ lookupdata.created.successfully=LookUpData creato correttamente. lookupdata.fetched.successfully=LookUpData recuperato correttamente. lookupdata.updated.successfully=LookUpData aggiornato correttamente. lookupdata.deleted.successfully=LookUpData eliminato correttamente. -lookupdata.value.cannot.be.empty=Il campo valore non può essere vuoto +lookupdata.value.cannot.be.empty=Il campo valore non pu� essere vuoto #Document-related message document.updated.successfully=Documento aggiornato con successo. @@ -133,5 +133,6 @@ update.user.status.success=Lo stato dell'utente � stato aggiornato con success #Flow-related message flow.created.successfully=Flusso creato con successo. flow.fetched.successfully=Flusso recuperato con successo. -flow.already.exists= Il flusso esiste già per questa chiamata. -flow.request.not.complete=La richiesta di flusso non è completa. \ No newline at end of file +flow.already.exists= Il flusso esiste gi� per questa chiamata. +flow.request.not.complete=La richiesta di flusso non � completa. +flow.not.found=Flow not found. \ No newline at end of file From 2be419e5d06ead5179aaff96d3c17459e5e4fd5f Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 13 Sep 2024 18:39:46 +0530 Subject: [PATCH 076/145] Updated data in form field --- .../tendermanagement/dao/FormFieldDao.java | 6 +++ .../entities/FormFieldEntity.java | 6 +++ .../model/request/FormFieldRequest.java | 4 ++ .../model/response/FormFieldResponseBean.java | 5 ++ .../db/changelog/db.changelog-1.0.0.xml | 18 +++++++ .../inserted_form_field_data_13_09_2024.sql | 51 +++++++++++++++++++ 6 files changed, 90 insertions(+) create mode 100644 src/main/resources/db/dump/inserted_form_field_data_13_09_2024.sql diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java index beda3eaa..57f67694 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java @@ -30,6 +30,8 @@ public class FormFieldDao { FormFieldEntity formFieldEntity = new FormFieldEntity(); formFieldEntity.setLabel(formFieldRequest.getLabel()); formFieldEntity.setName(formFieldRequest.getName()); + formFieldEntity.setDescription(formFieldRequest.getDescription()); + formFieldEntity.setSortOrder(formFieldRequest.getSortOrder()); formFieldEntity.setValidators(Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); formFieldEntity.setSettings(setSettingRequestBean(formFieldRequest.getSettings())); formFieldEntity = saveFormFieldEntity(formFieldEntity); @@ -40,6 +42,8 @@ public class FormFieldDao { FormFieldResponseBean formFieldResponseBean = new FormFieldResponseBean(); formFieldResponseBean.setId(formFieldEntity.getId()); formFieldResponseBean.setName(formFieldEntity.getName()); + formFieldResponseBean.setDescription(formFieldEntity.getDescription()); + formFieldResponseBean.setSortOrder(formFieldEntity.getSortOrder()); formFieldResponseBean .setSettings(Utils.convertJsonStringToList(formFieldEntity.getSettings(), SettingResponseBean.class)); formFieldResponseBean.setLabel(formFieldEntity.getLabel()); @@ -69,6 +73,8 @@ public class FormFieldDao { FormFieldEntity formFieldEntity = validateFormField(formFieldId); Utils.setIfUpdated(formFieldEntity::getName, formFieldEntity::setName, formFieldRequest.getName()); Utils.setIfUpdated(formFieldEntity::getLabel, formFieldEntity::setLabel, formFieldRequest.getLabel()); + Utils.setIfUpdated(formFieldEntity::getDescription, formFieldEntity::setDescription, formFieldRequest.getDescription()); + Utils.setIfUpdated(formFieldEntity::getSortOrder, formFieldEntity::setSortOrder, formFieldRequest.getSortOrder()); Utils.setIfUpdated(formFieldEntity::getSettings, formFieldEntity::setSettings, setSettingRequestBean(formFieldRequest.getSettings())); Utils.setIfUpdated(formFieldEntity::getValidators, formFieldEntity::setValidators, diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java index bffa49be..b75b0c57 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java @@ -25,4 +25,10 @@ public class FormFieldEntity extends BaseEntity{ @Column(name = "VALIDATORS") private String validators; + + @Column(name = "DESCRIPTION") + private String description; + + @Column(name = "SORT_ORDER") + private Integer sortOrder; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java index 30ddd40b..9cc1b19f 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FormFieldRequest.java @@ -10,6 +10,10 @@ public class FormFieldRequest { private String name; + private String description; + + private Integer sortOrder; + private String label; private List settings; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java index b779b353..1650241d 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormFieldResponseBean.java @@ -14,6 +14,11 @@ public class FormFieldResponseBean { private String label; + private String description; + + private Integer sortOrder; + + private List settings; private Map validators; diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index a18178e7..c8363a66 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -633,4 +633,22 @@ + + + + + + + + + + + + + TRUNCATE TABLE FORM_FIELD RESTART IDENTITY; + + + + diff --git a/src/main/resources/db/dump/inserted_form_field_data_13_09_2024.sql b/src/main/resources/db/dump/inserted_form_field_data_13_09_2024.sql new file mode 100644 index 00000000..510b4e19 --- /dev/null +++ b/src/main/resources/db/dump/inserted_form_field_data_13_09_2024.sql @@ -0,0 +1,51 @@ +INSERT INTO FORM_FIELD ( SORT_ORDER, NAME, LABEL, DESCRIPTION, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +( 1, 'textinput', 'Testo Breve', 'Per risposte concise (nomi, titoli, brevi descrizioni)', + '{"label": "Testo Breve", "placeholder": ""}', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + +( 2, 'textarea', 'Testo Lungo', 'Campo di testo esteso per paragrafi, descrizioni, proposte', + '{"label": "Testo Lungo", "placeholder": ""}', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + +( 3, 'wysiwyg', 'Campo di Testo Formattato', 'Editor avanzato per testo con formattazione', + '{"label": "Testo Formattato", "placeholder": ""}', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + +( 4, 'numberinput', 'Campo Numerico', 'Per l''inserimento di valori numerici (quantità, importi, percentuali)', + '{"label": "Numero", "placeholder": "0", "step": "0"}', + '{"isRequired": false, "min": null, "max": null, "pattern": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + +(5, 'radio', 'Scelta Singola', 'Gruppo di opzioni per selezione singola', + '{"label": "Scelta Singola", "options": []}', + '{"isRequired": false, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + +( 6, 'select', 'Menu a Tendina', 'Selezione da opzioni predefinite', + '{"label": "Menu a Tendina", "options": []}', + '{"isRequired": false, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + +( 7, 'checkboxes', 'Scelta Multipla', 'Gruppo di opzioni per selezione singola o multipla', + '{"label": "Scelta Multipla", "options": []}', + '{"isRequired": false, "min": null, "max": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + +( 8, 'switch', 'Casella di Spunta', 'Per selezioni binarie, accettazioni, conferme', + '{"label": "Casella di Spunta"}', + '{"isRequired": false}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + +( 9, 'datepicker', 'Data', 'Selezione di data', + '{"label": "Data"}', + '{"isRequired": false, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + +( 10, 'fileupload', 'Caricamento File', 'Per l''upload di documenti o immagini', + '{"label": "Caricamento File", "mime": []}', + '{"isRequired": false, "maxSize": 100000, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); From 5624c610401cdc350df9b6881d64ab02a988f321 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 13 Sep 2024 19:45:58 +0530 Subject: [PATCH 077/145] Added get api which is responsable for get next or pevious form --- .../constants/GepafinConstant.java | 5 + .../tendermanagement/dao/ApplicationDao.java | 28 ++- .../tendermanagement/dao/FlowFormDao.java | 237 ++++++++++++++++++ .../gepafin/tendermanagement/dao/FormDao.java | 4 - .../entities/ApplicationFormEntity.java | 4 - .../enums/FormActionEnum.java | 20 ++ .../response/ApplicationResponseBean.java | 1 - .../response/NextOrPreviousFormResponse.java | 12 + .../ApplicationFormFieldRepository.java | 12 + .../repositories/ApplicationRepository.java | 2 +- .../repositories/FlowDataRepository.java | 7 + .../repositories/FlowEdgesRepository.java | 4 + .../service/ApplicationService.java | 7 + .../service/impl/ApplicationServiceImpl.java | 27 ++ .../web/rest/api/ApplicationApi.java | 53 +++- .../api/impl/ApplicationApiController.java | 21 +- src/main/resources/message_en.properties | 3 +- src/main/resources/message_it.properties | 3 +- 18 files changed, 424 insertions(+), 26 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/FormActionEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 6c206c00..7abfe3fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -121,5 +121,10 @@ public class GepafinConstant { public static final String VALIDATION_FIELD_PATTERN = "validation.field.pattern"; public static final String VALIDATION_FIELD_NOT_NULL = "validation.field.not_null"; public static final String VALIDATION_FIELD_NOT_EMPTY = "validation.field.not_empty"; + // public static final String NEXT_FORM_NOT_FOUND = "next.form.not.found"; + // public static final String PREVIOUS_FORM_NOT_FOUND = "previous.form.not.found"; + public static final String CURRENT_FORM_INCOMPLETE = "current.form.incomplete"; + + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f273704c..f0b60e5e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -13,7 +13,7 @@ import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.FormService; -import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -23,6 +23,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -31,13 +32,9 @@ public class ApplicationDao { private final Logger log = LoggerFactory.getLogger(ApplicationDao.class); - @Autowired private CallService callService; - @Autowired - private UserService userService; - @Autowired private ApplicationRepository applicationRepository; @@ -178,7 +175,7 @@ public class ApplicationDao { } public ApplicationEntity getApplicationOrCreate(UserEntity userEntity, CallEntity callEntity, FormEntity formEntity) { - ApplicationEntity applicationEntity = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), callEntity.getId()); + ApplicationEntity applicationEntity = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), callEntity.getId()).orElse(null); if (applicationEntity == null) { validateFormId(formEntity, callEntity); applicationEntity = createApplicationEntity(userEntity, callEntity); @@ -217,7 +214,7 @@ public class ApplicationDao { public ApplicationFormFieldEntity validateApplicationFormField(Long applicationFormFieldId) { Optional applicationFormFieldEntity = applicationFormFieldRepository.findById(applicationFormFieldId); if (applicationFormFieldEntity.isEmpty()) { - throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_FORM_FIELD_NOT_FOUND)); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_FORM_FIELD_NOT_FOUND)); } return applicationFormFieldEntity.get(); } @@ -247,4 +244,21 @@ public class ApplicationDao { ApplicationEntity applicationEntity=applicationRepository.save(application); return applicationEntity; } + + + public ApplicationEntity getApplicationByCallAndUser(CallEntity call, UserEntity userEntity) { + return applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))); + + } + + public void updateApplicationStatus(Long applicationId, ApplicationStatusTypeEnum status) { + ApplicationEntity applicationEntity = validateApplication(applicationId); + applicationEntity.setStatus(status.getValue()); + if(status.equals(ApplicationStatusTypeEnum.SUBMIT)) { + applicationEntity.setSubmissionDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + } + saveApplicationEntity(applicationEntity); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java new file mode 100644 index 00000000..e0fa11d5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -0,0 +1,237 @@ +package net.gepafin.tendermanagement.dao; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.ApplicationFormEntity; +import net.gepafin.tendermanagement.entities.ApplicationFormFieldEntity; +import net.gepafin.tendermanagement.entities.FlowDataEntity; +import net.gepafin.tendermanagement.entities.FlowEdgesEntity; +import net.gepafin.tendermanagement.entities.FormEntity; +import net.gepafin.tendermanagement.enums.FormActionEnum; +import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; +import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository; +import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; +import net.gepafin.tendermanagement.repositories.FlowDataRepository; +import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +@Component +public class FlowFormDao { + + @Autowired + private FlowEdgesRepository flowEdgesRepository; + + @Autowired + private FlowDataRepository flowDataRepository; + + @Autowired + private ApplicationFormFieldRepository applicationFormFieldRepository; + + @Autowired + private ApplicationFormRepository applicationFormRepository; + +// Long getNextForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { +// // vlaidation if next form findout and cuuent from is not fill the give error +// List flowEdgesList = flowEdgesRepository.findBySourceIdAndCallId(currentFormEntity.getId(), applicationEntity.getCall().getId()); +// ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), currentFormEntity.getId()); +// if(applicationFormEntity == null) { +// throw new CustomValidationException(Status.VALIDATION_ERROR, +// Translator.toLocale("current form is not fill")); +// } +// if(flowEdgesList.isEmpty()) { +// throw new ResourceNotFoundException(Status.NOT_FOUND, +// Translator.toLocale(GepafinConstant.NEXT_FORM_NOT_FOUND)); +// } else if(flowEdgesList.size() == 1) { +// return flowEdgesList.get(0).getTargetId(); +// } else { +// List nextFormIds = flowEdgesList.stream().map(FlowEdgesEntity::getTargetId).toList(); +// FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndCallId(currentFormEntity.getId(), applicationEntity.getCall().getId()); +// +// ApplicationFormFieldEntity applicationFormFieldEntity = applicationFormFieldRepository +// .findByFieldIdAndApplicationFormFormIdAndApplicationFormApplicationId(flowDataEntity.getChoosenField(), +// currentFormEntity.getId(), applicationEntity.getId()).orElseThrow(()-> new ResourceNotFoundException(Status.NOT_FOUND, +// Translator.toLocale(GepafinConstant.NEXT_FORM_NOT_FOUND))); +// +// flowDataEntity = flowDataRepository.findByChoosenValueAndFormIdIn(applicationFormFieldEntity.getFieldValue(), nextFormIds).orElseThrow(()-> new NullPointerException()); +// return flowDataEntity.getFormId(); +// } +// } +// +// +// Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { +// +// // Step 1: Find all edges where the current form is the target (i.e., reverse flow) +// List flowEdgesList = flowEdgesRepository.findByTargetIdAndCallId( +// currentFormEntity.getId(), applicationEntity.getCall().getId()); +// +// if (flowEdgesList.isEmpty()) { +// // If no previous edges are found, return null or handle this case based on your needs +// throw new ResourceNotFoundException(Status.NOT_FOUND, +// Translator.toLocale(GepafinConstant.PREVIOUS_FORM_NOT_FOUND)); +// } +// +// // Step 2: If only one edge exists, return the source (previous) form ID directly have to look into it +// if (flowEdgesList.size() == 1) { +// return flowEdgesList.get(0).getSourceId(); +// } +// List previousFormIds = flowEdgesList.stream().map(FlowEdgesEntity::getSourceId).toList(); +// +// +// // Step 3: Try to find flow data for the current form. If not found, we know it's the last step (or no field filtering is needed). +// List flowDataList = flowDataRepository.findByFormIdInAndCallId( +// previousFormIds, applicationEntity.getCall().getId()); +// +// List fieldValue = flowDataList.stream().map(FlowDataEntity::getChoosenValue).toList(); +// +//// if (flowDataEntity == null || flowDataEntity.getChoosenField() == null) { +//// // If flow data is not found, simply return the first matching previous form +//// return flowEdgesList.get(0).getSourceId(); // You can modify this logic if needed +//// } +// +// // Step 4: Fetch the field value from the application form fields +// Set formList = applicationFormFieldRepository +// .findByFieldValueInAndAndApplicationFormApplicationId( +// fieldValue, applicationEntity.getId()).stream().map(applicationFormFieldEntity->applicationFormFieldEntity.getApplicationForm().getForm()).collect(Collectors.toSet()); +// +// List fieldIds = formList.stream().map(formEntity->getNextForm(formEntity, applicationEntity)).toList(); +// for(Long formId:previousFormIds) { +// fieldIds.contains(formId); +// return formId; +// } +// return null; +//// .orElseThrow(() -> new NullPointerException("Field value not found for the current form and application.")); +// +// +//// // Step 5: Check if there's a matching previous form based on the chosen value +//// FlowDataEntity previousFlowDataEntity = flowDataRepository.findByChoosenValueAndFormIdIn( +//// applicationFormFieldEntity.getFieldValue(), flowEdgesList.stream().map(FlowEdgesEntity::getSourceId).toList()) +//// .orElse(null); // If no matching form is found, return null or the first source form +//// +//// // Step 6: Return the formId of the matching previous form, or the first one if no specific match is found +//// return previousFlowDataEntity != null ? previousFlowDataEntity.getFormId() : flowEdgesList.get(0).getSourceId(); +// } + + + public Long getNextForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { + // Validate if the current form has been filled + ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId( + applicationEntity.getId(), currentFormEntity.getId()); + + // Retrieve the flow edges for the next forms + List flowEdgesList = flowEdgesRepository.findBySourceIdAndCallId( + currentFormEntity.getId(), applicationEntity.getCall().getId()); + + if (flowEdgesList.isEmpty()) { + return null; +// throw new ResourceNotFoundException(Status.NOT_FOUND, +// Translator.toLocale(GepafinConstant.NEXT_FORM_NOT_FOUND)); + } + + // If only one edge exists, return the target form ID + if (flowEdgesList.size() == 1) { + return flowEdgesList.get(0).getTargetId(); + } + + if (applicationFormEntity == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CURRENT_FORM_INCOMPLETE)); + } + + // For multiple edges, find the next form based on the chosen value + List nextFormIds = flowEdgesList.stream() + .map(FlowEdgesEntity::getTargetId) + .toList(); + + // Retrieve the flow data for the current form + FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndCallId( + currentFormEntity.getId(), applicationEntity.getCall().getId()); + + // Fetch the application form field related to the chosen field + ApplicationFormFieldEntity applicationFormFieldEntity = applicationFormFieldRepository + .findByFieldIdAndApplicationFormFormIdAndApplicationFormApplicationId( + flowDataEntity.getChoosenField(), currentFormEntity.getId(), applicationEntity.getId()).orElse(null); + + // Find the next form based on the chosen value and return its ID + return flowDataRepository.findByChoosenValueAndFormIdIn( + applicationFormFieldEntity.getFieldValue(), nextFormIds) + .map(FlowDataEntity::getFormId) + .orElse(null); + } + + + + + + + public Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { + // Retrieve the flow edges for the previous forms + List flowEdgesList = flowEdgesRepository.findByTargetIdAndCallId( + currentFormEntity.getId(), applicationEntity.getCall().getId()); + + if (flowEdgesList.isEmpty()) { + return null; +// throw new ResourceNotFoundException(Status.NOT_FOUND, +// Translator.toLocale(GepafinConstant.PREVIOUS_FORM_NOT_FOUND)); + } + + // If only one edge exists, return the source form ID + if (flowEdgesList.size() == 1) { + return flowEdgesList.get(0).getSourceId(); + } + + // For multiple edges, find the previous form based on the chosen value + List previousFormIds = flowEdgesList.stream() + .map(FlowEdgesEntity::getSourceId) + .toList(); + + // Fetch the flow data based on previous form IDs + List flowDataList = flowDataRepository.findByFormIdInAndCallId( + previousFormIds, applicationEntity.getCall().getId()); + + List chosenValues = flowDataList.stream() + .map(FlowDataEntity::getChoosenValue) + .toList(); + + // Fetch the previous forms based on the chosen field values + Set formList = applicationFormFieldRepository + .findByFieldValueInAndApplicationFormApplicationId(chosenValues, applicationEntity.getId()).stream() + .map(fieldEntity -> fieldEntity.getApplicationForm().getForm()) + .collect(Collectors.toSet()); + + // Find next form IDs recursively for all forms in the formList + List fieldIds = formList.stream() + .map(formEntity -> getNextForm(formEntity, applicationEntity)) + .toList(); + + // Return the first matching previous form ID that corresponds to a next form + return previousFormIds.stream() + .filter(fieldIds::contains) + .findFirst().orElse(null); + } + + + + + public NextOrPreviousFormResponse getnextOrPreviousForm(ApplicationEntity applicationEntity, FormEntity formEntity, + FormActionEnum action) { + + NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); + if (action.equals(FormActionEnum.NEXT)) { + nextOrPreviousFormResponse.setNextFormId(getNextForm(formEntity, applicationEntity)); + } else { + nextOrPreviousFormResponse.setPreviousFormId(getPreviousForm(formEntity, applicationEntity)); + } + return nextOrPreviousFormResponse; + } + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index c20db699..db91f787 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -10,7 +10,6 @@ import net.gepafin.tendermanagement.model.request.FormRequest; import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; -import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.FormRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -36,9 +35,6 @@ public class FormDao { @Autowired private CallService callService; - @Autowired - private ApplicationRepository applicationRepository; - @Autowired private ApplicationFormRepository applicationFormRepository; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java index c795d5ef..a6cc56aa 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java @@ -3,14 +3,10 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.*; -import java.time.LocalDateTime; @Entity @Table(name = "APPLICATION_FORM") @Data -@NoArgsConstructor -@AllArgsConstructor -@Builder public class ApplicationFormEntity extends BaseEntity { @ManyToOne diff --git a/src/main/java/net/gepafin/tendermanagement/enums/FormActionEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/FormActionEnum.java new file mode 100644 index 00000000..e5a64c59 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/FormActionEnum.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum FormActionEnum { + + NEXT("NEXT"), + PREVIOUS("PREVIOUS"); + + private String value; + + FormActionEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java index 6c0a42f8..b9787067 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.model.response; -import jakarta.persistence.Column; import lombok.Data; import net.gepafin.tendermanagement.model.BaseBean; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java new file mode 100644 index 00000000..1f7be289 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class NextOrPreviousFormResponse { + + Long nextFormId; + + Long previousFormId; + +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java index baac36b2..89c70488 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java @@ -1,10 +1,12 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ApplicationFormFieldEntity; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface ApplicationFormFieldRepository extends JpaRepository { @@ -12,4 +14,14 @@ public interface ApplicationFormFieldRepository extends JpaRepository findByApplicationFormIdIn(List applicationFormIds); public List findByApplicationFormId(Long applicationFormId); + + public Optional findByFieldIdAndApplicationFormFormIdAndApplicationFormApplicationId( + String fieldId, Long formId, Long applicationId); + + public Optional findByFieldValueInAndApplicationFormFormIdInAndApplicationFormApplicationId( + List fieldValues, List previousFormIds, Long applicationId); + + public List findByFieldValueInAndApplicationFormApplicationId( + List fieldValue, Long applicationId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index efdc0655..b32b8f46 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -13,7 +13,7 @@ import java.util.Optional; @Repository public interface ApplicationRepository extends JpaRepository { - public ApplicationEntity findByUserIdAndCallIdAndIsDeletedFalse(Long userId,Long callId); + public Optional findByUserIdAndCallIdAndIsDeletedFalse(Long userId,Long callId); public List findByUserIdAndIsDeletedFalse(Long userId); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java index 0f74d12b..8f752aa9 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java @@ -5,9 +5,16 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface FlowDataRepository extends JpaRepository { public List findByCallId(Long callId); + + public FlowDataEntity findByFormIdAndCallId(Long formId, Long callId); + + public Optional findByChoosenValueAndFormIdIn(String fieldValue, List nextFormIds); + + public List findByFormIdInAndCallId(List previousFormIds, Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FlowEdgesRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FlowEdgesRepository.java index ef4fbe91..3de65c17 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FlowEdgesRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FlowEdgesRepository.java @@ -10,4 +10,8 @@ import java.util.List; public interface FlowEdgesRepository extends JpaRepository { public List findByCallId(Long callId); + + public List findBySourceIdAndCallId(Long sourceId, Long callId); + + public List findByTargetIdAndCallId(Long targetId, Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index a0534401..f746c861 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -2,8 +2,11 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import java.util.List; @@ -18,4 +21,8 @@ public interface ApplicationService { void deleteApplication(HttpServletRequest request, Long applicationId); public ApplicationEntity validateApplication(Long userId); + + public NextOrPreviousFormResponse getnextOrPreviousForm(HttpServletRequest request, Long formId, FormActionEnum action); + + public void updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 58bb221a..17af38ba 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -2,11 +2,17 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.ApplicationDao; +import net.gepafin.tendermanagement.dao.FlowFormDao; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.FormEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -21,6 +27,12 @@ public class ApplicationServiceImpl implements ApplicationService { @Autowired private ApplicationDao applicationDao; + + @Autowired + private FlowFormDao flowFormDao; + + @Autowired + private FormService formService; @Autowired private Validator validator; @@ -55,5 +67,20 @@ public class ApplicationServiceImpl implements ApplicationService { Map userInfo=validator.getUserInfoFromToken(request); return applicationDao.getAllApplications(userInfo); } + + @Override + public NextOrPreviousFormResponse getnextOrPreviousForm(HttpServletRequest request, Long formId, + FormActionEnum action) { + UserEntity userEntity = validator.validateUser(request); + FormEntity formEntity = formService.validateForm(formId); + ApplicationEntity applicationEntity = applicationDao.getApplicationByCallAndUser(formEntity.getCall(), userEntity); + return flowFormDao.getnextOrPreviousForm(applicationEntity, formEntity, action); + } + + @Override + public void updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { + applicationDao.updateApplicationStatus(applicationId, status); + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index a251100a..ab31c12b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -1,5 +1,17 @@ package net.gepafin.tendermanagement.web.rest.api; +import java.util.List; + +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; @@ -7,16 +19,13 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; @Validated public interface ApplicationApi { @@ -73,5 +82,37 @@ public interface ApplicationApi { @DeleteMapping(value = "/{applicationId}") ResponseEntity> deleteApplication(HttpServletRequest request, @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); + + + @Operation(summary = "Api to get an next or previous form by current form id", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "form/{formId}", produces = "application/json") + ResponseEntity> getnextOrPreviousForm(HttpServletRequest request, + @Parameter(description = "The form id", required = true) @PathVariable("formId") Long formId, + @RequestParam("action") FormActionEnum action); + + + @Operation(summary = "Api to update application status", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PutMapping(value = "/{applicationId}/status", produces = { "application/json" }) + ResponseEntity> updateApplicationStatus(HttpServletRequest request, + @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId, + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) ApplicationStatusTypeEnum status); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index 00664319..d984ae1c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -3,9 +3,11 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.FlowResponseBean; +import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.web.rest.api.ApplicationApi; @@ -61,4 +63,21 @@ public class ApplicationApiController implements ApplicationApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); } + + @Override + public ResponseEntity> getnextOrPreviousForm(HttpServletRequest request, + Long formId, FormActionEnum action) { + NextOrPreviousFormResponse data = applicationService.getnextOrPreviousForm(request, formId, action); + log.info("Get Next Or Previous Form "); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> updateApplicationStatus(HttpServletRequest request, Long applicationId, + ApplicationStatusTypeEnum status) { + applicationService.updateApplicationStatus(request, applicationId, status); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 633130b3..6a87eb59 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -155,4 +155,5 @@ validation.field.min_length=Field {0} must be at least {1} characters long. validation.field.max_length=Field {0} must be no more than {1} characters long. validation.field.pattern=Field {0} does not match the required pattern. validation.field.not_null=Field {0} must not be null. -validation.field.not_empty=Field {0} must not be empty. \ No newline at end of file +validation.field.not_empty=Field {0} must not be empty. +current.form.incomplete=Current form is not filled. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 7990d89c..20f353f4 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -151,4 +151,5 @@ validation.field.min_length=Il campo {0} deve essere lungo almeno {1} caratteri. validation.field.max_length=Il campo {0} deve essere lungo al massimo {1} caratteri. validation.field.pattern=Il campo {0} non corrisponde al modello richiesto. validation.field.not_null=Il campo {0} non deve essere nullo. -validation.field.not_empty=Il campo {0} non deve essere vuoto. \ No newline at end of file +validation.field.not_empty=Il campo {0} non deve essere vuoto. +current.form.incomplete=il modulo corrente non è compilato \ No newline at end of file From 14887a75acc11b7577728e9e44e9cebb6ee955e7 Mon Sep 17 00:00:00 2001 From: rajesh Date: Sat, 14 Sep 2024 13:07:51 +0530 Subject: [PATCH 078/145] updated code for next form api --- .../tendermanagement/dao/FlowFormDao.java | 40 ++++++++++++++----- .../ApplicationFormRepository.java | 2 + .../service/ApplicationService.java | 2 +- .../service/impl/ApplicationServiceImpl.java | 8 ++-- .../web/rest/api/ApplicationApi.java | 7 ++-- .../api/impl/ApplicationApiController.java | 4 +- 6 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index e0fa11d5..7163f1f6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.dao; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -22,6 +23,7 @@ import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; import net.gepafin.tendermanagement.repositories.FlowDataRepository; import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @Component @@ -39,6 +41,7 @@ public class FlowFormDao { @Autowired private ApplicationFormRepository applicationFormRepository; + // Long getNextForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { // // vlaidation if next form findout and cuuent from is not fill the give error // List flowEdgesList = flowEdgesRepository.findBySourceIdAndCallId(currentFormEntity.getId(), applicationEntity.getCall().getId()); @@ -166,11 +169,6 @@ public class FlowFormDao { .map(FlowDataEntity::getFormId) .orElse(null); } - - - - - public Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { // Retrieve the flow edges for the previous forms @@ -218,20 +216,40 @@ public class FlowFormDao { .findFirst().orElse(null); } - - - - public NextOrPreviousFormResponse getnextOrPreviousForm(ApplicationEntity applicationEntity, FormEntity formEntity, + public NextOrPreviousFormResponse getnextOrPreviousForm(ApplicationEntity applicationEntity, Long formId, FormActionEnum action) { + FormEntity fromEntity = null; + if(formId == null) { + NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); + nextOrPreviousFormResponse.setNextFormId(getDefaultForm(applicationEntity)); + return nextOrPreviousFormResponse; + }else { + fromEntity = Optional + .of(applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formId)) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.FORM_NOT_FOUND))) + .getForm(); + } NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); if (action.equals(FormActionEnum.NEXT)) { - nextOrPreviousFormResponse.setNextFormId(getNextForm(formEntity, applicationEntity)); + nextOrPreviousFormResponse.setNextFormId(getNextForm(fromEntity, applicationEntity)); } else { - nextOrPreviousFormResponse.setPreviousFormId(getPreviousForm(formEntity, applicationEntity)); + nextOrPreviousFormResponse.setPreviousFormId(getPreviousForm(fromEntity, applicationEntity)); } return nextOrPreviousFormResponse; } + + private Long getDefaultForm(ApplicationEntity applicationEntity) { + List applicationFormList = applicationFormRepository.findByApplicationIdOrderByCreatedDateAsc(applicationEntity.getId()); + if(applicationFormList.isEmpty()) { + return applicationEntity.getCall().getInitialForm(); + } + if(applicationFormList.get(applicationFormList.size()-1).getForm().getId().equals(applicationEntity.getCall().getFinalForm())) { + return applicationEntity.getCall().getInitialForm(); + } + return getNextForm(applicationFormList.get(applicationFormList.size()-1).getForm(), applicationEntity); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java index f742925b..992eece3 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java @@ -15,4 +15,6 @@ public interface ApplicationFormRepository extends JpaRepository findByApplicationId(Long applicationId); + public List findByApplicationIdOrderByCreatedDateAsc(Long applicationId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index f746c861..16065d6d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -22,7 +22,7 @@ public interface ApplicationService { public ApplicationEntity validateApplication(Long userId); - public NextOrPreviousFormResponse getnextOrPreviousForm(HttpServletRequest request, Long formId, FormActionEnum action); + public NextOrPreviousFormResponse getnextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action); public void updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 17af38ba..5f07b619 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -69,12 +69,10 @@ public class ApplicationServiceImpl implements ApplicationService { } @Override - public NextOrPreviousFormResponse getnextOrPreviousForm(HttpServletRequest request, Long formId, + public NextOrPreviousFormResponse getnextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action) { - UserEntity userEntity = validator.validateUser(request); - FormEntity formEntity = formService.validateForm(formId); - ApplicationEntity applicationEntity = applicationDao.getApplicationByCallAndUser(formEntity.getCall(), userEntity); - return flowFormDao.getnextOrPreviousForm(applicationEntity, formEntity, action); + ApplicationEntity applicationEntity = validateApplication(applicationId); + return flowFormDao.getnextOrPreviousForm(applicationEntity, formId, action); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index ab31c12b..5a2736a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -93,10 +93,11 @@ public interface ApplicationApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @GetMapping(value = "form/{formId}", produces = "application/json") + @GetMapping(value = "/{applicationId}/form/next-previous", produces = "application/json") ResponseEntity> getnextOrPreviousForm(HttpServletRequest request, - @Parameter(description = "The form id", required = true) @PathVariable("formId") Long formId, - @RequestParam("action") FormActionEnum action); + @Parameter(description = "The applicaltion id", required = true) @PathVariable("applicationId") Long applicationId, + @Parameter(description = "The form id", required = false) @RequestParam(value = "formId", required = false) Long formId, + @RequestParam("action") FormActionEnum action); @Operation(summary = "Api to update application status", diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index d984ae1c..3644d83f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -65,9 +65,9 @@ public class ApplicationApiController implements ApplicationApi { } @Override - public ResponseEntity> getnextOrPreviousForm(HttpServletRequest request, + public ResponseEntity> getnextOrPreviousForm(HttpServletRequest request,Long applicationId, Long formId, FormActionEnum action) { - NextOrPreviousFormResponse data = applicationService.getnextOrPreviousForm(request, formId, action); + NextOrPreviousFormResponse data = applicationService.getnextOrPreviousForm(request, applicationId, formId, action); log.info("Get Next Or Previous Form "); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); From 6224ab526adc1f261396735289b297ae99ecd3fd Mon Sep 17 00:00:00 2001 From: rajesh Date: Sat, 14 Sep 2024 20:22:03 +0530 Subject: [PATCH 079/145] Updated get endpoints --- .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/ApplicationDao.java | 147 ++++++++++++------ .../model/request/ApplicationRequest.java | 16 ++ .../model/request/ApplicationRequestBean.java | 2 - .../response/ApplicationGetResponseBean.java | 23 +++ .../model/response/ApplicationResponse.java | 22 +++ .../response/FormApplicationResponse.java | 21 +++ .../service/ApplicationService.java | 12 +- .../service/impl/ApplicationServiceImpl.java | 28 ++-- .../web/rest/api/ApplicationApi.java | 28 +++- .../api/impl/ApplicationApiController.java | 24 ++- src/main/resources/message_en.properties | 4 +- src/main/resources/message_it.properties | 1 + 13 files changed, 256 insertions(+), 73 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/FormApplicationResponse.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 6c206c00..7777325a 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -121,5 +121,6 @@ public class GepafinConstant { public static final String VALIDATION_FIELD_PATTERN = "validation.field.pattern"; public static final String VALIDATION_FIELD_NOT_NULL = "validation.field.not_null"; public static final String VALIDATION_FIELD_NOT_EMPTY = "validation.field.not_empty"; + public static final String APPLICATION_ALREADY_EXISTS="application.already.exists"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f273704c..589b97f2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -5,9 +5,9 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; +import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository; import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; @@ -50,9 +50,12 @@ public class ApplicationDao { @Autowired private FormService formService; - public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long callId) { - CallEntity call = callService.validateCall(callId); - FormEntity formEntity = formService.validateForm(applicationRequestBean.getFormId()); + @Autowired + private FormDao formDao; + + public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId) { + FormEntity formEntity = formService.validateForm(formId); + CallEntity call = callService.validateCall(formEntity.getCall().getId()); ApplicationEntity applicationEntity = getApplicationOrCreate(userEntity, call, formEntity); formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity); @@ -117,47 +120,25 @@ public class ApplicationDao { log.info("Application deleted with ID: {}", id); } - public List getAllApplications(Map userInfo) { + public List getAllApplications(UserEntity userEntity) { log.info("Fetching all applications"); - String userIdStr = (String) userInfo.get("userId"); - Long userId = Long.parseLong(userIdStr); - List applicationEntities = applicationRepository.findByUserIdAndIsDeletedFalse(userId); - List applicationIds = applicationEntities.stream() - .map(ApplicationEntity::getId) - .collect(Collectors.toList()); + List applicationResponses=new ArrayList<>(); + List applicationEntities = applicationRepository.findByUserIdAndIsDeletedFalse(userEntity.getId()); + for(ApplicationEntity applicationEntity:applicationEntities){ + ApplicationResponse responseBean = getApplicationResponse(applicationEntity); + applicationResponses.add(responseBean); + } + return applicationResponses; + } - List applicationFormEntities = applicationFormRepository.findByApplicationIdIn(applicationIds); - - List applicationFormIds = applicationFormEntities.stream() - .map(ApplicationFormEntity::getId) - .collect(Collectors.toList()); - - List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormIdIn(applicationFormIds); - - - return applicationEntities.stream().map(applicationEntity -> { - ApplicationResponseBean responseBean = new ApplicationResponseBean(); - - responseBean.setCallId(applicationEntity.getCall().getId()); - responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); - responseBean.setStatus(applicationEntity.getStatus()); - responseBean.setComments(applicationEntity.getComments()); - - List formFieldResponseBeans = applicationFormFieldEntities.stream() - .filter(field -> field.getApplicationForm().getApplication().getId().equals(applicationEntity.getId())) - .map(field -> { - ApplicationFormFieldResponseBean fieldResponseBean = new ApplicationFormFieldResponseBean(); - fieldResponseBean.setId(field.getId()); - fieldResponseBean.setFieldId(field.getFieldId()); - fieldResponseBean.setApplicationFormId(field.getApplicationForm().getId()); - fieldResponseBean.setFieldValue(field.getFieldValue()); - return fieldResponseBean; - }).collect(Collectors.toList()); - - responseBean.setFormFields(formFieldResponseBeans); - - return responseBean; - }).collect(Collectors.toList()); + private ApplicationResponse getApplicationResponse(ApplicationEntity applicationEntity) { + ApplicationResponse responseBean = new ApplicationResponse(); + responseBean.setId(applicationEntity.getId()); + responseBean.setCallId(applicationEntity.getCall().getId()); + responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); + responseBean.setStatus(applicationEntity.getStatus()); + responseBean.setComments(applicationEntity.getComments()); + return responseBean; } public ApplicationEntity validateApplication(Long id) { @@ -247,4 +228,82 @@ public class ApplicationDao { ApplicationEntity applicationEntity=applicationRepository.save(application); return applicationEntity; } + + public ApplicationGetResponseBean getApplicationByFormId( Long applicationId,Long formId, UserEntity userEntity) { + + ApplicationEntity applicationEntity=null; + List formApplicationResponses = new ArrayList<>(); + List formEntities = new ArrayList<>(); + Optional applicationEntity1 = applicationRepository.findById(applicationId); + applicationEntity=applicationEntity1.get(); + if (applicationEntity == null) { + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)); + } + if (formId != null) { + FormEntity formEntity = formService.validateForm(formId); + applicationEntity = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), formEntity.getCall().getId()); + formEntities.add(formEntity); + processForm(formEntity, applicationEntity, formApplicationResponses); + } + else { + List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationEntity.getId()); + for (ApplicationFormEntity applicationFormEntity : applicationFormEntities) { + FormEntity form = formService.validateForm(applicationFormEntity.getForm().getId()); + formEntities.add(form); + processForm(form, applicationEntity, formApplicationResponses); + } + } + + return createApplicationGetResponseBean(applicationEntity, formEntities, formApplicationResponses); + } + + private void processForm(FormEntity formEntity, ApplicationEntity applicationEntity, List formApplicationResponses) { + ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId()); + if(applicationFormEntity!=null) { + List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); + FormApplicationResponse formApplicationResponse = createFormApplicationResponse(formEntity); + List applicationFormFieldResponseBeans = convertApplicationFormFieldEntitiesToApplicationFormFieldResponseBeans(applicationFormFieldEntities, applicationFormEntity.getId()); + + formApplicationResponse.setFormFields(applicationFormFieldResponseBeans); + formApplicationResponses.add(formApplicationResponse); + } + } + + private ApplicationGetResponseBean createApplicationGetResponseBean(ApplicationEntity applicationEntity, List formEntities, List formApplicationResponses) { + ApplicationGetResponseBean applicationGetResponseBean =createApplicationGetResponseBean(applicationEntity); + applicationGetResponseBean.setForm(formApplicationResponses); + return applicationGetResponseBean; + } + + private ApplicationGetResponseBean createApplicationGetResponseBean(ApplicationEntity applicationEntity) { + ApplicationGetResponseBean applicationGetResponseBean = new ApplicationGetResponseBean(); + applicationGetResponseBean.setId(applicationEntity.getId()); + applicationGetResponseBean.setStatus(applicationEntity.getStatus()); + applicationGetResponseBean.setComments(applicationEntity.getComments()); + applicationGetResponseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); + return applicationGetResponseBean; + } + + private FormApplicationResponse createFormApplicationResponse(FormEntity formEntity) { + FormApplicationResponse formApplicationResponse=new FormApplicationResponse(); + formApplicationResponse.setId(formEntity.getId()); + formApplicationResponse.setLabel(formEntity.getLabel()); + formApplicationResponse.setCallId(formEntity.getCall().getId()); + formApplicationResponse.setContent(Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class)); + return formApplicationResponse; + } + + public ApplicationResponse createApplicationByCallId(ApplicationRequest applicationRequest,Long callId,UserEntity userEntity){ + CallEntity call=callService.validateCall(callId); + checkIfApplicationExists(call,userEntity); + ApplicationEntity applicationEntity=saveApplicationEntity(createApplicationEntity(userEntity,call)); + ApplicationResponse applicationResponse=getApplicationResponse(applicationEntity); + return applicationResponse; + } + public void checkIfApplicationExists(CallEntity call,UserEntity userEntity){ + ApplicationEntity applicationEntity=applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(),call.getId()); + if(applicationEntity!=null){ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_EXISTS)); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequest.java new file mode 100644 index 00000000..920d1a2d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequest.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class ApplicationRequest { + + private LocalDateTime submissionDate; + + private String status; + + private String comments; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequestBean.java index ce95d9d6..273519be 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequestBean.java @@ -9,7 +9,5 @@ import java.util.List; @Data public class ApplicationRequestBean { - private Long formId; - private List formFields; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java new file mode 100644 index 00000000..e566fc16 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.FormResponseBean; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class ApplicationGetResponseBean { + + private Long id; + + private LocalDateTime submissionDate; + + private String status; + + private String comments; + + private List form; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java new file mode 100644 index 00000000..fdb0f6f3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseBean; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class ApplicationResponse{ + + private Long id; + + private Long callId; + + private LocalDateTime submissionDate; + + private String status; + + private String comments; + +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormApplicationResponse.java new file mode 100644 index 00000000..3c7a322a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormApplicationResponse.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseBean; +import net.gepafin.tendermanagement.model.response.ContentResponseBean; + +import java.util.List; + +@Data +public class FormApplicationResponse { + + private Long id; + + private String label; + + private Long callId; + + private List content; + + private List formFields; +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index a0534401..3c5fc6d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -2,20 +2,26 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; import java.util.List; public interface ApplicationService { - public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long callId); + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId); - ApplicationResponseBean getApplicationById(HttpServletRequest request, Long applicationId); + ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId); - List getAllApplications(HttpServletRequest request); + List getAllApplications(HttpServletRequest request); void deleteApplication(HttpServletRequest request, Long applicationId); public ApplicationEntity validateApplication(Long userId); + + public ApplicationResponse createApplication(HttpServletRequest request, ApplicationRequest applicationRequest, Long callId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 58bb221a..5952c4ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -4,7 +4,10 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.ApplicationDao; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.util.Validator; @@ -13,8 +16,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; - @Service public class ApplicationServiceImpl implements ApplicationService { @@ -27,15 +28,16 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @Transactional(rollbackFor = Exception.class) - public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long callId) { + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId) { UserEntity userEntity = validator.validateUser(request); - return applicationDao.createApplication(applicationRequestBean,userEntity,callId); + return applicationDao.createApplication(applicationRequestBean,userEntity,formId); } @Override @Transactional(readOnly = true) - public ApplicationResponseBean getApplicationById(HttpServletRequest request, Long applicationId) { - return null; + public ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId) { + UserEntity userEntity = validator.validateUser(request); + return applicationDao.getApplicationByFormId(applicationId,formId,userEntity); } @Override @@ -50,10 +52,16 @@ public class ApplicationServiceImpl implements ApplicationService { } @Override - @Transactional(readOnly = true) - public List getAllApplications(HttpServletRequest request) { - Map userInfo=validator.getUserInfoFromToken(request); - return applicationDao.getAllApplications(userInfo); + @Transactional(rollbackFor = Exception.class) + public ApplicationResponse createApplication(HttpServletRequest request, ApplicationRequest applicationRequest, Long callId) { + UserEntity userEntity = validator.validateUser(request); + return applicationDao.createApplicationByCallId(applicationRequest,callId,userEntity); } + @Override + @Transactional(readOnly = true) + public List getAllApplications(HttpServletRequest request) { + UserEntity userEntity = validator.validateUser(request); + return applicationDao.getAllApplications(userEntity); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index a251100a..0966d3d1 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -7,7 +7,10 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -30,11 +33,11 @@ public interface ApplicationApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PutMapping(value = "/call/{callId}", + @PutMapping(value = "/form/{formId}", produces = { "application/json" }) ResponseEntity> createApplication(HttpServletRequest request, @Parameter(description = " Flow request object", required = true) @Valid @RequestBody ApplicationRequestBean applicationRequestBean, - @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + @Parameter(description = "The form ID", required = true) @PathVariable("formId") Long formId); @Operation(summary = "Api to get an application by id", responses = { @@ -46,8 +49,7 @@ public interface ApplicationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{applicationId}", produces = "application/json") - ResponseEntity> getApplicationById(HttpServletRequest request, - @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); + ResponseEntity> getApplicationByFormId(HttpServletRequest request, @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId,@Parameter(description = "The form id", required = false) @RequestParam(value = "formId",required = false) Long formId); @Operation(summary = "Api to get all applications", responses = { @@ -59,7 +61,7 @@ public interface ApplicationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = "application/json") - ResponseEntity>> getAllApplications(HttpServletRequest request); + ResponseEntity>> getAllApplications(HttpServletRequest request); @Operation(summary = "Api to delete application", responses = { @@ -73,5 +75,21 @@ public interface ApplicationApi { @DeleteMapping(value = "/{applicationId}") ResponseEntity> deleteApplication(HttpServletRequest request, @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); + + @Operation(summary = "Api to create application", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PostMapping(value = "/call/{callId}", + produces = { "application/json" }) + ResponseEntity> createApplicationByCallId(HttpServletRequest request, + @Parameter(description = " Flow request object", required = true) @Valid @RequestBody ApplicationRequest applicationRequest, + @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index 00664319..183f54c8 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -3,9 +3,11 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.FlowResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.web.rest.api.ApplicationApi; @@ -31,16 +33,16 @@ public class ApplicationApiController implements ApplicationApi { private ApplicationService applicationService; @Override - public ResponseEntity> createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long callId) { - ApplicationResponseBean applicationResponseBean= applicationService.createApplication(request,applicationRequestBean,callId); + public ResponseEntity> createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId) { + ApplicationResponseBean applicationResponseBean= applicationService.createApplication(request,applicationRequestBean,formId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG))); } @Override - public ResponseEntity> getApplicationById(HttpServletRequest request, - Long applicationId) { + public ResponseEntity> getApplicationByFormId(HttpServletRequest request + , Long applicationId,Long formId) { log.info("Get Application by ID - Application ID: {}", applicationId); - ApplicationResponseBean application = applicationService.getApplicationById(request,applicationId); + ApplicationGetResponseBean application = applicationService.getApplicationByFormId(request,applicationId,formId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); } @@ -55,8 +57,14 @@ public class ApplicationApiController implements ApplicationApi { } @Override - public ResponseEntity>> getAllApplications(HttpServletRequest request) { - List applications = applicationService.getAllApplications(request); + public ResponseEntity> createApplicationByCallId(HttpServletRequest request, ApplicationRequest applicationRequest, Long callId) { + ApplicationResponse applicationResponseBean=applicationService.createApplication(request,applicationRequest,callId); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG))); + } + @Override + public ResponseEntity>> getAllApplications(HttpServletRequest request) { + List applications = applicationService.getAllApplications(request); log.info("Get All Applications"); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 633130b3..3b7c11df 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -148,6 +148,7 @@ application.get.success=Application details fetched successfully. application.not.found=Application not found with the given ID. application.form.field.not.found=Application form field not found. Form.not.matches.to.call.initial.form=Form id does not matches to initial form id of call. +application.already.exists=Application already exists for this call. #Validation related messages validation.field.required=Field {0} is required. @@ -155,4 +156,5 @@ validation.field.min_length=Field {0} must be at least {1} characters long. validation.field.max_length=Field {0} must be no more than {1} characters long. validation.field.pattern=Field {0} does not match the required pattern. validation.field.not_null=Field {0} must not be null. -validation.field.not_empty=Field {0} must not be empty. \ No newline at end of file +validation.field.not_empty=Field {0} must not be empty. + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 7990d89c..cd32956d 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -144,6 +144,7 @@ application.get.success=Dettagli dell'applicazione recuperati con successo. application.not.found=Applicazione non trovata con l'ID fornito. application.form.field.not.found=Campo del modulo di domanda non trovato. Form.not.matches.to.call.initial.form=L'ID del modulo non corrisponde all'ID del modulo iniziale della chiamata. +application.already.exists=L'applicazione esiste già per questa chiamata. #Validation related messages validation.field.required=Il campo {0} � obbligatorio. From dac7eb10cd73eab63ef780dd75ee84084d4f7e1b Mon Sep 17 00:00:00 2001 From: rajesh Date: Sun, 15 Sep 2024 13:31:54 +0530 Subject: [PATCH 080/145] update code for form get api --- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index db91f787..f0c6289c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -94,7 +94,7 @@ public class FormDao { formRepository.delete(formEntity); } public List getFormsByCallId(Long callId){ - CallEntity callEntity=callService.getCallEntityById(callId); + CallEntity callEntity=callService.validateCall(callId); if(callEntity== null){ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); From 7babf437d63fbca3bcc6a16f68e7b919f65cdea0 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 16 Sep 2024 13:51:53 +0530 Subject: [PATCH 081/145] updated code --- .../net/gepafin/tendermanagement/dao/FlowFormDao.java | 11 +++++------ .../tendermanagement/service/ApplicationService.java | 2 +- .../service/impl/ApplicationServiceImpl.java | 2 +- .../tendermanagement/web/rest/api/ApplicationApi.java | 6 +++--- .../web/rest/api/impl/ApplicationApiController.java | 4 ++-- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 7163f1f6..5ca6eb0e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -223,13 +223,12 @@ public class FlowFormDao { NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); nextOrPreviousFormResponse.setNextFormId(getDefaultForm(applicationEntity)); return nextOrPreviousFormResponse; - }else { - fromEntity = Optional - .of(applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formId)) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.FORM_NOT_FOUND))) - .getForm(); } + fromEntity = Optional + .of(applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formId)) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.FORM_NOT_FOUND))) + .getForm(); NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); if (action.equals(FormActionEnum.NEXT)) { diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 013526ff..e82b7c70 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -27,7 +27,7 @@ public interface ApplicationService { public ApplicationResponse createApplication(HttpServletRequest request, ApplicationRequest applicationRequest, Long callId); - public NextOrPreviousFormResponse getnextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action); + public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action); public void updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index c0e7b301..e9c524d4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -71,7 +71,7 @@ public class ApplicationServiceImpl implements ApplicationService { } @Override - public NextOrPreviousFormResponse getnextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, + public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action) { ApplicationEntity applicationEntity = validateApplication(applicationId); return flowFormDao.getnextOrPreviousForm(applicationEntity, formId, action); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index 85f6e345..75de91fb 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -28,7 +28,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @Validated public interface ApplicationApi { - @Operation(summary = "Api to create or update application", + @Operation(summary = "Api to create application form", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -107,10 +107,10 @@ public interface ApplicationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{applicationId}/form/next-previous", produces = "application/json") - ResponseEntity> getnextOrPreviousForm(HttpServletRequest request, + ResponseEntity> getNextOrPreviousForm(HttpServletRequest request, @Parameter(description = "The applicaltion id", required = true) @PathVariable("applicationId") Long applicationId, @Parameter(description = "The form id", required = false) @RequestParam(value = "formId", required = false) Long formId, - @RequestParam("action") FormActionEnum action); + @RequestParam(value = "action", required = false) FormActionEnum action); @Operation(summary = "Api to update application status", diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index 9986412b..ac55c81b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -74,9 +74,9 @@ public class ApplicationApiController implements ApplicationApi { } @Override - public ResponseEntity> getnextOrPreviousForm(HttpServletRequest request,Long applicationId, + public ResponseEntity> getNextOrPreviousForm(HttpServletRequest request,Long applicationId, Long formId, FormActionEnum action) { - NextOrPreviousFormResponse data = applicationService.getnextOrPreviousForm(request, applicationId, formId, action); + NextOrPreviousFormResponse data = applicationService.getNextOrPreviousForm(request, applicationId, formId, action); log.info("Get Next Or Previous Form "); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); From b4212ee21984c480bb9ce48ffe9c3e45c28539ff Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 16 Sep 2024 15:31:12 +0530 Subject: [PATCH 082/145] updated get all application endpoint --- .../tendermanagement/dao/ApplicationDao.java | 15 +++++++++++++-- .../model/request/ApplicationRequest.java | 4 ---- .../service/ApplicationService.java | 2 +- .../service/impl/ApplicationServiceImpl.java | 4 ++-- .../web/rest/api/ApplicationApi.java | 3 ++- .../rest/api/impl/ApplicationApiController.java | 4 ++-- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f1a99e27..f76b378f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -117,9 +117,18 @@ public class ApplicationDao { log.info("Application deleted with ID: {}", id); } - public List getAllApplications(UserEntity userEntity) { + public List getAllApplications(UserEntity userEntity,Long callId) { log.info("Fetching all applications"); List applicationResponses=new ArrayList<>(); + if(callId!=null) { + CallEntity call = callService.validateCall(callId); + Optional applicationEntity1 = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId()); + if (applicationEntity1.isPresent()) { + ApplicationResponse responseBean = getApplicationResponse(applicationEntity1.get()); + applicationResponses.add(responseBean); + return applicationResponses; + } + } List applicationEntities = applicationRepository.findByUserIdAndIsDeletedFalse(userEntity.getId()); for(ApplicationEntity applicationEntity:applicationEntities){ ApplicationResponse responseBean = getApplicationResponse(applicationEntity); @@ -291,7 +300,9 @@ public class ApplicationDao { public ApplicationResponse createApplicationByCallId(ApplicationRequest applicationRequest,Long callId,UserEntity userEntity){ CallEntity call=callService.validateCall(callId); checkIfApplicationExists(call,userEntity); - ApplicationEntity applicationEntity=saveApplicationEntity(createApplicationEntity(userEntity,call)); + ApplicationEntity applicationEntity=createApplicationEntity(userEntity,call); + applicationEntity.setComments(applicationRequest.getComments()); + applicationEntity=saveApplicationEntity(applicationEntity); ApplicationResponse applicationResponse=getApplicationResponse(applicationEntity); return applicationResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequest.java index 920d1a2d..0eabdcb8 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationRequest.java @@ -7,10 +7,6 @@ import java.time.LocalDateTime; @Data public class ApplicationRequest { - private LocalDateTime submissionDate; - - private String status; - private String comments; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index e82b7c70..e9f46f29 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -19,7 +19,7 @@ public interface ApplicationService { ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId); - List getAllApplications(HttpServletRequest request); + List getAllApplications(HttpServletRequest request,Long callId); void deleteApplication(HttpServletRequest request, Long applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index e9c524d4..28fa197d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -85,8 +85,8 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @Transactional(readOnly = true) - public List getAllApplications(HttpServletRequest request) { + public List getAllApplications(HttpServletRequest request,Long callId) { UserEntity userEntity = validator.validateUser(request); - return applicationDao.getAllApplications(userEntity); + return applicationDao.getAllApplications(userEntity,callId); } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index 75de91fb..76937d58 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -65,7 +65,8 @@ public interface ApplicationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = "application/json") - ResponseEntity>> getAllApplications(HttpServletRequest request); + ResponseEntity>> getAllApplications(HttpServletRequest request, + @Parameter(description = "The call id", required = false) @RequestParam(value = "callId", required = false) Long callId); @Operation(summary = "Api to delete application", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index ac55c81b..f0cb8b9b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -66,8 +66,8 @@ public class ApplicationApiController implements ApplicationApi { .body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG))); } @Override - public ResponseEntity>> getAllApplications(HttpServletRequest request) { - List applications = applicationService.getAllApplications(request); + public ResponseEntity>> getAllApplications(HttpServletRequest request,Long callId) { + List applications = applicationService.getAllApplications(request,callId); log.info("Get All Applications"); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); From 721451586bd6bd8eb619b982a81f9c2c125f67eb Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 16 Sep 2024 16:22:28 +0530 Subject: [PATCH 083/145] updated code for next of previous api --- .../tendermanagement/dao/ApplicationDao.java | 23 ++++++---- .../tendermanagement/dao/FlowFormDao.java | 42 ++++++++++++------- .../response/FormApplicationResponse.java | 2 - .../response/NextOrPreviousFormResponse.java | 4 +- .../service/impl/ApplicationServiceImpl.java | 5 --- 5 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f1a99e27..e0b8ac20 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -47,9 +47,6 @@ public class ApplicationDao { @Autowired private FormService formService; - @Autowired - private FormDao formDao; - public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId) { FormEntity formEntity = formService.validateForm(formId); CallEntity call = callService.validateCall(formEntity.getCall().getId()); @@ -238,30 +235,40 @@ public class ApplicationDao { formEntity.getCall().getId()); applicationEntity=application.get(); formEntities.add(formEntity); - processForm(formEntity, applicationEntity, formApplicationResponses); + addFormApplication(formEntity, applicationEntity, formApplicationResponses); } else { List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationEntity.getId()); for (ApplicationFormEntity applicationFormEntity : applicationFormEntities) { FormEntity form = formService.validateForm(applicationFormEntity.getForm().getId()); formEntities.add(form); - processForm(form, applicationEntity, formApplicationResponses); + addFormApplication(form, applicationEntity, formApplicationResponses); } } return createApplicationGetResponseBean(applicationEntity, formEntities, formApplicationResponses); } - private void processForm(FormEntity formEntity, ApplicationEntity applicationEntity, List formApplicationResponses) { + private void addFormApplication(FormEntity formEntity, ApplicationEntity applicationEntity, + List formApplicationResponses) { + FormApplicationResponse formApplicationResponse = processForm(formEntity, applicationEntity); + if(formApplicationResponse.getContent() != null && formApplicationResponse.getFormFields() != null) { + formApplicationResponses.add(formApplicationResponse); + } + + } + + public FormApplicationResponse processForm(FormEntity formEntity, ApplicationEntity applicationEntity) { + FormApplicationResponse formApplicationResponse = createFormApplicationResponse(formEntity); ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId()); if(applicationFormEntity!=null) { List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); - FormApplicationResponse formApplicationResponse = createFormApplicationResponse(formEntity); +// formApplicationResponse = createFormApplicationResponse(formEntity); List applicationFormFieldResponseBeans = convertApplicationFormFieldEntitiesToApplicationFormFieldResponseBeans(applicationFormFieldEntities, applicationFormEntity.getId()); formApplicationResponse.setFormFields(applicationFormFieldResponseBeans); - formApplicationResponses.add(formApplicationResponse); } + return formApplicationResponse; } private ApplicationGetResponseBean createApplicationGetResponseBean(ApplicationEntity applicationEntity, List formEntities, List formApplicationResponses) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 5ca6eb0e..81f69f7b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -22,6 +22,7 @@ import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository; import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; import net.gepafin.tendermanagement.repositories.FlowDataRepository; import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; +import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -41,6 +42,12 @@ public class FlowFormDao { @Autowired private ApplicationFormRepository applicationFormRepository; + @Autowired + private ApplicationDao applicationDao; + + @Autowired + private FormService formService; + // Long getNextForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { // // vlaidation if next form findout and cuuent from is not fill the give error @@ -218,23 +225,28 @@ public class FlowFormDao { public NextOrPreviousFormResponse getnextOrPreviousForm(ApplicationEntity applicationEntity, Long formId, FormActionEnum action) { + Long calculatedFormId = null; FormEntity fromEntity = null; - if(formId == null) { - NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); - nextOrPreviousFormResponse.setNextFormId(getDefaultForm(applicationEntity)); - return nextOrPreviousFormResponse; - } - fromEntity = Optional - .of(applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formId)) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.FORM_NOT_FOUND))) - .getForm(); - - NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); - if (action.equals(FormActionEnum.NEXT)) { - nextOrPreviousFormResponse.setNextFormId(getNextForm(fromEntity, applicationEntity)); + if (formId == null) { + calculatedFormId = getDefaultForm(applicationEntity); } else { - nextOrPreviousFormResponse.setPreviousFormId(getPreviousForm(fromEntity, applicationEntity)); + fromEntity = Optional + .of(applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formId)) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.FORM_NOT_FOUND))) + .getForm(); + + if (action.equals(FormActionEnum.NEXT)) { + calculatedFormId = getNextForm(fromEntity, applicationEntity); + } else { + calculatedFormId = getPreviousForm(fromEntity, applicationEntity); + } + } + NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); + if (calculatedFormId != null) { + nextOrPreviousFormResponse.setFormId(calculatedFormId); + nextOrPreviousFormResponse.setApplicationFormResponse( + applicationDao.processForm(formService.validateForm(calculatedFormId), applicationEntity)); } return nextOrPreviousFormResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormApplicationResponse.java index 3c7a322a..5ee40bb9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FormApplicationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormApplicationResponse.java @@ -1,8 +1,6 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; -import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseBean; -import net.gepafin.tendermanagement.model.response.ContentResponseBean; import java.util.List; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java index 1f7be289..247a57f3 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java @@ -5,8 +5,8 @@ import lombok.Data; @Data public class NextOrPreviousFormResponse { - Long nextFormId; + Long formId; - Long previousFormId; + FormApplicationResponse applicationFormResponse; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index e9c524d4..a4d3c8e0 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -4,7 +4,6 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.ApplicationDao; import net.gepafin.tendermanagement.dao.FlowFormDao; import net.gepafin.tendermanagement.entities.ApplicationEntity; -import net.gepafin.tendermanagement.entities.FormEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; @@ -15,7 +14,6 @@ import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.service.ApplicationService; -import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -31,9 +29,6 @@ public class ApplicationServiceImpl implements ApplicationService { @Autowired private FlowFormDao flowFormDao; - - @Autowired - private FormService formService; @Autowired private Validator validator; From e81e62cebbe4dcf0ce87dc8a9dd0fd2c4008f285 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 16 Sep 2024 17:01:47 +0530 Subject: [PATCH 084/145] updated code for get all application api --- .../tendermanagement/dao/ApplicationDao.java | 51 +++++++++++++------ .../repositories/ApplicationRepository.java | 4 ++ 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 8d68e984..d9ff714b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -4,6 +4,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; @@ -114,26 +115,44 @@ public class ApplicationDao { log.info("Application deleted with ID: {}", id); } - public List getAllApplications(UserEntity userEntity,Long callId) { - log.info("Fetching all applications"); - List applicationResponses=new ArrayList<>(); - if(callId!=null) { + public List getAllApplications(UserEntity userEntity, Long callId) { + RoleStatusEnum roleStatus = RoleStatusEnum.valueOf(userEntity.getRoleEntity().getRoleType()); + boolean isBeneficiary = RoleStatusEnum.ROLE_BENEFICIARY.equals(roleStatus); + + log.info("Fetching applications for RoleType: {}", roleStatus); + List applicationResponses = new ArrayList<>(); + + if (callId != null) { + // Fetch based on callId and user if role is BENEFICIARY, otherwise fetch all for the call + log.info("Fetching applications for callId: {}", callId); CallEntity call = callService.validateCall(callId); - Optional applicationEntity1 = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId()); - if (applicationEntity1.isPresent()) { - ApplicationResponse responseBean = getApplicationResponse(applicationEntity1.get()); - applicationResponses.add(responseBean); - return applicationResponses; - } + + // Use a single method to handle both conditions for consistency + List applicationEntities = isBeneficiary + ? applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId()) + .map(List::of) // Convert Optional to a List of one element + .orElse(List.of()) // If not present, return an empty list + : applicationRepository.findByCallIdAndIsDeletedFalse(call.getId()); + + applicationResponses = applicationEntities.stream() + .map(this::getApplicationResponse) + .collect(Collectors.toList()); + + } else { + // Fetch all applications for the user if BENEFICIARY, or fetch all applications in general + List applicationEntities = isBeneficiary + ? applicationRepository.findByUserIdAndIsDeletedFalse(userEntity.getId()) + : applicationRepository.findByIsDeletedFalse(); + + applicationResponses = applicationEntities.stream() + .map(this::getApplicationResponse) + .collect(Collectors.toList()); } - List applicationEntities = applicationRepository.findByUserIdAndIsDeletedFalse(userEntity.getId()); - for(ApplicationEntity applicationEntity:applicationEntities){ - ApplicationResponse responseBean = getApplicationResponse(applicationEntity); - applicationResponses.add(responseBean); - } - return applicationResponses; + + return applicationResponses; } + private ApplicationResponse getApplicationResponse(ApplicationEntity applicationEntity) { ApplicationResponse responseBean = new ApplicationResponse(); responseBean.setId(applicationEntity.getId()); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index b32b8f46..8d41608c 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -19,4 +19,8 @@ public interface ApplicationRepository extends JpaRepository findById(@Param("id") Long id); + + public List findByCallIdAndIsDeletedFalse(Long callId); + + public List findByIsDeletedFalse(); } From 3a0257139451d0e0c2cb4f1b916edb910229b5ac Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 16 Sep 2024 18:47:51 +0530 Subject: [PATCH 085/145] Updated put endpoint of application --- .../tendermanagement/dao/ApplicationDao.java | 40 +++++++++---------- .../service/ApplicationService.java | 2 +- .../service/impl/ApplicationServiceImpl.java | 4 +- .../web/rest/api/ApplicationApi.java | 5 ++- .../api/impl/ApplicationApiController.java | 4 +- 5 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f76b378f..fe76affd 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -50,10 +50,10 @@ public class ApplicationDao { @Autowired private FormDao formDao; - public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId) { + public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId,Long applicationId) { FormEntity formEntity = formService.validateForm(formId); CallEntity call = callService.validateCall(formEntity.getCall().getId()); - ApplicationEntity applicationEntity = getApplicationOrCreate(userEntity, call, formEntity); + ApplicationEntity applicationEntity = validateApplication(applicationId); formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity); createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity); @@ -92,16 +92,14 @@ public class ApplicationDao { log.info("Fetching application with ID: {}", id); ApplicationEntity applicationEntity = validateApplication(id); - List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationEntity.getId()); + ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),formId); List applicationFormFieldResponseBeans=new ArrayList<>(); ApplicationFormFieldResponseBean applicationFormFieldResponseBeans1=null; - for (ApplicationFormEntity applicationFormEntity:applicationFormEntities){ List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntities) { applicationFormFieldResponseBeans1 = convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(applicationFormFieldEntity, applicationFormEntity.getId()); applicationFormFieldResponseBeans.add(applicationFormFieldResponseBeans1); } - } ApplicationResponseBean applicationResponseBean= convertApplicationEntityToApplicationResponseBean(applicationEntity); applicationResponseBean.setFormFields(applicationFormFieldResponseBeans); applicationResponseBean.setCurrentFormId(formId); @@ -164,15 +162,6 @@ public class ApplicationDao { return response; } - public ApplicationEntity getApplicationOrCreate(UserEntity userEntity, CallEntity callEntity, FormEntity formEntity) { - ApplicationEntity applicationEntity = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), callEntity.getId()).orElse(null); - if (applicationEntity == null) { - validateFormId(formEntity, callEntity); - applicationEntity = createApplicationEntity(userEntity, callEntity); - applicationEntity=saveApplicationEntity(applicationEntity); - } - return applicationEntity; - } private ApplicationFormEntity getApplicationFormOrCreate(FormEntity formEntity, ApplicationEntity applicationEntity) { ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId()); if(applicationFormEntity == null){ @@ -182,19 +171,30 @@ public class ApplicationDao { } public List createOrUpdateMultipleFormFields(List formFieldResponseBeans, ApplicationFormEntity applicationFormEntity) { + List existingFields = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); + List applicationFormFieldEntity = formFieldResponseBeans.stream() - .map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity)) + .map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity,existingFields)) .collect(Collectors.toList()); return applicationFormFieldEntity; } - public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity) { - ApplicationFormFieldEntity applicationFormFieldEntity; - if (applicationFormFieldRequestBean.getId() == null || applicationFormFieldRequestBean.getId() == 0) { + public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity,List applicationFormFieldEntities ) { + + ApplicationFormFieldEntity applicationFormFieldEntity=null; + if(applicationFormFieldEntities==null || applicationFormFieldEntities.isEmpty()){ applicationFormFieldEntity = new ApplicationFormFieldEntity(); applicationFormFieldEntity.setApplicationForm(applicationFormEntity); - } else { - applicationFormFieldEntity = validateApplicationFormField(applicationFormFieldRequestBean.getId()); + }else { + for (ApplicationFormFieldEntity applicationFormFieldEntity1 : applicationFormFieldEntities) { + if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId())) { + applicationFormFieldEntity = applicationFormFieldEntity1; + break; + } else { + applicationFormFieldEntity = new ApplicationFormFieldEntity(); + applicationFormFieldEntity.setApplicationForm(applicationFormEntity); + } + } } Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); Utils.setIfUpdated(applicationFormFieldEntity::getFieldValue, applicationFormFieldEntity::setFieldValue, applicationFormFieldRequestBean.getFieldValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index e9f46f29..152bc1b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -15,7 +15,7 @@ import java.util.List; public interface ApplicationService { - public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId); + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean,Long applicationId, Long formId); ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 28fa197d..8e9d1235 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -40,9 +40,9 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @Transactional(rollbackFor = Exception.class) - public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId) { + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean,Long applicationId, Long formId) { UserEntity userEntity = validator.validateUser(request); - return applicationDao.createApplication(applicationRequestBean,userEntity,formId); + return applicationDao.createApplication(applicationRequestBean,userEntity,formId,applicationId); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index 76937d58..879691e4 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -37,11 +37,12 @@ public interface ApplicationApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PutMapping(value = "/form/{formId}", + @PutMapping(value = "/{applicationId}", produces = { "application/json" }) ResponseEntity> createApplication(HttpServletRequest request, @Parameter(description = " Flow request object", required = true) @Valid @RequestBody ApplicationRequestBean applicationRequestBean, - @Parameter(description = "The form ID", required = true) @PathVariable("formId") Long formId); + @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId, + @Parameter(description = "The form ID", required = true) @RequestParam("formId") Long formId); @Operation(summary = "Api to get an application by id", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index f0cb8b9b..1d8b205b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -36,8 +36,8 @@ public class ApplicationApiController implements ApplicationApi { private ApplicationService applicationService; @Override - public ResponseEntity> createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId) { - ApplicationResponseBean applicationResponseBean= applicationService.createApplication(request,applicationRequestBean,formId); + public ResponseEntity> createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean,Long applicationId, Long formId) { + ApplicationResponseBean applicationResponseBean= applicationService.createApplication(request,applicationRequestBean,applicationId,formId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG))); } From 4582088e77d17a5a82e1364a30f50f41c09b25ee Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 16 Sep 2024 19:25:10 +0530 Subject: [PATCH 086/145] updated data in form field --- .../db/changelog/db.changelog-1.0.0.xml | 8 ++ .../updated_form_field_data_16-09-2024.sql | 74 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/main/resources/db/dump/updated_form_field_data_16-09-2024.sql diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index fcba8de3..f4a78969 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -702,4 +702,12 @@ + + + TRUNCATE TABLE FORM_FIELD RESTART IDENTITY; + + + + diff --git a/src/main/resources/db/dump/updated_form_field_data_16-09-2024.sql b/src/main/resources/db/dump/updated_form_field_data_16-09-2024.sql new file mode 100644 index 00000000..5cd80b6f --- /dev/null +++ b/src/main/resources/db/dump/updated_form_field_data_16-09-2024.sql @@ -0,0 +1,74 @@ +INSERT INTO FORM_FIELD (SORT_ORDER, NAME, LABEL, DESCRIPTION, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +(1, 'textinput', 'Testo Breve', 'Per risposte concise (nomi, titoli, brevi descrizioni)', + '{"label": "Testo Breve", "placeholder": ""}', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(2, 'textarea', 'Testo Lungo', 'Campo di testo esteso per paragrafi, descrizioni, proposte', + '{"label": "Testo Lungo", "placeholder": ""}', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(3, 'wysiwyg', 'Campo di Testo Formattato', 'Editor avanzato per testo con formattazione', + '{"label": "Testo Formattato", "placeholder": ""}', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(4, 'numberinput', 'Campo Numerico', 'Per l''inserimento di valori numerici (quantità, importi, percentuali)', + '{"label": "Numero", "placeholder": 0, "step": 0}', + '{"isRequired": false, "min": null, "max": null, "pattern": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(5, 'radio', 'Scelta Singola', 'Gruppo di opzioni per selezione singola', + '{"label": "Scelta Singola", "options": []}', + '{"isRequired": false, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(6, 'select', 'Menu a Tendina', 'Selezione da opzioni predefinite', + '{"label": "Menu a Tendina", "options": []}', + '{"isRequired": false, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(7, 'checkboxes', 'Scelta Multipla', 'Gruppo di opzioni per selezione singola o multipla', + '{"label": "Scelta Multipla", "options": []}', + '{"isRequired": false, "min": null, "max": null, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(8, 'switch', 'Casella di Spunta', 'Per selezioni binarie, accettazioni, conferme', + '{"label": "Casella di Spunta"}', + '{"isRequired": false}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(9, 'datepicker', 'Data', 'Selezione di data', + '{"label": "Data"}', + '{"isRequired": false, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(10, 'fileupload', 'Caricamento File', 'Per l''upload di documenti o immagini', + '{"label": "Caricamento File", "mime": []}', + '{"isRequired": false, "maxSize": 100000, "custom": null}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(11, 'textinput', 'Campo Partita IVA', 'Specifico per l''inserimento del numero di Partita IVA', + '{"label": "Partita IVA", "placeholder": ""}', + '{"isRequired": true, "minLength": 11, "maxLength": 11, "custom": "isPIVA"}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(12, 'textinput', 'Campo Codice Fiscale', 'Specifico per l''inserimento del Codice Fiscale italiano per persone fisiche e giuridiche', + '{"label": "Codice Fiscale", "placeholder": ""}', + '{"isRequired": true, "minLength": 11, "maxLength": 16, "custom": "isCodiceFiscale"}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(13, 'numberinput', 'Campo CAP', 'Per l''inserimento del Codice di Avviamento Postale', + '{"label": "CAP", "placeholder": ""}', + '{"isRequired": true, "custom": "isCAP"}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(14, 'textinput', 'Campo IBAN', 'Per l''inserimento del codice IBAN', + '{"label": "IBAN", "placeholder": ""}', + '{"isRequired": true, "custom": "isIBAN"}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(15, 'textinput', 'Campo Email', 'Per l''inserimento di indirizzi email standard (non PEC)', + '{"label": "Campo Email", "placeholder": "nome@esempio.it"}', + '{"isRequired": false, "custom": "isEmail"}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(16, 'textinput', 'Campo PEC', 'Specifico per l''inserimento di un indirizzo di Posta Elettronica Certificata', + '{"label": "Campo PEC", "placeholder": "nome@pec.it"}', + '{"isRequired": false, "custom": "isEmailPEC"}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(17, 'textinput', 'Campo URL', 'Per l''inserimento di indirizzi web', + '{"label": "Indirizzo URL", "placeholder": ""}', + '{"isRequired": false, "custom": "isUrl"}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), +(18, 'textinput', 'Marca da bollo', 'Per inserire codice di marca da bollo', + '{"label": "Marca da bollo", "placeholder": "Numero identificativo"}', + '{"isRequired": false, "custom": "isMarcaDaBollo"}', + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); From c655e8c5771bbe6e7ad4364bad91e299c6797cd0 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 16 Sep 2024 20:20:32 +0530 Subject: [PATCH 087/145] Done ticket BE-24,25 --- .../constants/GepafinConstant.java | 5 +-- .../tendermanagement/dao/ApplicationDao.java | 3 +- .../gepafin/tendermanagement/dao/CallDao.java | 8 ---- .../tendermanagement/dao/FlowFormDao.java | 38 +++++++++++++++---- .../response/ApplicationGetResponseBean.java | 6 ++- .../response/ApplicationResponseBean.java | 3 -- .../response/NextOrPreviousFormResponse.java | 12 +++++- .../impl/CallValidatorServiceImpl.java | 4 +- .../tendermanagement/util/FieldValidator.java | 2 +- .../api/errors/GlobalExceptionHandler.java | 9 +++++ .../rest/api/errors/ValidationException.java | 6 +-- src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 2 + 13 files changed, 66 insertions(+), 34 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8fa5ab0d..719efd30 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -125,8 +125,7 @@ public class GepafinConstant { // public static final String NEXT_FORM_NOT_FOUND = "next.form.not.found"; // public static final String PREVIOUS_FORM_NOT_FOUND = "previous.form.not.found"; public static final String CURRENT_FORM_INCOMPLETE = "current.form.incomplete"; - - - public static final String FLOW_NOT_FOUND = "flow.not.found"; + public static final String VALIDATION_MESSAGE = "validation.message"; + public static final String ACTION_REQUIRED = "action.required"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index d9ff714b..e90819a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -102,7 +102,6 @@ public class ApplicationDao { } ApplicationResponseBean applicationResponseBean= convertApplicationEntityToApplicationResponseBean(applicationEntity); applicationResponseBean.setFormFields(applicationFormFieldResponseBeans); - applicationResponseBean.setCurrentFormId(formId); return applicationResponseBean; } @@ -311,6 +310,8 @@ public class ApplicationDao { applicationGetResponseBean.setStatus(applicationEntity.getStatus()); applicationGetResponseBean.setComments(applicationEntity.getComments()); applicationGetResponseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); + applicationGetResponseBean.setCallId(applicationEntity.getCall().getId()); + applicationGetResponseBean.setCallTitle(applicationEntity.getCall().getDescriptionShort()); return applicationGetResponseBean; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index a4a9878f..18f56347 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -3,20 +3,13 @@ package net.gepafin.tendermanagement.dao; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.*; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -53,7 +46,6 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import static net.gepafin.tendermanagement.enums.RoleStatusEnum.ROLE_SUPER_ADMIN; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; -import static org.springframework.security.authorization.AuthorityReactiveAuthorizationManager.hasRole; @Component public class CallDao { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 81f69f7b..24d3bd22 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -226,31 +226,53 @@ public class FlowFormDao { public NextOrPreviousFormResponse getnextOrPreviousForm(ApplicationEntity applicationEntity, Long formId, FormActionEnum action) { Long calculatedFormId = null; - FormEntity fromEntity = null; + FormEntity formEntity = null; if (formId == null) { calculatedFormId = getDefaultForm(applicationEntity); } else { - fromEntity = Optional + if(action==null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.ACTION_REQUIRED)); + } + formEntity = Optional .of(applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formId)) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FORM_NOT_FOUND))) .getForm(); if (action.equals(FormActionEnum.NEXT)) { - calculatedFormId = getNextForm(fromEntity, applicationEntity); + calculatedFormId = getNextForm(formEntity, applicationEntity); } else { - calculatedFormId = getPreviousForm(fromEntity, applicationEntity); + calculatedFormId = getPreviousForm(formEntity, applicationEntity); } } - NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); + NextOrPreviousFormResponse nextOrPreviousFormResponse = null; if (calculatedFormId != null) { - nextOrPreviousFormResponse.setFormId(calculatedFormId); - nextOrPreviousFormResponse.setApplicationFormResponse( - applicationDao.processForm(formService.validateForm(calculatedFormId), applicationEntity)); + nextOrPreviousFormResponse = setNextOrPreviousResponse(calculatedFormId, applicationEntity); } return nextOrPreviousFormResponse; } + private NextOrPreviousFormResponse setNextOrPreviousResponse(Long calculatedFormId, ApplicationEntity applicationEntity) { + NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); + FormEntity formEntity = formService.validateForm(calculatedFormId); + nextOrPreviousFormResponse.setFormId(calculatedFormId); + nextOrPreviousFormResponse.setApplicationFormResponse( + applicationDao.processForm(formEntity, applicationEntity)); + nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId()); + nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getDescriptionShort()); + + List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); + Long totalFormSteps = 3l; + if (flowEdgesList.size() == 1) { + totalFormSteps = 2l; + } + List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId()); + nextOrPreviousFormResponse.setTotalFormSteps(totalFormSteps); + nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(applicationFormList.size())); + return nextOrPreviousFormResponse; + } + private Long getDefaultForm(ApplicationEntity applicationEntity) { List applicationFormList = applicationFormRepository.findByApplicationIdOrderByCreatedDateAsc(applicationEntity.getId()); if(applicationFormList.isEmpty()) { diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java index e566fc16..50ce0c57 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java @@ -1,8 +1,6 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.FormResponseBean; import java.time.LocalDateTime; import java.util.List; @@ -17,6 +15,10 @@ public class ApplicationGetResponseBean { private String status; private String comments; + + private Long callId; + + private String callTitle; private List form; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java index b9787067..e621197c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponseBean.java @@ -19,7 +19,4 @@ public class ApplicationResponseBean extends BaseBean { private List formFields; - private Long currentFormId; - - private Long nextFormId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java index 247a57f3..37fb1d9b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java @@ -5,8 +5,16 @@ import lombok.Data; @Data public class NextOrPreviousFormResponse { - Long formId; + private Long formId; - FormApplicationResponse applicationFormResponse; + private Long callId; + + private String callTitle; + + private Long totalFormSteps; + + private Long completedSteps; + + private FormApplicationResponse applicationFormResponse; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java index 402727b2..715242f5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java @@ -31,9 +31,7 @@ public class CallValidatorServiceImpl { .notNull(response.getDocumentationRequested(), "documentationRequested") .notEmpty(response.getAimedTo(), "aimedTo") .notEmpty(response.getCriteria(), "criteria") - .notEmpty(response.getDocs(), "docs") - .notEmpty(response.getFaq(), "faq") - .notEmpty(response.getImages(), "images") + .notEmpty(response.getDocs(), "docs") .notEmpty(response.getCheckList(), "checkList"); diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 5e195945..c9b05f8e 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -34,7 +34,7 @@ public class FieldValidator { public void validate() { if (!errors.isEmpty()) { - throw new ValidationException(Status.VALIDATION_ERROR, errors); + throw new ValidationException(Status.VALIDATION_ERROR, errors, Translator.toLocale(GepafinConstant.VALIDATION_MESSAGE)); } } public FieldValidator minLength(String value, Long minLength, String fieldName) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java index addb9a99..1118da03 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -34,6 +34,15 @@ public class GlobalExceptionHandler { log.error(ex.getLocalizedMessage(), ex); return new Response<>(null, ex.getStatus(), ex.getMessage()); } + + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler(ValidationException.class) + @ResponseBody + public Response handleValidationException(final ValidationException ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + return new Response<>(ex.getErrors(), ex.getStatus(), ex.getMessage()); + } @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException ex) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ValidationException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ValidationException.java index 855177db..8af6f41a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ValidationException.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/ValidationException.java @@ -2,14 +2,14 @@ package net.gepafin.tendermanagement.web.rest.api.errors; import java.util.List; -public class ValidationException extends CustomValidationException { +public class ValidationException extends CustomValidationException { private final Status status; private static final long serialVersionUID = 1L; private final List errors; - public ValidationException(Status status, List errors) { - super(status, errors.toString()); + public ValidationException(Status status, List errors, String message) { + super(status, message); this.errors = errors; this.status = status; } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 50a234c8..536c0b56 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -160,3 +160,5 @@ validation.field.not_empty=Field {0} must not be empty. current.form.incomplete=Current form is not filled. flow.not.found=Flow not found. +validation.message=Validation messages. +action.required=Action field required. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index e5c243df..55a645b2 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -155,3 +155,5 @@ validation.field.not_null=Il campo {0} non deve essere nullo. validation.field.not_empty=Il campo {0} non deve essere vuoto. current.form.incomplete=il modulo corrente non � compilato flow.not.found=Flow not found. +validation.message=Messaggi di convalida. +action.required=Campo azione obbligatorio. From 6959ac0a6572d11b2d9e3ba5cb69fba781de1722 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 16 Sep 2024 23:33:59 +0530 Subject: [PATCH 088/145] updated code for CallTitle --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 2 +- src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 26ad299c..da057631 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -311,7 +311,7 @@ public class ApplicationDao { applicationGetResponseBean.setComments(applicationEntity.getComments()); applicationGetResponseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); applicationGetResponseBean.setCallId(applicationEntity.getCall().getId()); - applicationGetResponseBean.setCallTitle(applicationEntity.getCall().getDescriptionShort()); + applicationGetResponseBean.setCallTitle(applicationEntity.getCall().getName()); return applicationGetResponseBean; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 24d3bd22..34bbd75d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -260,7 +260,7 @@ public class FlowFormDao { nextOrPreviousFormResponse.setApplicationFormResponse( applicationDao.processForm(formEntity, applicationEntity)); nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId()); - nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getDescriptionShort()); + nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName()); List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); Long totalFormSteps = 3l; From 021b7c3269b40bbe9b27dfca2114e7273f6d0f4c Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 17 Sep 2024 15:54:58 +0530 Subject: [PATCH 089/145] added current step in next/pervious api --- .../java/net/gepafin/tendermanagement/dao/FlowFormDao.java | 7 +++++++ .../model/response/NextOrPreviousFormResponse.java | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 34bbd75d..8030f198 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -267,9 +267,16 @@ public class FlowFormDao { if (flowEdgesList.size() == 1) { totalFormSteps = 2l; } + Long currentStep = 2l; + if (formEntity.getId().equals(formEntity.getCall().getInitialForm())) { + currentStep = 1l; + } else if (formEntity.getId().equals(formEntity.getCall().getFinalForm())) { + currentStep = 3l; + } List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId()); nextOrPreviousFormResponse.setTotalFormSteps(totalFormSteps); nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(applicationFormList.size())); + nextOrPreviousFormResponse.setCurrentStep(currentStep); return nextOrPreviousFormResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java index 37fb1d9b..55ee34be 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java @@ -15,6 +15,8 @@ public class NextOrPreviousFormResponse { private Long completedSteps; + private Long currentStep; + private FormApplicationResponse applicationFormResponse; } \ No newline at end of file From d2fed5e1688ab1967007a84c1badaf3898fa05af Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 17 Sep 2024 16:15:15 +0530 Subject: [PATCH 090/145] Applied validation --- .../tendermanagement/constants/GepafinConstant.java | 4 ++++ .../gepafin/tendermanagement/dao/ApplicationDao.java | 8 ++++++-- .../net/gepafin/tendermanagement/dao/CallDao.java | 12 +++++++++++- .../net/gepafin/tendermanagement/dao/FlowDao.java | 9 +++++++++ .../net/gepafin/tendermanagement/dao/FormDao.java | 4 ++++ .../request/ApplicationFormFieldRequestBean.java | 4 +--- .../repositories/CallRepository.java | 2 ++ .../tendermanagement/service/CallService.java | 4 +++- .../service/impl/CallServiceImpl.java | 7 ++++++- .../tendermanagement/util/FieldValidator.java | 3 +++ .../web/rest/api/ApplicationApi.java | 2 +- .../tendermanagement/web/rest/api/FaqApi.java | 2 +- src/main/resources/message_en.properties | 3 +++ src/main/resources/message_it.properties | 3 +++ 14 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 719efd30..3d8a17d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -128,4 +128,8 @@ public class GepafinConstant { public static final String FLOW_NOT_FOUND = "flow.not.found"; public static final String VALIDATION_MESSAGE = "validation.message"; public static final String ACTION_REQUIRED = "action.required"; + public static final String CALL_NOT_PUBLISHED="call.not.published"; + public static final String APPLICATION_ALREADY_SUBMITTED="application.already.submitted"; + public static final String INITAL_AND_FINAL_FORM_CANNOT_NULL="initial.and.final.form.cannot.null"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index da057631..d6e5e77a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -50,8 +50,11 @@ public class ApplicationDao { public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId,Long applicationId) { FormEntity formEntity = formService.validateForm(formId); - CallEntity call = callService.validateCall(formEntity.getCall().getId()); + CallEntity call = callService.validatePublishedCall(formEntity.getCall().getId()); ApplicationEntity applicationEntity = validateApplication(applicationId); + if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))){ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_SUBMITTED)); + } formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity); createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity); @@ -326,7 +329,8 @@ public class ApplicationDao { public ApplicationResponse createApplicationByCallId(ApplicationRequest applicationRequest,Long callId,UserEntity userEntity){ CallEntity call=callService.validateCall(callId); - checkIfApplicationExists(call,userEntity); + call = callService.validatePublishedCall(call.getId()); + checkIfApplicationExists(call,userEntity); ApplicationEntity applicationEntity=createApplicationEntity(userEntity,call); applicationEntity.setComments(applicationRequest.getComments()); applicationEntity=saveApplicationEntity(applicationEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 18f56347..8861ccbc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -387,7 +387,7 @@ public class CallDao { return createCallResponseBean; } - private void validateUpdate(CallEntity callEntity) { + public void validateUpdate(CallEntity callEntity) { if(callEntity.getStatus().equals(CallStatusEnum.PUBLISH.getValue())) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PUBLISHED_CALL_NOT_UPDATE)); @@ -622,5 +622,15 @@ public class CallDao { } } + public CallEntity validatePublishedCall(Long callId) { + CallEntity callEntity= callRepository + .findByIdAndStatus(callId, CallStatusEnum.PUBLISH.getValue()); + if(callEntity==null){ + throw new ResourceNotFoundException( + Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.CALL_NOT_PUBLISHED)); + } + return callEntity; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java index 8b6931bc..0ded1ac5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java @@ -21,6 +21,7 @@ import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; @@ -49,6 +50,9 @@ public class FlowDao { @Autowired private FormService formService; + @Autowired + private CallDao callDao; + public FlowResponseBean createOrUpdateFlow(FlowRequestBean flowRequestBean, Long callId) { validateFlowRequestBean(flowRequestBean); CallEntity call = callService.validateCall(callId); @@ -62,12 +66,17 @@ public class FlowDao { } public void validateFlowRequestBean(FlowRequestBean flowRequestBean){ + if (FieldValidator.isNullOrZero(flowRequestBean.getInitialForm()) || FieldValidator.isNullOrZero(flowRequestBean.getFinalForm())) { + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.INITAL_AND_FINAL_FORM_CANNOT_NULL)); + } + if (flowRequestBean.getFlowEdges() == null || flowRequestBean.getFlowEdges().isEmpty()) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.FLOW_REQUEST_NOT_PROPER)); } } public void checkIfFlowExits(CallEntity call) { + callDao.validateUpdate(call); List flowDataEntities = flowDataRepository.findByCallId(call.getId()); List flowEdgesEntities = flowEdgesRepository.findByCallId(call.getId()); if (Boolean.FALSE.equals(flowDataEntities.isEmpty()) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty())) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index f0c6289c..7acec284 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -38,6 +38,9 @@ public class FormDao { @Autowired private ApplicationFormRepository applicationFormRepository; + @Autowired + private CallDao callDao; + public FormEntity saveFormEntity(FormEntity formEntity){ formEntity=formRepository.save(formEntity); return formEntity; @@ -72,6 +75,7 @@ public class FormDao { } public FormResponseBean updateForm(Long formId, FormRequest formRequest){ FormEntity formEntity = validateForm(formId); + callDao.validateUpdate(formEntity.getCall()); Utils.setIfUpdated(formEntity::getLabel,formEntity::setLabel,formRequest.getLabel()); Utils.setIfUpdated(formEntity::getContent,formEntity::setContent,setContentResponseBean(formRequest.getContent())); formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationFormFieldRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationFormFieldRequestBean.java index 065c2f3f..029eb470 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationFormFieldRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationFormFieldRequestBean.java @@ -6,9 +6,7 @@ import net.gepafin.tendermanagement.entities.ApplicationFormEntity; @Data public class ApplicationFormFieldRequestBean { - - private Long id; - + private String fieldId; private String fieldValue; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 23f83f04..6fa6bbde 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -11,4 +11,6 @@ public interface CallRepository extends JpaRepository { public CallEntity findByIdAndStatusNotIn(Long id, List status); List findByStatusIn(List callStatus); + + public CallEntity findByIdAndStatus(Long id,String status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 500eb854..aa6ea872 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -31,4 +31,6 @@ public interface CallService { CallEntity validateCall(Long callId); -} + CallEntity validatePublishedCall(Long callId); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 5ba8952d..a6a6a901 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -87,4 +87,9 @@ public class CallServiceImpl implements CallService { public CallEntity validateCall(Long callId) { return callDao.validateCall(callId); } -} + + @Override + public CallEntity validatePublishedCall(Long callId) { + return callDao.validatePublishedCall(callId); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index c9b05f8e..18a1f042 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -62,4 +62,7 @@ public class FieldValidator { errors.add(errorMessage); return this; } + public static boolean isNullOrZero(Long value) { + return value == null || value == 0L; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index 879691e4..9499bfe0 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -28,7 +28,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @Validated public interface ApplicationApi { - @Operation(summary = "Api to create application form", + @Operation(summary = "Api to create or update application form", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java index e174621d..f44491a8 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java @@ -23,7 +23,7 @@ public interface FaqApi { @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", examples = @ExampleObject(value = "{ \"error\": \"Not Found\" }"))) }) @PostMapping(value = "/call/{callId}", consumes = "application/json", produces = "application/json") - ResponseEntity> createFaq(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) + ResponseEntity> createFaq(HttpServletRequest request, @Parameter(description = "call id", required = true) @PathVariable("callId") Long callId, @Valid @RequestBody FaqReq faqRequest); @Operation(summary = "API to get FAQ by id", diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 536c0b56..b1ec7f96 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -139,6 +139,7 @@ flow.created.successfully=Flow created successfully. flow.fetched.successfully=Flow fetched successfully. flow.already.exists= Flow already exist for this call. flow.request.not.complete=Flow request is not complete. +initial.and.final.form.cannot.null=Initial and final form cannot be null. # Application related messages application.created.success=Application successfully created. @@ -149,6 +150,7 @@ application.not.found=Application not found with the given ID. application.form.field.not.found=Application form field not found. Form.not.matches.to.call.initial.form=Form id does not matches to initial form id of call. application.already.exists=Application already exists for this call. +application.already.submitted=Application is already submitted. #Validation related messages validation.field.required=Field {0} is required. @@ -162,3 +164,4 @@ current.form.incomplete=Current form is not filled. flow.not.found=Flow not found. validation.message=Validation messages. action.required=Action field required. +call.not.published=Call is not published. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 55a645b2..82bff2ee 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -135,6 +135,7 @@ flow.created.successfully=Flusso creato con successo. flow.fetched.successfully=Flusso recuperato con successo. flow.already.exists= Il flusso esiste gi� per questa chiamata. flow.request.not.complete=La richiesta di flusso non � completa. +initial.and.final.form.cannot.null=La forma iniziale e finale non possono essere nulle. # Application related messages application.created.success=Applicazione creata con successo. @@ -145,6 +146,7 @@ application.not.found=Applicazione non trovata con l'ID fornito. application.form.field.not.found=Campo del modulo di domanda non trovato. Form.not.matches.to.call.initial.form=L'ID del modulo non corrisponde all'ID del modulo iniziale della chiamata. application.already.exists=L'applicazione esiste gi� per questa chiamata. +application.already.submitted=La domanda è già stata inviata. #Validation related messages validation.field.required=Il campo {0} � obbligatorio. @@ -157,3 +159,4 @@ current.form.incomplete=il modulo corrente non � compilato flow.not.found=Flow not found. validation.message=Messaggi di convalida. action.required=Campo azione obbligatorio. +call.not.published=La chiamata non è stata pubblicata. \ No newline at end of file From db466763500f9f0c2053a189cc524a3d08c55ee6 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 17 Sep 2024 17:28:43 -0700 Subject: [PATCH 091/145] updated code for create application form api --- .../tendermanagement/constants/GepafinConstant.java | 2 ++ .../net/gepafin/tendermanagement/dao/FlowFormDao.java | 11 ++++++----- .../net/gepafin/tendermanagement/dao/FormDao.java | 7 +++++-- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 3 ++- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 3d8a17d5..4ed09d15 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -131,5 +131,7 @@ public class GepafinConstant { public static final String CALL_NOT_PUBLISHED="call.not.published"; public static final String APPLICATION_ALREADY_SUBMITTED="application.already.submitted"; public static final String INITAL_AND_FINAL_FORM_CANNOT_NULL="initial.and.final.form.cannot.null"; + public static final String APPLICATION_FORM_NOT_FOUND="application.form.not.found"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 8030f198..0df71aa8 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -234,11 +234,12 @@ public class FlowFormDao { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.ACTION_REQUIRED)); } - formEntity = Optional - .of(applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formId)) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.FORM_NOT_FOUND))) - .getForm(); +// formEntity = Optional +// .ofNullable(applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formId)) +// .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, +// Translator.toLocale(GepafinConstant.APPLICATION_FORM_NOT_FOUND))) +// .getForm(); + formEntity = formService.validateForm(formId); if (action.equals(FormActionEnum.NEXT)) { calculatedFormId = getNextForm(formEntity, applicationEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 7acec284..0cc4b2eb 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -114,9 +115,11 @@ public class FormDao { } public void validateFormField(List applicationFormFieldRequestList, ApplicationEntity applicationEntity, FormEntity formEntity) { + Map formFieldMap = new LinkedHashMap(); + for(ApplicationFormFieldRequestBean applicationFormFieldRequestBean:applicationFormFieldRequestList) { + formFieldMap.put(applicationFormFieldRequestBean.getFieldId(),applicationFormFieldRequestBean.getFieldValue()); + } - Map formFieldMap = applicationFormFieldRequestList.stream() - .collect(Collectors.toMap(ApplicationFormFieldRequestBean::getFieldId, ApplicationFormFieldRequestBean::getFieldValue)); FormResponseBean formResponseBean = convertFormEntityToFormResponseBean(formEntity); ApplicationFormEntity applicationFormEntity=applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),formEntity.getId()); Boolean isApplicationFormExist= getApplicationFormExist(applicationFormEntity); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index b1ec7f96..cb423966 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -165,3 +165,4 @@ flow.not.found=Flow not found. validation.message=Validation messages. action.required=Action field required. call.not.published=Call is not published. +application.form.not.found=Application form not found. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 82bff2ee..0c47f666 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -159,4 +159,5 @@ current.form.incomplete=il modulo corrente non � compilato flow.not.found=Flow not found. validation.message=Messaggi di convalida. action.required=Campo azione obbligatorio. -call.not.published=La chiamata non è stata pubblicata. \ No newline at end of file +call.not.published=La chiamata non è stata pubblicata. +application.form.not.found=Modulo di domanda non trovato. \ No newline at end of file From d03f5ad6530b566bc18546681ee38e8c5ef6d064 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 17 Sep 2024 20:35:10 -0700 Subject: [PATCH 092/145] updated code --- .../updated_form_field_data_16-09-2024.sql | 81 +++++++++++-------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/src/main/resources/db/dump/updated_form_field_data_16-09-2024.sql b/src/main/resources/db/dump/updated_form_field_data_16-09-2024.sql index 5cd80b6f..1855bfe5 100644 --- a/src/main/resources/db/dump/updated_form_field_data_16-09-2024.sql +++ b/src/main/resources/db/dump/updated_form_field_data_16-09-2024.sql @@ -1,74 +1,91 @@ INSERT INTO FORM_FIELD (SORT_ORDER, NAME, LABEL, DESCRIPTION, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) VALUES (1, 'textinput', 'Testo Breve', 'Per risposte concise (nomi, titoli, brevi descrizioni)', - '{"label": "Testo Breve", "placeholder": ""}', + '[{"name": "label", "value": "Testo Breve"}, {"name": "placeholder", "value": ""}]', '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (2, 'textarea', 'Testo Lungo', 'Campo di testo esteso per paragrafi, descrizioni, proposte', - '{"label": "Testo Lungo", "placeholder": ""}', + '[{"name": "label", "value": "Testo Lungo"}, {"name": "placeholder", "value": ""}]', '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (3, 'wysiwyg', 'Campo di Testo Formattato', 'Editor avanzato per testo con formattazione', - '{"label": "Testo Formattato", "placeholder": ""}', + '[{"name": "label", "value": "Testo Formattato"}, {"name": "placeholder", "value": ""}]', '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (4, 'numberinput', 'Campo Numerico', 'Per l''inserimento di valori numerici (quantità, importi, percentuali)', - '{"label": "Numero", "placeholder": 0, "step": 0}', + '[{"name": "label", "value": "Numero"}, {"name": "placeholder", "value": "0"}, {"name": "step", "value": "0"}]', '{"isRequired": false, "min": null, "max": null, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (5, 'radio', 'Scelta Singola', 'Gruppo di opzioni per selezione singola', - '{"label": "Scelta Singola", "options": []}', - '{"isRequired": false, "custom": null}', + '[{"name": "label", "value": "Scelta Singola"}, {"name": "options", "value": "[]"}]', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (6, 'select', 'Menu a Tendina', 'Selezione da opzioni predefinite', - '{"label": "Menu a Tendina", "options": []}', - '{"isRequired": false, "custom": null}', + '[{"name": "label", "value": "Menu a Tendina"}, {"name": "options", "value": "[]"}]', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (7, 'checkboxes', 'Scelta Multipla', 'Gruppo di opzioni per selezione singola o multipla', - '{"label": "Scelta Multipla", "options": []}', - '{"isRequired": false, "min": null, "max": null, "custom": null}', + '[{"name": "label", "value": "Scelta Multipla"}, {"name": "options", "value": "[]"}]', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (8, 'switch', 'Casella di Spunta', 'Per selezioni binarie, accettazioni, conferme', - '{"label": "Casella di Spunta"}', - '{"isRequired": false}', + '[{"name": "label", "value": "Casella di Spunta"}]', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (9, 'datepicker', 'Data', 'Selezione di data', - '{"label": "Data"}', - '{"isRequired": false, "custom": null}', + '[{"name": "label", "value": "Data"}]', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (10, 'fileupload', 'Caricamento File', 'Per l''upload di documenti o immagini', - '{"label": "Caricamento File", "mime": []}', - '{"isRequired": false, "maxSize": 100000, "custom": null}', + '[{"name": "label", "value": "Caricamento File"}, {"name": "mime", "value": "[]"}]', + '{"isRequired": false, "maxSize": 100000, "pattern": null, "custom": null}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (11, 'textinput', 'Campo Partita IVA', 'Specifico per l''inserimento del numero di Partita IVA', - '{"label": "Partita IVA", "placeholder": ""}', - '{"isRequired": true, "minLength": 11, "maxLength": 11, "custom": "isPIVA"}', + '[{"name": "label", "value": "Partita IVA"}, {"name": "placeholder", "value": ""}]', + '{"isRequired": true, "pattern": null, "custom": "isPIVA"}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (12, 'textinput', 'Campo Codice Fiscale', 'Specifico per l''inserimento del Codice Fiscale italiano per persone fisiche e giuridiche', - '{"label": "Codice Fiscale", "placeholder": ""}', - '{"isRequired": true, "minLength": 11, "maxLength": 16, "custom": "isCodiceFiscale"}', + '[{"name": "label", "value": "Codice Fiscale"}, {"name": "placeholder", "value": ""}]', + '{"isRequired": true, "pattern": null, "custom": "isCodiceFiscale"}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (13, 'numberinput', 'Campo CAP', 'Per l''inserimento del Codice di Avviamento Postale', - '{"label": "CAP", "placeholder": ""}', - '{"isRequired": true, "custom": "isCAP"}', + '[{"name": "label", "value": "CAP"}, {"name": "placeholder", "value": ""}]', + '{"isRequired": true, "minLength": null, "maxLength": null, "pattern": null, "custom": "isCAP"}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (14, 'textinput', 'Campo IBAN', 'Per l''inserimento del codice IBAN', - '{"label": "IBAN", "placeholder": ""}', - '{"isRequired": true, "custom": "isIBAN"}', + '[{"name": "label", "value": "IBAN"}, {"name": "placeholder", "value": ""}]', + '{"isRequired": true, "minLength": null, "maxLength": null, "pattern": null, "custom": "isIBAN"}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (15, 'textinput', 'Campo Email', 'Per l''inserimento di indirizzi email standard (non PEC)', - '{"label": "Campo Email", "placeholder": "nome@esempio.it"}', - '{"isRequired": false, "custom": "isEmail"}', + '[{"name": "label", "value": "Campo Email"}, {"name": "placeholder", "value": "nome@esempio.it"}]', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": "isEmail"}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (16, 'textinput', 'Campo PEC', 'Specifico per l''inserimento di un indirizzo di Posta Elettronica Certificata', - '{"label": "Campo PEC", "placeholder": "nome@pec.it"}', - '{"isRequired": false, "custom": "isEmailPEC"}', + '[{"name": "label", "value": "Campo PEC"}, {"name": "placeholder", "value": "nome@pec.it"}]', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": "isEmailPEC"}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (17, 'textinput', 'Campo URL', 'Per l''inserimento di indirizzi web', - '{"label": "Indirizzo URL", "placeholder": ""}', - '{"isRequired": false, "custom": "isUrl"}', + '[{"name": "label", "value": "Indirizzo URL"}, {"name": "placeholder", "value": ""}]', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": "isUrl"}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (18, 'textinput', 'Marca da bollo', 'Per inserire codice di marca da bollo', - '{"label": "Marca da bollo", "placeholder": "Numero identificativo"}', - '{"isRequired": false, "custom": "isMarcaDaBollo"}', + '[{"name": "label", "value": "Marca da bollo"}, {"name": "placeholder", "value": "Numero identificativo"}]', + '{"isRequired": false, "minLength": null, "maxLength": null, "pattern": null, "custom": "isMarcaDaBollo"}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); From b46aa5aad45dc136679c27707d428750a7eb77fc Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 18 Sep 2024 19:38:58 +0530 Subject: [PATCH 093/145] Fixed amount issue in call --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 8861ccbc..850806fa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -116,7 +116,7 @@ public class CallDao { } callEntity.setStatus(CallStatusEnum.DRAFT.getValue()); callEntity.setAmountMax(createCallRequest.getAmountMax()); - callEntity.setAmount(createCallRequest.getAmountMax()); + callEntity.setAmount(createCallRequest.getAmount()); callEntity.setConfidi(false); if (createCallRequest.getConfidi() != null) { callEntity.setConfidi(createCallRequest.getConfidi()); From 3525cf01ad63a22571f770e84bdc042bc1f95e3d Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 18 Sep 2024 20:48:34 +0530 Subject: [PATCH 094/145] Applied validation in PUT api of form --- .../tendermanagement/config/Translator.java | 5 + .../constants/GepafinConstant.java | 2 +- .../gepafin/tendermanagement/dao/FlowDao.java | 8 +- .../gepafin/tendermanagement/dao/FormDao.java | 91 ++++++++++++++++--- .../enums/ApplicationStatusTypeEnum.java | 3 +- .../tendermanagement/service/FormService.java | 2 +- .../service/impl/FormServiceImpl.java | 4 +- .../web/rest/api/FlowApi.java | 2 + .../web/rest/api/FormApi.java | 4 +- .../web/rest/api/impl/FormApiController.java | 4 +- src/main/resources/message_en.properties | 3 + src/main/resources/message_it.properties | 4 +- 12 files changed, 107 insertions(+), 25 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/Translator.java b/src/main/java/net/gepafin/tendermanagement/config/Translator.java index b3c02401..35ad8227 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/Translator.java +++ b/src/main/java/net/gepafin/tendermanagement/config/Translator.java @@ -22,4 +22,9 @@ public class Translator { Locale locale = LocaleContextHolder.getLocale(); return messageSource.getMessage(msgCode, null, locale); } + + public static String toLocale(String key, Object... args) { + return messageSource.getMessage(key, args, LocaleContextHolder.getLocale()); + } + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 4ed09d15..acf2e124 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -132,6 +132,6 @@ public class GepafinConstant { public static final String APPLICATION_ALREADY_SUBMITTED="application.already.submitted"; public static final String INITAL_AND_FINAL_FORM_CANNOT_NULL="initial.and.final.form.cannot.null"; public static final String APPLICATION_FORM_NOT_FOUND="application.form.not.found"; - + public static final String UPDATING_FORM_VALUE_IMPACT_ON_FLOW="updating.form.value.impact.on.flow"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java index 0ded1ac5..34bf0e59 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java @@ -135,9 +135,13 @@ public class FlowDao { public FlowDataEntity createFlowDataEntity(FlowDataRequestBean flowDataRequestBean,CallEntity call) { FlowDataEntity flowDataEntity = new FlowDataEntity(); flowDataEntity.setFormId(flowDataRequestBean.getFormId()); + if(Boolean.FALSE.equals(flowDataRequestBean.getChosenField().isEmpty()) || flowDataRequestBean.getChosenField()!=null){ flowDataEntity.setChoosenField(flowDataRequestBean.getChosenField()); - flowDataEntity.setChoosenValue(flowDataRequestBean.getChosenValue()); - flowDataEntity.setCallId(call.getId()); + } + if(Boolean.FALSE.equals(flowDataRequestBean.getChosenValue().isEmpty()) || flowDataRequestBean.getChosenValue()!=null) { + flowDataEntity.setChoosenValue(flowDataRequestBean.getChosenValue()); + } + flowDataEntity.setCallId(call.getId()); return flowDataEntity; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 0cc4b2eb..ab882abd 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -3,14 +3,10 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; -import net.gepafin.tendermanagement.model.request.ContentRequestBean; -import net.gepafin.tendermanagement.model.request.FieldValidatorBean; -import net.gepafin.tendermanagement.model.request.FormRequest; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; -import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; -import net.gepafin.tendermanagement.repositories.FormRepository; +import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.FieldValidator; @@ -21,6 +17,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.text.MessageFormat; import java.time.LocalDateTime; import java.util.LinkedHashMap; import java.util.List; @@ -42,6 +39,15 @@ public class FormDao { @Autowired private CallDao callDao; + @Autowired + private FlowDataRepository flowDataRepository; + + @Autowired + private FlowEdgesRepository flowEdgesRepository; + + @Autowired + private CallRepository callRepository; + public FormEntity saveFormEntity(FormEntity formEntity){ formEntity=formRepository.save(formEntity); return formEntity; @@ -66,6 +72,16 @@ public class FormDao { } public FormResponseBean createForm(Long callId,FormRequest formRequest){ validateForm(formRequest); + CallEntity callEntity=callService.validateCall(callId); + List flowDataEntities=flowDataRepository.findByCallId(callId); + List flowEdgesEntities=flowEdgesRepository.findByCallId(callId); + if(Boolean.FALSE.equals(flowDataEntities.isEmpty() || flowDataEntities==null ) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty() || flowEdgesEntities==null) ){ + flowDataRepository.deleteAll(flowDataEntities); + flowEdgesRepository.deleteAll(flowEdgesEntities); + callEntity.setInitialForm(null); + callEntity.setFinalForm(null); + callRepository.save(callEntity); + } FormEntity formEntity=convertFormRequestToFormEntity(callId,formRequest); return convertFormEntityToFormResponseBean(formEntity); } @@ -74,14 +90,55 @@ public class FormDao { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM)); } } - public FormResponseBean updateForm(Long formId, FormRequest formRequest){ + public FormResponseBean updateForm(Long formId, FormRequest formRequest,Boolean forceDeleteFlow){ + ContentRequestBean contentRequestBean2=null; FormEntity formEntity = validateForm(formId); - callDao.validateUpdate(formEntity.getCall()); - Utils.setIfUpdated(formEntity::getLabel,formEntity::setLabel,formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent,formEntity::setContent,setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity=saveFormEntity(formEntity); - return convertFormEntityToFormResponseBean(formEntity); + callDao.validateUpdate(formEntity.getCall()); + FlowDataEntity flowDataEntity=flowDataRepository.findByFormIdAndCallId(formEntity.getId(),formEntity.getCall().getId()); + String choosenField=flowDataEntity.getChoosenField(); + List contentRequestBean=Utils.convertJsonStringToList(formEntity.getContent(),ContentRequestBean.class); + for (ContentRequestBean contentRequestBean1:contentRequestBean){ + if(Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))){ + contentRequestBean2=contentRequestBean1; + break; + } + } + if (contentRequestBean2 != null) { + List settingRequestBeansDB = contentRequestBean2.getSettings(); + for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) { + if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) { + for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest.getSettings()) { + for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) { + if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) { + if (!settingRequestBeanRequest.getValue().equals(settingRequestBeanDB.getValue())) { + if(Boolean.TRUE.equals(forceDeleteFlow)) { + Utils.setIfUpdated(formEntity::getLabel,formEntity::setLabel,formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent,formEntity::setContent,setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity=saveFormEntity(formEntity); + List flowDataEntities=flowDataRepository.findByCallId(formEntity.getCall().getId()); + List flowEdgesEntities=flowEdgesRepository.findByCallId(formEntity.getCall().getId()); + flowDataRepository.deleteAll(flowDataEntities); + flowEdgesRepository.deleteAll(flowEdgesEntities); + CallEntity callEntity=formEntity.getCall(); + callEntity.setInitialForm(null); + callEntity.setFinalForm(null); + callRepository.save(callEntity); + return convertFormEntityToFormResponseBean(formEntity); + }else { + throw new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField) + ); + } + } + } + } + } + } + } + } + return null; } public FormEntity validateForm(Long formId) { @@ -96,6 +153,14 @@ public class FormDao { } public void deleteFormById(Long formId){ FormEntity formEntity = validateForm(formId); + List flowDataEntities=flowDataRepository.findByCallId(formEntity.getCall().getId()); + List flowEdgesEntities=flowEdgesRepository.findByCallId(formEntity.getCall().getId()); + flowDataRepository.deleteAll(flowDataEntities); + flowEdgesRepository.deleteAll(flowEdgesEntities); + CallEntity callEntity=formEntity.getCall(); + callEntity.setFinalForm(null); + callEntity.setInitialForm(null); + callRepository.save(callEntity); formRepository.delete(formEntity); } public List getFormsByCallId(Long callId){ diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java index df120d29..08b436c8 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -6,8 +6,7 @@ public enum ApplicationStatusTypeEnum { DRAFT("DRAFT"), SUBMIT("SUBMIT"), - EXPIRED("EXPIRED"), - READY_TO_SUBMIT("READY_TO_SUBMIT"); + DISCARD("DISCARD"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/service/FormService.java b/src/main/java/net/gepafin/tendermanagement/service/FormService.java index cf896b73..84447ebb 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FormService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FormService.java @@ -14,7 +14,7 @@ public interface FormService { public FormResponseBean createForm(HttpServletRequest request,Long callId,FormRequest formRequest); - public FormResponseBean updateForm(HttpServletRequest request, Long formId, FormRequest formRequest); + public FormResponseBean updateForm(HttpServletRequest request, Long formId, FormRequest formRequest,Boolean forceDeleteFlow); public FormResponseBean getFormById(HttpServletRequest request, Long formId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java index ee56bf88..9d04dbc5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java @@ -26,8 +26,8 @@ public class FormServiceImpl implements FormService { } @Override - public FormResponseBean updateForm(HttpServletRequest request, Long formId, FormRequest formRequest) { - return formDao.updateForm(formId,formRequest); + public FormResponseBean updateForm(HttpServletRequest request, Long formId, FormRequest formRequest,Boolean forceDeleteFlow) { + return formDao.updateForm(formId,formRequest,forceDeleteFlow); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java index 63d813e6..61115f63 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -33,6 +34,7 @@ public interface FlowApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/call/{callId}", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") ResponseEntity> createOrUpdateFlow(HttpServletRequest request, @Parameter(description = " Flow request object", required = true) @Valid @RequestBody FlowRequestBean flowRequestBean, @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java index 001de040..04417439 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java @@ -13,6 +13,7 @@ import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -31,6 +32,7 @@ public interface FormApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "/call/{callId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") public ResponseEntity> createForm(HttpServletRequest request,@Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId, @Parameter(description = "form request object", required = true) @Valid @RequestBody FormRequest formRequest); @@ -49,7 +51,7 @@ public interface FormApi { produces = { "application/json" }) ResponseEntity> updateForm(HttpServletRequest request, @Parameter(description = "The form ID", required = true) @PathVariable("formId") Long formId, - @Parameter(description = "form request object", required = true) @Valid @RequestBody FormRequest formRequest); + @Parameter(description = "form request object", required = true) @Valid @RequestBody FormRequest formRequest,@Parameter(description = "force delete flow ",required = true)@RequestParam(value = "forceDeleteFlow",required = true)Boolean forceDeleteFlow); @Operation(summary = "Api to get form by id", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormApiController.java index 72e8bd2b..5b8b54a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FormApiController.java @@ -32,8 +32,8 @@ public class FormApiController implements FormApi { } @Override - public ResponseEntity> updateForm(HttpServletRequest request, Long formId, FormRequest formRequest) { - FormResponseBean formResponseBean = formService.updateForm(request, formId, formRequest); + public ResponseEntity> updateForm(HttpServletRequest request, Long formId, FormRequest formRequest,Boolean forceDeleteFlow) { + FormResponseBean formResponseBean = formService.updateForm(request, formId, formRequest,forceDeleteFlow); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(formResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.FORM_UPDATED_SUCCESSFULLY))); } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index cb423966..b0449f1e 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -166,3 +166,6 @@ validation.message=Validation messages. action.required=Action field required. call.not.published=Call is not published. application.form.not.found=Application form not found. + +updating.form.value.impact.on.flow=Updating this value of form {0} can make impact on flow. + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 0c47f666..7b464832 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -160,4 +160,6 @@ flow.not.found=Flow not found. validation.message=Messaggi di convalida. action.required=Campo azione obbligatorio. call.not.published=La chiamata non è stata pubblicata. -application.form.not.found=Modulo di domanda non trovato. \ No newline at end of file +application.form.not.found=Modulo di domanda non trovato. + +updating.form.value.impact.on.flow=L'aggiornamento di questo valore del modulo {0} può avere un impatto sul flusso. \ No newline at end of file From 569adb92d663da809eee5771eef53d2c6710dece Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 19 Sep 2024 14:39:14 +0530 Subject: [PATCH 095/145] Fixed form issue --- .../gepafin/tendermanagement/dao/FormDao.java | 88 +++++++++++-------- .../repositories/FlowDataRepository.java | 3 + 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index ab882abd..59d1b802 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -90,55 +90,65 @@ public class FormDao { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM)); } } - public FormResponseBean updateForm(Long formId, FormRequest formRequest,Boolean forceDeleteFlow){ + public FormResponseBean updateForm(Long formId, FormRequest formRequest,Boolean forceDeleteFlow){ ContentRequestBean contentRequestBean2=null; + String choosenField=null; FormEntity formEntity = validateForm(formId); - callDao.validateUpdate(formEntity.getCall()); - FlowDataEntity flowDataEntity=flowDataRepository.findByFormIdAndCallId(formEntity.getId(),formEntity.getCall().getId()); - String choosenField=flowDataEntity.getChoosenField(); - List contentRequestBean=Utils.convertJsonStringToList(formEntity.getContent(),ContentRequestBean.class); - for (ContentRequestBean contentRequestBean1:contentRequestBean){ - if(Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))){ - contentRequestBean2=contentRequestBean1; - break; + callDao.validateUpdate(formEntity.getCall()); + List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), ContentRequestBean.class); + for (ContentRequestBean contentRequestBean1 : contentRequestBean) { + FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), contentRequestBean1.getId()); + if (flowDataEntity != null) { + choosenField = flowDataEntity.getChoosenField(); + if (Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))) { + contentRequestBean2 = contentRequestBean1; + break; + } + } } - } - if (contentRequestBean2 != null) { - List settingRequestBeansDB = contentRequestBean2.getSettings(); - for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) { - if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) { - for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest.getSettings()) { - for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) { - if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) { - if (!settingRequestBeanRequest.getValue().equals(settingRequestBeanDB.getValue())) { - if(Boolean.TRUE.equals(forceDeleteFlow)) { - Utils.setIfUpdated(formEntity::getLabel,formEntity::setLabel,formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent,formEntity::setContent,setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity=saveFormEntity(formEntity); - List flowDataEntities=flowDataRepository.findByCallId(formEntity.getCall().getId()); - List flowEdgesEntities=flowEdgesRepository.findByCallId(formEntity.getCall().getId()); - flowDataRepository.deleteAll(flowDataEntities); - flowEdgesRepository.deleteAll(flowEdgesEntities); - CallEntity callEntity=formEntity.getCall(); - callEntity.setInitialForm(null); - callEntity.setFinalForm(null); - callRepository.save(callEntity); - return convertFormEntityToFormResponseBean(formEntity); - }else { - throw new CustomValidationException( - Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField) - ); - } + if (contentRequestBean2 != null) { + List settingRequestBeansDB = contentRequestBean2.getSettings(); + for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) { + if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) { + for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest.getSettings()) { + for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) { + if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) { + if (!settingRequestBeanRequest.getValue().equals(settingRequestBeanDB.getValue())) { + if (Boolean.TRUE.equals(forceDeleteFlow)) { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + List flowDataEntities = flowDataRepository.findByCallId(formEntity.getCall().getId()); + List flowEdgesEntities = flowEdgesRepository.findByCallId(formEntity.getCall().getId()); + flowDataRepository.deleteAll(flowDataEntities); + flowEdgesRepository.deleteAll(flowEdgesEntities); + CallEntity callEntity = formEntity.getCall(); + callEntity.setInitialForm(null); + callEntity.setFinalForm(null); + callRepository.save(callEntity); + return convertFormEntityToFormResponseBean(formEntity); + } else { + throw new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField) + ); + } + } } } } } } } + else { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + return convertFormEntityToFormResponseBean(formEntity); } - return null; + return null; } public FormEntity validateForm(Long formId) { diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java index 8f752aa9..dffaee53 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FlowDataRepository.java @@ -17,4 +17,7 @@ public interface FlowDataRepository extends JpaRepository { public Optional findByChoosenValueAndFormIdIn(String fieldValue, List nextFormIds); public List findByFormIdInAndCallId(List previousFormIds, Long callId); + + public FlowDataEntity findByFormIdAndChoosenField(Long formId, String choosenField); + } From 79603a0c0d6480a81b1b79be2b941270b98d5cb6 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 19 Sep 2024 15:16:06 +0530 Subject: [PATCH 096/145] updated code --- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 59d1b802..bf8537a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -148,7 +148,7 @@ public class FormDao { formEntity = saveFormEntity(formEntity); return convertFormEntityToFormResponseBean(formEntity); } - return null; + return convertFormEntityToFormResponseBean(formEntity); } public FormEntity validateForm(Long formId) { From 43cc11ba0208d512a66ac326131494f0c3e23958 Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 20 Sep 2024 16:25:57 +0530 Subject: [PATCH 097/145] Updated Logic for Retrieving Previous Form --- .../tendermanagement/dao/FlowFormDao.java | 106 +++++++++++------- .../repositories/FormRepository.java | 2 + 2 files changed, 68 insertions(+), 40 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 0df71aa8..f46e61f5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -1,10 +1,12 @@ package net.gepafin.tendermanagement.dao; +import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import net.gepafin.tendermanagement.repositories.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -18,10 +20,6 @@ import net.gepafin.tendermanagement.entities.FlowEdgesEntity; import net.gepafin.tendermanagement.entities.FormEntity; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; -import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository; -import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; -import net.gepafin.tendermanagement.repositories.FlowDataRepository; -import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -47,7 +45,8 @@ public class FlowFormDao { @Autowired private FormService formService; - + @Autowired + private FormRepository formRepository; // Long getNextForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { // // vlaidation if next form findout and cuuent from is not fill the give error @@ -177,52 +176,79 @@ public class FlowFormDao { .orElse(null); } - public Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { - // Retrieve the flow edges for the previous forms - List flowEdgesList = flowEdgesRepository.findByTargetIdAndCallId( - currentFormEntity.getId(), applicationEntity.getCall().getId()); +// public Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { +// // Retrieve the flow edges for the previous forms +// List flowEdgesList = flowEdgesRepository.findByTargetIdAndCallId( +// currentFormEntity.getId(), applicationEntity.getCall().getId()); +// +// if (flowEdgesList.isEmpty()) { +// return null; +//// throw new ResourceNotFoundException(Status.NOT_FOUND, +//// Translator.toLocale(GepafinConstant.PREVIOUS_FORM_NOT_FOUND)); +// } +// +// // If only one edge exists, return the source form ID +// if (flowEdgesList.size() == 1) { +// return flowEdgesList.get(0).getSourceId(); +// } +// +// // For multiple edges, find the previous form based on the chosen value +// List previousFormIds = flowEdgesList.stream() +// .map(FlowEdgesEntity::getSourceId) +// .toList(); +// +// // Fetch the flow data based on previous form IDs +// List flowDataList = flowDataRepository.findByFormIdInAndCallId( +// previousFormIds, applicationEntity.getCall().getId()); +// +// List chosenValues = flowDataList.stream() +// .map(FlowDataEntity::getChoosenValue) +// .toList(); +// +// // Fetch the previous forms based on the chosen field values +// Set formList = applicationFormFieldRepository +// .findByFieldValueInAndApplicationFormApplicationId(chosenValues, applicationEntity.getId()).stream() +// .map(fieldEntity -> fieldEntity.getApplicationForm().getForm()) +// .collect(Collectors.toSet()); +// +// // Find next form IDs recursively for all forms in the formList +// List fieldIds = formList.stream() +// .map(formEntity -> getNextForm(formEntity, applicationEntity)) +// .toList(); +// +// // Return the first matching previous form ID that corresponds to a next form +// return previousFormIds.stream() +// .filter(fieldIds::contains) +// .findFirst().orElse(null); +// } - if (flowEdgesList.isEmpty()) { - return null; + public Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { + + List flowEdgesList = flowEdgesRepository.findByTargetIdAndCallId( + currentFormEntity.getId(), applicationEntity.getCall().getId()); + + if (flowEdgesList.isEmpty()) { + return null; // throw new ResourceNotFoundException(Status.NOT_FOUND, // Translator.toLocale(GepafinConstant.PREVIOUS_FORM_NOT_FOUND)); } - // If only one edge exists, return the source form ID - if (flowEdgesList.size() == 1) { - return flowEdgesList.get(0).getSourceId(); - } + // // If only one edge exists, return the source form ID + // if (flowEdgesList.size() == 1) { + // return flowEdgesList.get(0).getSourceId(); + // } // For multiple edges, find the previous form based on the chosen value - List previousFormIds = flowEdgesList.stream() - .map(FlowEdgesEntity::getSourceId) - .toList(); + List previousFormIds = flowEdgesList.stream() + .map(FlowEdgesEntity::getSourceId) + .toList(); - // Fetch the flow data based on previous form IDs - List flowDataList = flowDataRepository.findByFormIdInAndCallId( - previousFormIds, applicationEntity.getCall().getId()); + List previousForms = formRepository.findByIdIn(previousFormIds); - List chosenValues = flowDataList.stream() - .map(FlowDataEntity::getChoosenValue) - .toList(); + previousForms.sort(Comparator.comparing(FormEntity::getCreatedDate).reversed()); - // Fetch the previous forms based on the chosen field values - Set formList = applicationFormFieldRepository - .findByFieldValueInAndApplicationFormApplicationId(chosenValues, applicationEntity.getId()).stream() - .map(fieldEntity -> fieldEntity.getApplicationForm().getForm()) - .collect(Collectors.toSet()); - - // Find next form IDs recursively for all forms in the formList - List fieldIds = formList.stream() - .map(formEntity -> getNextForm(formEntity, applicationEntity)) - .toList(); - - // Return the first matching previous form ID that corresponds to a next form - return previousFormIds.stream() - .filter(fieldIds::contains) - .findFirst().orElse(null); + return previousForms.isEmpty() ? null : previousForms.get(0).getId(); } - public NextOrPreviousFormResponse getnextOrPreviousForm(ApplicationEntity applicationEntity, Long formId, FormActionEnum action) { Long calculatedFormId = null; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java index 6250b21b..db35477f 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java @@ -10,4 +10,6 @@ import java.util.List; public interface FormRepository extends JpaRepository { List findByCallId(Long callId); + + List findByIdIn(List formId); } From f32ad3c4a9655dd0b20e9a4d0088aed5472d8bac Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 20 Sep 2024 17:17:04 +0530 Subject: [PATCH 098/145] Done ticket GEPAFINBE-18 --- pom.xml | 6 ++ .../TendermanagementApplication.java | 2 + .../constants/GepafinConstant.java | 21 +++++ .../gepafin/tendermanagement/dao/FormDao.java | 38 +++++++-- .../tendermanagement/dao/VatCheckDao.java | 74 +++++++++++++++++ .../model/response/VatNumberResponseBean.java | 15 ++++ .../service/feignClient/VatCheckService.java | 23 ++++++ .../tendermanagement/util/FieldValidator.java | 82 +++++++++++++++++++ src/main/resources/application-dev.properties | 4 +- src/main/resources/application.properties | 5 +- src/main/resources/message_en.properties | 13 +++ src/main/resources/message_it.properties | 13 ++- 12 files changed, 287 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/VatNumberResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java diff --git a/pom.xml b/pom.xml index 713de99a..55765564 100644 --- a/pom.xml +++ b/pom.xml @@ -140,6 +140,12 @@ 0.23.0 + + org.springframework.cloud + spring-cloud-starter-openfeign + 4.1.3 + + diff --git a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java index f9a97be8..7ec98464 100644 --- a/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java +++ b/src/main/java/net/gepafin/tendermanagement/TendermanagementApplication.java @@ -2,12 +2,14 @@ package net.gepafin.tendermanagement; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @EnableScheduling +@EnableFeignClients @SpringBootApplication public class TendermanagementApplication { diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index acf2e124..159d21c1 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -133,5 +133,26 @@ public class GepafinConstant { public static final String INITAL_AND_FINAL_FORM_CANNOT_NULL="initial.and.final.form.cannot.null"; public static final String APPLICATION_FORM_NOT_FOUND="application.form.not.found"; public static final String UPDATING_FORM_VALUE_IMPACT_ON_FLOW="updating.form.value.impact.on.flow"; + public static final String AUTHORIZATION = "Authorization"; + public static final String CHECK_VATNUMBER_V2_NEW_URL = "https://imprese.openapi.it/advance"; + public static final String VATNUMBER_V2 = "https://imprese.openapi.it/advance"; + public static final String VALIDATION_FIELD_CUSTOM="validation.field.custom"; + public static final String VALIDATION_CODICE_FISCALE = "validation.codice.fiscale"; + public static final String VALIDATION_CAP = "validation.cap"; + public static final String VALIDATION_IBAN = "validation.iban"; + public static final String VALIDATION_EMAIL = "validation.email"; + public static final String VALIDATION_EMAIL_PEC = "validation.email.pec"; + public static final String VALIDATION_URL = "validation.url"; + public static final String VALIDATION_MARCA_DA_BOLLO = "validation.marca.da.bollo"; + public static final String VALIDATION_PIVA = "validation.piva"; + public static final String VALIDATION_VALID_PIVA="valid.vat.number"; + public static final String IS_MARCA_DA_BOLLO="isMarcaDaBollo"; + public static final String IS_URL="isUrl"; + public static final String IS_EMAIL_PEC="isEmailPEC"; + public static final String IS_EMAIL="isEmail"; + public static final String IS_IBAN="isIBAN"; + public static final String IS_CAP="isCAP"; + public static final String IS_CODICE_FISCALE="isCodiceFiscale"; + public static final String IS_PIVA="isPIVA"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index ab882abd..820c261d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; +import net.gepafin.tendermanagement.model.response.VatNumberResponseBean; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -16,6 +17,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.text.MessageFormat; import java.time.LocalDateTime; @@ -45,6 +47,9 @@ public class FormDao { @Autowired private FlowEdgesRepository flowEdgesRepository; + @Autowired + private VatCheckDao vatCheckDao; + @Autowired private CallRepository callRepository; @@ -180,7 +185,7 @@ public class FormDao { } public void validateFormField(List applicationFormFieldRequestList, ApplicationEntity applicationEntity, FormEntity formEntity) { - Map formFieldMap = new LinkedHashMap(); + Map formFieldMap = new LinkedHashMap(); for(ApplicationFormFieldRequestBean applicationFormFieldRequestBean:applicationFormFieldRequestList) { formFieldMap.put(applicationFormFieldRequestBean.getFieldId(),applicationFormFieldRequestBean.getFieldValue()); } @@ -191,20 +196,25 @@ public class FormDao { FieldValidator validator = FieldValidator.create(); formResponseBean.getContent().forEach(contentResponseBean -> { String fieldId = contentResponseBean.getId(); - String value = formFieldMap.get(fieldId); + String value = String.valueOf(formFieldMap.get(fieldId)); + if(value == null && isApplicationFormExist) { return; } - FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean, FieldValidatorBean.class); + FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); validator .notNull(value, fieldId) + .isRequired(value,fieldValidatorBean.getIsRequired(),fieldId) .minLength(value, fieldValidatorBean.getMinLength(), fieldId) // Only applies if minLength is not null .maxLength(value, fieldValidatorBean.getMaxLength(), fieldId) // Only applies if maxLength is not null - .matchesPattern(value, fieldValidatorBean.getPattern(), fieldId); // Only applies if pattern is present + .matchesPattern(value, fieldValidatorBean.getPattern(), fieldId) // Only applies if pattern is present + .validateCustom(value, fieldValidatorBean.getCustom(), fieldId); // Add the custom validation here + if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) { + String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldId); + validator.addError(error); + } }); - validator.validate(); - } private Boolean getApplicationFormExist(ApplicationFormEntity applicationFormEntity) { @@ -213,4 +223,20 @@ public class FormDao { } return false; } + + public String validateVatNumber(String value,String customRule,String fieldId){ + String error=null; + if (value.matches("^\\d{1,11}$")) { + Map customData=null; + try { + Map vatCheckResponse = vatCheckDao.checkVatNumberApi(value); + if (Boolean.FALSE.equals(CollectionUtils.isEmpty(vatCheckResponse))) { + customData = vatCheckResponse; + } + } catch (Exception e) { + error=(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_VALID_PIVA), fieldId)); + } + } + return error; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java new file mode 100644 index 00000000..4d1d0f58 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java @@ -0,0 +1,74 @@ +package net.gepafin.tendermanagement.dao; + +import feign.FeignException; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.service.feignClient.VatCheckService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.net.URI; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +@Component +public class VatCheckDao { + + @Autowired + private VatCheckService vatCheckService; + + @Value("${vatCheckNewToken}") + public String vatCheckNewToken; + + @Value("${isVatCheckGloballyDisabled}") + public String isVatCheckGloballyDisabled; + + public final Logger log = LoggerFactory.getLogger(VatCheckDao.class); + + + + public Map checkVatNumberApi(String vatNumber) { + if (Boolean.TRUE.equals(Boolean.parseBoolean(isVatCheckGloballyDisabled))) { + return new HashMap<>(); + } + Map responseBody = new HashMap<>(); + try { + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set(GepafinConstant.AUTHORIZATION, "Bearer " + vatCheckNewToken); + headers.add(org.apache.http.HttpHeaders.USER_AGENT, + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"); + + URI baseUrl = URI.create(GepafinConstant.CHECK_VATNUMBER_V2_NEW_URL); + ResponseEntity> response = vatCheckService.checkVatNumber(baseUrl,vatNumber, headers); + + if (response.getStatusCode() == HttpStatus.OK && response.hasBody()) { + log.info("Successfully checked vat number"); + Map responseMap = response.getBody(); + if (responseMap != null && responseMap.containsKey("data")) { + responseBody = (Map) responseMap.get("data"); + responseBody.remove("timestamp_creation"); + responseBody.remove("timestamp_last_update"); + responseBody.remove("data_iscrizione"); + responseBody.remove("id"); + Map data = new LinkedHashMap<>(); + data.put("data", responseBody); + return data; + } + } + } catch (FeignException ex) { + log.error("Exception occurred while checking vat number: {0}", ex); + throw ex; + } + return responseBody; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/VatNumberResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/VatNumberResponseBean.java new file mode 100644 index 00000000..f98e60c5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/VatNumberResponseBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class VatNumberResponseBean { + + private Boolean valid; + + private String validation; + + private String companyName; + + private String errorMessage; +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java new file mode 100644 index 00000000..6665690d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.service.feignClient; + +import net.gepafin.tendermanagement.constants.GepafinConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.net.URI; +import java.util.Map; + +@FeignClient(value = "vat-check-service", url = GepafinConstant.VATNUMBER_V2) +public interface VatCheckService { + + + @GetMapping("/{vatNumber}") + ResponseEntity> checkVatNumber(URI baseUrl, + @PathVariable("vatNumber") String vatNumber, + @RequestHeader HttpHeaders headers + ); +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 18a1f042..71c76f1a 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -3,12 +3,17 @@ package net.gepafin.tendermanagement.util; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.dao.FormDao; +import net.gepafin.tendermanagement.dao.VatCheckDao; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.ValidationException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; public class FieldValidator { @@ -18,6 +23,10 @@ public class FieldValidator { return new FieldValidator(); } + @Autowired + private VatCheckDao vatCheckDao; + + public FieldValidator notNull(Object object, String fieldName) { if (Objects.isNull(object)) { errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_NULL), fieldName)); @@ -65,4 +74,77 @@ public class FieldValidator { public static boolean isNullOrZero(Long value) { return value == null || value == 0L; } + + public FieldValidator validateCustom(String value, String customRule, String fieldId) { + if (customRule == null || value == null) { + return this; // No custom rule to validate + } + + switch (customRule) { + + case GepafinConstant.IS_PIVA: + // VAT number: max 11 digits, can start with 0 + if (!value.matches("^\\d{1,11}$")) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_PIVA), fieldId, customRule)); + } + break; + case GepafinConstant.IS_CODICE_FISCALE: + // 16 characters: 6 letters, 2 digits, 1 letter, 2 digits, 1 letter, 3 digits, 1 letter + if (!value.matches("^[A-Z]{6}[0-9]{2}[A-Z]{1}[0-9]{2}[A-Z]{1}[0-9]{3}[A-Z]{1}$")) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_CODICE_FISCALE), fieldId, customRule)); + } + break; + + case GepafinConstant.IS_CAP: + // 5 digits (can start with 0) + if (!value.matches("^[0-9]{5}$")) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_CAP), fieldId, customRule)); + } + break; + + case GepafinConstant.IS_IBAN: + // IBAN must be 27 characters + if (value.length() != 27) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_IBAN), fieldId, customRule)); + } + break; + + case GepafinConstant.IS_EMAIL: + case GepafinConstant.IS_EMAIL_PEC: + // Email validation (using a simple regex for email) + if (!value.matches("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$")) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_EMAIL), fieldId, customRule)); + } + break; + + case GepafinConstant.IS_URL: + // URL validation (simple regex for URL) + if (!value.matches("^(https?|ftp)://[^\s/$.?#].[^\s]*$")) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_URL), fieldId, customRule)); + } + break; + + case GepafinConstant.IS_MARCA_DA_BOLLO: + // Length must be 14 digits (can start with 0) + if (!value.matches("^[0-9]{14}$")) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_MARCA_DA_BOLLO), fieldId, customRule)); + } + break; + + default: + // If the custom rule is unknown, just log or add an error (optional) + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_CUSTOM), fieldId, customRule)); + break; + } + + return this; + } + public FieldValidator isRequired(String value,Boolean isRequired, String fieldName) { + if (Boolean.TRUE.equals(isRequired)) { // Only check if isRequired is true + if (Objects.isNull(value) || value.isEmpty()) { // Check if value is null or empty + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_NULL), fieldName)); + } + } + return this; + } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 72135766..19588213 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -5,4 +5,6 @@ spring.datasource.password=vs1pAc9vu07mMcdx93j6WiBS spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration -spring.h2.console.enabled=true \ No newline at end of file +spring.h2.console.enabled=true + +isVatCheckGloballyDisabled = false diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 07fcf32f..a1893c1e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.application.name=tendermanagement spring.servlet.multipart.max-file-size=50MB spring.servlet.multipart.max-request-size=50MB -spring.profiles.active=testing +spring.profiles.active=local # JPA Configuration @@ -39,3 +39,6 @@ security.authentication.jwt.token-validity-in-seconds=86400 spring.main.allow-circular-references=true +isVatCheckGloballyDisabled = true +vatCheckNewToken: 66026bd891a51044e90e08c4 + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index b0449f1e..0f2025d5 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -168,4 +168,17 @@ call.not.published=Call is not published. application.form.not.found=Application form not found. updating.form.value.impact.on.flow=Updating this value of form {0} can make impact on flow. +validation.field.custom=The value for field {0} does not meet the custom validation rule. + +validation.codice.fiscale=The field {0} must be a valid Codice Fiscale with exactly 16 characters: 6 letters, 2 digits, 1 letter, 2 digits, 1 letter, 3 digits, and 1 letter. +validation.cap=The field {0} must be a valid CAP with exactly 5 digits. +validation.iban=The field {0} must be a valid IBAN with exactly 27 characters. +validation.email=The field {0} must be a valid email address. +validation.email.pec=The field {0} must be a valid PEC email address. +validation.url=The field {0} must be a valid URL. +validation.marca.da.bollo=The field {0} must be a valid Marca Da Bollo with exactly 14 digits. +validation.piva=The VAT number for {0} must be up to 11 digits. +valid.vat.number=The VAT number is not valid for field {0}. + + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 7b464832..95e4a1d9 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -162,4 +162,15 @@ action.required=Campo azione obbligatorio. call.not.published=La chiamata non è stata pubblicata. application.form.not.found=Modulo di domanda non trovato. -updating.form.value.impact.on.flow=L'aggiornamento di questo valore del modulo {0} può avere un impatto sul flusso. \ No newline at end of file +updating.form.value.impact.on.flow=L'aggiornamento di questo valore del modulo {0} può avere un impatto sul flusso. +validation.field.custom=Il valore per il campo {0} non soddisfa la regola di convalida personalizzata. + +validation.codice.fiscale=Il campo {0} deve essere un Codice Fiscale valido con esattamente 16 caratteri: 6 lettere, 2 cifre, 1 lettera, 2 cifre, 1 lettera, 3 cifre e 1 lettera. +validation.cap=Il campo {0} deve essere un CAP valido con esattamente 5 cifre. +validation.iban=Il campo {0} deve essere un IBAN valido con esattamente 27 caratteri. +validation.email=Il campo {0} deve essere un indirizzo email valido. +validation.email.pec=Il campo {0} deve essere un indirizzo email PEC valido. +validation.url=Il campo {0} deve essere un URL valido. +validation.marca.da.bollo=Il campo {0} deve essere una Marca Da Bollo valida con esattamente 14 cifre. +validation.piva=Il numero di partita IVA per {0} deve essere lungo fino a 11 cifre. +valid.vat.number=Il numero di partita IVA non è valido per il campo {0}. \ No newline at end of file From b21f0a7ea19559201c4f66a69e56a3d0390e28f9 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 20 Sep 2024 17:37:12 +0530 Subject: [PATCH 099/145] Updated code --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a1893c1e..8c3ecdf1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.application.name=tendermanagement spring.servlet.multipart.max-file-size=50MB spring.servlet.multipart.max-request-size=50MB -spring.profiles.active=local +spring.profiles.active=testing # JPA Configuration From c1939102c7810e8dc3874fe2598ab3d1e00a8f0e Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 20 Sep 2024 19:37:47 +0530 Subject: [PATCH 100/145] Updated put api of call --- .../constants/GepafinConstant.java | 2 +- .../net/gepafin/tendermanagement/dao/CallDao.java | 12 ++++++++++-- .../net/gepafin/tendermanagement/util/Utils.java | 14 ++++++++++++++ src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 3 ++- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index acf2e124..6fecacdd 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -133,5 +133,5 @@ public class GepafinConstant { public static final String INITAL_AND_FINAL_FORM_CANNOT_NULL="initial.and.final.form.cannot.null"; public static final String APPLICATION_FORM_NOT_FOUND="application.form.not.found"; public static final String UPDATING_FORM_VALUE_IMPACT_ON_FLOW="updating.form.value.impact.on.flow"; - + public static final String FAILED_RETAIN_FIELD="failed.retain.field"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 850806fa..1b3f60d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -3,12 +3,14 @@ package net.gepafin.tendermanagement.dao; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.*; +import net.gepafin.tendermanagement.util.Utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -424,8 +426,14 @@ public class CallDao { public CallResponse updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) { CallEntity callEntity = validateCall(callId); - validateUpdate(callEntity); - UserEntity userEntity = userService.validateUser(userId); + if(Boolean.TRUE.equals(callEntity.getStatus().equals(CallStatusEnum.PUBLISH.getValue()))) { + try { + Utils.retainOnlySpecificFields(updateCallRequest, Collections.singletonList("faq")); + } catch (IllegalAccessException e) { + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.FAILED_RETAIN_FIELD)); + } + } + UserEntity userEntity = userService.validateUser(userId); isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort, diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 5560809f..055fb8e8 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -12,6 +12,7 @@ import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -147,4 +148,17 @@ public class Utils { } return null; } + public static void retainOnlySpecificFields(T requestObject, List retainFields) throws IllegalAccessException { + // Get all declared fields of the request object's class + Field[] fields = requestObject.getClass().getDeclaredFields(); + + for (Field field : fields) { + field.setAccessible(true); // To allow access to private fields + + // Check if the field is in the retainFields list + if (!retainFields.contains(field.getName())) { + field.set(requestObject, null); // Set the field to null if not in the retain list + } + } + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index b0449f1e..76fef4eb 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -168,4 +168,5 @@ call.not.published=Call is not published. application.form.not.found=Application form not found. updating.form.value.impact.on.flow=Updating this value of form {0} can make impact on flow. +failed.retain.field=Failed to retain specific fields. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 7b464832..c5f4c2c9 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -162,4 +162,5 @@ action.required=Campo azione obbligatorio. call.not.published=La chiamata non è stata pubblicata. application.form.not.found=Modulo di domanda non trovato. -updating.form.value.impact.on.flow=L'aggiornamento di questo valore del modulo {0} può avere un impatto sul flusso. \ No newline at end of file +updating.form.value.impact.on.flow=L'aggiornamento di questo valore del modulo {0} può avere un impatto sul flusso. +failed.retain.field=Impossibile conservare campi specifici. \ No newline at end of file From 07a11da9581dd05c359097b0ddebc54c328d478e Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 20 Sep 2024 19:43:15 +0530 Subject: [PATCH 101/145] Updated submission api --- .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/ApplicationDao.java | 30 ++++++++++++++----- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 3 +- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index acf2e124..fcd7b57d 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -133,5 +133,6 @@ public class GepafinConstant { public static final String INITAL_AND_FINAL_FORM_CANNOT_NULL="initial.and.final.form.cannot.null"; public static final String APPLICATION_FORM_NOT_FOUND="application.form.not.found"; public static final String UPDATING_FORM_VALUE_IMPACT_ON_FLOW="updating.form.value.impact.on.flow"; + public static final String APPLICATION_IS_INCOMPLETE_MSG = "application.is.incomplete"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index d6e5e77a..f8e86e7e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -352,12 +352,26 @@ public class ApplicationDao { } - public void updateApplicationStatus(Long applicationId, ApplicationStatusTypeEnum status) { - ApplicationEntity applicationEntity = validateApplication(applicationId); - applicationEntity.setStatus(status.getValue()); - if(status.equals(ApplicationStatusTypeEnum.SUBMIT)) { - applicationEntity.setSubmissionDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - } - saveApplicationEntity(applicationEntity); - } + public void updateApplicationStatus(Long applicationId, ApplicationStatusTypeEnum status) { + ApplicationEntity applicationEntity = validateApplication(applicationId); + + if (status.equals(ApplicationStatusTypeEnum.SUBMIT)) { + CallEntity callEntity = applicationEntity.getCall(); + Long initialFormId = callEntity.getInitialForm(); + Long finalFormId = callEntity.getFinalForm(); +// if (initialFormId == null || finalFormId == null) { +// throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); +// } + ApplicationFormEntity initialApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), initialFormId); + ApplicationFormEntity finalApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), finalFormId); + if (initialApplicationForm == null || finalApplicationForm == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); + } + applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue()); + applicationEntity.setSubmissionDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + } else { + applicationEntity.setStatus(status.getValue()); + } + saveApplicationEntity(applicationEntity); + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index b0449f1e..560ae89a 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -169,3 +169,4 @@ application.form.not.found=Application form not found. updating.form.value.impact.on.flow=Updating this value of form {0} can make impact on flow. +application.is.incomplete = The application is incomplete. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 7b464832..18f8f5fa 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -162,4 +162,5 @@ action.required=Campo azione obbligatorio. call.not.published=La chiamata non è stata pubblicata. application.form.not.found=Modulo di domanda non trovato. -updating.form.value.impact.on.flow=L'aggiornamento di questo valore del modulo {0} può avere un impatto sul flusso. \ No newline at end of file +updating.form.value.impact.on.flow=L'aggiornamento di questo valore del modulo {0} può avere un impatto sul flusso. +application.is.incomplete = L'applicazione è incompleta. From 398fb7cc43a7aee1ffe4d67185d879549aebfbec Mon Sep 17 00:00:00 2001 From: rajesh Date: Sun, 22 Sep 2024 13:23:32 +0530 Subject: [PATCH 102/145] created an api to get metadata --- pom.xml | 36 ++++++++++++++++--- .../web/rest/api/SamlApi.java | 30 ++++++++++++++++ .../web/rest/api/impl/SamlApiController.java | 33 +++++++++++++++++ src/main/resources/application-dev.properties | 3 +- .../resources/application-local.properties | 3 +- .../resources/application-testing.properties | 3 +- 6 files changed, 100 insertions(+), 8 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/SamlApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/SamlApiController.java diff --git a/pom.xml b/pom.xml index 713de99a..ad01e409 100644 --- a/pom.xml +++ b/pom.xml @@ -116,10 +116,6 @@ jjwt-jackson 0.11.5 - - org.springframework.boot - spring-boot-starter-web - jakarta.validation jakarta.validation-api @@ -139,6 +135,37 @@ problem-spring-web 0.23.0 + + + + org.springframework.security + spring-security-saml2-service-provider + + + + + org.opensaml + opensaml-core + 4.0.1 + + + + + + org.opensaml + opensaml-saml-api + 4.0.1 + + + + + + org.opensaml + opensaml-saml-impl + 4.0.1 + + + @@ -152,7 +179,6 @@ org.liquibase liquibase-maven-plugin - 4.20.0 src/main/resources/application.properties diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/SamlApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/SamlApi.java new file mode 100644 index 00000000..54ac52dd --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/SamlApi.java @@ -0,0 +1,30 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; + +public interface SamlApi { + + + @Operation(summary = "Api to get SP metadata", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/gw/metadata", + produces = { "application/json" }) + ResponseEntity getMetadata(HttpServletRequest request); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/SamlApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/SamlApiController.java new file mode 100644 index 00000000..b9a35be8 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/SamlApiController.java @@ -0,0 +1,33 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.saml2.provider.service.metadata.OpenSamlMetadataResolver; +import org.springframework.security.saml2.provider.service.metadata.Saml2MetadataResolver; +import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration; +import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.web.rest.api.SamlApi; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/saml}") +public class SamlApiController implements SamlApi{ + + @Autowired + private RelyingPartyRegistrationRepository relyingPartyRegistrationRepository; + + @Override + public ResponseEntity getMetadata(HttpServletRequest request) { + Saml2MetadataResolver metadataResolver = new OpenSamlMetadataResolver(); + RelyingPartyRegistration registration = relyingPartyRegistrationRepository.findByRegistrationId("loginumbria"); + return ResponseEntity.status(HttpStatus.OK).header("Content-Type", MediaType.APPLICATION_XML_VALUE) + .body(metadataResolver.resolve(registration)); + + } + +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 72135766..c160287a 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -5,4 +5,5 @@ spring.datasource.password=vs1pAc9vu07mMcdx93j6WiBS spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration -spring.h2.console.enabled=true \ No newline at end of file +spring.h2.console.enabled=true +base-url=https://api-dev-gepafin.memento.credit \ No newline at end of file diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 7ed5944b..6b925e03 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -5,4 +5,5 @@ spring.datasource.password=root spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration -spring.jpa.show-sql=true \ No newline at end of file +spring.jpa.show-sql=true +base-url=http://localhost:8080 \ No newline at end of file diff --git a/src/main/resources/application-testing.properties b/src/main/resources/application-testing.properties index ea3a5732..12b95acb 100644 --- a/src/main/resources/application-testing.properties +++ b/src/main/resources/application-testing.properties @@ -4,4 +4,5 @@ spring.datasource.username=sa spring.datasource.password=sa # JPA Configuration -spring.h2.console.enabled=true \ No newline at end of file +spring.h2.console.enabled=true +base-url=http://localhost:8080 \ No newline at end of file From d2df445edf5afc136e1123ce07b9d7c436111fd2 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 13:31:02 +0530 Subject: [PATCH 103/145] updated code --- .../config/SecurityConfig.java | 186 +++++++++++++++--- .../entities/SamlResponseLogEntity.java | 26 +++ .../SamlResponseLogRepository.java | 11 ++ .../web/rest/api/impl/SamlApiController.java | 6 + src/main/resources/application.properties | 1 + .../db/changelog/db.changelog-1.0.0.xml | 26 +++ 6 files changed, 232 insertions(+), 24 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/SamlResponseLogEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseLogRepository.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index e06c3e4b..22ac7dff 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -1,6 +1,18 @@ package net.gepafin.tendermanagement.config; - +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.InputStream; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.security.spec.PKCS8EncodedKeySpec; +import org.bouncycastle.util.io.pem.PemReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; @@ -14,6 +26,11 @@ import org.springframework.security.config.annotation.web.configurers.AbstractHt import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.saml2.core.Saml2X509Credential; +import org.springframework.security.saml2.provider.service.registration.InMemoryRelyingPartyRegistrationRepository; +import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration; +import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository; +import org.springframework.security.saml2.provider.service.registration.Saml2MessageBinding; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; @@ -23,6 +40,8 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; +import com.fasterxml.jackson.databind.ObjectMapper; + import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.security.SecurityRequirement; @@ -30,24 +49,29 @@ import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; import net.gepafin.tendermanagement.config.jwt.JWTFilter; import net.gepafin.tendermanagement.config.jwt.TokenProvider; - +import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; +import net.gepafin.tendermanagement.repositories.SamlResponseLogRepository; @Configuration @EnableWebSecurity @EnableMethodSecurity(prePostEnabled = true) public class SecurityConfig { - + private final Logger logger = LoggerFactory.getLogger(SecurityConfig.class); private final TokenProvider tokenProvider; - + + @Value("${base-url}") + String baseUrl; + + @Autowired + private SamlResponseLogRepository samlResponseLogRepository; + @Autowired public SecurityConfig(TokenProvider tokenProvider) { this.tokenProvider = tokenProvider; } - @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); } - @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); @@ -75,8 +99,8 @@ public class SecurityConfig { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); - config.addAllowedMethod("*"); - config.addAllowedHeader("*"); + config.addAllowedMethod("*"); + config.addAllowedHeader("*"); config.setMaxAge(3600l); if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) { @@ -86,24 +110,91 @@ public class SecurityConfig { } return new CorsFilter(source); } - - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { - http - .csrf(AbstractHttpConfigurer::disable) - .authorizeHttpRequests(auth -> auth - .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user/login")).permitAll() - .requestMatchers("/swagger-ui/**").permitAll() - .requestMatchers("/v1/api-docs/**").permitAll() - .anyRequest().authenticated() - ) - .sessionManagement(session -> session - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - ) + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests(auth -> auth + // Allow public access to the login endpoints + .requestMatchers("/v1/user/login").permitAll() // JWT-based login + .requestMatchers("/v1/saml/**").permitAll() // JWT-based login + .requestMatchers("/saml2/**").permitAll() // SAML login initiation + .requestMatchers("/swagger-ui/**").permitAll() // Swagger docs + .requestMatchers("/v1/api-docs/**").permitAll() // API docs + .anyRequest().authenticated()) + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .addFilterBefore(corsFilter(), UsernamePasswordAuthenticationFilter.class) - .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class); + .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class) + // Add SAML2 login configuration (for BENEFICIARI) + /* + * .saml2Login(saml -> saml.loginPage("/saml/login") // Entry point for SAML + * login .defaultSuccessUrl("/") // Redirect after successful SAML login ); + */ + .saml2Login(saml -> + saml.defaultSuccessUrl("/") + .successHandler((request, response, authentication) -> { + logger.error("SAML success login"); + SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); + samlResponseLogEntity.setRequest(request.toString()); + samlResponseLogEntity.setResponse(response.toString()); + samlResponseLogEntity.setAuthenticationObject(authentication.toString()); + samlResponseLogRepository.save(samlResponseLogEntity); + try { + ObjectMapper objectMapper = new ObjectMapper(); + // Create a new SAML log entity + SamlResponseLogEntity samlResponseLogEntity1 = new SamlResponseLogEntity(); + // Convert request, response, and authentication to JSON format + String requestJson = objectMapper.writeValueAsString(request.getParameterMap()); // Assuming request params to JSON + String responseJson = objectMapper.writeValueAsString(response); // This may need to be adapted based on your response object + String authenticationJson = objectMapper.writeValueAsString(authentication); // Authentication object to JSON + + // Set the JSON strings in the entity + samlResponseLogEntity1.setRequest(requestJson); + samlResponseLogEntity1.setResponse(responseJson); + samlResponseLogEntity1.setAuthenticationObject(authenticationJson); + samlResponseLogRepository.save(samlResponseLogEntity1); + + logger.info("SAML Request: " + requestJson); + logger.info("SAML Response: " + responseJson); + logger.info("Authentication Details: " + authenticationJson); + }catch(Exception e) { + logger.info("Exception object" + e); + } +// samlResponseLogRepository + logger.info("SAML login successful for user: " + authentication.getName()); + response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/"); + }).failureHandler((request, response, exception) -> { + logger.error("SAML login failed: " + exception.getMessage()); + + SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); + samlResponseLogEntity.setRequest(request.toString()); + samlResponseLogEntity.setResponse(response.toString()); + samlResponseLogEntity.setExceptionObject(exception.toString()); + samlResponseLogRepository.save(samlResponseLogEntity); + try { + ObjectMapper objectMapper = new ObjectMapper(); + + // Create a new SAML log entity + SamlResponseLogEntity samlResponseLogEntity1 = new SamlResponseLogEntity(); + + // Convert request, response, and authentication to JSON format + String requestJson = objectMapper.writeValueAsString(request.getParameterMap()); // Assuming request params to JSON + String responseJson = objectMapper.writeValueAsString(response); // This may need to be adapted based on your response object + String exceptionJson = objectMapper.writeValueAsString(exception); // Authentication object to JSON + + // Set the JSON strings in the entity + samlResponseLogEntity1.setRequest(requestJson); + samlResponseLogEntity1.setResponse(responseJson); + samlResponseLogEntity1.setAuthenticationObject(exceptionJson); + samlResponseLogRepository.save(samlResponseLogEntity1); + + logger.info("SAML Request: " + requestJson); + logger.info("SAML Response: " + responseJson); + logger.info("exception Details: " + exceptionJson); + }catch(Exception e) { + logger.info("Exception object" + e); + } + response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); + })); return http.build(); } @@ -116,4 +207,51 @@ public class SecurityConfig { new SecurityScheme().type(SecurityScheme.Type.HTTP) .scheme("bearer").bearerFormat("JWT"))); } -} + + @Bean + public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() { + + String entityId = baseUrl + "/v1/saml/gw/metadata"; + String acsUrl = baseUrl + "/login/saml2/sso/loginumbria"; + RelyingPartyRegistration registration = RelyingPartyRegistration.withRegistrationId("loginumbria") + .entityId(entityId) + .signingX509Credentials(credentials -> { + try { + credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); + } catch (Exception e) { + e.printStackTrace(); + } + }) + .assertionConsumerServiceLocation(acsUrl) + .assertingPartyDetails(details -> details.entityId("https://federatest.umbriadigitale.it/gw/metadata") + .singleSignOnServiceLocation("https://federatest.umbriadigitale.it/gw/SSOProxy/SAML2") + .singleSignOnServiceBinding(Saml2MessageBinding.POST).wantAuthnRequestsSigned(false) + ) + .build(); + return new InMemoryRelyingPartyRegistrationRepository(registration); + } + + + + public PrivateKey readPrivateKey() throws Exception { + // Path to your private key PEM file + File privateKeyFile = new File("src/main/resources/dev/saml/private-key.pem"); + try (PemReader pemReader = new PemReader(new FileReader(privateKeyFile))) { + // Read the PEM content + byte[] pemContent = pemReader.readPemObject().getContent(); + // Decode the PEM content + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pemContent); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); // Use RSA algorithm + // Generate and return the PrivateKey + return keyFactory.generatePrivate(keySpec); + } + } + public X509Certificate readCertificate() throws Exception { + // Path to your certificate PEM fileFile + File certFile = new File("src/main/resources/dev/saml/public-cert.pem"); + try (InputStream inStream = new FileInputStream(certFile)) { + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + return (X509Certificate) certFactory.generateCertificate(inStream); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseLogEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseLogEntity.java new file mode 100644 index 00000000..53e262e9 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseLogEntity.java @@ -0,0 +1,26 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Table(name = "SAML_RESPONSE_LOG") +@Data +public class SamlResponseLogEntity extends BaseEntity{ + + @Column(name = "REQUEST") + private String request; + + @Column(name = "RESPONSE") + private String response; + + @Column(name = "AUTHENTICATION_OBJECT") + private String authenticationObject; + + @Column(name = "EXCEPTION_OBJECT") + private String exceptionObject; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseLogRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseLogRepository.java new file mode 100644 index 00000000..3f98e083 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseLogRepository.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; + +@Repository +public interface SamlResponseLogRepository extends JpaRepository { + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/SamlApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/SamlApiController.java index b9a35be8..f49b9fa5 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/SamlApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/SamlApiController.java @@ -1,5 +1,7 @@ package net.gepafin.tendermanagement.web.rest.api.impl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -12,17 +14,21 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.SecurityConfig; import net.gepafin.tendermanagement.web.rest.api.SamlApi; @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/saml}") public class SamlApiController implements SamlApi{ + private final Logger logger = LoggerFactory.getLogger(SecurityConfig.class); + @Autowired private RelyingPartyRegistrationRepository relyingPartyRegistrationRepository; @Override public ResponseEntity getMetadata(HttpServletRequest request) { + logger.info("get SP metadata"); Saml2MetadataResolver metadataResolver = new OpenSamlMetadataResolver(); RelyingPartyRegistration registration = relyingPartyRegistrationRepository.findByRegistrationId("loginumbria"); return ResponseEntity.status(HttpStatus.OK).header("Content-Type", MediaType.APPLICATION_XML_VALUE) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 07fcf32f..1b6634c5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -35,6 +35,7 @@ aws.s3.url.folder=gepafin # Ensure these values match your expectations security.authentication.jwt.secret=my-secret-token-to-change-in-prod-environment-your-super-secure-randomly-generated-key security.authentication.jwt.token-validity-in-seconds=86400 +base-url=https://api-dev-gepafin.memento.credit spring.main.allow-circular-references=true diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index f4a78969..d7377f5c 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -710,4 +710,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + From 29b94c7bd7ed8b25e7717bc921e14131a85e53be Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 15:01:43 +0530 Subject: [PATCH 104/145] updated private and public key --- src/main/resources/dev/saml/private-key.pem | 28 +++++++++++++++++++++ src/main/resources/dev/saml/public-cert.pem | 24 ++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/main/resources/dev/saml/private-key.pem create mode 100644 src/main/resources/dev/saml/public-cert.pem diff --git a/src/main/resources/dev/saml/private-key.pem b/src/main/resources/dev/saml/private-key.pem new file mode 100644 index 00000000..9302e091 --- /dev/null +++ b/src/main/resources/dev/saml/private-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCsCrXQyDN5nURj +2LB1wJKRIOzO8tgIXxPHVL65dYv7cOql01b5LpmUGQaGfUKALlvEdPs0NwCSdiyz +MGAMTD81KHLqa+Wdm5ySl82ONRGl15pmHQFJlUDFpOr5+r1AZvQdh9MfdcbWW57m +4qaDEF3kvihIZg9PMbqlQjHOrcG1iUPzpHnzcnmevpP32MH2FSYZhy+b0Ie2Fsho +3Aj7CvmJYlBWfCaFLQ/wi8FsDEhjsOlUUkcr7/giO3ygK57oPzcld74g4x79A/UH +VbUe2+CUxzFqP9+VtDWGqJ7lp0bHA/lfGvmDvIJAY6UDyYfum1Vn/ag2NmvW5wLH +Z8vdLP75AgMBAAECggEABJ5u/jF5zFCQFvwo1Kh8ZuAS64Vyjlr7HXVlf3Yr8W65 +JgWUBrGdFvBLEA5J3EYiWZZobiDx53y7u33Xfk0Hv2YcG7YU3pPgcsEXmDNNi33L +2+T4dWDH8eZ5FogIT7PT5v0QCn6vfW7NR9aa8NbeJneCflsbGx2zLJ+n1awtkLGY +6vFSwl/xzRCClWCccT64+8/b2btLEDFa4IK5KdMoiP/t1fM51vu3DmPBgWt2ZWH1 +cPcd2GSXPaEyHECUAYV7/HpY5I+2xD8W3YJLaGmSeavsuW726ygUaYDsX3L3EPP8 +/AIPwhI0uLRLT2zRfH9BzPqJL+A1gnFR/BysVWnKQQKBgQDm6myujHrpe1A92j8v +E3nTmaigCAdIhJSkoOjcvHxcHacJtK/QN4zmQvOtHwn9NAOz0jvMgJUM2Pd6t4MV +1vWSFZam9P6EkNkmhg94V2FnQlas329XIfLWdVqfVsTxbyhIICRLBmBgn3Z22ugw +FU5rYoZw7mjP/Gqhv3hYNH2dcQKBgQC+uw01Jh51JclSkT2lh5M2xwovnA74HuWT +d/w9smXS3hi1TJn0ECVJKagZXhwAIgVntxzV93Vz3++VvX3LeM81eOD2vTpTR+MP +mZ8lwsCxKDABZfoFV79lrO+8I61e4pSgcRSK0uqsvFmlN1agL+hn6esBrZe4IV37 +Hvk1OobWCQKBgFtJ8B9tcCYf1xAs2O/Ofko2JCDoK6DysSUIbCbf6TYtjtzabusd +GvnpHBaj/7n3N0N+6J8nckV6/ROpuwwGSF0xZbapgnl8Hi0JsNH9kYdWBZggWQ8U +X8GC8YmurvtX24/wDQkQA0gPorDISCTCN5digw3gYtVez/UUEgqk7cgxAoGADA3q +YceM+T5wIOXJDaMp7LZbsHKeh5P8Unus14Fk6hTbXun+eOxkTuFxHFlUT7XWvZ1X +FzbSl4Y5sC8PukJiZjDDlxSSkRzj/uJoqoxKfWfa0NvPF3NaR2TMqglfNbYASrua +3sNBzbUBvW1n7ivY9mhUUADWq+5/8BUfDvwp9XECgYEAxfclKcPbns4Hm5N0/tGV +aTCvlwXIWIYa5krewof1bfW/APS917MZEfIMvVUJOtLU+iD9OJnZOMtA3qFDcWN6 +gnkQui8RpmJKteLf2eemfP6owWhMG5AZZjcinLTjHbiWFnjs8HLsj8931pGxSSUD +aR7D9CcLcEUqi8EaeNukmbA= +-----END PRIVATE KEY----- diff --git a/src/main/resources/dev/saml/public-cert.pem b/src/main/resources/dev/saml/public-cert.pem new file mode 100644 index 00000000..b88d60cb --- /dev/null +++ b/src/main/resources/dev/saml/public-cert.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIUBKj5WxwQRn0Ro0lChsMb+NZOnTMwDQYJKoZIhvcNAQEL +BQAwgYwxCzAJBgNVBAYTAklUMQ8wDQYDVQQIDAZVbWJyaWExEDAOBgNVBAcMB1Bl +cnVnaWExEDAOBgNVBAoMB0dlcGFmaW4xCzAJBgNVBAsMAklUMRAwDgYDVQQDDAdH +ZXBhZmluMSkwJwYJKoZIhvcNAQkBFhpyaW5hbGRvLmJvbmF6em9AYmZsb3dzLm5l +dDAeFw0yNDA5MjMwODUxMTlaFw0yNTA5MjMwODUxMTlaMIGMMQswCQYDVQQGEwJJ +VDEPMA0GA1UECAwGVW1icmlhMRAwDgYDVQQHDAdQZXJ1Z2lhMRAwDgYDVQQKDAdH +ZXBhZmluMQswCQYDVQQLDAJJVDEQMA4GA1UEAwwHR2VwYWZpbjEpMCcGCSqGSIb3 +DQEJARYacmluYWxkby5ib25henpvQGJmbG93cy5uZXQwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCsCrXQyDN5nURj2LB1wJKRIOzO8tgIXxPHVL65dYv7 +cOql01b5LpmUGQaGfUKALlvEdPs0NwCSdiyzMGAMTD81KHLqa+Wdm5ySl82ONRGl +15pmHQFJlUDFpOr5+r1AZvQdh9MfdcbWW57m4qaDEF3kvihIZg9PMbqlQjHOrcG1 +iUPzpHnzcnmevpP32MH2FSYZhy+b0Ie2Fsho3Aj7CvmJYlBWfCaFLQ/wi8FsDEhj +sOlUUkcr7/giO3ygK57oPzcld74g4x79A/UHVbUe2+CUxzFqP9+VtDWGqJ7lp0bH +A/lfGvmDvIJAY6UDyYfum1Vn/ag2NmvW5wLHZ8vdLP75AgMBAAGjUzBRMB0GA1Ud +DgQWBBTSz8YB9ACNsuoGwrhtGt4ct+Bm3DAfBgNVHSMEGDAWgBTSz8YB9ACNsuoG +wrhtGt4ct+Bm3DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAB +3xJ2OQBI4VgICN4ohZ+Bfq4pHkJgZUV202mC8XLiCx1oihpi1ew25zu5BdNUgDn8 +dlMzx8MeMa4aRCKg5Xdio956ea1iPx4n0UafbnU13p2oLGTSDKRuYOidDcFF/fl4 +77nVAa8THc9GKaIQ1jvOnZ5+Sq0dKA2ZjT4sXciuEgrdsPM5CSjHNSSN9dwceGVZ +OWyta0NViqQh1DFfLv1Tqkt3vaEcKRGqWlXryHmRSlmTrAiTFF4LE4eYMiUrlIbq +P4R1R0w7fVXRufJkpiTAzrmQa5xTr5/9w8zTDuFxVHAQ23vMn9uB+P4ZUDu6ZoDP +khKe3VzuKIBSKiSfiuFY +-----END CERTIFICATE----- From 6f2bb714e10476d0cf45169a7fa4380d91974281 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 15:15:46 +0530 Subject: [PATCH 105/145] removed flow smells --- .../java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java | 2 -- .../tendermanagement/web/rest/api/impl/FlowApiController.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java index 61115f63..218ed5ff 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FlowApi.java @@ -9,7 +9,6 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import net.gepafin.tendermanagement.model.request.FlowRequestBean; import net.gepafin.tendermanagement.model.response.FlowResponseBean; -import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; @@ -18,7 +17,6 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; @Validated public interface FlowApi { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java index 6245a420..68cb183b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FlowApiController.java @@ -12,11 +12,9 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/flow}") From 59d895108966cabc34397f0d0ca1c7a84aa30442 Mon Sep 17 00:00:00 2001 From: rbonazzo-KZ <66477605+rbonazzo-KZ@users.noreply.github.com> Date: Mon, 23 Sep 2024 12:48:57 +0200 Subject: [PATCH 106/145] Update Dockerfile --- Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 22070bd1..d1f3b45a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,9 @@ FROM amazoncorretto:17.0.8-alpine3.17 EXPOSE 8080 +# Create the folder in the docker image +RUN mkdir -pv /foldername/keys + +ADD /src/main/resources/dev/saml/public-cert.pem foldername/keys/public-cert.pem +ADD /src/main/resources/dev/saml/private-key.pem /foldername/keys/private-key.pem ADD /target/tendermanagement-0.0.1-SNAPSHOT.jar tendermanagement-0.0.1-SNAPSHOT.jar -ENTRYPOINT ["java", "-jar","tendermanagement-0.0.1-SNAPSHOT.jar"] \ No newline at end of file +ENTRYPOINT ["java", "-jar","tendermanagement-0.0.1-SNAPSHOT.jar"] From f92c4fb7b94be60c7288e0bcb5e67f690660dc6a Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 17:47:51 +0530 Subject: [PATCH 107/145] updated code for keys --- Dockerfile | 5 ----- .../config/SecurityConfig.java | 22 +++++++++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index d1f3b45a..ceacf16e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,4 @@ FROM amazoncorretto:17.0.8-alpine3.17 EXPOSE 8080 -# Create the folder in the docker image -RUN mkdir -pv /foldername/keys - -ADD /src/main/resources/dev/saml/public-cert.pem foldername/keys/public-cert.pem -ADD /src/main/resources/dev/saml/private-key.pem /foldername/keys/private-key.pem ADD /target/tendermanagement-0.0.1-SNAPSHOT.jar tendermanagement-0.0.1-SNAPSHOT.jar ENTRYPOINT ["java", "-jar","tendermanagement-0.0.1-SNAPSHOT.jar"] diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 22ac7dff..ae30d29e 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -1,8 +1,8 @@ package net.gepafin.tendermanagement.config; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.cert.CertificateFactory; @@ -235,8 +235,7 @@ public class SecurityConfig { public PrivateKey readPrivateKey() throws Exception { // Path to your private key PEM file - File privateKeyFile = new File("src/main/resources/dev/saml/private-key.pem"); - try (PemReader pemReader = new PemReader(new FileReader(privateKeyFile))) { + try (PemReader pemReader = new PemReader(new InputStreamReader(readKey("dev/saml/private-key.pem")))) { // Read the PEM content byte[] pemContent = pemReader.readPemObject().getContent(); // Decode the PEM content @@ -248,10 +247,19 @@ public class SecurityConfig { } public X509Certificate readCertificate() throws Exception { // Path to your certificate PEM fileFile - File certFile = new File("src/main/resources/dev/saml/public-cert.pem"); - try (InputStream inStream = new FileInputStream(certFile)) { + try (InputStream inStream = readKey("dev/saml/public-cert.pem")) { CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); return (X509Certificate) certFactory.generateCertificate(inStream); } } + + public InputStream readKey(String path) throws IOException { + ClassLoader classLoader = getClass().getClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream(path); + + if (inputStream == null) { + throw new FileNotFoundException("file not found : "+path); + } + return inputStream; + } } \ No newline at end of file From afbdd70f6bbc25e1fe9f6763381e0ee335311959 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 18:33:45 +0530 Subject: [PATCH 108/145] Updated code --- .../java/net/gepafin/tendermanagement/dao/FlowFormDao.java | 6 +++--- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 4 +++- .../repositories/ApplicationFormRepository.java | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index f46e61f5..a6f6a867 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -243,11 +243,11 @@ public class FlowFormDao { .map(FlowEdgesEntity::getSourceId) .toList(); - List previousForms = formRepository.findByIdIn(previousFormIds); + List applicationFormEntities=applicationFormRepository.findByFormIdInAndApplicationId(previousFormIds,applicationEntity.getId()); - previousForms.sort(Comparator.comparing(FormEntity::getCreatedDate).reversed()); + applicationFormEntities.sort(Comparator.comparing(ApplicationFormEntity::getCreatedDate).reversed()); - return previousForms.isEmpty() ? null : previousForms.get(0).getId(); + return applicationFormEntities.isEmpty() ? null : applicationFormEntities.get(0).getForm().getId(); } public NextOrPreviousFormResponse getnextOrPreviousForm(ApplicationEntity applicationEntity, Long formId, FormActionEnum action) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 11a27915..57568468 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -221,7 +221,9 @@ public class FormDao { .validateCustom(value, fieldValidatorBean.getCustom(), fieldId); // Add the custom validation here if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) { String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldId); - validator.addError(error); + if(error != null) { + validator.addError(error); + } } }); validator.validate(); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java index 992eece3..1037402a 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java @@ -17,4 +17,5 @@ public interface ApplicationFormRepository extends JpaRepository findByApplicationIdOrderByCreatedDateAsc(Long applicationId); + public List findByFormIdInAndApplicationId(List formIds,Long applicationId); } From dc0640e21125d694657200da3be797dc124089a5 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 20:21:24 -0700 Subject: [PATCH 109/145] Updated config --- .../net/gepafin/tendermanagement/config/SecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index ae30d29e..d5ad81e6 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -225,7 +225,7 @@ public class SecurityConfig { .assertionConsumerServiceLocation(acsUrl) .assertingPartyDetails(details -> details.entityId("https://federatest.umbriadigitale.it/gw/metadata") .singleSignOnServiceLocation("https://federatest.umbriadigitale.it/gw/SSOProxy/SAML2") - .singleSignOnServiceBinding(Saml2MessageBinding.POST).wantAuthnRequestsSigned(false) + .singleSignOnServiceBinding(Saml2MessageBinding.POST).wantAuthnRequestsSigned(true) ) .build(); return new InMemoryRelyingPartyRegistrationRepository(registration); From 18b1cff9f0317fd4ef9ca5fdd8fdad17694da6c7 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 21:16:58 -0700 Subject: [PATCH 110/145] Updated config --- .../config/SecurityConfig.java | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index d5ad81e6..73213a77 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -8,7 +8,14 @@ import java.security.PrivateKey; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; + import org.bouncycastle.util.io.pem.PemReader; +import org.opensaml.saml.common.xml.SAMLConstants; +import org.opensaml.saml.saml2.core.AuthnContextClassRef; +import org.opensaml.saml.saml2.core.AuthnContextComparisonTypeEnumeration; +import org.opensaml.saml.saml2.core.RequestedAuthnContext; +import org.opensaml.saml.saml2.core.impl.AuthnContextClassRefBuilder; +import org.opensaml.saml.saml2.core.impl.RequestedAuthnContextBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,6 +38,10 @@ import org.springframework.security.saml2.provider.service.registration.InMemory import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration; import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository; import org.springframework.security.saml2.provider.service.registration.Saml2MessageBinding; +import org.springframework.security.saml2.provider.service.web.DefaultRelyingPartyRegistrationResolver; +import org.springframework.security.saml2.provider.service.web.RelyingPartyRegistrationResolver; +import org.springframework.security.saml2.provider.service.web.authentication.OpenSaml4AuthenticationRequestResolver; +import org.springframework.security.saml2.provider.service.web.authentication.Saml2AuthenticationRequestResolver; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; @@ -51,6 +62,9 @@ import net.gepafin.tendermanagement.config.jwt.JWTFilter; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; import net.gepafin.tendermanagement.repositories.SamlResponseLogRepository; +//import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationRequestContext; +//import org.springframework.security.saml2.core.Saml2AuthenticationRequest; + @Configuration @EnableWebSecurity @EnableMethodSecurity(prePostEnabled = true) @@ -68,6 +82,17 @@ public class SecurityConfig { public SecurityConfig(TokenProvider tokenProvider) { this.tokenProvider = tokenProvider; } +// +// @Bean +// public Saml2AuthenticationRequestResolver authenticationRequestResolver() { +// return (Saml2AuthenticationRequestContext context) -> { +// Saml2AuthenticationRequest request = Saml2AuthenticationRequest.withAuthenticationRequestContext(context) +// .authenticationContextClassRef("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword") // Add context here +// .build(); +// return request; +// }; +// } + @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); @@ -225,12 +250,41 @@ public class SecurityConfig { .assertionConsumerServiceLocation(acsUrl) .assertingPartyDetails(details -> details.entityId("https://federatest.umbriadigitale.it/gw/metadata") .singleSignOnServiceLocation("https://federatest.umbriadigitale.it/gw/SSOProxy/SAML2") - .singleSignOnServiceBinding(Saml2MessageBinding.POST).wantAuthnRequestsSigned(true) + .singleSignOnServiceBinding(Saml2MessageBinding.POST).wantAuthnRequestsSigned(true).build() ) .build(); return new InMemoryRelyingPartyRegistrationRepository(registration); } + @Bean + public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { + RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); + OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); + + // Customize the AuthnRequest with the authentication context + authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { + context.getAuthnRequest().setRequestedAuthnContext(buildRequestedAuthnContext()); + }); + + return authenticationRequestResolver; + } + + private RequestedAuthnContext buildRequestedAuthnContext() { + AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); + AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( + SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX + ); + + // Set the SPID Level 2 authentication context + authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"); + + RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); + RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); + requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); + requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef); + + return requestedAuthnContext; + } public PrivateKey readPrivateKey() throws Exception { From c018757df831d7de6c910827fe20928bc5579321 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 21:28:41 -0700 Subject: [PATCH 111/145] Updated config --- .../gepafin/tendermanagement/config/SecurityConfig.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 73213a77..409a4bb8 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -261,14 +261,19 @@ public class SecurityConfig { RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); - // Customize the AuthnRequest with the authentication context + // Customize and log the AuthnRequest after setting the context authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { context.getAuthnRequest().setRequestedAuthnContext(buildRequestedAuthnContext()); + + // Log the SAML AuthnRequest after setting the authentication context + String samlRequest = context.getAuthnRequest().toString(); // Get the updated AuthnRequest + logger.info("SAML AuthnRequest after setting context: " + samlRequest); // Log the updated SAML request }); return authenticationRequestResolver; } + private RequestedAuthnContext buildRequestedAuthnContext() { AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( From d9c428262add4a251ede02333f444a6c8f1696b6 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 21:37:03 -0700 Subject: [PATCH 112/145] Updated config --- .../config/SamlRequestLogger.java | 22 +++++++++++++++++++ .../config/SecurityConfig.java | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/config/SamlRequestLogger.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlRequestLogger.java b/src/main/java/net/gepafin/tendermanagement/config/SamlRequestLogger.java new file mode 100644 index 00000000..fd4d6561 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlRequestLogger.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.config; + +import org.opensaml.core.xml.io.MarshallingException; +import org.opensaml.core.xml.util.XMLObjectSupport; +import org.opensaml.saml.saml2.core.AuthnRequest; +import org.w3c.dom.Element; + +import net.shibboleth.utilities.java.support.xml.SerializeSupport; + +public class SamlRequestLogger { + + public static String convertSAMLObjectToString(AuthnRequest authnRequest) { + try { + Element element = XMLObjectSupport.marshall(authnRequest); + return SerializeSupport.prettyPrintXML(element); // Pretty print XML using SerializeSupport + } catch (MarshallingException e) { + e.printStackTrace(); + return "Error converting SAML object to XML"; + } + } +} + diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 409a4bb8..d9285b8d 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -266,8 +266,8 @@ public class SecurityConfig { context.getAuthnRequest().setRequestedAuthnContext(buildRequestedAuthnContext()); // Log the SAML AuthnRequest after setting the authentication context - String samlRequest = context.getAuthnRequest().toString(); // Get the updated AuthnRequest - logger.info("SAML AuthnRequest after setting context: " + samlRequest); // Log the updated SAML request + String samlRequest = SamlRequestLogger.convertSAMLObjectToString(context.getAuthnRequest()); + logger.info("SAML AuthnRequest after setting context: " + samlRequest); }); return authenticationRequestResolver; From ab52e844d16bd872ea0c6d2c1d6e6701a36597dd Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 23 Sep 2024 21:49:11 -0700 Subject: [PATCH 113/145] Updated config --- .../config/SecurityConfig.java | 65 ++++++++++--------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index d9285b8d..ac2ade2c 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -8,11 +8,14 @@ import java.security.PrivateKey; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; +import java.util.UUID; import org.bouncycastle.util.io.pem.PemReader; +import org.opensaml.saml.common.SAMLVersion; import org.opensaml.saml.common.xml.SAMLConstants; import org.opensaml.saml.saml2.core.AuthnContextClassRef; import org.opensaml.saml.saml2.core.AuthnContextComparisonTypeEnumeration; +import org.opensaml.saml.saml2.core.AuthnRequest; import org.opensaml.saml.saml2.core.RequestedAuthnContext; import org.opensaml.saml.saml2.core.impl.AuthnContextClassRefBuilder; import org.opensaml.saml.saml2.core.impl.RequestedAuthnContextBuilder; @@ -256,41 +259,45 @@ public class SecurityConfig { return new InMemoryRelyingPartyRegistrationRepository(registration); } - @Bean - public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { - RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); - OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); - // Customize and log the AuthnRequest after setting the context - authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { - context.getAuthnRequest().setRequestedAuthnContext(buildRequestedAuthnContext()); - - // Log the SAML AuthnRequest after setting the authentication context - String samlRequest = SamlRequestLogger.convertSAMLObjectToString(context.getAuthnRequest()); - logger.info("SAML AuthnRequest after setting context: " + samlRequest); - }); +@Bean +public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { + RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); + OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); - return authenticationRequestResolver; - } + authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { + // Set the required attributes + AuthnRequest authnRequest = context.getAuthnRequest(); + authnRequest.setID("_" + UUID.randomUUID().toString()); // Add a unique ID + authnRequest.setVersion(SAMLVersion.VERSION_20); // Ensure version is 2.0 + authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); // HTTP-POST + // Set Authentication Context + authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); - private RequestedAuthnContext buildRequestedAuthnContext() { - AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); - AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( - SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX - ); - - // Set the SPID Level 2 authentication context - authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"); + // Log the SAML AuthnRequest after setting context + String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); + logger.info("SAML AuthnRequest after setting context: " + samlRequest); + }); - RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); - RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); - requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); - requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef); + return authenticationRequestResolver; +} - return requestedAuthnContext; - } - +private RequestedAuthnContext buildRequestedAuthnContext() { + AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); + AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( + SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX + ); + // Set the SPID Level 2 authentication context + authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"); + + RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); + RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); + requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); + requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef); + + return requestedAuthnContext; +} public PrivateKey readPrivateKey() throws Exception { // Path to your private key PEM file From 4cd6b9a606d473f7d26491524a2a1d9b00fca078 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 11:52:07 -0700 Subject: [PATCH 114/145] Updated conifg --- .../config/SecurityConfig.java | 50 ++++++++++++++++--- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index ac2ade2c..365f2fb7 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -8,9 +8,11 @@ import java.security.PrivateKey; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; +import java.time.Instant; import java.util.UUID; import org.bouncycastle.util.io.pem.PemReader; +import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; import org.opensaml.saml.common.SAMLVersion; import org.opensaml.saml.common.xml.SAMLConstants; import org.opensaml.saml.saml2.core.AuthnContextClassRef; @@ -19,6 +21,11 @@ import org.opensaml.saml.saml2.core.AuthnRequest; import org.opensaml.saml.saml2.core.RequestedAuthnContext; import org.opensaml.saml.saml2.core.impl.AuthnContextClassRefBuilder; import org.opensaml.saml.saml2.core.impl.RequestedAuthnContextBuilder; +import org.opensaml.security.x509.BasicX509Credential; +import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap; +import org.opensaml.xmlsec.signature.Signature; +import org.opensaml.xmlsec.signature.support.SignatureConstants; +import org.opensaml.xmlsec.signature.support.Signer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -36,7 +43,6 @@ import org.springframework.security.config.annotation.web.configurers.AbstractHt import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.saml2.core.Saml2X509Credential; import org.springframework.security.saml2.provider.service.registration.InMemoryRelyingPartyRegistrationRepository; import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration; import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository; @@ -244,11 +250,12 @@ public class SecurityConfig { RelyingPartyRegistration registration = RelyingPartyRegistration.withRegistrationId("loginumbria") .entityId(entityId) .signingX509Credentials(credentials -> { - try { - credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); - } catch (Exception e) { - e.printStackTrace(); - } + try { + AuthnRequest signedAuthnRequest = createSignedAuthnRequest(readPrivateKey(), readCertificate()); + logger.info("Signed SAML AuthnRequest: " + SamlRequestLogger.convertSAMLObjectToString(signedAuthnRequest)); + } catch (Exception e) { + e.printStackTrace(); + } }) .assertionConsumerServiceLocation(acsUrl) .assertingPartyDetails(details -> details.entityId("https://federatest.umbriadigitale.it/gw/metadata") @@ -259,6 +266,37 @@ public class SecurityConfig { return new InMemoryRelyingPartyRegistrationRepository(registration); } + public AuthnRequest createSignedAuthnRequest(PrivateKey privateKey, X509Certificate certificate) throws Exception { + AuthnRequest authnRequest = (AuthnRequest) XMLObjectProviderRegistrySupport.getBuilderFactory() + .getBuilder(AuthnRequest.DEFAULT_ELEMENT_NAME) + .buildObject(AuthnRequest.DEFAULT_ELEMENT_NAME); + + authnRequest.setID("_" + UUID.randomUUID().toString()); + authnRequest.setVersion(SAMLVersion.VERSION_20); + // authnRequest.setIssueInstant(new DateTime()); + authnRequest.setIssueInstant(Instant.now()); + + + // Sign the AuthnRequest + // BasicCredential signingCredential = new BasicCredential(certificate, privateKey); + BasicX509Credential signingCredential = new BasicX509Credential(certificate, privateKey); + + Signature signature = (Signature) XMLObjectProviderRegistrySupport.getBuilderFactory() + .getBuilder(Signature.DEFAULT_ELEMENT_NAME) + .buildObject(Signature.DEFAULT_ELEMENT_NAME); + + signature.setSigningCredential(signingCredential); + signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1); // Set RSA-SHA1 + + authnRequest.setSignature(signature); + DefaultSecurityConfigurationBootstrap.buildDefaultSignatureSigningConfiguration(); + + // Marshall and sign the object + XMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(authnRequest).marshall(authnRequest); + Signer.signObject(signature); + + return authnRequest; + } @Bean public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { From b765d53d6652b66226a1985066228249cdc37c05 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 11:58:53 +0530 Subject: [PATCH 115/145] Revert "Updated conifg" This reverts commit 4cd6b9a606d473f7d26491524a2a1d9b00fca078. --- .../config/SecurityConfig.java | 50 +++---------------- 1 file changed, 6 insertions(+), 44 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 365f2fb7..ac2ade2c 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -8,11 +8,9 @@ import java.security.PrivateKey; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; -import java.time.Instant; import java.util.UUID; import org.bouncycastle.util.io.pem.PemReader; -import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; import org.opensaml.saml.common.SAMLVersion; import org.opensaml.saml.common.xml.SAMLConstants; import org.opensaml.saml.saml2.core.AuthnContextClassRef; @@ -21,11 +19,6 @@ import org.opensaml.saml.saml2.core.AuthnRequest; import org.opensaml.saml.saml2.core.RequestedAuthnContext; import org.opensaml.saml.saml2.core.impl.AuthnContextClassRefBuilder; import org.opensaml.saml.saml2.core.impl.RequestedAuthnContextBuilder; -import org.opensaml.security.x509.BasicX509Credential; -import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap; -import org.opensaml.xmlsec.signature.Signature; -import org.opensaml.xmlsec.signature.support.SignatureConstants; -import org.opensaml.xmlsec.signature.support.Signer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -43,6 +36,7 @@ import org.springframework.security.config.annotation.web.configurers.AbstractHt import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.saml2.core.Saml2X509Credential; import org.springframework.security.saml2.provider.service.registration.InMemoryRelyingPartyRegistrationRepository; import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration; import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository; @@ -250,12 +244,11 @@ public class SecurityConfig { RelyingPartyRegistration registration = RelyingPartyRegistration.withRegistrationId("loginumbria") .entityId(entityId) .signingX509Credentials(credentials -> { - try { - AuthnRequest signedAuthnRequest = createSignedAuthnRequest(readPrivateKey(), readCertificate()); - logger.info("Signed SAML AuthnRequest: " + SamlRequestLogger.convertSAMLObjectToString(signedAuthnRequest)); - } catch (Exception e) { - e.printStackTrace(); - } + try { + credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); + } catch (Exception e) { + e.printStackTrace(); + } }) .assertionConsumerServiceLocation(acsUrl) .assertingPartyDetails(details -> details.entityId("https://federatest.umbriadigitale.it/gw/metadata") @@ -266,37 +259,6 @@ public class SecurityConfig { return new InMemoryRelyingPartyRegistrationRepository(registration); } - public AuthnRequest createSignedAuthnRequest(PrivateKey privateKey, X509Certificate certificate) throws Exception { - AuthnRequest authnRequest = (AuthnRequest) XMLObjectProviderRegistrySupport.getBuilderFactory() - .getBuilder(AuthnRequest.DEFAULT_ELEMENT_NAME) - .buildObject(AuthnRequest.DEFAULT_ELEMENT_NAME); - - authnRequest.setID("_" + UUID.randomUUID().toString()); - authnRequest.setVersion(SAMLVersion.VERSION_20); - // authnRequest.setIssueInstant(new DateTime()); - authnRequest.setIssueInstant(Instant.now()); - - - // Sign the AuthnRequest - // BasicCredential signingCredential = new BasicCredential(certificate, privateKey); - BasicX509Credential signingCredential = new BasicX509Credential(certificate, privateKey); - - Signature signature = (Signature) XMLObjectProviderRegistrySupport.getBuilderFactory() - .getBuilder(Signature.DEFAULT_ELEMENT_NAME) - .buildObject(Signature.DEFAULT_ELEMENT_NAME); - - signature.setSigningCredential(signingCredential); - signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1); // Set RSA-SHA1 - - authnRequest.setSignature(signature); - DefaultSecurityConfigurationBootstrap.buildDefaultSignatureSigningConfiguration(); - - // Marshall and sign the object - XMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(authnRequest).marshall(authnRequest); - Signer.signObject(signature); - - return authnRequest; - } @Bean public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { From 98fc120cffc955f7788ced1a51abda6a9f2ee32f Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 24 Sep 2024 13:09:29 +0530 Subject: [PATCH 116/145] Updated response of application form data --- .../tendermanagement/dao/ApplicationDao.java | 97 +++++++++++++++++-- .../ApplicationFormFieldResponseBean.java | 2 +- .../service/DocumentService.java | 5 +- .../service/impl/DocumentServiceImpl.java | 7 ++ 4 files changed, 99 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f8e86e7e..d153ed5c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -4,6 +4,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; @@ -13,6 +14,7 @@ import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository; import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.service.DocumentService; import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; @@ -48,6 +50,12 @@ public class ApplicationDao { @Autowired private FormService formService; + @Autowired + private DocumentService documentService; + + @Autowired + private CallDao callDao; + public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId,Long applicationId) { FormEntity formEntity = formService.validateForm(formId); CallEntity call = callService.validatePublishedCall(formEntity.getCall().getId()); @@ -57,7 +65,7 @@ public class ApplicationDao { } formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity); - createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity); + createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity,formEntity); return getApplicationById(applicationEntity.getId(),formEntity.getId()); } @@ -97,15 +105,56 @@ public class ApplicationDao { List applicationFormFieldResponseBeans=new ArrayList<>(); ApplicationFormFieldResponseBean applicationFormFieldResponseBeans1=null; List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); - for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntities) { - applicationFormFieldResponseBeans1 = convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(applicationFormFieldEntity, applicationFormEntity.getId()); - applicationFormFieldResponseBeans.add(applicationFormFieldResponseBeans1); - } + applicationFormFieldResponseBeans=createApplicationFormFieldResponse(applicationFormFieldEntities, applicationFormEntity, applicationFormFieldResponseBeans); ApplicationResponseBean applicationResponseBean= convertApplicationEntityToApplicationResponseBean(applicationEntity); applicationResponseBean.setFormFields(applicationFormFieldResponseBeans); return applicationResponseBean; } + private List createApplicationFormFieldResponse( + List applicationFormFieldEntities, + ApplicationFormEntity applicationFormEntity, + List applicationFormFieldResponseBeans) { + + List contentResponseBeans = Utils.convertJsonStringToList( + applicationFormEntity.getForm().getContent(), ContentResponseBean.class); + + for (ApplicationFormFieldEntity applicationFormFieldEntity : applicationFormFieldEntities) { + + Optional fileUploadContent = contentResponseBeans.stream() + .filter(contentResponseBean -> "fileupload".equals(contentResponseBean.getName()) && + contentResponseBean.getId().equals(applicationFormFieldEntity.getFieldId())) + .findFirst(); + + List documentResponseBeans = new ArrayList<>(); + if (fileUploadContent.isPresent()) { + String documentId = applicationFormFieldEntity.getFieldValue(); + if (documentId != null && !documentId.isEmpty()) { + documentResponseBeans = Arrays.stream(documentId.split(",")) + .map(String::trim) + .map(Long::parseLong) + .map(docId -> { + DocumentEntity documentEntity = documentService.validateDocument(docId); + if (Boolean.FALSE.equals(DocumentSourceTypeEnum.APPLICATION.getValue().equals(documentEntity.getSource()))) { + throw new CustomValidationException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); + } + return documentEntity; + }) + .map(callDao::convertToDocumentResponseBean) + .collect(Collectors.toList()); + } + } + ApplicationFormFieldResponseBean responseBean = convertApplicationFormFieldEntityToApplicationFormFieldResponseBean( + applicationFormFieldEntity, applicationFormEntity.getId()); + if (!documentResponseBeans.isEmpty()) { + responseBean.setFieldValue(documentResponseBeans); + } + applicationFormFieldResponseBeans.add(responseBean); + } + + return applicationFormFieldResponseBeans; + } + public void deleteById(Long id) { log.info("Deleting application with ID: {}", id); @@ -188,18 +237,21 @@ public class ApplicationDao { return applicationFormEntity; } - public List createOrUpdateMultipleFormFields(List formFieldResponseBeans, ApplicationFormEntity applicationFormEntity) { + public List createOrUpdateMultipleFormFields(List formFieldResponseBeans, ApplicationFormEntity applicationFormEntity,FormEntity formEntity) { List existingFields = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); List applicationFormFieldEntity = formFieldResponseBeans.stream() - .map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity,existingFields)) + .map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity,existingFields,formEntity)) .collect(Collectors.toList()); return applicationFormFieldEntity; } - public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity,List applicationFormFieldEntities ) { + public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity,List applicationFormFieldEntities ,FormEntity formEntity) { ApplicationFormFieldEntity applicationFormFieldEntity=null; + + validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity); + if(applicationFormFieldEntities==null || applicationFormFieldEntities.isEmpty()){ applicationFormFieldEntity = new ApplicationFormFieldEntity(); applicationFormFieldEntity.setApplicationForm(applicationFormEntity); @@ -219,6 +271,31 @@ public class ApplicationDao { return applicationFormFieldRepository.save(applicationFormFieldEntity); } + private List validateFileUploadDocuments(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity) { + List documentIds=null; + List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); + for (ContentResponseBean contentResponseBean:contentResponseBeans){ + if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload"))){ + if(contentResponseBean.getId().equals(applicationFormFieldRequestBean.getFieldId())) { + String documentId = applicationFormFieldRequestBean.getFieldValue(); + documentIds = validateDocumentIds(documentId); + } + } + } + return documentIds; + } + + private List validateDocumentIds(String documentId) { + if (documentId != null && !documentId.isEmpty()) { + return Arrays.stream(documentId.split(",")) + .map(Long::parseLong) + .peek(docId -> documentService.validateDocument(docId)) + .collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + public ApplicationFormFieldEntity validateApplicationFormField(Long applicationFormFieldId) { Optional applicationFormFieldEntity = applicationFormFieldRepository.findById(applicationFormFieldId); if (applicationFormFieldEntity.isEmpty()) { @@ -290,12 +367,12 @@ public class ApplicationDao { public FormApplicationResponse processForm(FormEntity formEntity, ApplicationEntity applicationEntity) { FormApplicationResponse formApplicationResponse = createFormApplicationResponse(formEntity); + List applicationFormFieldResponseBeans =new ArrayList<>(); ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId()); if(applicationFormEntity!=null) { List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); // formApplicationResponse = createFormApplicationResponse(formEntity); - List applicationFormFieldResponseBeans = convertApplicationFormFieldEntitiesToApplicationFormFieldResponseBeans(applicationFormFieldEntities, applicationFormEntity.getId()); - + applicationFormFieldResponseBeans = createApplicationFormFieldResponse(applicationFormFieldEntities, applicationFormEntity,applicationFormFieldResponseBeans); formApplicationResponse.setFormFields(applicationFormFieldResponseBeans); } return formApplicationResponse; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java index f625d991..2e207f21 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java @@ -12,5 +12,5 @@ public class ApplicationFormFieldResponseBean extends BaseBean { private String fieldId; - private String fieldValue; + private Object fieldValue; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java index 4c57d3ca..6012a273 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; @@ -17,4 +18,6 @@ public interface DocumentService { public DocumentResponseBean updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum); public DocumentResponseBean getDocument(HttpServletRequest httpServletRequest,Long documentId); -} + + public DocumentEntity validateDocument(Long id); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java index 5cbc8634..3b3fa310 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -4,6 +4,7 @@ import java.util.List; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.DocumentDao; +import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; @@ -40,4 +41,10 @@ public class DocumentServiceImpl implements DocumentService { public DocumentResponseBean getDocument(HttpServletRequest httpServletRequest, Long documentId) { return documentDao.getDocument(documentId); } + + @Override + public DocumentEntity validateDocument(Long id){ + return documentDao.validateDocument(id); + } + } From 5212442417052afd3f7d0f5c63902ce6f7d34563 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 12:39:45 -0700 Subject: [PATCH 117/145] Updated config --- pom.xml | 7 +++ .../config/SecurityConfig.java | 61 ++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e8fb4bca..e10bc152 100644 --- a/pom.xml +++ b/pom.xml @@ -172,6 +172,13 @@ spring-cloud-starter-openfeign 4.1.3 + + + org.apache.santuario + xmlsec + 2.3.0 + + diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index ac2ade2c..c645cee1 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -1,4 +1,6 @@ package net.gepafin.tendermanagement.config; + + import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -8,9 +10,12 @@ import java.security.PrivateKey; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; +import java.time.Instant; import java.util.UUID; import org.bouncycastle.util.io.pem.PemReader; +import org.opensaml.core.config.InitializationService; +import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; import org.opensaml.saml.common.SAMLVersion; import org.opensaml.saml.common.xml.SAMLConstants; import org.opensaml.saml.saml2.core.AuthnContextClassRef; @@ -19,6 +24,11 @@ import org.opensaml.saml.saml2.core.AuthnRequest; import org.opensaml.saml.saml2.core.RequestedAuthnContext; import org.opensaml.saml.saml2.core.impl.AuthnContextClassRefBuilder; import org.opensaml.saml.saml2.core.impl.RequestedAuthnContextBuilder; +import org.opensaml.security.x509.BasicX509Credential; +import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap; +import org.opensaml.xmlsec.signature.Signature; +import org.opensaml.xmlsec.signature.support.SignatureConstants; +import org.opensaml.xmlsec.signature.support.Signer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -55,19 +65,19 @@ import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; import com.fasterxml.jackson.databind.ObjectMapper; - +import org.apache.xml.security.Init; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; +import jakarta.annotation.PostConstruct; import net.gepafin.tendermanagement.config.jwt.JWTFilter; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; import net.gepafin.tendermanagement.repositories.SamlResponseLogRepository; //import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationRequestContext; //import org.springframework.security.saml2.core.Saml2AuthenticationRequest; - @Configuration @EnableWebSecurity @EnableMethodSecurity(prePostEnabled = true) @@ -85,6 +95,21 @@ public class SecurityConfig { public SecurityConfig(TokenProvider tokenProvider) { this.tokenProvider = tokenProvider; } + + + + @PostConstruct + public void initXmlSecurity() throws Exception { + // Initialize Apache XML Security (Santuario) + Init.init(); + } + + + @PostConstruct + public void initOpenSAML() throws Exception { + InitializationService.initialize(); + } + // // @Bean // public Saml2AuthenticationRequestResolver authenticationRequestResolver() { @@ -259,6 +284,38 @@ public class SecurityConfig { return new InMemoryRelyingPartyRegistrationRepository(registration); } + public AuthnRequest createSignedAuthnRequest(PrivateKey privateKey, X509Certificate certificate) throws Exception { + AuthnRequest authnRequest = (AuthnRequest) XMLObjectProviderRegistrySupport.getBuilderFactory() + .getBuilder(AuthnRequest.DEFAULT_ELEMENT_NAME) + .buildObject(AuthnRequest.DEFAULT_ELEMENT_NAME); + + authnRequest.setID("_" + UUID.randomUUID().toString()); + authnRequest.setVersion(SAMLVersion.VERSION_20); + // authnRequest.setIssueInstant(new DateTime()); + authnRequest.setIssueInstant(Instant.now()); + + + // Sign the AuthnRequest + // BasicCredential signingCredential = new BasicCredential(certificate, privateKey); + BasicX509Credential signingCredential = new BasicX509Credential(certificate, privateKey); + + Signature signature = (Signature) XMLObjectProviderRegistrySupport.getBuilderFactory() + .getBuilder(Signature.DEFAULT_ELEMENT_NAME) + .buildObject(Signature.DEFAULT_ELEMENT_NAME); + + signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS); + signature.setSigningCredential(signingCredential); + signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1); // Set RSA-SHA1 + + authnRequest.setSignature(signature); + DefaultSecurityConfigurationBootstrap.buildDefaultSignatureSigningConfiguration(); + + // Marshall and sign the object + XMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(authnRequest).marshall(authnRequest); + Signer.signObject(signature); + + return authnRequest; + } @Bean public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { From 79bef1b8252e5ffb31652fceeacfdc556e7d0953 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 13:57:33 -0700 Subject: [PATCH 118/145] Updated versions --- pom.xml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index e10bc152..a2a1e712 100644 --- a/pom.xml +++ b/pom.xml @@ -146,7 +146,7 @@ org.opensaml opensaml-core - 4.0.1 + 4.2.0 @@ -154,7 +154,7 @@ org.opensaml opensaml-saml-api - 4.0.1 + 4.2.0 @@ -162,7 +162,7 @@ org.opensaml opensaml-saml-impl - 4.0.1 + 4.2.0 @@ -181,6 +181,12 @@ + + + shibboleth + https://build.shibboleth.net/nexus/content/repositories/releases/ + + From 14b08497322a6699f2d3664b63952a4f737e34a9 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 24 Sep 2024 15:25:43 +0530 Subject: [PATCH 119/145] Added call status in flow api response --- src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java | 2 ++ .../tendermanagement/model/response/FlowResponseBean.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java index 34bf0e59..6b4d34d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.FlowDataEntity; import net.gepafin.tendermanagement.entities.FlowDataEntity; import net.gepafin.tendermanagement.entities.FlowEdgesEntity; +import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.model.request.FlowDataRequestBean; import net.gepafin.tendermanagement.model.request.FlowEdgesRequestBean; import net.gepafin.tendermanagement.model.request.FlowRequestBean; @@ -193,6 +194,7 @@ public class FlowDao { return null; } flowResponseBean.setCallId(call.getId()); + flowResponseBean.setCallStatus(CallStatusEnum.valueOf(call.getStatus())); flowResponseBean.setInitialForm(call.getInitialForm()); flowResponseBean.setFinalForm(call.getFinalForm()); return flowResponseBean; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java index 289f44b1..d97895e7 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.model.request.FlowDataRequestBean; import net.gepafin.tendermanagement.model.request.FlowEdgesRequestBean; @@ -11,6 +12,8 @@ public class FlowResponseBean { private Long callId; + private CallStatusEnum callStatus; + private Long initialForm; private Long finalForm; From 385a9b7daa8043c4047c831cc27064f4f6c79aad Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 17:32:01 +0530 Subject: [PATCH 120/145] Updated code --- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 57568468..8121f9e6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -206,14 +206,13 @@ public class FormDao { FieldValidator validator = FieldValidator.create(); formResponseBean.getContent().forEach(contentResponseBean -> { String fieldId = contentResponseBean.getId(); - String value = String.valueOf(formFieldMap.get(fieldId)); + String value = (String) formFieldMap.get(fieldId); if(value == null && isApplicationFormExist) { return; } FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); validator - .notNull(value, fieldId) .isRequired(value,fieldValidatorBean.getIsRequired(),fieldId) .minLength(value, fieldValidatorBean.getMinLength(), fieldId) // Only applies if minLength is not null .maxLength(value, fieldValidatorBean.getMaxLength(), fieldId) // Only applies if maxLength is not null From befd86cacbdd845879fc7009cb827225ea675fba Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 24 Sep 2024 18:08:43 +0530 Subject: [PATCH 121/145] Configure production properties in application_prod.properties --- Jenkinsfile | 2 +- src/main/resources/application-production.properties | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/application-production.properties diff --git a/Jenkinsfile b/Jenkinsfile index 968d3a2b..d488b39e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -56,7 +56,7 @@ pipeline { } } script { - sh 'ssh ubuntu@46.105.65.89 "sh gepafin-production-api.sh"' + sh 'ssh ubuntu@79.137.88.15 "sh gepafin-production-api.sh"' } } } diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties new file mode 100644 index 00000000..2132264d --- /dev/null +++ b/src/main/resources/application-production.properties @@ -0,0 +1,11 @@ +# DataSource Configuration +spring.datasource.url=jdbc:postgresql://79.137.88.14:21543/gepaDb +spring.datasource.username=usergepa +spring.datasource.password=nRHMi7esdgHJiIm3L5ctrSJ0 +spring.datasource.driver-class-name=org.postgresql.Driver + +# JPA Configuration +spring.h2.console.enabled=true +base-url=https://api-dev-gepafin.memento.credit + +isVatCheckGloballyDisabled = false From 389b29995b58830b7317b762e4029d4be34a496d Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 15:32:20 -0700 Subject: [PATCH 122/145] updated config --- .../net/gepafin/tendermanagement/config/SecurityConfig.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index c645cee1..5e2de88b 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -270,7 +270,9 @@ public class SecurityConfig { .entityId(entityId) .signingX509Credentials(credentials -> { try { - credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); + // credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); + AuthnRequest signedAuthnRequest = createSignedAuthnRequest(readPrivateKey(), readCertificate()); + //logger.info("Signed SAML AuthnRequest: " + SamlRequestLogger.convertSAMLObjectToString(signedAuthnRequest)); } catch (Exception e) { e.printStackTrace(); } From 2714f646af19c0e852d4d78606f47ec6028d2cc7 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 15:39:06 -0700 Subject: [PATCH 123/145] updated config --- .../net/gepafin/tendermanagement/config/SecurityConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 5e2de88b..e530b479 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -270,8 +270,8 @@ public class SecurityConfig { .entityId(entityId) .signingX509Credentials(credentials -> { try { - // credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); - AuthnRequest signedAuthnRequest = createSignedAuthnRequest(readPrivateKey(), readCertificate()); + credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); + // AuthnRequest signedAuthnRequest = createSignedAuthnRequest(readPrivateKey(), readCertificate()); //logger.info("Signed SAML AuthnRequest: " + SamlRequestLogger.convertSAMLObjectToString(signedAuthnRequest)); } catch (Exception e) { e.printStackTrace(); From aabb7ae55104271c89cb9eeadd4bbdcc58fe4823 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 16:40:14 -0700 Subject: [PATCH 124/145] Updated config --- .../config/SecurityConfig.java | 42 +++++++++++++------ .../resources/dev/saml/idp-certificate.pem | 3 ++ 2 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/dev/saml/idp-certificate.pem diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index e530b479..3b8f79b4 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -263,26 +263,35 @@ public class SecurityConfig { @Bean public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() { - - String entityId = baseUrl + "/v1/saml/gw/metadata"; - String acsUrl = baseUrl + "/login/saml2/sso/loginumbria"; + + String entityId = baseUrl + "/v1/saml/gw/metadata"; + String acsUrl = baseUrl + "/login/saml2/sso/loginumbria"; + RelyingPartyRegistration registration = RelyingPartyRegistration.withRegistrationId("loginumbria") .entityId(entityId) - .signingX509Credentials(credentials -> { + .signingX509Credentials(credentials -> { + try { + credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); + } catch (Exception e) { + e.printStackTrace(); + } + }) + .assertionConsumerServiceLocation(acsUrl) + .assertingPartyDetails(details -> details.entityId("https://federatest.umbriadigitale.it/gw/metadata") + .singleSignOnServiceLocation("https://federatest.umbriadigitale.it/gw/SSOProxy/SAML2") + .singleSignOnServiceBinding(Saml2MessageBinding.POST) + .wantAuthnRequestsSigned(true) + .verificationX509Credentials(credentials -> { try { - credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); - // AuthnRequest signedAuthnRequest = createSignedAuthnRequest(readPrivateKey(), readCertificate()); - //logger.info("Signed SAML AuthnRequest: " + SamlRequestLogger.convertSAMLObjectToString(signedAuthnRequest)); + // Load the IDP's public certificate for verifying the SAML response signature + credentials.add(Saml2X509Credential.verification(readIdpCertificate())); } catch (Exception e) { e.printStackTrace(); } }) - .assertionConsumerServiceLocation(acsUrl) - .assertingPartyDetails(details -> details.entityId("https://federatest.umbriadigitale.it/gw/metadata") - .singleSignOnServiceLocation("https://federatest.umbriadigitale.it/gw/SSOProxy/SAML2") - .singleSignOnServiceBinding(Saml2MessageBinding.POST).wantAuthnRequestsSigned(true).build() - ) + ) .build(); + return new InMemoryRelyingPartyRegistrationRepository(registration); } @@ -378,6 +387,15 @@ private RequestedAuthnContext buildRequestedAuthnContext() { } } + public X509Certificate readIdpCertificate() throws Exception { + // Path to your IDP public certificate PEM file + try (InputStream inStream = readKey("dev/saml/idp-certificate.pem")) { + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + return (X509Certificate) certFactory.generateCertificate(inStream); + } + } + + public InputStream readKey(String path) throws IOException { ClassLoader classLoader = getClass().getClassLoader(); InputStream inputStream = classLoader.getResourceAsStream(path); diff --git a/src/main/resources/dev/saml/idp-certificate.pem b/src/main/resources/dev/saml/idp-certificate.pem new file mode 100644 index 00000000..598749d1 --- /dev/null +++ b/src/main/resources/dev/saml/idp-certificate.pem @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +MIIDJDCCAgygAwIBAgIVAIq/MUgxPKO0cuX/GtD7YUvk87GtMA0GCSqGSIb3DQEBBQUAMBkxFzAVBgNVBAMTDmlkcC5tYWNoaW5lLml0MB4XDTA5MDMyNTEwNTM1OFoXDTI5MDMyNTA5NTM1OFowGTEXMBUGA1UEAxMOaWRwLm1hY2hpbmUuaXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQClXV18x0/yhZ+D3pHlmhrK4paA+xdJKAT7U7R9DeaTQygwtCjKmCrJbzdohckLz5pax7eaGeA53pPCY+JdiU0Uq4ES8nG2DCZgCtl4QGLUcTuUtJdPq+DbYD1cWBwEeeffsiClVyuhgLRPO1OQLl/TJp4slfoYTi0aONgQp03uG+ixL48myL7GrINHYXtDUDqo2BimyU0yrOe6ZmvxJchZ8nBuWKy0J8wsO/Mnasbvo79/c8gcn0HTst0QDlHXQlzwZ4Suq2os9qKjXAYOzA1VqmTyzJIge/ynHiJ0Fkw0HNxBaVFTJRNL8RvwJsMuBT7YZKRoNK7gjT5/6bGagYM/AgMBAAGjYzBhMEAGA1UdEQQ5MDeCDmlkcC5tYWNoaW5lLml0hiVodHRwczovL2lkcC5tYWNoaW5lLml0L2lkcC9zaGliYm9sZXRoMB0GA1UdDgQWBBSBOsPZiWZRXFqNINIguHfv7jnidDANBgkqhkiG9w0BAQUFAAOCAQEAeVLN9jczRINuPUvpXbgibL2c99dUReMcl47nSVtYeYEBkPPZrSz0h3AyVZyar2Vo+/fC3fRNmaOJvfiVSm+bo1069iROI1+dGGq2gAwWuQI1q0F7PNPX4zooY+LbZI0oUhuoyH81xed0WtMlpJ1aRSBMpR6oV3rguAkH6pdr725yv6m5WxKcOM/LzdD5Xt9fQRL7ino4HfiPPJNDG3UOKhoAWkVn/Y/CuMLcBPWh/3LxIv4A1bQbnkpdty+Qtwfp4QUKkisv7gufQP91aLqUvvRE6Uz8r51VH13e4mEJjJGxLKXWzlP50gp7b27AXCTKSS6fW6iBpfA14PGcWvDiPQ== +-----END CERTIFICATE----- From 27774895505f742c0bc283f193f94723d4d79710 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 17:06:32 -0700 Subject: [PATCH 125/145] Updated config --- .../config/SecurityConfig.java | 107 ++++++++---------- 1 file changed, 48 insertions(+), 59 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 3b8f79b4..c83cc513 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -11,8 +11,11 @@ import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; import java.time.Instant; +import java.util.List; +import java.util.Map; import java.util.UUID; +import org.apache.xml.security.Init; import org.bouncycastle.util.io.pem.PemReader; import org.opensaml.core.config.InitializationService; import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; @@ -47,6 +50,8 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.saml2.core.Saml2X509Credential; +import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal; +import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; import org.springframework.security.saml2.provider.service.registration.InMemoryRelyingPartyRegistrationRepository; import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration; import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository; @@ -65,7 +70,7 @@ import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.xml.security.Init; + import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.security.SecurityRequirement; @@ -184,70 +189,54 @@ public class SecurityConfig { .saml2Login(saml -> saml.defaultSuccessUrl("/") .successHandler((request, response, authentication) -> { - logger.error("SAML success login"); - SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); - samlResponseLogEntity.setRequest(request.toString()); - samlResponseLogEntity.setResponse(response.toString()); - samlResponseLogEntity.setAuthenticationObject(authentication.toString()); - samlResponseLogRepository.save(samlResponseLogEntity); - try { - ObjectMapper objectMapper = new ObjectMapper(); - // Create a new SAML log entity - SamlResponseLogEntity samlResponseLogEntity1 = new SamlResponseLogEntity(); + try { + // Cast the authentication object to Saml2Authentication + Saml2Authentication samlAuth = (Saml2Authentication) authentication; + Saml2AuthenticatedPrincipal principal = (Saml2AuthenticatedPrincipal) samlAuth.getPrincipal(); - // Convert request, response, and authentication to JSON format - String requestJson = objectMapper.writeValueAsString(request.getParameterMap()); // Assuming request params to JSON - String responseJson = objectMapper.writeValueAsString(response); // This may need to be adapted based on your response object - String authenticationJson = objectMapper.writeValueAsString(authentication); // Authentication object to JSON + // Extract the user attributes from the principal + Map> userAttributes = principal.getAttributes(); - // Set the JSON strings in the entity - samlResponseLogEntity1.setRequest(requestJson); - samlResponseLogEntity1.setResponse(responseJson); - samlResponseLogEntity1.setAuthenticationObject(authenticationJson); - samlResponseLogRepository.save(samlResponseLogEntity1); - - logger.info("SAML Request: " + requestJson); - logger.info("SAML Response: " + responseJson); - logger.info("Authentication Details: " + authenticationJson); - }catch(Exception e) { - logger.info("Exception object" + e); - } -// samlResponseLogRepository - logger.info("SAML login successful for user: " + authentication.getName()); - response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/"); - }).failureHandler((request, response, exception) -> { - logger.error("SAML login failed: " + exception.getMessage()); + // Log the user attributes for debugging purposes + logger.info("SAML User Attributes: " + userAttributes); - SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); - samlResponseLogEntity.setRequest(request.toString()); - samlResponseLogEntity.setResponse(response.toString()); - samlResponseLogEntity.setExceptionObject(exception.toString()); - samlResponseLogRepository.save(samlResponseLogEntity); - try { - ObjectMapper objectMapper = new ObjectMapper(); + // Save the authentication details in the database (Optional) + SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); + samlResponseLogEntity.setAuthenticationObject(authentication.toString()); - // Create a new SAML log entity - SamlResponseLogEntity samlResponseLogEntity1 = new SamlResponseLogEntity(); + // Convert user attributes to JSON and save in DB + ObjectMapper objectMapper = new ObjectMapper(); + String userAttributesJson = objectMapper.writeValueAsString(userAttributes); + samlResponseLogEntity.setAuthenticationObject(userAttributesJson); + samlResponseLogRepository.save(samlResponseLogEntity); + + // Successful login logic + logger.info("SAML login successful for user: " + principal.getName()); + response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); + } catch (Exception e) { + logger.error("Error processing SAML success handler", e); + } + }) + .failureHandler((request, response, exception) -> { + try { + logger.error("SAML login failed: " + exception.getMessage()); + + // Log the failure details to the database (Optional) + SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); + samlResponseLogEntity.setRequest(request.toString()); + samlResponseLogEntity.setResponse(response.toString()); + samlResponseLogEntity.setExceptionObject(exception.toString()); + samlResponseLogRepository.save(samlResponseLogEntity); + + // Handle failure redirection + response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); + } catch (Exception e) { + logger.error("Error processing SAML failure handler", e); + } + }) + ); - // Convert request, response, and authentication to JSON format - String requestJson = objectMapper.writeValueAsString(request.getParameterMap()); // Assuming request params to JSON - String responseJson = objectMapper.writeValueAsString(response); // This may need to be adapted based on your response object - String exceptionJson = objectMapper.writeValueAsString(exception); // Authentication object to JSON - // Set the JSON strings in the entity - samlResponseLogEntity1.setRequest(requestJson); - samlResponseLogEntity1.setResponse(responseJson); - samlResponseLogEntity1.setAuthenticationObject(exceptionJson); - samlResponseLogRepository.save(samlResponseLogEntity1); - - logger.info("SAML Request: " + requestJson); - logger.info("SAML Response: " + responseJson); - logger.info("exception Details: " + exceptionJson); - }catch(Exception e) { - logger.info("Exception object" + e); - } - response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); - })); return http.build(); } From 2e2bb65bce792c2f096653ba7b3799fa44da7516 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 24 Sep 2024 19:32:37 +0530 Subject: [PATCH 126/145] Refactored saml code --- .../tendermanagement/config/SamlConfig.java | 197 ++++++++++++ .../config/SamlFailureHandler.java | 45 +++ .../config/SamlSuccessHandler.java | 64 ++++ .../config/SecurityConfig.java | 282 +----------------- 4 files changed, 315 insertions(+), 273 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java create mode 100644 src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java create mode 100644 src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java new file mode 100644 index 00000000..02a0ae27 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java @@ -0,0 +1,197 @@ +package net.gepafin.tendermanagement.config; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.security.spec.PKCS8EncodedKeySpec; +import java.time.Instant; +import java.util.UUID; + +import org.bouncycastle.util.io.pem.PemReader; +import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; +import org.opensaml.saml.common.SAMLVersion; +import org.opensaml.saml.common.xml.SAMLConstants; +import org.opensaml.saml.saml2.core.AuthnContextClassRef; +import org.opensaml.saml.saml2.core.AuthnContextComparisonTypeEnumeration; +import org.opensaml.saml.saml2.core.AuthnRequest; +import org.opensaml.saml.saml2.core.RequestedAuthnContext; +import org.opensaml.saml.saml2.core.impl.AuthnContextClassRefBuilder; +import org.opensaml.saml.saml2.core.impl.RequestedAuthnContextBuilder; +import org.opensaml.security.x509.BasicX509Credential; +import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap; +import org.opensaml.xmlsec.signature.Signature; +import org.opensaml.xmlsec.signature.support.SignatureConstants; +import org.opensaml.xmlsec.signature.support.Signer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.saml2.core.Saml2X509Credential; +import org.springframework.security.saml2.provider.service.registration.InMemoryRelyingPartyRegistrationRepository; +import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration; +import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository; +import org.springframework.security.saml2.provider.service.registration.Saml2MessageBinding; +import org.springframework.security.saml2.provider.service.web.DefaultRelyingPartyRegistrationResolver; +import org.springframework.security.saml2.provider.service.web.RelyingPartyRegistrationResolver; +import org.springframework.security.saml2.provider.service.web.authentication.OpenSaml4AuthenticationRequestResolver; +import org.springframework.security.saml2.provider.service.web.authentication.Saml2AuthenticationRequestResolver; + +@Configuration +public class SamlConfig { + + private final Logger logger = LoggerFactory.getLogger(SamlConfig.class); + + @Value("${base-url}") + String baseUrl; + + @Bean + public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() { + + String entityId = baseUrl + "/v1/saml/gw/metadata"; + String acsUrl = baseUrl + "/login/saml2/sso/loginumbria"; + + RelyingPartyRegistration registration = RelyingPartyRegistration.withRegistrationId("loginumbria") + .entityId(entityId) + .signingX509Credentials(credentials -> { + try { + credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); + } catch (Exception e) { + e.printStackTrace(); + } + }) + .assertionConsumerServiceLocation(acsUrl) + .assertingPartyDetails(details -> details.entityId("https://federatest.umbriadigitale.it/gw/metadata") + .singleSignOnServiceLocation("https://federatest.umbriadigitale.it/gw/SSOProxy/SAML2") + .singleSignOnServiceBinding(Saml2MessageBinding.POST) + .wantAuthnRequestsSigned(true) + .verificationX509Credentials(credentials -> { + try { + // Load the IDP's public certificate for verifying the SAML response signature + credentials.add(Saml2X509Credential.verification(readIdpCertificate())); + } catch (Exception e) { + e.printStackTrace(); + } + }) + ) + .build(); + + return new InMemoryRelyingPartyRegistrationRepository(registration); + } + + public AuthnRequest createSignedAuthnRequest(PrivateKey privateKey, X509Certificate certificate) throws Exception { + AuthnRequest authnRequest = (AuthnRequest) XMLObjectProviderRegistrySupport.getBuilderFactory() + .getBuilder(AuthnRequest.DEFAULT_ELEMENT_NAME) + .buildObject(AuthnRequest.DEFAULT_ELEMENT_NAME); + + authnRequest.setID("_" + UUID.randomUUID().toString()); + authnRequest.setVersion(SAMLVersion.VERSION_20); + // authnRequest.setIssueInstant(new DateTime()); + authnRequest.setIssueInstant(Instant.now()); + + + // Sign the AuthnRequest + // BasicCredential signingCredential = new BasicCredential(certificate, privateKey); + BasicX509Credential signingCredential = new BasicX509Credential(certificate, privateKey); + + Signature signature = (Signature) XMLObjectProviderRegistrySupport.getBuilderFactory() + .getBuilder(Signature.DEFAULT_ELEMENT_NAME) + .buildObject(Signature.DEFAULT_ELEMENT_NAME); + + signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS); + signature.setSigningCredential(signingCredential); + signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1); // Set RSA-SHA1 + + authnRequest.setSignature(signature); + DefaultSecurityConfigurationBootstrap.buildDefaultSignatureSigningConfiguration(); + + // Marshall and sign the object + XMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(authnRequest).marshall(authnRequest); + Signer.signObject(signature); + + return authnRequest; + } + +@Bean +public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { + RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); + OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); + + authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { + // Set the required attributes + AuthnRequest authnRequest = context.getAuthnRequest(); + authnRequest.setID("_" + UUID.randomUUID().toString()); // Add a unique ID + authnRequest.setVersion(SAMLVersion.VERSION_20); // Ensure version is 2.0 + authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); // HTTP-POST + + // Set Authentication Context + authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); + + // Log the SAML AuthnRequest after setting context + String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); + logger.info("SAML AuthnRequest after setting context: " + samlRequest); + }); + + return authenticationRequestResolver; +} + +private RequestedAuthnContext buildRequestedAuthnContext() { + AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); + AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( + SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX + ); + // Set the SPID Level 2 authentication context + authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"); + + RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); + RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); + requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); + requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef); + + return requestedAuthnContext; +} + + public PrivateKey readPrivateKey() throws Exception { + // Path to your private key PEM file + try (PemReader pemReader = new PemReader(new InputStreamReader(readKey("dev/saml/private-key.pem")))) { + // Read the PEM content + byte[] pemContent = pemReader.readPemObject().getContent(); + // Decode the PEM content + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pemContent); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); // Use RSA algorithm + // Generate and return the PrivateKey + return keyFactory.generatePrivate(keySpec); + } + } + public X509Certificate readCertificate() throws Exception { + // Path to your certificate PEM fileFile + try (InputStream inStream = readKey("dev/saml/public-cert.pem")) { + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + return (X509Certificate) certFactory.generateCertificate(inStream); + } + } + + public X509Certificate readIdpCertificate() throws Exception { + // Path to your IDP public certificate PEM file + try (InputStream inStream = readKey("dev/saml/idp-certificate.pem")) { + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + return (X509Certificate) certFactory.generateCertificate(inStream); + } + } + + + public InputStream readKey(String path) throws IOException { + ClassLoader classLoader = getClass().getClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream(path); + + if (inputStream == null) { + throw new FileNotFoundException("file not found : "+path); + } + return inputStream; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java new file mode 100644 index 00000000..da5f3a65 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java @@ -0,0 +1,45 @@ +package net.gepafin.tendermanagement.config; + +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; +import org.springframework.stereotype.Component; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; +import net.gepafin.tendermanagement.repositories.SamlResponseLogRepository; + +@Component +public class SamlFailureHandler implements AuthenticationFailureHandler { + + private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class); + + @Autowired + private SamlResponseLogRepository samlResponseLogRepository; + + @Override + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) throws IOException { + try { + logger.error("SAML login failed: " + exception.getMessage()); + + // Log the failure details to the database (Optional) + SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); + samlResponseLogEntity.setRequest(request.toString()); + samlResponseLogEntity.setResponse(response.toString()); + samlResponseLogEntity.setExceptionObject(exception.toString()); + samlResponseLogRepository.save(samlResponseLogEntity); + + // Handle failure redirection + response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); + } catch (Exception e) { + logger.error("Error processing SAML failure handler", e); + } + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java new file mode 100644 index 00000000..ef7c0bb7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -0,0 +1,64 @@ +package net.gepafin.tendermanagement.config; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal; +import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; +import net.gepafin.tendermanagement.repositories.SamlResponseLogRepository; + +@Component +public class SamlSuccessHandler implements AuthenticationSuccessHandler{ + + + private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class); + + @Autowired + private SamlResponseLogRepository samlResponseLogRepository; + + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, + Authentication authentication) throws IOException { + try { + // Cast the authentication object to Saml2Authentication + Saml2Authentication samlAuth = (Saml2Authentication) authentication; + Saml2AuthenticatedPrincipal principal = (Saml2AuthenticatedPrincipal) samlAuth.getPrincipal(); + + // Extract the user attributes from the principal + Map> userAttributes = principal.getAttributes(); + + // Log the user attributes for debugging purposes + logger.info("SAML User Attributes: " + userAttributes); + + // Save the authentication details in the database (Optional) + SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); + samlResponseLogEntity.setAuthenticationObject(authentication.toString()); + + // Convert user attributes to JSON and save in DB + ObjectMapper objectMapper = new ObjectMapper(); + String userAttributesJson = objectMapper.writeValueAsString(userAttributes); + samlResponseLogEntity.setAuthenticationObject(userAttributesJson); + samlResponseLogRepository.save(samlResponseLogEntity); + + // Successful login logic + logger.info("SAML login successful for user: " + principal.getName()); + response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); + } catch (Exception e) { + logger.error("Error processing SAML success handler", e); + } + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index c83cc513..17cf0253 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -1,39 +1,5 @@ package net.gepafin.tendermanagement.config; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.security.KeyFactory; -import java.security.PrivateKey; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import java.security.spec.PKCS8EncodedKeySpec; -import java.time.Instant; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import org.apache.xml.security.Init; -import org.bouncycastle.util.io.pem.PemReader; -import org.opensaml.core.config.InitializationService; -import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; -import org.opensaml.saml.common.SAMLVersion; -import org.opensaml.saml.common.xml.SAMLConstants; -import org.opensaml.saml.saml2.core.AuthnContextClassRef; -import org.opensaml.saml.saml2.core.AuthnContextComparisonTypeEnumeration; -import org.opensaml.saml.saml2.core.AuthnRequest; -import org.opensaml.saml.saml2.core.RequestedAuthnContext; -import org.opensaml.saml.saml2.core.impl.AuthnContextClassRefBuilder; -import org.opensaml.saml.saml2.core.impl.RequestedAuthnContextBuilder; -import org.opensaml.security.x509.BasicX509Credential; -import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap; -import org.opensaml.xmlsec.signature.Signature; -import org.opensaml.xmlsec.signature.support.SignatureConstants; -import org.opensaml.xmlsec.signature.support.Signer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -49,17 +15,6 @@ import org.springframework.security.config.annotation.web.configurers.AbstractHt import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.saml2.core.Saml2X509Credential; -import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal; -import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; -import org.springframework.security.saml2.provider.service.registration.InMemoryRelyingPartyRegistrationRepository; -import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration; -import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository; -import org.springframework.security.saml2.provider.service.registration.Saml2MessageBinding; -import org.springframework.security.saml2.provider.service.web.DefaultRelyingPartyRegistrationResolver; -import org.springframework.security.saml2.provider.service.web.RelyingPartyRegistrationResolver; -import org.springframework.security.saml2.provider.service.web.authentication.OpenSaml4AuthenticationRequestResolver; -import org.springframework.security.saml2.provider.service.web.authentication.Saml2AuthenticationRequestResolver; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; @@ -69,63 +24,34 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; -import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; -import jakarta.annotation.PostConstruct; import net.gepafin.tendermanagement.config.jwt.JWTFilter; import net.gepafin.tendermanagement.config.jwt.TokenProvider; -import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; -import net.gepafin.tendermanagement.repositories.SamlResponseLogRepository; -//import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationRequestContext; -//import org.springframework.security.saml2.core.Saml2AuthenticationRequest; + @Configuration @EnableWebSecurity @EnableMethodSecurity(prePostEnabled = true) public class SecurityConfig { - private final Logger logger = LoggerFactory.getLogger(SecurityConfig.class); private final TokenProvider tokenProvider; + private final SamlSuccessHandler samlSuccessHandler; + private final SamlFailureHandler samlFailureHandler; @Value("${base-url}") String baseUrl; @Autowired - private SamlResponseLogRepository samlResponseLogRepository; - - @Autowired - public SecurityConfig(TokenProvider tokenProvider) { + public SecurityConfig(TokenProvider tokenProvider, SamlSuccessHandler samlSuccessHandler, SamlFailureHandler samlFailureHandler) { this.tokenProvider = tokenProvider; + this.samlSuccessHandler =samlSuccessHandler; + this.samlFailureHandler=samlFailureHandler; } - - @PostConstruct - public void initXmlSecurity() throws Exception { - // Initialize Apache XML Security (Santuario) - Init.init(); - } - - - @PostConstruct - public void initOpenSAML() throws Exception { - InitializationService.initialize(); - } - -// -// @Bean -// public Saml2AuthenticationRequestResolver authenticationRequestResolver() { -// return (Saml2AuthenticationRequestContext context) -> { -// Saml2AuthenticationRequest request = Saml2AuthenticationRequest.withAuthenticationRequestContext(context) -// .authenticationContextClassRef("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword") // Add context here -// .build(); -// return request; -// }; -// } - @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); @@ -186,55 +112,8 @@ public class SecurityConfig { * .saml2Login(saml -> saml.loginPage("/saml/login") // Entry point for SAML * login .defaultSuccessUrl("/") // Redirect after successful SAML login ); */ - .saml2Login(saml -> - saml.defaultSuccessUrl("/") - .successHandler((request, response, authentication) -> { - try { - // Cast the authentication object to Saml2Authentication - Saml2Authentication samlAuth = (Saml2Authentication) authentication; - Saml2AuthenticatedPrincipal principal = (Saml2AuthenticatedPrincipal) samlAuth.getPrincipal(); - - // Extract the user attributes from the principal - Map> userAttributes = principal.getAttributes(); - - // Log the user attributes for debugging purposes - logger.info("SAML User Attributes: " + userAttributes); - - // Save the authentication details in the database (Optional) - SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); - samlResponseLogEntity.setAuthenticationObject(authentication.toString()); - - // Convert user attributes to JSON and save in DB - ObjectMapper objectMapper = new ObjectMapper(); - String userAttributesJson = objectMapper.writeValueAsString(userAttributes); - samlResponseLogEntity.setAuthenticationObject(userAttributesJson); - samlResponseLogRepository.save(samlResponseLogEntity); - - // Successful login logic - logger.info("SAML login successful for user: " + principal.getName()); - response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); - } catch (Exception e) { - logger.error("Error processing SAML success handler", e); - } - }) - .failureHandler((request, response, exception) -> { - try { - logger.error("SAML login failed: " + exception.getMessage()); - - // Log the failure details to the database (Optional) - SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); - samlResponseLogEntity.setRequest(request.toString()); - samlResponseLogEntity.setResponse(response.toString()); - samlResponseLogEntity.setExceptionObject(exception.toString()); - samlResponseLogRepository.save(samlResponseLogEntity); - - // Handle failure redirection - response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); - } catch (Exception e) { - logger.error("Error processing SAML failure handler", e); - } - }) - ); + .saml2Login(saml -> saml.defaultSuccessUrl("/").successHandler(samlSuccessHandler) + .failureHandler(samlFailureHandler)); return http.build(); @@ -250,148 +129,5 @@ public class SecurityConfig { .scheme("bearer").bearerFormat("JWT"))); } - @Bean - public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() { - - String entityId = baseUrl + "/v1/saml/gw/metadata"; - String acsUrl = baseUrl + "/login/saml2/sso/loginumbria"; - - RelyingPartyRegistration registration = RelyingPartyRegistration.withRegistrationId("loginumbria") - .entityId(entityId) - .signingX509Credentials(credentials -> { - try { - credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate())); - } catch (Exception e) { - e.printStackTrace(); - } - }) - .assertionConsumerServiceLocation(acsUrl) - .assertingPartyDetails(details -> details.entityId("https://federatest.umbriadigitale.it/gw/metadata") - .singleSignOnServiceLocation("https://federatest.umbriadigitale.it/gw/SSOProxy/SAML2") - .singleSignOnServiceBinding(Saml2MessageBinding.POST) - .wantAuthnRequestsSigned(true) - .verificationX509Credentials(credentials -> { - try { - // Load the IDP's public certificate for verifying the SAML response signature - credentials.add(Saml2X509Credential.verification(readIdpCertificate())); - } catch (Exception e) { - e.printStackTrace(); - } - }) - ) - .build(); - - return new InMemoryRelyingPartyRegistrationRepository(registration); - } - - public AuthnRequest createSignedAuthnRequest(PrivateKey privateKey, X509Certificate certificate) throws Exception { - AuthnRequest authnRequest = (AuthnRequest) XMLObjectProviderRegistrySupport.getBuilderFactory() - .getBuilder(AuthnRequest.DEFAULT_ELEMENT_NAME) - .buildObject(AuthnRequest.DEFAULT_ELEMENT_NAME); - - authnRequest.setID("_" + UUID.randomUUID().toString()); - authnRequest.setVersion(SAMLVersion.VERSION_20); - // authnRequest.setIssueInstant(new DateTime()); - authnRequest.setIssueInstant(Instant.now()); - - - // Sign the AuthnRequest - // BasicCredential signingCredential = new BasicCredential(certificate, privateKey); - BasicX509Credential signingCredential = new BasicX509Credential(certificate, privateKey); - - Signature signature = (Signature) XMLObjectProviderRegistrySupport.getBuilderFactory() - .getBuilder(Signature.DEFAULT_ELEMENT_NAME) - .buildObject(Signature.DEFAULT_ELEMENT_NAME); - - signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS); - signature.setSigningCredential(signingCredential); - signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1); // Set RSA-SHA1 - - authnRequest.setSignature(signature); - DefaultSecurityConfigurationBootstrap.buildDefaultSignatureSigningConfiguration(); - - // Marshall and sign the object - XMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(authnRequest).marshall(authnRequest); - Signer.signObject(signature); - - return authnRequest; - } - -@Bean -public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { - RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); - OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); - - authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { - // Set the required attributes - AuthnRequest authnRequest = context.getAuthnRequest(); - authnRequest.setID("_" + UUID.randomUUID().toString()); // Add a unique ID - authnRequest.setVersion(SAMLVersion.VERSION_20); // Ensure version is 2.0 - authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); // HTTP-POST - - // Set Authentication Context - authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); - - // Log the SAML AuthnRequest after setting context - String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); - logger.info("SAML AuthnRequest after setting context: " + samlRequest); - }); - - return authenticationRequestResolver; -} - -private RequestedAuthnContext buildRequestedAuthnContext() { - AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); - AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( - SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX - ); - // Set the SPID Level 2 authentication context - authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"); - - RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); - RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); - requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); - requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef); - - return requestedAuthnContext; -} - - public PrivateKey readPrivateKey() throws Exception { - // Path to your private key PEM file - try (PemReader pemReader = new PemReader(new InputStreamReader(readKey("dev/saml/private-key.pem")))) { - // Read the PEM content - byte[] pemContent = pemReader.readPemObject().getContent(); - // Decode the PEM content - PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pemContent); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); // Use RSA algorithm - // Generate and return the PrivateKey - return keyFactory.generatePrivate(keySpec); - } - } - public X509Certificate readCertificate() throws Exception { - // Path to your certificate PEM fileFile - try (InputStream inStream = readKey("dev/saml/public-cert.pem")) { - CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); - return (X509Certificate) certFactory.generateCertificate(inStream); - } - } - - public X509Certificate readIdpCertificate() throws Exception { - // Path to your IDP public certificate PEM file - try (InputStream inStream = readKey("dev/saml/idp-certificate.pem")) { - CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); - return (X509Certificate) certFactory.generateCertificate(inStream); - } - } - - - public InputStream readKey(String path) throws IOException { - ClassLoader classLoader = getClass().getClassLoader(); - InputStream inputStream = classLoader.getResourceAsStream(path); - - if (inputStream == null) { - throw new FileNotFoundException("file not found : "+path); - } - return inputStream; - } + } \ No newline at end of file From b997fb3a5aa89ddf75dfe350b0e9dfdf0e64c17e Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 24 Sep 2024 20:03:28 +0530 Subject: [PATCH 127/145] Added callStatus in get api of form --- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 1 + .../tendermanagement/model/response/FormResponseBean.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 8121f9e6..1d5ad1a1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -73,6 +73,7 @@ public class FormDao { formResponseBean.setContent(Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class)); formResponseBean.setLabel(formEntity.getLabel()); formResponseBean.setCallId(formEntity.getCall().getId()); + formResponseBean.setCallStatus(formEntity.getCall().getStatus()); return formResponseBean; } public FormResponseBean createForm(Long callId,FormRequest formRequest){ diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java index 7e3ebce1..7a1d178e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java @@ -9,6 +9,8 @@ public class FormResponseBean { private Long id; + private String callStatus; + private String label; private Long callId; From 30061c514ddc97a434f64dca9a5314761fb03180 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 25 Sep 2024 11:59:42 +0530 Subject: [PATCH 128/145] Updated code --- src/main/resources/application-production.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 2132264d..51940c65 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -6,6 +6,6 @@ spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration spring.h2.console.enabled=true -base-url=https://api-dev-gepafin.memento.credit +base-url=http://79.137.88.15 isVatCheckGloballyDisabled = false From 49f5eb08838f21e360395b63508d9a0d502dd348 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 25 Sep 2024 12:25:29 +0530 Subject: [PATCH 129/145] Updated response of application api --- .../constants/GepafinConstant.java | 3 +- .../tendermanagement/dao/ApplicationDao.java | 32 +++++++++++++++++++ .../tendermanagement/dao/FlowFormDao.java | 28 ++++++++++------ .../model/response/ApplicationResponse.java | 8 +++++ src/main/resources/message_en.properties | 2 ++ src/main/resources/message_it.properties | 3 ++ 6 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 395d883c..ad8ca5b4 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -155,6 +155,7 @@ public class GepafinConstant { public static final String IS_CAP="isCAP"; public static final String IS_CODICE_FISCALE="isCodiceFiscale"; public static final String IS_PIVA="isPIVA"; - public static final String FAILED_RETAIN_FIELD="failed.retain.field"; + public static final String TOTAL_STEPS_NOT_BE_ZERO="total.steps.not.zero"; + public static final String COMPLETED_STEPS_NOT_VALID="completed.steps.not.valid"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index d153ed5c..8d19b48d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -13,14 +13,17 @@ import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository; import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.DocumentService; import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.checkerframework.checker.units.qual.A; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -56,6 +59,12 @@ public class ApplicationDao { @Autowired private CallDao callDao; + @Autowired + private FlowFormDao flowFormDao; + + @Autowired + private FlowEdgesRepository flowEdgesRepository; + public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId,Long applicationId) { FormEntity formEntity = formService.validateForm(formId); CallEntity call = callService.validatePublishedCall(formEntity.getCall().getId()); @@ -204,7 +213,16 @@ public class ApplicationDao { private ApplicationResponse getApplicationResponse(ApplicationEntity applicationEntity) { ApplicationResponse responseBean = new ApplicationResponse(); + List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); + Long totalFormSteps = flowFormDao.calculateTotalSteps(flowEdgesList); + List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId()); + Long completedSteps=(Long.valueOf(applicationFormList.size())); + Integer progress=calculateProgress(totalFormSteps,completedSteps); responseBean.setId(applicationEntity.getId()); + responseBean.setProgress(progress); + responseBean.setCallTitle(applicationEntity.getCall().getName()); + responseBean.setCallEndDate(applicationEntity.getCall().getEndDate()); + responseBean.setModifiedDate(applicationEntity.getCall().getUpdatedDate()); responseBean.setCallId(applicationEntity.getCall().getId()); responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); responseBean.setStatus(applicationEntity.getStatus()); @@ -451,4 +469,18 @@ public class ApplicationDao { } saveApplicationEntity(applicationEntity); } + + public Integer calculateProgress(Long totalSteps, Long completedSteps) { + if (FieldValidator.isNullOrZero(totalSteps)) { + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO)); + } + + if (completedSteps < 0 || completedSteps > totalSteps) { + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.COMPLETED_STEPS_NOT_VALID)); + } + + double progress = ((double) completedSteps / totalSteps) * 100; + return (int) Math.round(progress); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index a6f6a867..63287e0d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -290,21 +290,31 @@ public class FlowFormDao { nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName()); List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); - Long totalFormSteps = 3l; - if (flowEdgesList.size() == 1) { - totalFormSteps = 2l; - } + Long totalFormSteps = calculateTotalSteps(flowEdgesList); + Long currentStep = calculateCurrentStep(formEntity); + List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId()); + nextOrPreviousFormResponse.setTotalFormSteps(totalFormSteps); + nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(applicationFormList.size())); + nextOrPreviousFormResponse.setCurrentStep(currentStep); + return nextOrPreviousFormResponse; + } + + public Long calculateCurrentStep(FormEntity formEntity) { Long currentStep = 2l; if (formEntity.getId().equals(formEntity.getCall().getInitialForm())) { currentStep = 1l; } else if (formEntity.getId().equals(formEntity.getCall().getFinalForm())) { currentStep = 3l; } - List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId()); - nextOrPreviousFormResponse.setTotalFormSteps(totalFormSteps); - nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(applicationFormList.size())); - nextOrPreviousFormResponse.setCurrentStep(currentStep); - return nextOrPreviousFormResponse; + return currentStep; + } + + public Long calculateTotalSteps(List flowEdgesList) { + Long totalFormSteps = 3l; + if (flowEdgesList.size() == 1) { + totalFormSteps = 2l; + } + return totalFormSteps; } private Long getDefaultForm(ApplicationEntity applicationEntity) { diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java index fdb0f6f3..b5a0fbb2 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java @@ -13,6 +13,14 @@ public class ApplicationResponse{ private Long callId; + private String callTitle; + + private LocalDateTime callEndDate; + + private LocalDateTime modifiedDate; + + private Integer progress; + private LocalDateTime submissionDate; private String status; diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 981ed852..12b06608 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -184,3 +184,5 @@ valid.vat.number=The VAT number is not valid for field {0}. failed.retain.field=Failed to retain specific fields. application.is.incomplete = The application is incomplete. +total.steps.not.zero=Total steps cannot be zero. +completed.steps.not.valid=Completed steps should be between 0 and total steps. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 5a7899df..a7d9068e 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -176,3 +176,6 @@ validation.marca.da.bollo=Il campo {0} deve essere una Marca Da Bollo valida con validation.piva=Il numero di partita IVA per {0} deve essere lungo fino a 11 cifre. valid.vat.number=Il numero di partita IVA non � valido per il campo {0}. failed.retain.field=Impossibile conservare campi specifici. + +total.steps.not.zero=Il totale dei passaggi non può essere zero. +completed.steps.not.valid=I passaggi completati devono essere compresi tra 0 e il totale dei passaggi. From cfdb872f49a44a7a217d124555f3596a5c57161a Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 25 Sep 2024 16:33:41 +0530 Subject: [PATCH 130/145] updated code --- .../tendermanagement/dao/ApplicationDao.java | 18 ++++++++++++++---- .../repositories/ApplicationRepository.java | 3 +++ .../tendermanagement/web/rest/api/FormApi.java | 2 ++ .../web/rest/api/FormFieldApi.java | 6 ++++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 8d19b48d..6b310bc6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -174,10 +174,9 @@ public class ApplicationDao { } public List getAllApplications(UserEntity userEntity, Long callId) { - RoleStatusEnum roleStatus = RoleStatusEnum.valueOf(userEntity.getRoleEntity().getRoleType()); - boolean isBeneficiary = RoleStatusEnum.ROLE_BENEFICIARY.equals(roleStatus); + boolean isBeneficiary = isBeneficiary(userEntity); - log.info("Fetching applications for RoleType: {}", roleStatus); + log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType()); List applicationResponses = new ArrayList<>(); if (callId != null) { @@ -351,7 +350,12 @@ public class ApplicationDao { public ApplicationGetResponseBean getApplicationByFormId( Long applicationId,Long formId, UserEntity userEntity) { List formApplicationResponses = new ArrayList<>(); List formEntities = new ArrayList<>(); - ApplicationEntity applicationEntity = applicationRepository.findById(applicationId) + boolean isBeneficiary = isBeneficiary(userEntity); + ApplicationEntity applicationEntity = isBeneficiary + ? applicationRepository.findByIdAndUserIdAndIsDeletedFalse(applicationId,userEntity.getId()) + .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))) + : applicationRepository.findById(applicationId) + .stream().findFirst() .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))); if (formId != null) { @@ -374,6 +378,12 @@ public class ApplicationDao { return createApplicationGetResponseBean(applicationEntity, formEntities, formApplicationResponses); } + private boolean isBeneficiary(UserEntity userEntity) { + RoleStatusEnum roleStatus = RoleStatusEnum.valueOf(userEntity.getRoleEntity().getRoleType()); + boolean isBeneficiary = RoleStatusEnum.ROLE_BENEFICIARY.equals(roleStatus); + return isBeneficiary; + } + private void addFormApplication(FormEntity formEntity, ApplicationEntity applicationEntity, List formApplicationResponses) { FormApplicationResponse formApplicationResponse = processForm(formEntity, applicationEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 8d41608c..ad9104a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -23,4 +23,7 @@ public interface ApplicationRepository extends JpaRepository findByCallIdAndIsDeletedFalse(Long callId); public List findByIsDeletedFalse(); + + public Optional findByIdAndUserIdAndIsDeletedFalse(Long id,Long userId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java index 04417439..99eb8835 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormApi.java @@ -49,6 +49,7 @@ public interface FormApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/{formId}", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") ResponseEntity> updateForm(HttpServletRequest request, @Parameter(description = "The form ID", required = true) @PathVariable("formId") Long formId, @Parameter(description = "form request object", required = true) @Valid @RequestBody FormRequest formRequest,@Parameter(description = "force delete flow ",required = true)@RequestParam(value = "forceDeleteFlow",required = true)Boolean forceDeleteFlow); @@ -78,6 +79,7 @@ public interface FormApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @DeleteMapping(value = "/{formId}") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") ResponseEntity> deleteForm(HttpServletRequest request, @Parameter(description = "The form ID", required = true) @PathVariable("formId") Long formId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java index 341b3fed..0aeecf0f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FormFieldApi.java @@ -13,6 +13,7 @@ import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -30,6 +31,7 @@ public interface FormFieldApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") public ResponseEntity> createFormField(HttpServletRequest request, @Parameter(description = "form field request object", required = true) @Valid @RequestBody FormFieldRequest formFieldRequest); @@ -46,6 +48,7 @@ public interface FormFieldApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/{formFieldId}", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") ResponseEntity> updateFormField(HttpServletRequest request, @Parameter(description = "The form field ID", required = true) @PathVariable("formFieldId") Long formFieldId, @Parameter(description = "form field request object", required = true) @Valid @RequestBody FormFieldRequest formFieldRequest); @@ -61,6 +64,7 @@ public interface FormFieldApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{formFieldId}", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") ResponseEntity> getFormFieldById(HttpServletRequest request, @Parameter(description = "The form field ID", required = true) @PathVariable("formFieldId") Long formFieldId); @@ -75,6 +79,7 @@ public interface FormFieldApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @DeleteMapping(value = "/{formFieldId}") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") ResponseEntity> deleteForm(HttpServletRequest request, @Parameter(description = "The form field ID", required = true) @PathVariable("formFieldId") Long formFieldId); @@ -89,6 +94,7 @@ public interface FormFieldApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") ResponseEntity>> getAllFormField(HttpServletRequest request); } From db42874e75ff4c57151532ad02119b74247bdede Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 25 Sep 2024 18:12:31 +0530 Subject: [PATCH 131/145] Applied validation application form field --- .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/ApplicationDao.java | 21 +++++++++++++++++++ src/main/resources/message_en.properties | 3 ++- src/main/resources/message_it.properties | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index ad8ca5b4..00fdc267 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -158,4 +158,5 @@ public class GepafinConstant { public static final String FAILED_RETAIN_FIELD="failed.retain.field"; public static final String TOTAL_STEPS_NOT_BE_ZERO="total.steps.not.zero"; public static final String COMPLETED_STEPS_NOT_VALID="completed.steps.not.valid"; + public static final String FIELD_ID_NOT_FOUND="field.id.not.found"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 6b310bc6..8c05ca89 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.text.MessageFormat; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -68,6 +69,7 @@ public class ApplicationDao { public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId,Long applicationId) { FormEntity formEntity = formService.validateForm(formId); CallEntity call = callService.validatePublishedCall(formEntity.getCall().getId()); + validateFormFields(applicationRequestBean,formEntity); ApplicationEntity applicationEntity = validateApplication(applicationId); if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))){ throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_SUBMITTED)); @@ -492,5 +494,24 @@ public class ApplicationDao { double progress = ((double) completedSteps / totalSteps) * 100; return (int) Math.round(progress); } + public void validateFormFields(ApplicationRequestBean request, FormEntity formEntity) { + List errors=new ArrayList<>(); + List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); + + List requestFields = request.getFormFields(); + + Map contentMap = contentResponseBeans.stream() + .collect(Collectors.toMap(ContentResponseBean::getId, ContentResponseBean::getLabel)); // Change getLabel() if needed + FieldValidator validator = FieldValidator.create(); + for (ApplicationFormFieldRequestBean requestField : requestFields) { + String fieldId = requestField.getFieldId(); + + if (!contentMap.containsKey(fieldId)) { + validator.addError(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_ID_NOT_FOUND), fieldId)); + } + + } + validator.validate(); + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 12b06608..9f10dba0 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -185,4 +185,5 @@ failed.retain.field=Failed to retain specific fields. application.is.incomplete = The application is incomplete. total.steps.not.zero=Total steps cannot be zero. -completed.steps.not.valid=Completed steps should be between 0 and total steps. \ No newline at end of file +completed.steps.not.valid=Completed steps should be between 0 and total steps. +field.id.not.found=Field ID {0} does not exist in the form structure. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index a7d9068e..7a90dd8e 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -179,3 +179,4 @@ failed.retain.field=Impossibile conservare campi specifici. total.steps.not.zero=Il totale dei passaggi non può essere zero. completed.steps.not.valid=I passaggi completati devono essere compresi tra 0 e il totale dei passaggi. +field.id.not.found=L'ID campo {0} non esiste nella struttura del modulo. From ccaa3c9ffef279d69aa1023844d878b000cc7491 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 25 Sep 2024 19:06:05 +0530 Subject: [PATCH 132/145] Updated code for form field value --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 8c05ca89..aae686d7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -286,7 +286,7 @@ public class ApplicationDao { } } Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); - Utils.setIfUpdated(applicationFormFieldEntity::getFieldValue, applicationFormFieldEntity::setFieldValue, applicationFormFieldRequestBean.getFieldValue()); + applicationFormFieldEntity.setFieldValue(applicationFormFieldRequestBean.getFieldValue()); return applicationFormFieldRepository.save(applicationFormFieldEntity); } From d5524b7cc989f636884d58080133101d734d6c54 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 25 Sep 2024 20:12:34 +0530 Subject: [PATCH 133/145] created new api's for login with spid --- .../config/SamlFailureHandler.java | 18 +--- .../config/SamlSuccessHandler.java | 100 ++++++++++++------ .../config/SecurityConfig.java | 3 + .../config/jwt/TokenProvider.java | 11 +- .../constants/GepafinConstant.java | 4 + .../gepafin/tendermanagement/dao/UserDao.java | 47 +++++--- ...LogEntity.java => SamlResponseEntity.java} | 14 +-- .../tendermanagement/entities/UserEntity.java | 9 +- .../model/request/UserReq.java | 7 +- .../model/response/UserSamlResponse.java | 13 +++ .../SamlResponseLogRepository.java | 11 -- .../repositories/SamlResponseRepository.java | 13 +++ .../repositories/UserRepository.java | 7 ++ .../tendermanagement/service/UserService.java | 7 +- .../service/impl/AuthenticationService.java | 92 +++++++++++++--- .../service/impl/UserServiceImpl.java | 35 ++++-- .../gepafin/tendermanagement/util/Utils.java | 29 +++++ .../tendermanagement/util/Validator.java | 28 +++++ .../web/rest/api/UserApi.java | 41 ++++++- .../web/rest/api/impl/UserApiController.java | 20 +++- src/main/resources/application.properties | 1 + .../db/changelog/db.changelog-1.0.0.xml | 38 +++---- src/main/resources/message_en.properties | 4 + src/main/resources/message_it.properties | 4 + 24 files changed, 407 insertions(+), 149 deletions(-) rename src/main/java/net/gepafin/tendermanagement/entities/{SamlResponseLogEntity.java => SamlResponseEntity.java} (50%) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/UserSamlResponse.java delete mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseLogRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java index da5f3a65..1e740869 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java @@ -4,23 +4,21 @@ import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.stereotype.Component; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; -import net.gepafin.tendermanagement.repositories.SamlResponseLogRepository; @Component public class SamlFailureHandler implements AuthenticationFailureHandler { private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class); - @Autowired - private SamlResponseLogRepository samlResponseLogRepository; + @Value("fe.base.url") + private String feBaseUrl; @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, @@ -28,15 +26,7 @@ public class SamlFailureHandler implements AuthenticationFailureHandler { try { logger.error("SAML login failed: " + exception.getMessage()); - // Log the failure details to the database (Optional) - SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); - samlResponseLogEntity.setRequest(request.toString()); - samlResponseLogEntity.setResponse(response.toString()); - samlResponseLogEntity.setExceptionObject(exception.toString()); - samlResponseLogRepository.save(samlResponseLogEntity); - - // Handle failure redirection - response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); + response.sendRedirect(feBaseUrl + "/login"); } catch (Exception e) { logger.error("Error processing SAML failure handler", e); } diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index ef7c0bb7..1ef52f87 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -7,6 +7,7 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal; import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; @@ -17,48 +18,77 @@ import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; -import net.gepafin.tendermanagement.repositories.SamlResponseLogRepository; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.SamlResponseEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.repositories.SamlResponseRepository; +import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; @Component -public class SamlSuccessHandler implements AuthenticationSuccessHandler{ - +public class SamlSuccessHandler implements AuthenticationSuccessHandler { - private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class); - - @Autowired - private SamlResponseLogRepository samlResponseLogRepository; - - @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, - Authentication authentication) throws IOException { - try { - // Cast the authentication object to Saml2Authentication - Saml2Authentication samlAuth = (Saml2Authentication) authentication; - Saml2AuthenticatedPrincipal principal = (Saml2AuthenticatedPrincipal) samlAuth.getPrincipal(); + private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class); - // Extract the user attributes from the principal - Map> userAttributes = principal.getAttributes(); + @Autowired + private SamlResponseRepository samlResponseLogRepository; - // Log the user attributes for debugging purposes - logger.info("SAML User Attributes: " + userAttributes); + @Autowired + private UserRepository userRepository; - // Save the authentication details in the database (Optional) - SamlResponseLogEntity samlResponseLogEntity = new SamlResponseLogEntity(); - samlResponseLogEntity.setAuthenticationObject(authentication.toString()); + @Value("fe.base.url") + private String feBaseUrl; - // Convert user attributes to JSON and save in DB - ObjectMapper objectMapper = new ObjectMapper(); - String userAttributesJson = objectMapper.writeValueAsString(userAttributes); - samlResponseLogEntity.setAuthenticationObject(userAttributesJson); - samlResponseLogRepository.save(samlResponseLogEntity); + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, + Authentication authentication) throws IOException { + try { + Saml2Authentication samlAuth = (Saml2Authentication) authentication; + Saml2AuthenticatedPrincipal principal = (Saml2AuthenticatedPrincipal) samlAuth.getPrincipal(); - // Successful login logic - logger.info("SAML login successful for user: " + principal.getName()); - response.sendRedirect("http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com/login"); - } catch (Exception e) { - logger.error("Error processing SAML success handler", e); - } - } + Map> userAttributes = principal.getAttributes(); + String token = Utils.generateSecureToken(); + logger.info("SAML User Attributes: " + userAttributes); + + SamlResponseEntity samlResponseLogEntity = new SamlResponseEntity(); + samlResponseLogEntity.setAuthenticationObject(authentication.toString()); + + ObjectMapper objectMapper = new ObjectMapper(); + String userAttributesJson = objectMapper.writeValueAsString(userAttributes); + samlResponseLogEntity.setAuthenticationObject(userAttributesJson); + samlResponseLogEntity.setToken(token); + samlResponseLogRepository.save(samlResponseLogEntity); + + // Successful login logic + logger.info("SAML login successful for user: " + principal.getName()); + String cf = userAttributes.get("CodiceFiscale").get(0).toString(); + UserEntity userEntity = userRepository.findByCodiceFiscale(cf).orElse(null); + if (userEntity == null) { + response.sendRedirect(feBaseUrl + "/registration?temp_token=" + token); + } else { + response.sendRedirect(feBaseUrl + "/login?temp_token=" + token); + } + } catch (Exception e) { + logger.error("Error processing SAML success handler", e); + } + } + + public void validateToken(String token, String codiceFiscale) { + SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository.findByToken(token); + if (samlResponseLogEntity == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); + } + Map> userAttributes = Utils + .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); + String cf = userAttributes.get("CodiceFiscale").get(0).toString(); + if (codiceFiscale == null || Boolean.FALSE.equals(codiceFiscale.equals(cf))) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); + } + samlResponseLogRepository.delete(samlResponseLogEntity); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 17cf0253..91424195 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -99,6 +99,9 @@ public class SecurityConfig { http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests(auth -> auth // Allow public access to the login endpoints .requestMatchers("/v1/user/login").permitAll() // JWT-based login + .requestMatchers("/v1/user").permitAll() // User registration + .requestMatchers("/v1/user/sso/validate/existing-user/{token}").permitAll() + .requestMatchers("/v1/user/sso/validate/new-user/{token}").permitAll() .requestMatchers("/v1/saml/**").permitAll() // JWT-based login .requestMatchers("/saml2/**").permitAll() // SAML login initiation .requestMatchers("/swagger-ui/**").permitAll() // Swagger docs diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java index 15c51b7a..d299b6ff 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java @@ -82,10 +82,11 @@ public class TokenProvider { log.info("JWT Secret Key initialized."); } - public String createToken(Authentication authentication, Boolean rememberMe, UserEntity user) { - String authorities = authentication.getAuthorities().stream() - .map(GrantedAuthority::getAuthority) - .collect(Collectors.joining(",")); + public String createToken(Boolean rememberMe, UserEntity user) { +// String authorities = authentication.getAuthorities().stream() +// .map(GrantedAuthority::getAuthority) +// .collect(Collectors.joining(",")); + String authorities = user.getRoleEntity().getRoleType(); Long now; Date validity; @@ -99,7 +100,7 @@ public class TokenProvider { log.info("Creating token with standard validity of {} seconds.", this.tokenValidityInSeconds); } - String payload = authentication.getName(); + String payload = user.getEmail(); if(user != null) { payload += ":"+user.getId(); } diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 395d883c..874fafac 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -157,4 +157,8 @@ public class GepafinConstant { public static final String IS_PIVA="isPIVA"; public static final String FAILED_RETAIN_FIELD="failed.retain.field"; + public static final String USER_ALREADY_EXIST_MSG = "user.already.exist.msg"; + public static final String TOKEN_VALIDATE_SUCCESS_MGE = "token.validate.success.mge"; + public static final String INVALID_REQUEST = "invalid.request"; + public static final String CODICE_FISCALE_EXISTS = "codice.fiscale.exists"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 81033b05..8dddbfea 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -9,20 +9,22 @@ import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.RoleResponseBean; +import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.impl.AuthenticationService; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Repository; -import java.security.SecureRandom; -import java.util.Base64; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @@ -43,24 +45,32 @@ public class UserDao { @Autowired private RoleDao roleDao; - public UserResponseBean createUser(UserReq userReq) { + public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { log.info("Creating user with email: {}", userReq.getEmail()); if (userRepository.existsByEmailIgnoreCase(userReq.getEmail())) { log.error("User creation failed: Email {} already exists", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); } - if (!userReq.getPassword().equals(userReq.getConfPassword())) { + if (Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getCodiceFiscale())) && userRepository.existsByCodiceFiscale(userReq.getCodiceFiscale())) { + log.error("User creation failed: CodiceFiscale {} already exists", userReq.getCodiceFiscale()); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CODICE_FISCALE_EXISTS)); + } + if(tempToken == null && (StringUtils.isEmpty(userReq.getPassword()) || StringUtils.isEmpty(userReq.getConfPassword()))) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_REQUEST)); + } + if (tempToken == null && !userReq.getPassword().equals(userReq.getConfPassword())) { log.error("User creation failed: Passwords do not match for email {}", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); } - if (userReq.getPassword().length() < 8) { + if (tempToken == null && userReq.getPassword().length() < 8) { log.error("User creation failed: Password length is less than 8 characters for email {}", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_MIN_LEN)); } + UserEntity userEntity = convertUserRequestToUserEntity(userReq); userEntity = userRepository.save(userEntity); log.info("User created with ID: {}", userEntity.getId()); - return convertUserEntityToUserResponse(userEntity); + return authService.getJWTTokenBean(userEntity, Boolean.TRUE); } public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { @@ -88,15 +98,18 @@ public class UserDao { private UserEntity convertUserRequestToUserEntity(UserReq userReq) { UserEntity userEntity = new UserEntity(); - userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); + if(Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getPassword()))) { + userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); + } userEntity.setEmail(userReq.getEmail()); userEntity.setFirstName(userReq.getFirstName()); - userEntity.setStatus(UserStatusEnum.PENDING_VERIFICATION.getValue()); + userEntity.setStatus(UserStatusEnum.ACTIVE.getValue()); userEntity.setLastName(userReq.getLastName()); userEntity.setOrganization(userReq.getOrganization()); userEntity.setAddress(userReq.getAddress()); userEntity.setPhoneNumber(userReq.getPhoneNumber()); userEntity.setRoleEntity(roleDao.validateRole(userReq.getRoleId())); + userEntity.setCodiceFiscale(userReq.getCodiceFiscale()); return userEntity; } @@ -150,14 +163,6 @@ public class UserDao { .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); } - public String generateSecureToken() { - SecureRandom secureRandom = new SecureRandom(); - byte[] tokenBytes = new byte[24]; - secureRandom.nextBytes(tokenBytes); - String token = Base64.getUrlEncoder().withoutPadding().encodeToString(tokenBytes); - log.debug("Generated secure token: {}", token); - return token; - } public String initiatePasswordReset(InitiatePasswordResetReq resetReq) { UserEntity user = userRepository.findByEmail(resetReq.getEmail()); @@ -165,7 +170,7 @@ public class UserDao { log.info("Password reset attempt for non-existent user: {}", resetReq.getEmail()); throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); } - String token = generateSecureToken(); + String token = Utils.generateSecureToken(); user.setResetPasswordToken(token); userRepository.save(user); log.info("Password reset token generated for user: {}", resetReq.getEmail()); @@ -227,4 +232,12 @@ public class UserDao { return convertUserEntityToUserResponse(userEntity); } + public JWTToken validateExistingUserToken(String token) { + return authService.validateExistingUserToken(token); + } + + public UserSamlResponse validateNewUserToken(String token) { + return authService.validateNewUserToken(token); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseLogEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java similarity index 50% rename from src/main/java/net/gepafin/tendermanagement/entities/SamlResponseLogEntity.java rename to src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java index 53e262e9..732edfd9 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseLogEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java @@ -6,21 +6,15 @@ import jakarta.persistence.Table; import lombok.Data; @Entity -@Table(name = "SAML_RESPONSE_LOG") +@Table(name = "SAML_RESPONSE") @Data -public class SamlResponseLogEntity extends BaseEntity{ - - @Column(name = "REQUEST") - private String request; - - @Column(name = "RESPONSE") - private String response; +public class SamlResponseEntity extends BaseEntity{ @Column(name = "AUTHENTICATION_OBJECT") private String authenticationObject; - @Column(name = "EXCEPTION_OBJECT") - private String exceptionObject; + @Column(name = "TOKEN") + private String token; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java index 5bd88f33..0a0c9016 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.entities; -import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.*; import jakarta.validation.constraints.Email; @@ -17,7 +16,7 @@ import java.time.LocalDateTime; @Setter public class UserEntity extends BaseEntity { - @Column(name = "PASSWORD", columnDefinition = "TEXT",nullable = false) + @Column(name = "PASSWORD", columnDefinition = "TEXT",nullable = true) @JsonIgnore private String password; @@ -29,8 +28,7 @@ public class UserEntity extends BaseEntity { @JoinColumn(name = "ROLE_ID") @JsonIgnore private RoleEntity roleEntity; - - + @Column(name = "LAST_LOGIN") private LocalDateTime lastLogin; @@ -60,4 +58,7 @@ public class UserEntity extends BaseEntity { @Column(name = "RESET_PASSWORD_TOKEN", length = 255, nullable = true) private String resetPasswordToken; + + @Column(name = "CODICE_FISCALE") + private String codiceFiscale; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java index 7dacab15..e81bdaf3 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.model.request; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -12,9 +11,9 @@ public class UserReq { @NotBlank @Email private String email; - @NotEmpty + private String password; - @NotEmpty + private String confPassword; private String firstName; @@ -32,5 +31,7 @@ public class UserReq { private String city; private String country; + + private String codiceFiscale; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UserSamlResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/UserSamlResponse.java new file mode 100644 index 00000000..da732bd4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/UserSamlResponse.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class UserSamlResponse { + + private String codiceFiscale; + + private String firstName; + + private String lastName; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseLogRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseLogRepository.java deleted file mode 100644 index 3f98e083..00000000 --- a/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseLogRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.gepafin.tendermanagement.repositories; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import net.gepafin.tendermanagement.entities.SamlResponseLogEntity; - -@Repository -public interface SamlResponseLogRepository extends JpaRepository { - -} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java new file mode 100644 index 00000000..9183f339 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.SamlResponseEntity; + +@Repository +public interface SamlResponseRepository extends JpaRepository { + + SamlResponseEntity findByToken(String token); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index 7720430c..68289e6d 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -6,7 +6,14 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface UserRepository extends JpaRepository { + Optional findByEmailIgnoreCase(String email); + boolean existsByEmailIgnoreCase(String email); + UserEntity findByEmail(String email); + + Optional findByCodiceFiscale(String cf); + + boolean existsByCodiceFiscale(String codiceFiscale); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index f925d7dd..57421978 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -8,11 +8,12 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; public interface UserService { - UserResponseBean createUser(UserReq userReq); + JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq); UserResponseBean updateUser(Long userId, UpdateUserReq userReq); @@ -35,4 +36,8 @@ public interface UserService { UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq); UserResponseBean getValidUser(HttpServletRequest request); + + JWTToken validateExistingUserToken(HttpServletRequest request, String token); + + UserSamlResponse validateNewUserToken(HttpServletRequest request, String token); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index bf853124..1b61baa7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -6,15 +6,20 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.RoleDao; +import net.gepafin.tendermanagement.entities.SamlResponseEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.RoleResponseBean; +import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.util.JWTToken; +import net.gepafin.tendermanagement.repositories.SamlResponseRepository; import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,6 +32,8 @@ import org.springframework.security.web.authentication.logout.SecurityContextLog import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; @Service public class AuthenticationService { @@ -41,6 +48,9 @@ public class AuthenticationService { @Autowired private RoleDao roleDao; + + @Autowired + private SamlResponseRepository samlResponseLogRepository; @Autowired public AuthenticationService(TokenProvider tokenProvider, AuthenticationManager authenticationManager) { @@ -55,27 +65,32 @@ public class AuthenticationService { Authentication authentication = this.authenticationManager.authenticate(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authentication); log.info("Authentication successful for email: {}", loginReq.getEmail()); - UserEntity user = userRepository.findByEmailIgnoreCase(loginReq.getEmail()).orElseThrow(()-> new CustomValidationException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); - if (Boolean.FALSE.equals(UserStatusEnum.ACTIVE.getValue().equals(user.getStatus()))) { - throw new CustomValidationException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + UserEntity user = userRepository.findByEmailIgnoreCase(loginReq.getEmail()) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + if (Boolean.FALSE.equals(UserStatusEnum.ACTIVE.getValue().equals(user.getStatus()))) { + throw new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); } + return getJWTTokenBean(user, loginReq.getRememberMe()); + } + + public JWTToken getJWTTokenBean(UserEntity user, Boolean rememberMe) { user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); userRepository.save(user); - String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user); - log.info("JWT token generated for email: {}", loginReq.getEmail()); + String token = tokenProvider.createToken(rememberMe, user); + log.info("JWT token generated for email: {}", user.getEmail()); RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); LoginResponse loginResponse = getLoginResponse(user, roleResponseBean); JWTToken jwtToken = new JWTToken(token, loginResponse); - log.info("Login successful for email: {}", loginReq.getEmail()); - return jwtToken; - } - - private static LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) { + log.info("Login successful for email: {}", user.getEmail()); + return jwtToken; + } + + private static LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) { LoginResponse loginResponse = new LoginResponse(); loginResponse.setId(user.getId()); loginResponse.setEmail(user.getEmail()); @@ -93,8 +108,8 @@ public class AuthenticationService { loginResponse.setUpdatedDate(user.getUpdatedDate()); return loginResponse; } - public void logout(HttpServletRequest request, HttpServletResponse response) - { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + public void logout(HttpServletRequest request, HttpServletResponse response) { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null) { String token = tokenProvider.extractTokenFromRequest(request); tokenProvider.invalidateToken(token); @@ -102,6 +117,53 @@ public class AuthenticationService { } SecurityContextHolder.getContext().setAuthentication(null); SecurityContextHolder.clearContext(); -} + } + + public JWTToken validateExistingUserToken(String token) { + SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository.findByToken(token); + if (samlResponseLogEntity == null) { + log.info("Invalid spid login token : {}", token); + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); + } + Map> userAttributes = Utils + .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); + String cf = userAttributes.get("CodiceFiscale").get(0).toString(); + UserEntity userEntity = userRepository.findByCodiceFiscale(cf) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + samlResponseLogRepository.delete(samlResponseLogEntity); + + return getJWTTokenBean(userEntity, Boolean.TRUE); + } + + + public UserSamlResponse validateNewUserToken(String token) { + SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository.findByToken(token); + if (samlResponseLogEntity == null) { + log.info("Invalid spid login token : {}", token); + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); + } + Map> userAttributes = Utils + .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); + String cf = userAttributes.get("CodiceFiscale").get(0).toString(); + if (userRepository.findByCodiceFiscale(cf).isPresent()) { + throw new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_ALREADY_EXIST_MSG)); + } + UserSamlResponse userSamlResponse = new UserSamlResponse(); + userSamlResponse.setCodiceFiscale(cf); + if (userAttributes.containsKey("nome") && userAttributes.get("nome") != null + && !userAttributes.get("nome").isEmpty()) { + userSamlResponse.setFirstName(userAttributes.get("nome").get(0).toString()); + } + if (userAttributes.containsKey("cognome") && userAttributes.get("cognome") != null + && !userAttributes.get("cognome").isEmpty()) { + userSamlResponse.setLastName(userAttributes.get("cognome").get(0).toString()); + } + userSamlResponse.setCodiceFiscale(cf); + return userSamlResponse; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index 9dc8378e..c109e6bb 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -2,22 +2,25 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import net.gepafin.tendermanagement.config.jwt.TokenProvider; +import net.gepafin.tendermanagement.config.SamlSuccessHandler; import net.gepafin.tendermanagement.dao.UserDao; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Map; @Service @@ -25,12 +28,21 @@ public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; + @Autowired - private TokenProvider tokenProvider; + private Validator validator; + + @Autowired + private SamlSuccessHandler samlSuccessHandler; @Transactional(rollbackFor = Exception.class) - public UserResponseBean createUser(UserReq userReq) { - return userDao.createUser(userReq); + public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { + if (tempToken == null) { + validator.validateRequest(request,RoleStatusEnum.ROLE_SUPER_ADMIN); + }else { + samlSuccessHandler.validateToken(tempToken, userReq.getCodiceFiscale()); + } + return userDao.createUser(request, tempToken, userReq); } @@ -89,8 +101,17 @@ public class UserServiceImpl implements UserService { @Override @Transactional(readOnly = true) public UserResponseBean getValidUser(HttpServletRequest request) { - Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - UserEntity user=tokenProvider.validateUser(userInfo); + UserEntity user=validator.validateUser(request); return userDao.getUserById(user.getId()); } + + @Override + @Transactional(rollbackFor = Exception.class) + public JWTToken validateExistingUserToken(HttpServletRequest request, String token) { + return userDao.validateExistingUserToken(token); + } + @Override + public UserSamlResponse validateNewUserToken(HttpServletRequest request, String token) { + return userDao.validateNewUserToken(token); + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 055fb8e8..9de26d9c 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; import java.util.Base64; import java.util.List; import java.util.Map; @@ -161,4 +162,32 @@ public class Utils { } } } + + public static String encodeData(String data) { + return Base64.getEncoder().encodeToString(data.getBytes(StandardCharsets.UTF_8)); + } + + public static String decodeData(String token) { + byte[] decodedBytes = Base64.getDecoder().decode(token); + return new String(decodedBytes, StandardCharsets.UTF_8); + } + + public static String generateSecureToken() { + SecureRandom secureRandom = new SecureRandom(); + byte[] tokenBytes = new byte[24]; + secureRandom.nextBytes(tokenBytes); + String token = Base64.getUrlEncoder().withoutPadding().encodeToString(tokenBytes); + log.debug("Generated secure token: {}", token); + return token; + } + + public static Map> convertStringIntoMap(String jsonString) { + try { + return mapper.readValue(jsonString, new TypeReference>>() { + }); + } catch (Exception e) { + log.error("Error converting object: " + e.getMessage(), e); + return null; + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index a831c2dc..f4f53d0b 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -1,11 +1,19 @@ package net.gepafin.tendermanagement.util; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import net.gepafin.tendermanagement.web.rest.api.errors.UnauthorizedAccessException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import java.util.Map; @@ -28,4 +36,24 @@ public class Validator { return userService.validateUser(Long.parseLong(userInfo.get("userId").toString())); } + public Boolean checkIsSuperAdmin(HttpServletRequest request) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.isAuthenticated()) { + // Check if the user has the ROLE_SUPER_ADMIN authority + for (GrantedAuthority authority : authentication.getAuthorities()) { + if (RoleStatusEnum.ROLE_SUPER_ADMIN.getValue().equals(authority.getAuthority())) { + return true; + } + } + } + return false; + } + + public void validateRequest(HttpServletRequest request,RoleStatusEnum role) { + if (RoleStatusEnum.ROLE_SUPER_ADMIN.equals(role) && Boolean.FALSE.equals(checkIsSuperAdmin(request))) { + throw new UnauthorizedAccessException(Status.UNAUTHORIZED, Translator.toLocale(GepafinConstant.INVALID_USER)); + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 8eaeca2d..18281f96 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -10,6 +10,7 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; @@ -37,10 +38,11 @@ public interface UserApi { @RequestMapping(value = "", produces = {"application/json"}, method = RequestMethod.POST) - @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - default ResponseEntity> createUser( +// @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + default ResponseEntity> createUser(HttpServletRequest request, + @Parameter(description = "temp spid Token", required = false) @RequestParam(value = "tempToken", required = false) String tempToken, @Parameter(description = "User request object", required = true) @Validated @RequestBody UserReq userReq) { - return new ResponseEntity>(HttpStatus.NOT_IMPLEMENTED); + return new ResponseEntity>(HttpStatus.NOT_IMPLEMENTED); } @Operation(summary = "Api to update user", @@ -174,6 +176,7 @@ public interface UserApi { @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) UserStatusEnum status) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } + @Operation(summary = "Api to get valid user from token", responses = { @ApiResponse(responseCode = "200", description = "OK"), @@ -186,6 +189,38 @@ public interface UserApi { @GetMapping(value = "/me", produces = { "application/json" }) ResponseEntity> getValidUser(HttpServletRequest request); + + @Operation(summary = "Api to validate existing user from saml token", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/sso/validate/existing-user/{token}", + produces = { "application/json" }) + ResponseEntity> validateExistingUserToken(HttpServletRequest request, + @Parameter(description = "The spid token", required = true) @PathVariable("token") String token); + + + @Operation(summary = "Api to validate new user from saml token", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/sso/validate/new-user/{token}", + produces = { "application/json" }) + ResponseEntity> validateNewUserToken(HttpServletRequest request, + @Parameter(description = "The spid token", required = true) @PathVariable("token") String token); + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index d036a7f0..ccb255c1 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -7,6 +7,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; @@ -33,9 +34,9 @@ public class UserApiController implements UserApi { private UserService userService; @Override - public ResponseEntity> createUser(@RequestBody UserReq userReq) { + public ResponseEntity> createUser(HttpServletRequest request, String tempToken, @RequestBody UserReq userReq) { log.info("Create User with - Request Body: {}", userReq); - UserResponseBean createdUser = userService.createUser(userReq); + JWTToken createdUser = userService.createUser(request, tempToken, userReq); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createdUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_CREATED_SUCCESS_MSG))); } @@ -124,4 +125,19 @@ public class UserApiController implements UserApi { .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); } + + @Override + public ResponseEntity> validateExistingUserToken(HttpServletRequest request, String token) { + log.info("User login attempt via spid token"); + JWTToken data = userService.validateExistingUserToken(request, token); + return ResponseEntity.ok(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.TOKEN_VALIDATE_SUCCESS_MGE))); + } + + @Override + public ResponseEntity> validateNewUserToken(HttpServletRequest request, String token) { + log.info("User validating spid token"); + UserSamlResponse data = userService.validateNewUserToken(request,token); + return ResponseEntity.ok(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.TOKEN_VALIDATE_SUCCESS_MGE))); + } + } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1e41a2e9..1c16a251 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -42,4 +42,5 @@ spring.main.allow-circular-references=true isVatCheckGloballyDisabled = true vatCheckNewToken: 66026bd891a51044e90e08c4 +fe.base.url=http://gepafin-staging-fe.s3-website.eu-central-1.amazonaws.com diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index d7377f5c..212db4d3 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -712,28 +712,22 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + - + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 981ed852..fcba1c30 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -8,6 +8,7 @@ delete_user_error_msg=An error occurred while deleting the user. get_user_success_msg=User retrieved successfully. get_user_error_msg=An error occurred while retrieving the user. user.not.active=User is not active. Please contact support. +user.already.exist.msg=User already exist for this codice fiscale. # Role-related messages role.created.success=Role created successfully. role.updated.success=Role updated successfully. @@ -184,3 +185,6 @@ valid.vat.number=The VAT number is not valid for field {0}. failed.retain.field=Failed to retain specific fields. application.is.incomplete = The application is incomplete. +token.validate.success=Token validated successfully. +invalid.request=Invalid Request. +codice.fiscale.exists=This codice fiscale is already associated with another user. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 5a7899df..aa815e8c 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -8,6 +8,7 @@ delete_user_error_msg=Si � verificato un errore durante l'eliminazione dell'ut get_user_success_msg=Utente recuperato con successo. get_user_error_msg=Si � verificato un errore durante il recupero dell'utente. user.not.active=Utente non attivo. Si prega di contattare il supporto. +user.already.exist.msg=L'utente esiste già per questo codice fiscale. # Role-related messages role.created.success=Ruolo creato con successo. role.updated.success=Ruolo aggiornato con successo. @@ -176,3 +177,6 @@ validation.marca.da.bollo=Il campo {0} deve essere una Marca Da Bollo valida con validation.piva=Il numero di partita IVA per {0} deve essere lungo fino a 11 cifre. valid.vat.number=Il numero di partita IVA non � valido per il campo {0}. failed.retain.field=Impossibile conservare campi specifici. +token.validate.success=Token convalidato con successo. +invalid.request=Richiesta non valida. +codice.fiscale.exists=Questo codice fiscale è già associato ad un altro utente. From d521dc464c3a612887c4f91acc444786ff97ee31 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 25 Sep 2024 20:29:57 +0530 Subject: [PATCH 134/145] added logger for saml --- .../tendermanagement/config/SamlSuccessHandler.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index 1ef52f87..32d07a8f 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -60,16 +60,19 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { samlResponseLogEntity.setAuthenticationObject(userAttributesJson); samlResponseLogEntity.setToken(token); samlResponseLogRepository.save(samlResponseLogEntity); + + String redirectUrl = feBaseUrl; - // Successful login logic logger.info("SAML login successful for user: " + principal.getName()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); UserEntity userEntity = userRepository.findByCodiceFiscale(cf).orElse(null); if (userEntity == null) { - response.sendRedirect(feBaseUrl + "/registration?temp_token=" + token); + redirectUrl += "/registration?temp_token=" + token; } else { - response.sendRedirect(feBaseUrl + "/login?temp_token=" + token); + redirectUrl += "/login?temp_token=" + token; } + response.sendRedirect(redirectUrl); + logger.info("SAML redirect Url: " + redirectUrl); } catch (Exception e) { logger.error("Error processing SAML success handler", e); } From 9cc3ca14161206ee765befdb7f2f6b2f38abc956 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 25 Sep 2024 20:33:53 +0530 Subject: [PATCH 135/145] updated code --- .../net/gepafin/tendermanagement/config/SamlSuccessHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index 32d07a8f..a8af08a7 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -38,7 +38,7 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { @Autowired private UserRepository userRepository; - @Value("fe.base.url") + @Value("${fe.base.url}") private String feBaseUrl; @Override From c89adce8508e077b40323b012aa94ffb9856f954 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 25 Sep 2024 20:43:27 +0530 Subject: [PATCH 136/145] updated code --- .../gepafin/tendermanagement/constants/GepafinConstant.java | 2 +- .../tendermanagement/web/rest/api/impl/UserApiController.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 39e01825..3866e145 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -157,7 +157,7 @@ public class GepafinConstant { public static final String IS_PIVA="isPIVA"; public static final String FAILED_RETAIN_FIELD="failed.retain.field"; public static final String USER_ALREADY_EXIST_MSG = "user.already.exist.msg"; - public static final String TOKEN_VALIDATE_SUCCESS_MGE = "token.validate.success.mge"; + public static final String TOKEN_VALIDATE_SUCCESS_MSE = "token.validate.success"; public static final String INVALID_REQUEST = "invalid.request"; public static final String CODICE_FISCALE_EXISTS = "codice.fiscale.exists"; public static final String TOTAL_STEPS_NOT_BE_ZERO="total.steps.not.zero"; diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index ccb255c1..ca13268a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -130,14 +130,14 @@ public class UserApiController implements UserApi { public ResponseEntity> validateExistingUserToken(HttpServletRequest request, String token) { log.info("User login attempt via spid token"); JWTToken data = userService.validateExistingUserToken(request, token); - return ResponseEntity.ok(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.TOKEN_VALIDATE_SUCCESS_MGE))); + return ResponseEntity.ok(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.TOKEN_VALIDATE_SUCCESS_MSE))); } @Override public ResponseEntity> validateNewUserToken(HttpServletRequest request, String token) { log.info("User validating spid token"); UserSamlResponse data = userService.validateNewUserToken(request,token); - return ResponseEntity.ok(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.TOKEN_VALIDATE_SUCCESS_MGE))); + return ResponseEntity.ok(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.TOKEN_VALIDATE_SUCCESS_MSE))); } } \ No newline at end of file From 39b0ba994c35f9ae94aa54da8713e7d770f26860 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 25 Sep 2024 21:41:50 +0530 Subject: [PATCH 137/145] Updated form field data --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index d7377f5c..60292ab0 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -736,4 +736,10 @@ + + + + id = 13 + + From ff74b9afcaaef2e68db42fce22afd0ccac99b5c8 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 26 Sep 2024 12:29:33 +0530 Subject: [PATCH 138/145] Updated configuration --- src/main/resources/application-production.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 51940c65..af9d5e38 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -6,6 +6,6 @@ spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration spring.h2.console.enabled=true -base-url=http://79.137.88.15 +base-url=http://bandi.gepafin.it isVatCheckGloballyDisabled = false From ea30c41002441827bc8cb812759c056ebd2ed1d1 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 26 Sep 2024 13:25:57 +0530 Subject: [PATCH 139/145] added dob filed for user --- .../gepafin/tendermanagement/config/SamlFailureHandler.java | 2 +- src/main/java/net/gepafin/tendermanagement/dao/UserDao.java | 3 +++ .../net/gepafin/tendermanagement/entities/UserEntity.java | 3 +++ .../net/gepafin/tendermanagement/model/request/UserReq.java | 4 ++++ .../tendermanagement/model/response/LoginResponse.java | 4 ++++ .../tendermanagement/model/response/UserResponseBean.java | 4 ++++ .../tendermanagement/service/impl/AuthenticationService.java | 2 ++ src/main/resources/db/changelog/db.changelog-1.0.0.xml | 1 + 8 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java index 1e740869..81df79e3 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java @@ -17,7 +17,7 @@ public class SamlFailureHandler implements AuthenticationFailureHandler { private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class); - @Value("fe.base.url") + @Value("${fe.base.url}") private String feBaseUrl; @Override diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 8dddbfea..b615f263 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -110,6 +110,7 @@ public class UserDao { userEntity.setPhoneNumber(userReq.getPhoneNumber()); userEntity.setRoleEntity(roleDao.validateRole(userReq.getRoleId())); userEntity.setCodiceFiscale(userReq.getCodiceFiscale()); + userEntity.setDateOfBirth(userReq.getDateOfBirth()); return userEntity; } @@ -130,6 +131,8 @@ public class UserDao { RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(userEntity.getRoleEntity()); userResponseBean.setRole(roleResponseBean); userResponseBean.setLastLogin(userEntity.getLastLogin()); + userResponseBean.setCodiceFiscale(userEntity.getCodiceFiscale()); + userResponseBean.setDateOfBirth(userEntity.getDateOfBirth()); return userResponseBean; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java index 0a0c9016..37b0ab57 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -61,4 +61,7 @@ public class UserEntity extends BaseEntity { @Column(name = "CODICE_FISCALE") private String codiceFiscale; + + @Column(name = "DATE_OF_BIRTH") + private LocalDateTime dateOfBirth; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java index e81bdaf3..508baabe 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -1,5 +1,7 @@ package net.gepafin.tendermanagement.model.request; +import java.time.LocalDateTime; + import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -33,5 +35,7 @@ public class UserReq { private String country; private String codiceFiscale; + + private LocalDateTime dateOfBirth; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java index 64af6b1a..6317724e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java @@ -35,6 +35,10 @@ public class LoginResponse { private String status; private LocalDateTime lastLogin; + + private String codiceFiscale; + + private LocalDateTime dateOfBirth; private LocalDateTime createdDate; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java index 5c1a8ef2..565e2561 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java @@ -32,5 +32,9 @@ public class UserResponseBean extends BaseBean { private UserStatusEnum status; private LocalDateTime lastLogin; + + private String codiceFiscale; + + private LocalDateTime dateOfBirth; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 1b61baa7..457a1e5d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -104,6 +104,8 @@ public class AuthenticationService { loginResponse.setStatus(user.getStatus()); loginResponse.setCity(user.getCity()); loginResponse.setLastLogin(user.getLastLogin()); + loginResponse.setCodiceFiscale(user.getCodiceFiscale()); + loginResponse.setDateOfBirth(user.getDateOfBirth()); loginResponse.setCreatedDate(user.getCreatedDate()); loginResponse.setUpdatedDate(user.getUpdatedDate()); return loginResponse; diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 212db4d3..cfde8228 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -726,6 +726,7 @@ + From 40e5ab9e910e4ffcc6ea4dda52c89f87ab44fcdb Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 26 Sep 2024 17:31:44 +0530 Subject: [PATCH 140/145] updated code for create user api --- .../constants/GepafinConstant.java | 4 + .../gepafin/tendermanagement/dao/RoleDao.java | 5 ++ .../gepafin/tendermanagement/dao/UserDao.java | 90 ++++++++++++++----- .../model/request/UserReq.java | 8 +- .../repositories/RoleRepository.java | 2 + src/main/resources/message_en.properties | 3 + src/main/resources/message_it.properties | 3 + 7 files changed, 86 insertions(+), 29 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 3866e145..d79edb37 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -163,4 +163,8 @@ public class GepafinConstant { public static final String TOTAL_STEPS_NOT_BE_ZERO="total.steps.not.zero"; public static final String COMPLETED_STEPS_NOT_VALID="completed.steps.not.valid"; public static final String FIELD_ID_NOT_FOUND="field.id.not.found"; + public static final String VALIDATE_EMAIL = "validate.email"; + public static final String ROLE_ID_MANDATORY = "role.id.mandatory"; + public static final String VALIDATE_PASSWORD = "validate.password"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index ef80acbb..cb4f41fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -4,6 +4,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RegionEntity; import net.gepafin.tendermanagement.entities.RoleEntity; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.model.request.RoleReq; import net.gepafin.tendermanagement.model.response.RegionResponseBean; import net.gepafin.tendermanagement.model.response.RoleResponseBean; @@ -119,4 +120,8 @@ public class RoleDao { log.info("Total roles found: {}", roles.size()); return roles; } + + public RoleEntity getRoleByType(RoleStatusEnum roleStatus) { + return roleRepository.findByRoleType(roleStatus.getValue()); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index b615f263..252c88f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.RoleResponseBean; @@ -28,6 +29,8 @@ import org.springframework.stereotype.Repository; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; +import java.util.regex.Pattern; + @Repository public class UserDao { @@ -46,32 +49,57 @@ public class UserDao { private RoleDao roleDao; public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { - log.info("Creating user with email: {}", userReq.getEmail()); - if (userRepository.existsByEmailIgnoreCase(userReq.getEmail())) { - log.error("User creation failed: Email {} already exists", userReq.getEmail()); - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); - } - if (Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getCodiceFiscale())) && userRepository.existsByCodiceFiscale(userReq.getCodiceFiscale())) { - log.error("User creation failed: CodiceFiscale {} already exists", userReq.getCodiceFiscale()); - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CODICE_FISCALE_EXISTS)); - } - if(tempToken == null && (StringUtils.isEmpty(userReq.getPassword()) || StringUtils.isEmpty(userReq.getConfPassword()))) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_REQUEST)); - } - if (tempToken == null && !userReq.getPassword().equals(userReq.getConfPassword())) { - log.error("User creation failed: Passwords do not match for email {}", userReq.getEmail()); - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); - } - if (tempToken == null && userReq.getPassword().length() < 8) { - log.error("User creation failed: Password length is less than 8 characters for email {}", userReq.getEmail()); - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_MIN_LEN)); - } + + if (Boolean.FALSE.equals(isValidEmail(userReq.getEmail()))) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.VALIDATE_EMAIL)); + } + log.info("Creating user with email: {}", userReq.getEmail()); + if (userRepository.existsByEmailIgnoreCase(userReq.getEmail())) { + log.error("User creation failed: Email {} already exists", userReq.getEmail()); + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); + } + if (Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getCodiceFiscale())) + && userRepository.existsByCodiceFiscale(userReq.getCodiceFiscale())) { + log.error("User creation failed: CodiceFiscale {} already exists", userReq.getCodiceFiscale()); + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CODICE_FISCALE_EXISTS)); + } + if (tempToken == null && userReq.getRoleId() == null) { + throw new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.ROLE_ID_MANDATORY)); + } + if(tempToken != null) { + userReq.setRoleId(null); + } + validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken); UserEntity userEntity = convertUserRequestToUserEntity(userReq); userEntity = userRepository.save(userEntity); log.info("User created with ID: {}", userEntity.getId()); return authService.getJWTTokenBean(userEntity, Boolean.TRUE); } + + private void validatePassword(String password, String confirmPassword, String tempToken) { + if (StringUtils.isEmpty(password) || StringUtils.isEmpty(confirmPassword)) { + if(tempToken == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_PASSWORD)); + }else if(Boolean.FALSE.equals(StringUtils.isEmpty(password) && StringUtils.isEmpty(confirmPassword))){ + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_PASSWORD)); + } + } + + if (password != null && !password.equals(confirmPassword)) { + log.error("User creation failed: Passwords do not match"); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); + } + + if (password != null && password.length() < 8) { + log.error("User creation failed: Password length is less than 8 characters"); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_MIN_LEN)); + } + } public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { log.info("Updating user with ID: {}", userId); @@ -108,13 +136,21 @@ public class UserDao { userEntity.setOrganization(userReq.getOrganization()); userEntity.setAddress(userReq.getAddress()); userEntity.setPhoneNumber(userReq.getPhoneNumber()); - userEntity.setRoleEntity(roleDao.validateRole(userReq.getRoleId())); + userEntity.setRoleEntity(getRoleEntity(userReq.getRoleId())); userEntity.setCodiceFiscale(userReq.getCodiceFiscale()); userEntity.setDateOfBirth(userReq.getDateOfBirth()); return userEntity; } - private UserResponseBean convertUserEntityToUserResponse(UserEntity userEntity) { + private RoleEntity getRoleEntity(Long roleId) { + if(roleId != null) { + return roleDao.validateRole(roleId); + } else { + return roleDao.getRoleByType(RoleStatusEnum.ROLE_BENEFICIARY); + } + } + + private UserResponseBean convertUserEntityToUserResponse(UserEntity userEntity) { UserResponseBean userResponseBean = new UserResponseBean(); userResponseBean.setId(userEntity.getId()); userResponseBean.setCreatedDate(userEntity.getCreatedDate()); @@ -225,6 +261,16 @@ public class UserDao { authService.logout(request, response); log.info("User successfully logged out."); } + + + public static Boolean isValidEmail(String email) { + String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$"; + if (email == null || email.isEmpty()) { + return false; + } + Pattern pattern = Pattern.compile(EMAIL_REGEX); + return pattern.matcher(email).matches(); + } public UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq) { log.info("Updating status for user with ID: {}", userId); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java index 508baabe..c53d65aa 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -1,17 +1,11 @@ package net.gepafin.tendermanagement.model.request; import java.time.LocalDateTime; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Data; @Data public class UserReq { - @NotBlank - @Email private String email; private String password; @@ -23,7 +17,7 @@ public class UserReq { private String lastName; private String phoneNumber; - @NotNull + private Long roleId; private String organization; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java index e009e6a3..a48eade5 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java @@ -6,4 +6,6 @@ import org.springframework.stereotype.Repository; @Repository public interface RoleRepository extends JpaRepository { + + RoleEntity findByRoleType(String roleType); } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index d58e019b..cf80165c 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -9,6 +9,8 @@ get_user_success_msg=User retrieved successfully. get_user_error_msg=An error occurred while retrieving the user. user.not.active=User is not active. Please contact support. user.already.exist.msg=User already exist for this codice fiscale. +validate.email=The email is mandatory and must be in the correct format. Please verify and try again. +validate.password=The password and confPassword are mandatory. Please verify and try again. # Role-related messages role.created.success=Role created successfully. role.updated.success=Role updated successfully. @@ -18,6 +20,7 @@ create.role.error=Error occurred while creating the role. update.role.error=Error occurred while updating the role. role.fetch.success=Role fetched successfully. delete.role.error=Error occurred while deleting the role. +role.id.mandatory=Role id is mandatory. # Region-related messages region.created.success=Region created successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 87077449..9582a89d 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -9,6 +9,8 @@ get_user_success_msg=Utente recuperato con successo. get_user_error_msg=Si � verificato un errore durante il recupero dell'utente. user.not.active=Utente non attivo. Si prega di contattare il supporto. user.already.exist.msg=L'utente esiste gi� per questo codice fiscale. +validate.email=L'email è obbligatoria e deve essere nel formato corretto. Si prega di verificare e riprovare. +validate.password=La password e confPassword sono obbligatorie. Verifica e riprova. # Role-related messages role.created.success=Ruolo creato con successo. role.updated.success=Ruolo aggiornato con successo. @@ -18,6 +20,7 @@ create.role.error=Errore durante la creazione del ruolo. update.role.error=Errore durante l'aggiornamento del ruolo. role.fetch.success=Ruolo recuperato con successo. delete.role.error=Errore durante l'eliminazione del ruolo. +role.id.mandatory=L'ID del ruolo è obbligatorio. # Region-related messages region.created.success=Regione creata con successo. From d8d4396a04e52303a74cde0641b3bb6a4550d469 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 26 Sep 2024 20:01:19 +0530 Subject: [PATCH 141/145] Updated configuration --- src/main/resources/application-production.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index af9d5e38..4860dd7e 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -1,5 +1,5 @@ # DataSource Configuration -spring.datasource.url=jdbc:postgresql://79.137.88.14:21543/gepaDb +spring.datasource.url=jdbc:postgresql://bandidb.gepafin.it:21543/gepaDb spring.datasource.username=usergepa spring.datasource.password=nRHMi7esdgHJiIm3L5ctrSJ0 spring.datasource.driver-class-name=org.postgresql.Driver From fb75408152087d7d3b9647c4c8f2994ce06f7071 Mon Sep 17 00:00:00 2001 From: rajeshkhore <36757840+rajeshkhore@users.noreply.github.com> Date: Fri, 27 Sep 2024 11:59:32 +0530 Subject: [PATCH 142/145] Update base url in application production properties --- src/main/resources/application-production.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 4860dd7e..be371126 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -6,6 +6,6 @@ spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration spring.h2.console.enabled=true -base-url=http://bandi.gepafin.it +base-url=http://bandi-api.gepafin.it isVatCheckGloballyDisabled = false From e5e2894b3d7886427cec383a881baddd4f8f0777 Mon Sep 17 00:00:00 2001 From: nisha Date: Sat, 28 Sep 2024 08:03:01 +0530 Subject: [PATCH 143/145] Implemnted new flow for application form data --- .../tendermanagement/dao/ApplicationDao.java | 79 +++++++++++++++---- .../tendermanagement/dao/FlowFormDao.java | 40 +++++++--- .../gepafin/tendermanagement/dao/FormDao.java | 47 +++++++++-- .../response/NextOrPreviousFormResponse.java | 3 + .../tendermanagement/util/FieldValidator.java | 23 +++--- 5 files changed, 151 insertions(+), 41 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index aae686d7..c7ad96c5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -10,10 +10,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBea import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.*; -import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository; -import net.gepafin.tendermanagement.repositories.ApplicationFormRepository; -import net.gepafin.tendermanagement.repositories.ApplicationRepository; -import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; +import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.DocumentService; import net.gepafin.tendermanagement.service.FormService; @@ -66,6 +63,10 @@ public class ApplicationDao { @Autowired private FlowEdgesRepository flowEdgesRepository; + @Autowired + private FlowDataRepository flowDataRepository; + + public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId,Long applicationId) { FormEntity formEntity = formService.validateForm(formId); CallEntity call = callService.validatePublishedCall(formEntity.getCall().getId()); @@ -85,12 +86,6 @@ public class ApplicationDao { return applicationFormEntity1; } - public void validateFormId(FormEntity formEntity, CallEntity callEntity) { - if (Boolean.FALSE.equals(formEntity.getId().equals(callEntity.getInitialForm()))) { - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.FORM_ID_DOES_NOT_MACTHES)); - } - } - public ApplicationFormEntity createApplicationFormEntity(ApplicationEntity application, FormEntity formEntity) { ApplicationFormEntity applicationFormEntity = new ApplicationFormEntity(); applicationFormEntity.setApplication(application); @@ -278,6 +273,9 @@ public class ApplicationDao { for (ApplicationFormFieldEntity applicationFormFieldEntity1 : applicationFormFieldEntities) { if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId())) { applicationFormFieldEntity = applicationFormFieldEntity1; + if(applicationFormEntity.getForm().getId().equals(applicationFormEntity.getApplication().getCall().getInitialForm())){ + validateRequiredFields(applicationFormEntity.getForm(),applicationFormEntity.getApplication(), applicationFormFieldRequestBean.getFieldId()); + } break; } else { applicationFormFieldEntity = new ApplicationFormFieldEntity(); @@ -286,7 +284,9 @@ public class ApplicationDao { } } Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); + if(applicationFormFieldRequestBean.getFieldValue() ==null || Boolean.FALSE.equals(applicationFormFieldRequestBean.getFieldValue().isEmpty())) { applicationFormFieldEntity.setFieldValue(applicationFormFieldRequestBean.getFieldValue()); + } return applicationFormFieldRepository.save(applicationFormFieldEntity); } @@ -464,14 +464,20 @@ public class ApplicationDao { if (status.equals(ApplicationStatusTypeEnum.SUBMIT)) { CallEntity callEntity = applicationEntity.getCall(); - Long initialFormId = callEntity.getInitialForm(); - Long finalFormId = callEntity.getFinalForm(); -// if (initialFormId == null || finalFormId == null) { +// Long initialFormId = callEntity.getInitialForm(); +// Long finalFormId = callEntity.getFinalForm(); +//// if (initialFormId == null || finalFormId == null) { +//// throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); +//// } +// ApplicationFormEntity initialApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), initialFormId); +// ApplicationFormEntity finalApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), finalFormId); +// if (initialApplicationForm == null || finalApplicationForm == null) { // throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); // } - ApplicationFormEntity initialApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), initialFormId); - ApplicationFormEntity finalApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), finalFormId); - if (initialApplicationForm == null || finalApplicationForm == null) { + List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); + Long totalSteps=flowFormDao.calculateTotalSteps(flowEdgesList); + Integer completedSteps=flowFormDao.getCompletedSteps(applicationEntity); + if (totalSteps.intValue() != completedSteps) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); } applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue()); @@ -514,4 +520,45 @@ public class ApplicationDao { validator.validate(); } + public void validateRequiredFields(FormEntity formEntity, ApplicationEntity applicationEntity, String fieldId) { + FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndCallId( + formEntity.getId(), applicationEntity.getCall().getId()); + + if (flowDataEntity == null) { + return; + } + + ApplicationFormFieldEntity applicationFormFieldEntity = applicationFormFieldRepository + .findByFieldIdAndApplicationFormFormIdAndApplicationFormApplicationId( + flowDataEntity.getChoosenField(), formEntity.getId(), applicationEntity.getId()) + .orElse(null); + + if (applicationFormFieldEntity == null || !fieldId.equals(applicationFormFieldEntity.getFieldId())) { + return; + } + List nextFormIds = flowEdgesRepository.findBySourceIdAndCallId( + formEntity.getId(), applicationEntity.getCall().getId()) + .stream() + .map(FlowEdgesEntity::getTargetId) + .collect(Collectors.toList()); + + Optional nextFormIdOptional = flowDataRepository.findByChoosenValueAndFormIdIn( + applicationFormFieldEntity.getFieldValue(), nextFormIds) + .map(FlowDataEntity::getFormId); + + if (nextFormIdOptional.isPresent()) { + Long nextFormId = nextFormIdOptional.get(); + + FormEntity nextForm = formService.validateForm(nextFormId); + ApplicationFormEntity nextApplicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId( + applicationEntity.getId(), nextForm.getId()); + + if (nextApplicationFormEntity != null) { + List nextApplicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(nextApplicationFormEntity.getId()); + applicationFormFieldRepository.deleteAll(nextApplicationFormFieldEntities); + applicationFormRepository.delete(nextApplicationFormEntity); + } + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 63287e0d..57f3c756 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -1,11 +1,9 @@ package net.gepafin.tendermanagement.dao; -import java.util.Comparator; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.repositories.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -46,7 +44,9 @@ public class FlowFormDao { @Autowired private FormService formService; @Autowired - private FormRepository formRepository; + private FormDao formDao; + + // Long getNextForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) { // // vlaidation if next form findout and cuuent from is not fill the give error @@ -274,16 +274,24 @@ public class FlowFormDao { } } NextOrPreviousFormResponse nextOrPreviousFormResponse = null; - if (calculatedFormId != null) { - nextOrPreviousFormResponse = setNextOrPreviousResponse(calculatedFormId, applicationEntity); + if (calculatedFormId == null && formId == null) { + FormEntity form=formService.validateForm(applicationEntity.getCall().getInitialForm()); + calculatedFormId=form.getId(); } + if (calculatedFormId == null) { + calculatedFormId=formId; + } + nextOrPreviousFormResponse = setNextOrPreviousResponse(calculatedFormId, applicationEntity); + return nextOrPreviousFormResponse; } private NextOrPreviousFormResponse setNextOrPreviousResponse(Long calculatedFormId, ApplicationEntity applicationEntity) { NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); + Integer completedSteps=0; FormEntity formEntity = formService.validateForm(calculatedFormId); nextOrPreviousFormResponse.setFormId(calculatedFormId); + nextOrPreviousFormResponse.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(applicationEntity.getStatus())); nextOrPreviousFormResponse.setApplicationFormResponse( applicationDao.processForm(formEntity, applicationEntity)); nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId()); @@ -292,13 +300,27 @@ public class FlowFormDao { List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); Long totalFormSteps = calculateTotalSteps(flowEdgesList); Long currentStep = calculateCurrentStep(formEntity); - List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId()); nextOrPreviousFormResponse.setTotalFormSteps(totalFormSteps); - nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(applicationFormList.size())); + completedSteps = getCompletedSteps(applicationEntity); + nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(completedSteps)); nextOrPreviousFormResponse.setCurrentStep(currentStep); return nextOrPreviousFormResponse; } + public Integer getCompletedSteps(ApplicationEntity applicationEntity) { + Integer completedSteps=0; + List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId()); + List applicationFormFieldEntities=new ArrayList<>(); + for (ApplicationFormEntity applicationFormEntity:applicationFormList){ + applicationFormFieldEntities=applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); + Boolean isCompleted=formDao.validateCompletedSteps(applicationFormFieldEntities, applicationEntity, applicationFormEntity.getForm()); + if(Boolean.TRUE.equals(isCompleted)){ + completedSteps++; + } + } + return completedSteps; + } + public Long calculateCurrentStep(FormEntity formEntity) { Long currentStep = 2l; if (formEntity.getId().equals(formEntity.getCall().getInitialForm())) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 1d5ad1a1..318253d2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -198,6 +198,8 @@ public class FormDao { public void validateFormField(List applicationFormFieldRequestList, ApplicationEntity applicationEntity, FormEntity formEntity) { Map formFieldMap = new LinkedHashMap(); for(ApplicationFormFieldRequestBean applicationFormFieldRequestBean:applicationFormFieldRequestList) { + if(applicationFormFieldRequestBean.getFieldValue()==null || applicationFormFieldRequestBean.getFieldValue().isEmpty()) + continue; formFieldMap.put(applicationFormFieldRequestBean.getFieldId(),applicationFormFieldRequestBean.getFieldValue()); } @@ -208,19 +210,19 @@ public class FormDao { formResponseBean.getContent().forEach(contentResponseBean -> { String fieldId = contentResponseBean.getId(); String value = (String) formFieldMap.get(fieldId); + String fieldLabel=contentResponseBean.getLabel(); if(value == null && isApplicationFormExist) { return; } FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); validator - .isRequired(value,fieldValidatorBean.getIsRequired(),fieldId) - .minLength(value, fieldValidatorBean.getMinLength(), fieldId) // Only applies if minLength is not null - .maxLength(value, fieldValidatorBean.getMaxLength(), fieldId) // Only applies if maxLength is not null - .matchesPattern(value, fieldValidatorBean.getPattern(), fieldId) // Only applies if pattern is present - .validateCustom(value, fieldValidatorBean.getCustom(), fieldId); // Add the custom validation here + .minLength(value, fieldValidatorBean.getMinLength(), fieldLabel) // Only applies if minLength is not null + .maxLength(value, fieldValidatorBean.getMaxLength(), fieldLabel) // Only applies if maxLength is not null + .matchesPattern(value, fieldValidatorBean.getPattern(), fieldLabel) // Only applies if pattern is present + .validateCustom(value, fieldValidatorBean.getCustom(), fieldLabel); // Add the custom validation here if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) { - String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldId); + String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldLabel); if(error != null) { validator.addError(error); } @@ -251,4 +253,37 @@ public class FormDao { } return error; } + public Boolean validateCompletedSteps(List applicationFormFieldEntityList, ApplicationEntity applicationEntity, FormEntity formEntity) { + Map formFieldMap = new LinkedHashMap(); + for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntityList) { + formFieldMap.put(applicationFormFieldEntity.getFieldId(),applicationFormFieldEntity.getFieldValue()); + } + + FormResponseBean formResponseBean = convertFormEntityToFormResponseBean(formEntity); + ApplicationFormEntity applicationFormEntity=applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),formEntity.getId()); + Boolean isApplicationFormExist= getApplicationFormExist(applicationFormEntity); + FieldValidator validator = FieldValidator.create(); + formResponseBean.getContent().forEach(contentResponseBean -> { + String fieldId = contentResponseBean.getId(); + String value = (String) formFieldMap.get(fieldId); + + if(value == null && isApplicationFormExist) { + return; + } + FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); + validator + .isRequired(value,fieldValidatorBean.getIsRequired(),fieldId); + if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) { + String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldId); + if(error != null) { + validator.addError(error); + } + } + }); + if (validator.hasErrors()) { + return false; // Validation failed, return false + } + return true; + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java index 55ee34be..0c39d4a9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; @Data public class NextOrPreviousFormResponse { @@ -16,6 +17,8 @@ public class NextOrPreviousFormResponse { private Long completedSteps; private Long currentStep; + + private ApplicationStatusTypeEnum applicationStatus; private FormApplicationResponse applicationFormResponse; diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 71c76f1a..26edffff 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -27,16 +27,16 @@ public class FieldValidator { private VatCheckDao vatCheckDao; - public FieldValidator notNull(Object object, String fieldName) { + public FieldValidator notNull(Object object, String fieldLabel) { if (Objects.isNull(object)) { - errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_NULL), fieldName)); + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_NULL), fieldLabel)); } return this; } - public FieldValidator notEmpty(List list, String fieldName) { + public FieldValidator notEmpty(List list, String fieldLabel) { if (list == null || list.isEmpty()) { - errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_EMPTY), fieldName)); + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_EMPTY), fieldLabel)); } return this; } @@ -46,23 +46,23 @@ public class FieldValidator { throw new ValidationException(Status.VALIDATION_ERROR, errors, Translator.toLocale(GepafinConstant.VALIDATION_MESSAGE)); } } - public FieldValidator minLength(String value, Long minLength, String fieldName) { + public FieldValidator minLength(String value, Long minLength, String fieldLabel) { if (minLength != null && value != null && value.length() < minLength) { - errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN_LENGTH), fieldName, minLength)); + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN_LENGTH), fieldLabel, minLength)); } return this; } - public FieldValidator maxLength(String value, Long maxLength, String fieldName) { + public FieldValidator maxLength(String value, Long maxLength, String fieldLabel) { if (maxLength != null && value != null && value.length() > maxLength) { - errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX_LENGTH), fieldName, maxLength)); + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX_LENGTH), fieldLabel, maxLength)); } return this; } - public FieldValidator matchesPattern(String value, String pattern, String fieldName) { + public FieldValidator matchesPattern(String value, String pattern, String fieldLabel) { if (value != null && pattern != null && !value.matches(pattern)) { - errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_PATTERN), fieldName)); + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_PATTERN), fieldLabel)); } return this; } @@ -147,4 +147,7 @@ public class FieldValidator { } return this; } + public boolean hasErrors() { + return !errors.isEmpty(); + } } From c30106a63b3411561479840f67fee3c2fb466c8a Mon Sep 17 00:00:00 2001 From: rajesh Date: Sun, 29 Sep 2024 12:54:55 +0530 Subject: [PATCH 144/145] updated code --- .../gepafin/tendermanagement/dao/FormDao.java | 56 ++++++++----------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 318253d2..36ff8eb8 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -238,9 +238,31 @@ public class FormDao { return false; } + public Boolean validateCompletedSteps(List applicationFormFieldEntityList, ApplicationEntity applicationEntity, FormEntity formEntity) { + Map formFieldMap = new LinkedHashMap(); + for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntityList) { + formFieldMap.put(applicationFormFieldEntity.getFieldId(),applicationFormFieldEntity.getFieldValue()); + } + + FormResponseBean formResponseBean = convertFormEntityToFormResponseBean(formEntity); + FieldValidator validator = FieldValidator.create(); + formResponseBean.getContent().forEach(contentResponseBean -> { + String fieldId = contentResponseBean.getId(); + String value = (String) formFieldMap.get(fieldId); + + FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); + validator + .isRequired(value,fieldValidatorBean.getIsRequired(),fieldId); + }); + if (validator.hasErrors()) { + return false; // Validation failed, return false + } + return true; + } public String validateVatNumber(String value,String customRule,String fieldId){ String error=null; - if (value.matches("^\\d{1,11}$")) { + + if (value!=null && value.matches("^\\d{1,11}$")) { Map customData=null; try { Map vatCheckResponse = vatCheckDao.checkVatNumberApi(value); @@ -253,37 +275,5 @@ public class FormDao { } return error; } - public Boolean validateCompletedSteps(List applicationFormFieldEntityList, ApplicationEntity applicationEntity, FormEntity formEntity) { - Map formFieldMap = new LinkedHashMap(); - for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntityList) { - formFieldMap.put(applicationFormFieldEntity.getFieldId(),applicationFormFieldEntity.getFieldValue()); - } - - FormResponseBean formResponseBean = convertFormEntityToFormResponseBean(formEntity); - ApplicationFormEntity applicationFormEntity=applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),formEntity.getId()); - Boolean isApplicationFormExist= getApplicationFormExist(applicationFormEntity); - FieldValidator validator = FieldValidator.create(); - formResponseBean.getContent().forEach(contentResponseBean -> { - String fieldId = contentResponseBean.getId(); - String value = (String) formFieldMap.get(fieldId); - - if(value == null && isApplicationFormExist) { - return; - } - FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); - validator - .isRequired(value,fieldValidatorBean.getIsRequired(),fieldId); - if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) { - String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldId); - if(error != null) { - validator.addError(error); - } - } - }); - if (validator.hasErrors()) { - return false; // Validation failed, return false - } - return true; - } } From 328726d12f311a580f14d4ee0d900095c316420a Mon Sep 17 00:00:00 2001 From: nishainnogent Date: Sun, 29 Sep 2024 21:33:23 +0530 Subject: [PATCH 145/145] Updated code --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index c7ad96c5..e520a6ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -211,8 +211,7 @@ public class ApplicationDao { ApplicationResponse responseBean = new ApplicationResponse(); List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); Long totalFormSteps = flowFormDao.calculateTotalSteps(flowEdgesList); - List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId()); - Long completedSteps=(Long.valueOf(applicationFormList.size())); + Long completedSteps= Long.valueOf(flowFormDao.getCompletedSteps(applicationEntity)); Integer progress=calculateProgress(totalFormSteps,completedSteps); responseBean.setId(applicationEntity.getId()); responseBean.setProgress(progress);