56
.gitignore
vendored
56
.gitignore
vendored
@@ -1,24 +1,42 @@
|
|||||||
# Compiled class file
|
HELP.md
|
||||||
*.class
|
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*
|
|
||||||
|
|||||||
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
4
Dockerfile
Normal file
4
Dockerfile
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
FROM amazoncorretto:17.0.8-alpine3.17
|
||||||
|
EXPOSE 8080
|
||||||
|
ADD /target/tendermanagement-0.0.1-SNAPSHOT.jar tendermanagement-0.0.1-SNAPSHOT.jar
|
||||||
|
ENTRYPOINT ["java", "-jar","tendermanagement-0.0.1-SNAPSHOT.jar"]
|
||||||
64
Jenkinsfile
vendored
Normal file
64
Jenkinsfile
vendored
Normal file
@@ -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@79.137.88.15 "sh gepafin-production-api.sh"'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
# GEPAFIN-BE
|
# GEPAFIN-BE
|
||||||
Back Gepafin Project
|
Back Gepafin Project
|
||||||
|
Please add doc here
|
||||||
|
|||||||
259
mvnw
vendored
Normal file
259
mvnw
vendored
Normal file
@@ -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-<version>,maven-mvnd-<version>-<platform>}/<hash>
|
||||||
|
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
|
||||||
|
distributionUrlName="${distributionUrl##*/}"
|
||||||
|
distributionUrlNameMain="${distributionUrlName%.*}"
|
||||||
|
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
|
||||||
|
MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
|
||||||
|
MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
|
||||||
|
|
||||||
|
exec_maven() {
|
||||||
|
unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
|
||||||
|
exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -d "$MAVEN_HOME" ]; then
|
||||||
|
verbose "found existing MAVEN_HOME at $MAVEN_HOME"
|
||||||
|
exec_maven "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "${distributionUrl-}" in
|
||||||
|
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
|
||||||
|
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# prepare tmp dir
|
||||||
|
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
|
||||||
|
clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
|
||||||
|
trap clean HUP INT TERM EXIT
|
||||||
|
else
|
||||||
|
die "cannot create temp dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p -- "${MAVEN_HOME%/*}"
|
||||||
|
|
||||||
|
# Download and Install Apache Maven
|
||||||
|
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
|
||||||
|
verbose "Downloading from: $distributionUrl"
|
||||||
|
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
|
||||||
|
|
||||||
|
# select .zip or .tar.gz
|
||||||
|
if ! command -v unzip >/dev/null; then
|
||||||
|
distributionUrl="${distributionUrl%.zip}.tar.gz"
|
||||||
|
distributionUrlName="${distributionUrl##*/}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# verbose opt
|
||||||
|
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
|
||||||
|
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
|
||||||
|
|
||||||
|
# normalize http auth
|
||||||
|
case "${MVNW_PASSWORD:+has-password}" in
|
||||||
|
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
|
||||||
|
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
|
||||||
|
verbose "Found wget ... using wget"
|
||||||
|
wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
|
||||||
|
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
|
||||||
|
verbose "Found curl ... using curl"
|
||||||
|
curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
|
||||||
|
elif set_java_home; then
|
||||||
|
verbose "Falling back to use Java to download"
|
||||||
|
javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
|
||||||
|
targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
|
||||||
|
cat >"$javaSource" <<-END
|
||||||
|
public class Downloader extends java.net.Authenticator
|
||||||
|
{
|
||||||
|
protected java.net.PasswordAuthentication getPasswordAuthentication()
|
||||||
|
{
|
||||||
|
return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
|
||||||
|
}
|
||||||
|
public static void main( String[] args ) throws Exception
|
||||||
|
{
|
||||||
|
setDefault( new Downloader() );
|
||||||
|
java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
END
|
||||||
|
# For Cygwin/MinGW, switch paths to Windows format before running javac and java
|
||||||
|
verbose " - Compiling Downloader.java ..."
|
||||||
|
"$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
|
||||||
|
verbose " - Running Downloader.java ..."
|
||||||
|
"$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If specified, validate the SHA-256 sum of the Maven distribution zip file
|
||||||
|
if [ -n "${distributionSha256Sum-}" ]; then
|
||||||
|
distributionSha256Result=false
|
||||||
|
if [ "$MVN_CMD" = mvnd.sh ]; then
|
||||||
|
echo "Checksum validation is not supported for maven-mvnd." >&2
|
||||||
|
echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
|
||||||
|
exit 1
|
||||||
|
elif command -v sha256sum >/dev/null; then
|
||||||
|
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
|
||||||
|
distributionSha256Result=true
|
||||||
|
fi
|
||||||
|
elif command -v shasum >/dev/null; then
|
||||||
|
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
|
||||||
|
distributionSha256Result=true
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
|
||||||
|
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ $distributionSha256Result = false ]; then
|
||||||
|
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
|
||||||
|
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# unzip and move
|
||||||
|
if command -v unzip >/dev/null; then
|
||||||
|
unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
|
||||||
|
else
|
||||||
|
tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
|
||||||
|
fi
|
||||||
|
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
|
||||||
|
mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
|
||||||
|
|
||||||
|
clean || :
|
||||||
|
exec_maven "$@"
|
||||||
149
mvnw.cmd
vendored
Normal file
149
mvnw.cmd
vendored
Normal file
@@ -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-<version>,maven-mvnd-<version>-<platform>}/<hash>
|
||||||
|
if ($env:MVNW_REPOURL) {
|
||||||
|
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
|
||||||
|
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
|
||||||
|
}
|
||||||
|
$distributionUrlName = $distributionUrl -replace '^.*/',''
|
||||||
|
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
|
||||||
|
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
|
||||||
|
if ($env:MAVEN_USER_HOME) {
|
||||||
|
$MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
|
||||||
|
}
|
||||||
|
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
|
||||||
|
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
|
||||||
|
|
||||||
|
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
|
||||||
|
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
|
||||||
|
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
|
||||||
|
exit $?
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
|
||||||
|
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
|
||||||
|
}
|
||||||
|
|
||||||
|
# prepare tmp dir
|
||||||
|
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
|
||||||
|
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
|
||||||
|
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
|
||||||
|
trap {
|
||||||
|
if ($TMP_DOWNLOAD_DIR.Exists) {
|
||||||
|
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
|
||||||
|
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
|
||||||
|
|
||||||
|
# Download and Install Apache Maven
|
||||||
|
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
|
||||||
|
Write-Verbose "Downloading from: $distributionUrl"
|
||||||
|
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
|
||||||
|
|
||||||
|
$webclient = New-Object System.Net.WebClient
|
||||||
|
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
|
||||||
|
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
|
||||||
|
}
|
||||||
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||||
|
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
|
||||||
|
|
||||||
|
# If specified, validate the SHA-256 sum of the Maven distribution zip file
|
||||||
|
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
|
||||||
|
if ($distributionSha256Sum) {
|
||||||
|
if ($USE_MVND) {
|
||||||
|
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
|
||||||
|
}
|
||||||
|
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
|
||||||
|
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
|
||||||
|
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# unzip and move
|
||||||
|
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
|
||||||
|
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
|
||||||
|
try {
|
||||||
|
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
|
||||||
|
} catch {
|
||||||
|
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
|
||||||
|
Write-Error "fail to move MAVEN_HOME"
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
|
||||||
|
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
|
||||||
207
pom.xml
Normal file
207
pom.xml
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>3.3.2</version>
|
||||||
|
<relativePath/> <!-- lookup parent from repository -->
|
||||||
|
</parent>
|
||||||
|
<groupId>net.gepafin</groupId>
|
||||||
|
<artifactId>tendermanagement</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>tendermanagement</name>
|
||||||
|
<description>Tender Management project</description>
|
||||||
|
<properties>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<mapstruct.version>1.5.5.Final</mapstruct.version> <!-- MapStruct version -->
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<!-- Spring Boot Starter Web for REST API -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Lombok for reducing boilerplate code -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- H2 Database for in-memory testing -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- PostgreSQL Database -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.postgresql</groupId>
|
||||||
|
<artifactId>postgresql</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Spring Boot Starter Data JPA for JPA and Hibernate -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Springdoc OpenAPI for API Documentation -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springdoc</groupId>
|
||||||
|
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
|
||||||
|
<version>2.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- MapStruct for object mapping -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapstruct</groupId>
|
||||||
|
<artifactId>mapstruct</artifactId>
|
||||||
|
<version>${mapstruct.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapstruct</groupId>
|
||||||
|
<artifactId>mapstruct-processor</artifactId>
|
||||||
|
<version>${mapstruct.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.liquibase</groupId>
|
||||||
|
<artifactId>liquibase-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Spring Boot Starter Test for unit and integration tests -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.amazonaws</groupId>
|
||||||
|
<artifactId>aws-java-sdk-s3</artifactId>
|
||||||
|
<version>1.12.312</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.amazonaws</groupId>
|
||||||
|
<artifactId>aws-java-sdk-core</artifactId>
|
||||||
|
<version>1.12.341</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>2.11.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-security</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.jsonwebtoken</groupId>
|
||||||
|
<artifactId>jjwt-api</artifactId>
|
||||||
|
<version>0.11.5</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.jsonwebtoken</groupId>
|
||||||
|
<artifactId>jjwt-impl</artifactId>
|
||||||
|
<version>0.11.5</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.jsonwebtoken</groupId>
|
||||||
|
<artifactId>jjwt-jackson</artifactId>
|
||||||
|
<version>0.11.5</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>jakarta.validation</groupId>
|
||||||
|
<artifactId>jakarta.validation-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate.validator</groupId>
|
||||||
|
<artifactId>hibernate-validator</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.zalando</groupId>
|
||||||
|
<artifactId>problem-spring-web</artifactId>
|
||||||
|
<version>0.23.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-saml2-service-provider -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.security</groupId>
|
||||||
|
<artifactId>spring-security-saml2-service-provider</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.opensaml/opensaml-core -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.opensaml</groupId>
|
||||||
|
<artifactId>opensaml-core</artifactId>
|
||||||
|
<version>4.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.opensaml/opensaml-saml-api -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.opensaml</groupId>
|
||||||
|
<artifactId>opensaml-saml-api</artifactId>
|
||||||
|
<version>4.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.opensaml/opensaml-saml-impl -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.opensaml</groupId>
|
||||||
|
<artifactId>opensaml-saml-impl</artifactId>
|
||||||
|
<version>4.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-openfeign</artifactId>
|
||||||
|
<version>4.1.3</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.santuario</groupId>
|
||||||
|
<artifactId>xmlsec</artifactId>
|
||||||
|
<version>2.3.0</version> <!-- or latest -->
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>shibboleth</id>
|
||||||
|
<url>https://build.shibboleth.net/nexus/content/repositories/releases/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.liquibase</groupId>
|
||||||
|
<artifactId>liquibase-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<propertyFile>src/main/resources/application.properties</propertyFile>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
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 {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package net.gepafin.tendermanagement.config;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
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;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class SamlFailureHandler implements AuthenticationFailureHandler {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class);
|
||||||
|
|
||||||
|
@Value("${fe.base.url}")
|
||||||
|
private String feBaseUrl;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
|
||||||
|
AuthenticationException exception) throws IOException {
|
||||||
|
try {
|
||||||
|
logger.error("SAML login failed: " + exception.getMessage());
|
||||||
|
|
||||||
|
response.sendRedirect(feBaseUrl + "/login");
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("Error processing SAML failure handler", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
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.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;
|
||||||
|
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.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 {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SamlResponseRepository samlResponseLogRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserRepository userRepository;
|
||||||
|
|
||||||
|
@Value("${fe.base.url}")
|
||||||
|
private String feBaseUrl;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
|
||||||
|
Authentication authentication) throws IOException {
|
||||||
|
try {
|
||||||
|
Saml2Authentication samlAuth = (Saml2Authentication) authentication;
|
||||||
|
Saml2AuthenticatedPrincipal principal = (Saml2AuthenticatedPrincipal) samlAuth.getPrincipal();
|
||||||
|
|
||||||
|
Map<String, List<Object>> 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);
|
||||||
|
|
||||||
|
String redirectUrl = feBaseUrl;
|
||||||
|
|
||||||
|
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) {
|
||||||
|
redirectUrl += "/registration?temp_token=" + token;
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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<String, List<Object>> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
package net.gepafin.tendermanagement.config;
|
||||||
|
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
@EnableMethodSecurity(prePostEnabled = true)
|
||||||
|
public class SecurityConfig {
|
||||||
|
private final TokenProvider tokenProvider;
|
||||||
|
private final SamlSuccessHandler samlSuccessHandler;
|
||||||
|
private final SamlFailureHandler samlFailureHandler;
|
||||||
|
|
||||||
|
@Value("${base-url}")
|
||||||
|
String baseUrl;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public SecurityConfig(TokenProvider tokenProvider, SamlSuccessHandler samlSuccessHandler, SamlFailureHandler samlFailureHandler) {
|
||||||
|
this.tokenProvider = tokenProvider;
|
||||||
|
this.samlSuccessHandler =samlSuccessHandler;
|
||||||
|
this.samlFailureHandler=samlFailureHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
|
||||||
|
return config.getAuthenticationManager();
|
||||||
|
}
|
||||||
|
@Bean
|
||||||
|
public PasswordEncoder passwordEncoder() {
|
||||||
|
return new BCryptPasswordEncoder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
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/**"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public CorsFilter corsFilter() {
|
||||||
|
|
||||||
|
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
||||||
|
|
||||||
|
CorsConfiguration config = new CorsConfiguration();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
@Bean
|
||||||
|
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/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
|
||||||
|
.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)
|
||||||
|
// 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(samlSuccessHandler)
|
||||||
|
.failureHandler(samlFailureHandler));
|
||||||
|
|
||||||
|
|
||||||
|
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")));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toLocale(String key, Object... args) {
|
||||||
|
return messageSource.getMessage(key, args, LocaleContextHolder.getLocale());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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<DefaultSecurityFilterChain, HttpSecurity> {
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,248 @@
|
|||||||
|
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 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;
|
||||||
|
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 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);
|
||||||
|
|
||||||
|
@Value("${security.authentication.jwt.secret}")
|
||||||
|
private String secretKey;
|
||||||
|
|
||||||
|
@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";
|
||||||
|
|
||||||
|
static final String AUTH_SECRET = "X-Api-Secret";
|
||||||
|
private final Set<String> invalidatedTokens = new HashSet<>();
|
||||||
|
private static final String USER_ID = "userId";
|
||||||
|
|
||||||
|
public UserEntity validateUser(Map<String, Object> 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(Boolean rememberMe, UserEntity user) {
|
||||||
|
// String authorities = authentication.getAuthorities().stream()
|
||||||
|
// .map(GrantedAuthority::getAuthority)
|
||||||
|
// .collect(Collectors.joining(","));
|
||||||
|
String authorities = user.getRoleEntity().getRoleType();
|
||||||
|
Long now;
|
||||||
|
Date validity;
|
||||||
|
|
||||||
|
if (Boolean.TRUE.equals(rememberMe)) {
|
||||||
|
now = DateUtils.addMonths(new Date(), 2).getTime();
|
||||||
|
validity = new Date(now);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
String payload = user.getEmail();
|
||||||
|
if(user != null) {
|
||||||
|
payload += ":"+user.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
String token = Jwts.builder()
|
||||||
|
.setSubject(payload)
|
||||||
|
.claim("auth", authorities)
|
||||||
|
.signWith(key, SignatureAlgorithm.HS512)
|
||||||
|
.setExpiration(validity)
|
||||||
|
.compact();
|
||||||
|
|
||||||
|
log.debug("Generated token: {}", token);
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Authentication getAuthentication(String token) {
|
||||||
|
Claims claims = Jwts.parserBuilder()
|
||||||
|
.setSigningKey(key)
|
||||||
|
.build()
|
||||||
|
.parseClaimsJws(token)
|
||||||
|
.getBody();
|
||||||
|
|
||||||
|
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<? extends GrantedAuthority> ClaimsToAuthorities(Object authClaim) {
|
||||||
|
Collection<? extends GrantedAuthority> 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) {
|
||||||
|
try {
|
||||||
|
if (isTokenInvalid(authToken)) {
|
||||||
|
log.warn("Token is invalidated.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Jwts.parserBuilder()
|
||||||
|
.setSigningKey(key)
|
||||||
|
.build()
|
||||||
|
.parseClaimsJws(authToken);
|
||||||
|
log.info("Token is valid.");
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Token validation failed: {}", e.getMessage());
|
||||||
|
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<String, Object> getUserInfoAndUserIdFromToken(HttpServletRequest request) {
|
||||||
|
Map<String, Object> 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<String, Object> extractDetailsFromTheToken(Map<String, Object> userInfo, String authSecretHeader,
|
||||||
|
String token) {
|
||||||
|
String payload = null;
|
||||||
|
Boolean isSuperAdmin = false;
|
||||||
|
// if (StringUtils.hasText(token) && token.endsWith("_superKey" + getSuperUserToken())) {
|
||||||
|
// Map<String, Object> 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<String, Object> 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();
|
||||||
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
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 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";
|
||||||
|
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 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";
|
||||||
|
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";
|
||||||
|
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";
|
||||||
|
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 FORM_NOT_FOUND_FOR_CALL_ID="form.not.found.for.call.id";
|
||||||
|
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";
|
||||||
|
|
||||||
|
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 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";
|
||||||
|
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";
|
||||||
|
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 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";
|
||||||
|
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";
|
||||||
|
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";
|
||||||
|
public static final String APPLICATION_ALREADY_EXISTS="application.already.exists";
|
||||||
|
// 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";
|
||||||
|
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";
|
||||||
|
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";
|
||||||
|
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";
|
||||||
|
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_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";
|
||||||
|
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";
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,563 @@
|
|||||||
|
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.enums.DocumentSourceTypeEnum;
|
||||||
|
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;
|
||||||
|
import net.gepafin.tendermanagement.model.response.*;
|
||||||
|
import net.gepafin.tendermanagement.repositories.*;
|
||||||
|
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;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
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 ApplicationRepository applicationRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationFormRepository applicationFormRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationFormFieldRepository applicationFormFieldRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FormService formService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DocumentService documentService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallDao callDao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FlowFormDao flowFormDao;
|
||||||
|
|
||||||
|
@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());
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity);
|
||||||
|
ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity);
|
||||||
|
createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity,formEntity);
|
||||||
|
return getApplicationById(applicationEntity.getId(),formEntity.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationFormEntity saveApplicationFormEntity(ApplicationFormEntity applicationFormEntity) {
|
||||||
|
ApplicationFormEntity applicationFormEntity1 = applicationFormRepository.save(applicationFormEntity);
|
||||||
|
return applicationFormEntity1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),formId);
|
||||||
|
List<ApplicationFormFieldResponseBean> applicationFormFieldResponseBeans=new ArrayList<>();
|
||||||
|
ApplicationFormFieldResponseBean applicationFormFieldResponseBeans1=null;
|
||||||
|
List<ApplicationFormFieldEntity> applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
|
||||||
|
applicationFormFieldResponseBeans=createApplicationFormFieldResponse(applicationFormFieldEntities, applicationFormEntity, applicationFormFieldResponseBeans);
|
||||||
|
ApplicationResponseBean applicationResponseBean= convertApplicationEntityToApplicationResponseBean(applicationEntity);
|
||||||
|
applicationResponseBean.setFormFields(applicationFormFieldResponseBeans);
|
||||||
|
return applicationResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<ApplicationFormFieldResponseBean> createApplicationFormFieldResponse(
|
||||||
|
List<ApplicationFormFieldEntity> applicationFormFieldEntities,
|
||||||
|
ApplicationFormEntity applicationFormEntity,
|
||||||
|
List<ApplicationFormFieldResponseBean> applicationFormFieldResponseBeans) {
|
||||||
|
|
||||||
|
List<ContentResponseBean> contentResponseBeans = Utils.convertJsonStringToList(
|
||||||
|
applicationFormEntity.getForm().getContent(), ContentResponseBean.class);
|
||||||
|
|
||||||
|
for (ApplicationFormFieldEntity applicationFormFieldEntity : applicationFormFieldEntities) {
|
||||||
|
|
||||||
|
Optional<ContentResponseBean> fileUploadContent = contentResponseBeans.stream()
|
||||||
|
.filter(contentResponseBean -> "fileupload".equals(contentResponseBean.getName()) &&
|
||||||
|
contentResponseBean.getId().equals(applicationFormFieldEntity.getFieldId()))
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
List<DocumentResponseBean> 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);
|
||||||
|
|
||||||
|
ApplicationEntity applicationEntity= validateApplication(id);
|
||||||
|
applicationEntity.setIsDeleted(true);
|
||||||
|
applicationEntity=saveApplicationEntity(applicationEntity);
|
||||||
|
log.info("Application deleted with ID: {}", id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ApplicationResponse> getAllApplications(UserEntity userEntity, Long callId) {
|
||||||
|
boolean isBeneficiary = isBeneficiary(userEntity);
|
||||||
|
|
||||||
|
log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType());
|
||||||
|
List<ApplicationResponse> 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);
|
||||||
|
|
||||||
|
// Use a single method to handle both conditions for consistency
|
||||||
|
List<ApplicationEntity> applicationEntities = isBeneficiary
|
||||||
|
? applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId())
|
||||||
|
.map(List::of) // Convert Optional<ApplicationEntity> 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<ApplicationEntity> applicationEntities = isBeneficiary
|
||||||
|
? applicationRepository.findByUserIdAndIsDeletedFalse(userEntity.getId())
|
||||||
|
: applicationRepository.findByIsDeletedFalse();
|
||||||
|
|
||||||
|
applicationResponses = applicationEntities.stream()
|
||||||
|
.map(this::getApplicationResponse)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
return applicationResponses;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private ApplicationResponse getApplicationResponse(ApplicationEntity applicationEntity) {
|
||||||
|
ApplicationResponse responseBean = new ApplicationResponse();
|
||||||
|
List<FlowEdgesEntity> flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
|
||||||
|
Long totalFormSteps = flowFormDao.calculateTotalSteps(flowEdgesList);
|
||||||
|
Long completedSteps= Long.valueOf(flowFormDao.getCompletedSteps(applicationEntity));
|
||||||
|
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());
|
||||||
|
responseBean.setComments(applicationEntity.getComments());
|
||||||
|
return responseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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<ApplicationFormFieldEntity> createOrUpdateMultipleFormFields(List<ApplicationFormFieldRequestBean> formFieldResponseBeans, ApplicationFormEntity applicationFormEntity,FormEntity formEntity) {
|
||||||
|
List<ApplicationFormFieldEntity> existingFields = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
|
||||||
|
|
||||||
|
List<ApplicationFormFieldEntity> applicationFormFieldEntity = formFieldResponseBeans.stream()
|
||||||
|
.map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity,existingFields,formEntity))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
return applicationFormFieldEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity,List<ApplicationFormFieldEntity> applicationFormFieldEntities ,FormEntity formEntity) {
|
||||||
|
|
||||||
|
ApplicationFormFieldEntity applicationFormFieldEntity=null;
|
||||||
|
|
||||||
|
validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity);
|
||||||
|
|
||||||
|
if(applicationFormFieldEntities==null || applicationFormFieldEntities.isEmpty()){
|
||||||
|
applicationFormFieldEntity = new ApplicationFormFieldEntity();
|
||||||
|
applicationFormFieldEntity.setApplicationForm(applicationFormEntity);
|
||||||
|
}else {
|
||||||
|
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();
|
||||||
|
applicationFormFieldEntity.setApplicationForm(applicationFormEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Long> validateFileUploadDocuments(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity) {
|
||||||
|
List<Long> documentIds=null;
|
||||||
|
List<ContentResponseBean> 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<Long> 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> applicationFormFieldEntity = applicationFormFieldRepository.findById(applicationFormFieldId);
|
||||||
|
if (applicationFormFieldEntity.isEmpty()) {
|
||||||
|
throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_FORM_FIELD_NOT_FOUND));
|
||||||
|
}
|
||||||
|
return applicationFormFieldEntity.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ApplicationFormFieldEntity> saveApplicationFormFieldEntities(List<ApplicationFormFieldEntity> applicationFormFieldEntities) {
|
||||||
|
List<ApplicationFormFieldEntity> applicationFormFieldEntities1 = applicationFormFieldRepository.saveAll(applicationFormFieldEntities);
|
||||||
|
return applicationFormFieldEntities1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ApplicationFormFieldResponseBean> convertApplicationFormFieldEntitiesToApplicationFormFieldResponseBeans(List<ApplicationFormFieldEntity> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationGetResponseBean getApplicationByFormId( Long applicationId,Long formId, UserEntity userEntity) {
|
||||||
|
List<FormApplicationResponse> formApplicationResponses = new ArrayList<>();
|
||||||
|
List<FormEntity> formEntities = new ArrayList<>();
|
||||||
|
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) {
|
||||||
|
FormEntity formEntity = formService.validateForm(formId);
|
||||||
|
Optional<ApplicationEntity> application = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(),
|
||||||
|
formEntity.getCall().getId());
|
||||||
|
applicationEntity=application.get();
|
||||||
|
formEntities.add(formEntity);
|
||||||
|
addFormApplication(formEntity, applicationEntity, formApplicationResponses);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
List<ApplicationFormEntity> applicationFormEntities = applicationFormRepository.findByApplicationId(applicationEntity.getId());
|
||||||
|
for (ApplicationFormEntity applicationFormEntity : applicationFormEntities) {
|
||||||
|
FormEntity form = formService.validateForm(applicationFormEntity.getForm().getId());
|
||||||
|
formEntities.add(form);
|
||||||
|
addFormApplication(form, applicationEntity, formApplicationResponses);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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<FormApplicationResponse> 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);
|
||||||
|
List<ApplicationFormFieldResponseBean> applicationFormFieldResponseBeans =new ArrayList<>();
|
||||||
|
ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId());
|
||||||
|
if(applicationFormEntity!=null) {
|
||||||
|
List<ApplicationFormFieldEntity> applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
|
||||||
|
// formApplicationResponse = createFormApplicationResponse(formEntity);
|
||||||
|
applicationFormFieldResponseBeans = createApplicationFormFieldResponse(applicationFormFieldEntities, applicationFormEntity,applicationFormFieldResponseBeans);
|
||||||
|
formApplicationResponse.setFormFields(applicationFormFieldResponseBeans);
|
||||||
|
}
|
||||||
|
return formApplicationResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ApplicationGetResponseBean createApplicationGetResponseBean(ApplicationEntity applicationEntity, List<FormEntity> formEntities, List<FormApplicationResponse> 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());
|
||||||
|
applicationGetResponseBean.setCallId(applicationEntity.getCall().getId());
|
||||||
|
applicationGetResponseBean.setCallTitle(applicationEntity.getCall().getName());
|
||||||
|
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);
|
||||||
|
call = callService.validatePublishedCall(call.getId());
|
||||||
|
checkIfApplicationExists(call,userEntity);
|
||||||
|
ApplicationEntity applicationEntity=createApplicationEntity(userEntity,call);
|
||||||
|
applicationEntity.setComments(applicationRequest.getComments());
|
||||||
|
applicationEntity=saveApplicationEntity(applicationEntity);
|
||||||
|
ApplicationResponse applicationResponse=getApplicationResponse(applicationEntity);
|
||||||
|
return applicationResponse;
|
||||||
|
}
|
||||||
|
public void checkIfApplicationExists(CallEntity call,UserEntity userEntity){
|
||||||
|
Optional<ApplicationEntity> applicationEntity=applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(),call.getId());
|
||||||
|
if(applicationEntity.isPresent()){
|
||||||
|
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_EXISTS));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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));
|
||||||
|
// }
|
||||||
|
List<FlowEdgesEntity> 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());
|
||||||
|
applicationEntity.setSubmissionDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
|
||||||
|
} else {
|
||||||
|
applicationEntity.setStatus(status.getValue());
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
public void validateFormFields(ApplicationRequestBean request, FormEntity formEntity) {
|
||||||
|
List<String> errors=new ArrayList<>();
|
||||||
|
List<ContentResponseBean> contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class);
|
||||||
|
|
||||||
|
List<ApplicationFormFieldRequestBean> requestFields = request.getFormFields();
|
||||||
|
|
||||||
|
Map<String, String> 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
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<Long> nextFormIds = flowEdgesRepository.findBySourceIdAndCallId(
|
||||||
|
formEntity.getId(), applicationEntity.getCall().getId())
|
||||||
|
.stream()
|
||||||
|
.map(FlowEdgesEntity::getTargetId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
Optional<Long> 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<ApplicationFormFieldEntity> nextApplicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(nextApplicationFormEntity.getId());
|
||||||
|
applicationFormFieldRepository.deleteAll(nextApplicationFormFieldEntities);
|
||||||
|
applicationFormRepository.delete(nextApplicationFormEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
644
src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
Normal file
644
src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
Normal file
@@ -0,0 +1,644 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
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.CallStatusEnum;
|
||||||
|
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.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.RegionRepository;
|
||||||
|
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;
|
||||||
|
|
||||||
|
@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 LookUpDataService lookUpDataService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository;
|
||||||
|
|
||||||
|
@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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest) {
|
||||||
|
CallEntity callEntity = new CallEntity();
|
||||||
|
// validateCallEntity(createCallRequest);
|
||||||
|
RegionEntity region = regionRepository.findById(createCallRequest.getRegionId())
|
||||||
|
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
|
||||||
|
Translator.toLocale(GepafinConstant.REGION_NOT_FOUND)));
|
||||||
|
callEntity.setRegion(region);
|
||||||
|
callEntity.setName(createCallRequest.getName());
|
||||||
|
callEntity.setDescriptionShort(createCallRequest.getDescriptionShort());
|
||||||
|
callEntity.setDescriptionLong(createCallRequest.getDescriptionLong());
|
||||||
|
List<LocalDateTime> 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.getAmount());
|
||||||
|
callEntity.setConfidi(false);
|
||||||
|
if (createCallRequest.getConfidi() != null) {
|
||||||
|
callEntity.setConfidi(createCallRequest.getConfidi());
|
||||||
|
}
|
||||||
|
callEntity.setDocumentationRequested(createCallRequest.getDocumentationRequested());
|
||||||
|
callEntity = callRepository.save(callEntity);
|
||||||
|
return callEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<EvaluationCriteriaEntity> convertToEvaluationCriteriaEntities(
|
||||||
|
List<EvaluationCriteriaReq> criteriaReqList, CallEntity callEntity, LookUpDataTypeEnum type) {
|
||||||
|
if (criteriaReqList == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<EvaluationCriteriaEntity> existingCriteria = evaluationCriteriaRepository.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue());
|
||||||
|
|
||||||
|
List<Long> 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<EvaluationCriteriaEntity> 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) {
|
||||||
|
EvaluationCriteriaEntity criteriaEntity = null;
|
||||||
|
LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(criteriaReq, type);
|
||||||
|
if (criteriaReq.getId() != null && criteriaReq.getId() > 0) {
|
||||||
|
criteriaEntity = evaluationCriteriaRepository.findById(criteriaReq.getId())
|
||||||
|
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
|
||||||
|
Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<DocumentEntity> convertToDocumentEntities(List<DocumentReq> documentReqList, Long sourceId,
|
||||||
|
DocumentTypeEnum documentType) {
|
||||||
|
if (documentReqList == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<DocumentEntity> existingDocuments = documentRepository
|
||||||
|
.findBySourceIdAndTypeAndIsDeletedFalse(sourceId, documentType.getValue());
|
||||||
|
|
||||||
|
List<Long> incomingIds = documentReqList.stream().map(DocumentReq::getId).filter(id -> id != null && id > 0)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
existingDocuments.stream().filter(document -> !incomingIds.contains(document.getId()))
|
||||||
|
.forEach(this::softDeleteDocument);
|
||||||
|
List<DocumentEntity> documentEntities = documentReqList.stream()
|
||||||
|
.map(req -> convertToDocumentEntity(req, sourceId)).collect(Collectors.toList());
|
||||||
|
documentRepository.saveAll(documentEntities);
|
||||||
|
return documentEntities;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void softDeleteDocument(DocumentEntity documentEntity) {
|
||||||
|
documentEntity.setIsDeleted(true);
|
||||||
|
documentRepository.save(documentEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DocumentEntity convertToDocumentEntity(DocumentReq documentReq,Long sourceId) {
|
||||||
|
validateDocumentEntity(documentReq.getId());
|
||||||
|
DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndIsDeletedFalse(documentReq.getId(),sourceId)
|
||||||
|
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
|
||||||
|
Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)));
|
||||||
|
return documentEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<FaqEntity> updateFaq(List<FaqReq> faqReqList, CallEntity callEntity, UserEntity userEntity, LookUpDataTypeEnum type) {
|
||||||
|
if (faqReqList == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<FaqEntity> existingFaqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId());
|
||||||
|
List<Long> 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<FaqEntity> faqEntities = faqReqList.stream()
|
||||||
|
.map(req -> faqService.createOrUpdateFaqEntity(req, callEntity, userEntity, type))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
return faqEntities;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void validateDocumentEntity(Long documentId) {
|
||||||
|
if (documentId == null || documentId < 1) {
|
||||||
|
throw new CustomValidationException(Status.VALIDATION_ERROR,
|
||||||
|
Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validateEvaluationCriteriaEntity(String name) {
|
||||||
|
if (!StringUtils.hasText(name)) {
|
||||||
|
throw new CustomValidationException(Status.VALIDATION_ERROR,
|
||||||
|
Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallResponse convertToCallResponseBean(CallEntity callEntity) {
|
||||||
|
CallResponse createCallResponseBean = new CallResponse();
|
||||||
|
createCallResponseBean.setId(callEntity.getId());
|
||||||
|
createCallResponseBean.setName(callEntity.getName());
|
||||||
|
List<LocalDateTime> dates = new ArrayList<>();
|
||||||
|
dates.add(callEntity.getStartDate());
|
||||||
|
dates.add(callEntity.getEndDate());
|
||||||
|
createCallResponseBean.setDates(dates);
|
||||||
|
createCallResponseBean.setDescriptionShort(callEntity.getDescriptionShort());
|
||||||
|
createCallResponseBean.setDescriptionLong(callEntity.getDescriptionLong());
|
||||||
|
createCallResponseBean.setStatus(CallStatusEnum.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.setDocumentationRequested(callEntity.getDocumentationRequested());
|
||||||
|
createCallResponseBean.setPriorityArea(callEntity.getPriorityArea());
|
||||||
|
createCallResponseBean.setConfidi(callEntity.getConfidi());
|
||||||
|
createCallResponseBean.setCreatedDate(callEntity.getCreatedDate());
|
||||||
|
createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate());
|
||||||
|
return createCallResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
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.setResponse(entity.getLookupData().getResponse());
|
||||||
|
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.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());
|
||||||
|
return responseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallResponse assembleCreateCallResponseBean(CallEntity callEntity,
|
||||||
|
List<EvaluationCriteriaEntity> evaluationCriteriaEntities, List<DocumentEntity> documentEntities,
|
||||||
|
List<DocumentEntity> images) {
|
||||||
|
|
||||||
|
CallResponse callResponseBean = convertToCallResponseBean(callEntity);
|
||||||
|
|
||||||
|
List<EvaluationCriteriaResponseBean> evaluationCriteriaResponseBeans = evaluationCriteriaEntities.stream()
|
||||||
|
.map(this::convertToEvaluationCriteriaResponseBean).collect(Collectors.toList());
|
||||||
|
|
||||||
|
List<DocumentResponseBean> documentResponseBeans = documentEntities.stream()
|
||||||
|
.map(this::convertToDocumentResponseBean).collect(Collectors.toList());
|
||||||
|
|
||||||
|
|
||||||
|
List<DocumentResponseBean> imagesResponseBean = images.stream().map(this::convertToDocumentResponseBean)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
CallResponse createCallResponseBean = callResponseBean;
|
||||||
|
createCallResponseBean.setCriteria(evaluationCriteriaResponseBeans);
|
||||||
|
createCallResponseBean.setDocs(documentResponseBeans);
|
||||||
|
createCallResponseBean.setImages(imagesResponseBean);
|
||||||
|
return createCallResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<LookUpDataResponse> convertLookUpDataEntities(List<LookUpDataReq> lookUpData, CallEntity callEntity,
|
||||||
|
LookUpDataEntity.LookUpDataTypeEnum type) {
|
||||||
|
if(lookUpData == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<LookUpDataEntity> lookUpDataEntities = lookUpData.stream()
|
||||||
|
.map(req -> lookUpDataService.getOrCreateLookUpDataEntity(req, type)).collect(Collectors.toList());
|
||||||
|
|
||||||
|
return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<LookUpDataResponse> createCallTargetAudienceCheckList(CallEntity callEntity,
|
||||||
|
List<LookUpDataEntity> lookUpDataEntities) {
|
||||||
|
List<LookUpDataResponse> lookUpDataResponses = new ArrayList<>();
|
||||||
|
for (LookUpDataEntity lookUpDataEntity : lookUpDataEntities) {
|
||||||
|
CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity = new CallTargetAudienceChecklistEntity();
|
||||||
|
callTargetAudienceChecklistEntity.setIsValidated(false);
|
||||||
|
callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity);
|
||||||
|
callTargetAudienceChecklistEntity.setCall(callEntity);
|
||||||
|
callTargetAudienceChecklistEntity.setIsDeleted(false);
|
||||||
|
callTargetAudienceChecklistEntity = callTargetAudienceChecklistRepository
|
||||||
|
.save(callTargetAudienceChecklistEntity);
|
||||||
|
lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity));
|
||||||
|
}
|
||||||
|
return lookUpDataResponses;
|
||||||
|
}
|
||||||
|
|
||||||
|
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.setResponse(lookUpDataEntity.getResponse());
|
||||||
|
lookUpDataResponse.setCreatedDate(callTargetAudienceChecklistEntity.getCreatedDate());
|
||||||
|
lookUpDataResponse.setUpdatedDate(callTargetAudienceChecklistEntity.getUpdatedDate());
|
||||||
|
return lookUpDataResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallEntity validateCall(Long callId) {
|
||||||
|
return callRepository.findById(callId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
|
||||||
|
Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallResponse getCallById(Long callId) {
|
||||||
|
CallEntity callEntity = validateCall(callId);
|
||||||
|
return getCallResponseBean(callEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallResponse createCallStep2(Long callId, CreateCallRequestStep2 createCallRequest, Long userId) {
|
||||||
|
CallEntity callEntity = validateCall(callId);
|
||||||
|
validateUpdate(callEntity);
|
||||||
|
setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold());
|
||||||
|
callRepository.save(callEntity);
|
||||||
|
convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA);
|
||||||
|
|
||||||
|
convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT);
|
||||||
|
|
||||||
|
convertToDocumentEntities(createCallRequest.getImages(), callEntity.getId(), DocumentTypeEnum.IMAGES);
|
||||||
|
|
||||||
|
updateLookUpData(callEntity, createCallRequest.getCheckList(), LookUpDataTypeEnum.CHECKLIST);
|
||||||
|
|
||||||
|
// List<FaqEntity> faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId());
|
||||||
|
// List<LookUpDataResponse> 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);
|
||||||
|
CallResponse createCallResponseBean = getCallResponseBean(callEntity);
|
||||||
|
createCallResponseBean.setCurrentStep(GepafinConstant.STEP_2);
|
||||||
|
return createCallResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void isValidDateRange(UpdateCallRequestStep1 updateCallRequest, CallEntity callEntity) {
|
||||||
|
List<LocalDateTime> 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;
|
||||||
|
} else if (startDate != null && endDate == null && callEntity.getEndDate() != null
|
||||||
|
&& startDate.isAfter(callEntity.getEndDate().toLocalDate())) {
|
||||||
|
isValid = false;
|
||||||
|
} else if (startDate == null && 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 CallResponse updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) {
|
||||||
|
CallEntity callEntity = validateCall(callId);
|
||||||
|
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,
|
||||||
|
updateCallRequest.getDescriptionShort());
|
||||||
|
setIfUpdated(callEntity::getDescriptionLong, callEntity::setDescriptionLong,
|
||||||
|
updateCallRequest.getDescriptionLong());
|
||||||
|
List<LocalDateTime> 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,
|
||||||
|
updateCallRequest.getDocumentationRequested());
|
||||||
|
setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi());
|
||||||
|
updateLookUpData(callEntity, updateCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO);
|
||||||
|
updateFaq(updateCallRequest.getFaq(), callEntity, userEntity, LookUpDataTypeEnum.FAQ);
|
||||||
|
CallResponse createCallResponseBean = getCallResponseBean(callEntity);
|
||||||
|
createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1);
|
||||||
|
return createCallResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void softDeleteFaq(FaqEntity faqEntity) {
|
||||||
|
faqEntity.setIsDeleted(true);
|
||||||
|
faqRepository.save(faqEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateLookUpData(CallEntity callEntity, List<LookUpDataReq> lookupDataReqList, LookUpDataTypeEnum type) {
|
||||||
|
if (lookupDataReqList == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<CallTargetAudienceChecklistEntity> existingChecklist = callTargetAudienceChecklistRepository
|
||||||
|
.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue());
|
||||||
|
List<Long> 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 = lookUpDataService.getOrCreateLookUpDataEntity(lookUpDataReq, type);
|
||||||
|
if (lookUpDataReq.getId() != null && lookUpDataReq.getId() > 0) {
|
||||||
|
checklistEntity = callTargetAudienceChecklistRepository.findById(lookUpDataReq.getId())
|
||||||
|
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallDetailsResponseBean convertToCallDetailsResponseBean(CallEntity callEntity) {
|
||||||
|
CallDetailsResponseBean callDetailsResponseBean = new CallDetailsResponseBean();
|
||||||
|
callDetailsResponseBean.setId(callEntity.getId());
|
||||||
|
callDetailsResponseBean.setName(callEntity.getName());
|
||||||
|
List<LocalDateTime> 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()));
|
||||||
|
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.setDocumentationRequested(callEntity.getDocumentationRequested());
|
||||||
|
callDetailsResponseBean.setPriorityArea(callEntity.getPriorityArea());
|
||||||
|
callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate());
|
||||||
|
callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate());
|
||||||
|
return callDetailsResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
private CallResponse getCallResponseBean(CallEntity callEntity) {
|
||||||
|
List<DocumentEntity> documentEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(),
|
||||||
|
DocumentTypeEnum.DOCUMENT.getValue());
|
||||||
|
List<DocumentEntity> imageEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(),
|
||||||
|
DocumentTypeEnum.IMAGES.getValue());
|
||||||
|
List<LookUpDataResponse> amiedTo = callTargetAudienceChecklistRepository
|
||||||
|
.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream()
|
||||||
|
.map(this::convertToLookUpDataResponseBean).toList();
|
||||||
|
|
||||||
|
List<LookUpDataResponse> checkList = callTargetAudienceChecklistRepository
|
||||||
|
.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.CHECKLIST.getValue()).stream()
|
||||||
|
.map(this::convertToLookUpDataResponseBean).toList();
|
||||||
|
List<EvaluationCriteriaEntity> evaluationCriteriaEntities = evaluationCriteriaRepository
|
||||||
|
.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue());
|
||||||
|
|
||||||
|
CallResponse createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities,
|
||||||
|
documentEntities, imageEntities);
|
||||||
|
createCallResponseBean.setFaq(faqService.getFaqByCallId(callEntity.getId()));
|
||||||
|
createCallResponseBean.setAimedTo(amiedTo);
|
||||||
|
createCallResponseBean.setCheckList(checkList);
|
||||||
|
return createCallResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CallDetailsResponseBean> getAllCalls(UserEntity user) {
|
||||||
|
String type=user.getRoleEntity().getRoleType();
|
||||||
|
List<String> callStatusList =CallStatusEnum.getStatusValues();
|
||||||
|
if (Boolean.FALSE.equals(ROLE_SUPER_ADMIN.getValue().equals(type))) {
|
||||||
|
callStatusList = List.of(CallStatusEnum.PUBLISH.getValue());
|
||||||
|
}
|
||||||
|
List<CallEntity> calls = callRepository.findByStatusIn(callStatusList);
|
||||||
|
return calls.stream()
|
||||||
|
.map(this::convertToCallDetailsResponseBean)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallResponse validateCallData(CallEntity callEntity) {
|
||||||
|
validateUpdate(callEntity);
|
||||||
|
CallResponse callResponseBean = getCallResponseBean(callEntity);
|
||||||
|
FlowResponseBean flowResponseBean = flowDao.getFlowByCallId(callEntity.getId());
|
||||||
|
List<FormResponseBean> 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);
|
||||||
|
callResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus()));
|
||||||
|
return callResponseBean;
|
||||||
|
}
|
||||||
|
public CallEntity getCallEntityById(Long id){
|
||||||
|
CallEntity callEntity=callRepository.findByIdAndStatusNotIn(id,List.of(CallStatusEnum.PUBLISH.getValue()));
|
||||||
|
if(callEntity==null){
|
||||||
|
throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND));
|
||||||
|
}
|
||||||
|
return callEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq) {
|
||||||
|
CallEntity callEntity = validateCall(callId);
|
||||||
|
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:
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
137
src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java
Normal file
137
src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
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;
|
||||||
|
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.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.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;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class DocumentDao {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AmazonS3Service amazonS3Service;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DocumentRepository documentRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallDao callDao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallService callService;
|
||||||
|
|
||||||
|
public List<DocumentResponseBean> uploadFiles(List<MultipartFile> files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) {
|
||||||
|
List<DocumentEntity> documentEntities = new ArrayList<>();
|
||||||
|
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.setSource(sourceType.getValue());
|
||||||
|
documentEntity.setSourceId(source);
|
||||||
|
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 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());
|
||||||
|
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) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteFile(Long documentId) {
|
||||||
|
DocumentEntity documentEntity = validateDocument(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = validateDocument(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());
|
||||||
|
documentEntity.setSource(documentEntity.getSource());
|
||||||
|
documentEntity.setSourceId(documentEntity.getSourceId());
|
||||||
|
documentRepository.save(documentEntity);
|
||||||
|
}
|
||||||
|
return callDao.convertToDocumentResponseBean(documentEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DocumentResponseBean getDocument(Long documentId) {
|
||||||
|
DocumentEntity documentEntity = validateDocument(documentId);
|
||||||
|
return callDao.convertToDocumentResponseBean(documentEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.CallEntity;
|
||||||
|
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.EvaluationCriteriaRepository;
|
||||||
|
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 CallService callService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private LookUpDataService lookUpDataService;
|
||||||
|
|
||||||
|
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.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 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
123
src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java
Normal file
123
src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
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.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;
|
||||||
|
import net.gepafin.tendermanagement.repositories.FaqRepository;
|
||||||
|
import net.gepafin.tendermanagement.service.CallService;
|
||||||
|
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 {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FaqRepository faqRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallService callService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private LookUpDataService lookUpDataService;
|
||||||
|
|
||||||
|
public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId) {
|
||||||
|
FaqEntity entity = new FaqEntity();
|
||||||
|
CallEntity callEntity = callService.validateCall(callId);
|
||||||
|
entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity,
|
||||||
|
LookUpDataEntity.LookUpDataTypeEnum.FAQ);
|
||||||
|
faqRepository.save(entity);
|
||||||
|
return convertToFaqResponseBean(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FaqResponseBean getFaqById(Long id) {
|
||||||
|
return convertToFaqResponseBean(validateFaq(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
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 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)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<FaqResponseBean> getFaqByCallId(Long callId) {
|
||||||
|
callService.validateCall(callId);
|
||||||
|
return faqRepository.findByCallIdAndIsDeletedFalse(callId).stream().map(this::convertToFaqResponseBean)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 {
|
||||||
|
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);
|
||||||
|
faqEntity.setIsVisible(false);
|
||||||
|
faqEntity.setIsDeleted(false);
|
||||||
|
}
|
||||||
|
if (faqReq.getResponse() != null && (faqEntity.getResponse() == null
|
||||||
|
|| Boolean.FALSE.equals(faqReq.getResponse().equals(faqEntity.getResponse())))) {
|
||||||
|
faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
203
src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java
Normal file
203
src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
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.enums.CallStatusEnum;
|
||||||
|
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.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;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
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;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallDao callDao;
|
||||||
|
|
||||||
|
public FlowResponseBean createOrUpdateFlow(FlowRequestBean flowRequestBean, Long callId) {
|
||||||
|
validateFlowRequestBean(flowRequestBean);
|
||||||
|
CallEntity call = callService.validateCall(callId);
|
||||||
|
checkIfFlowExits(call);
|
||||||
|
call= setInitialAndFinalFormInCall(flowRequestBean, call);
|
||||||
|
validateFlowRequest(flowRequestBean);
|
||||||
|
List<FlowDataEntity> flowDataEntities = createFlowData(flowRequestBean,call);
|
||||||
|
List<FlowEdgesEntity> flowEdgesEntities = createFlowEdges(flowRequestBean,call);
|
||||||
|
FlowResponseBean flowResponseBean = getFlowByCallId(call.getId());
|
||||||
|
return flowResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
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<FlowDataEntity> flowDataEntities = flowDataRepository.findByCallId(call.getId());
|
||||||
|
List<FlowEdgesEntity> 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());
|
||||||
|
if(flowRequestBean.getFlowData()!=null && !flowRequestBean.getFlowData().isEmpty()) {
|
||||||
|
flowRequestBean.getFlowData().forEach(flowData -> formService.validateForm(flowData.getFormId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<FlowEdgesResponseBean> createFlowEdgesResponseBean(List<FlowEdgesEntity> flowEdgesEntities) {
|
||||||
|
List<FlowEdgesResponseBean> flowEdgesResponseBeans = flowEdgesEntities.stream()
|
||||||
|
.map(this::convertFlowEdgesEntityToFlowEdgesResponseBean).collect(Collectors.toList());
|
||||||
|
return flowEdgesResponseBeans;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<FlowDataResponseBean> createFlowDataResponseBean(List<FlowDataEntity> flowDataEntities) {
|
||||||
|
List<FlowDataResponseBean> 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, CallEntity call) {
|
||||||
|
call.setInitialForm(flowRequestBean.getInitialForm());
|
||||||
|
call.setFinalForm(flowRequestBean.getFinalForm());
|
||||||
|
call.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
|
||||||
|
call = callRepository.save(call);
|
||||||
|
return call;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<FlowDataEntity> createFlowData(FlowRequestBean flowRequestBean, CallEntity call) {
|
||||||
|
if (flowRequestBean.getFlowData() != null || !flowRequestBean.getFlowEdges().isEmpty()) {
|
||||||
|
List<FlowDataEntity> 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) {
|
||||||
|
FlowDataEntity flowDataEntity = new FlowDataEntity();
|
||||||
|
flowDataEntity.setFormId(flowDataRequestBean.getFormId());
|
||||||
|
if(Boolean.FALSE.equals(flowDataRequestBean.getChosenField().isEmpty()) || flowDataRequestBean.getChosenField()!=null){
|
||||||
|
flowDataEntity.setChoosenField(flowDataRequestBean.getChosenField());
|
||||||
|
}
|
||||||
|
if(Boolean.FALSE.equals(flowDataRequestBean.getChosenValue().isEmpty()) || flowDataRequestBean.getChosenValue()!=null) {
|
||||||
|
flowDataEntity.setChoosenValue(flowDataRequestBean.getChosenValue());
|
||||||
|
}
|
||||||
|
flowDataEntity.setCallId(call.getId());
|
||||||
|
return flowDataEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<FlowEdgesEntity> createFlowEdges(FlowRequestBean flowRequestBean, CallEntity call) {
|
||||||
|
List<FlowEdgesEntity> 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.setTrackingId(flowEdgesRequestBean.getId());
|
||||||
|
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.getTrackingId());
|
||||||
|
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<FlowDataEntity> flowDataEntities=flowDataRepository.findByCallId(call.getId());
|
||||||
|
List<FlowEdgesEntity> flowEdgesEntities=flowEdgesRepository.findByCallId(call.getId());
|
||||||
|
List<FlowDataResponseBean> flowDataResponseBeans=createFlowDataResponseBean(flowDataEntities);
|
||||||
|
List<FlowEdgesResponseBean> flowEdgesResponseBeans=createFlowEdgesResponseBean(flowEdgesEntities);
|
||||||
|
flowResponseBean.setFlowData(flowDataResponseBeans);
|
||||||
|
flowResponseBean.setFlowEdges(flowEdgesResponseBeans);
|
||||||
|
if( flowResponseBean.getFlowEdges().isEmpty()){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
flowResponseBean.setCallId(call.getId());
|
||||||
|
flowResponseBean.setCallStatus(CallStatusEnum.valueOf(call.getStatus()));
|
||||||
|
flowResponseBean.setInitialForm(call.getInitialForm());
|
||||||
|
flowResponseBean.setFinalForm(call.getFinalForm());
|
||||||
|
return flowResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
354
src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
Normal file
354
src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
Normal file
@@ -0,0 +1,354 @@
|
|||||||
|
package net.gepafin.tendermanagement.dao;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
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.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;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class FlowFormDao {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FlowEdgesRepository flowEdgesRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FlowDataRepository flowDataRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationFormFieldRepository applicationFormFieldRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationFormRepository applicationFormRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationDao applicationDao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FormService formService;
|
||||||
|
@Autowired
|
||||||
|
private FormDao formDao;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Long getNextForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) {
|
||||||
|
// // vlaidation if next form findout and cuuent from is not fill the give error
|
||||||
|
// List<FlowEdgesEntity> 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<Long> 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<FlowEdgesEntity> 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<Long> 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<FlowDataEntity> flowDataList = flowDataRepository.findByFormIdInAndCallId(
|
||||||
|
// previousFormIds, applicationEntity.getCall().getId());
|
||||||
|
//
|
||||||
|
// List<String> 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<FormEntity> formList = applicationFormFieldRepository
|
||||||
|
// .findByFieldValueInAndAndApplicationFormApplicationId(
|
||||||
|
// fieldValue, applicationEntity.getId()).stream().map(applicationFormFieldEntity->applicationFormFieldEntity.getApplicationForm().getForm()).collect(Collectors.toSet());
|
||||||
|
//
|
||||||
|
// List<Long> 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<FlowEdgesEntity> 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<Long> 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<FlowEdgesEntity> 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<Long> previousFormIds = flowEdgesList.stream()
|
||||||
|
// .map(FlowEdgesEntity::getSourceId)
|
||||||
|
// .toList();
|
||||||
|
//
|
||||||
|
// // Fetch the flow data based on previous form IDs
|
||||||
|
// List<FlowDataEntity> flowDataList = flowDataRepository.findByFormIdInAndCallId(
|
||||||
|
// previousFormIds, applicationEntity.getCall().getId());
|
||||||
|
//
|
||||||
|
// List<String> chosenValues = flowDataList.stream()
|
||||||
|
// .map(FlowDataEntity::getChoosenValue)
|
||||||
|
// .toList();
|
||||||
|
//
|
||||||
|
// // Fetch the previous forms based on the chosen field values
|
||||||
|
// Set<FormEntity> 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<Long> 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 Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) {
|
||||||
|
|
||||||
|
List<FlowEdgesEntity> 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<Long> previousFormIds = flowEdgesList.stream()
|
||||||
|
.map(FlowEdgesEntity::getSourceId)
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
List<ApplicationFormEntity> applicationFormEntities=applicationFormRepository.findByFormIdInAndApplicationId(previousFormIds,applicationEntity.getId());
|
||||||
|
|
||||||
|
applicationFormEntities.sort(Comparator.comparing(ApplicationFormEntity::getCreatedDate).reversed());
|
||||||
|
|
||||||
|
return applicationFormEntities.isEmpty() ? null : applicationFormEntities.get(0).getForm().getId();
|
||||||
|
}
|
||||||
|
public NextOrPreviousFormResponse getnextOrPreviousForm(ApplicationEntity applicationEntity, Long formId,
|
||||||
|
FormActionEnum action) {
|
||||||
|
Long calculatedFormId = null;
|
||||||
|
FormEntity formEntity = null;
|
||||||
|
if (formId == null) {
|
||||||
|
calculatedFormId = getDefaultForm(applicationEntity);
|
||||||
|
} else {
|
||||||
|
if(action==null) {
|
||||||
|
throw new CustomValidationException(Status.VALIDATION_ERROR,
|
||||||
|
Translator.toLocale(GepafinConstant.ACTION_REQUIRED));
|
||||||
|
}
|
||||||
|
// 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);
|
||||||
|
} else {
|
||||||
|
calculatedFormId = getPreviousForm(formEntity, applicationEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NextOrPreviousFormResponse nextOrPreviousFormResponse = null;
|
||||||
|
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());
|
||||||
|
nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName());
|
||||||
|
|
||||||
|
List<FlowEdgesEntity> flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
|
||||||
|
Long totalFormSteps = calculateTotalSteps(flowEdgesList);
|
||||||
|
Long currentStep = calculateCurrentStep(formEntity);
|
||||||
|
nextOrPreviousFormResponse.setTotalFormSteps(totalFormSteps);
|
||||||
|
completedSteps = getCompletedSteps(applicationEntity);
|
||||||
|
nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(completedSteps));
|
||||||
|
nextOrPreviousFormResponse.setCurrentStep(currentStep);
|
||||||
|
return nextOrPreviousFormResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCompletedSteps(ApplicationEntity applicationEntity) {
|
||||||
|
Integer completedSteps=0;
|
||||||
|
List<ApplicationFormEntity> applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId());
|
||||||
|
List<ApplicationFormFieldEntity> 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())) {
|
||||||
|
currentStep = 1l;
|
||||||
|
} else if (formEntity.getId().equals(formEntity.getCall().getFinalForm())) {
|
||||||
|
currentStep = 3l;
|
||||||
|
}
|
||||||
|
return currentStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long calculateTotalSteps(List<FlowEdgesEntity> flowEdgesList) {
|
||||||
|
Long totalFormSteps = 3l;
|
||||||
|
if (flowEdgesList.size() == 1) {
|
||||||
|
totalFormSteps = 2l;
|
||||||
|
}
|
||||||
|
return totalFormSteps;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Long getDefaultForm(ApplicationEntity applicationEntity) {
|
||||||
|
List<ApplicationFormEntity> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
279
src/main/java/net/gepafin/tendermanagement/dao/FormDao.java
Normal file
279
src/main/java/net/gepafin/tendermanagement/dao/FormDao.java
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
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.*;
|
||||||
|
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;
|
||||||
|
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.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class FormDao {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FormRepository formRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallService callService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationFormRepository applicationFormRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallDao callDao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FlowDataRepository flowDataRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FlowEdgesRepository flowEdgesRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private VatCheckDao vatCheckDao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CallRepository callRepository;
|
||||||
|
|
||||||
|
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(setContentResponseBean(formRequest.getContent()));
|
||||||
|
formEntity=saveFormEntity(formEntity);
|
||||||
|
return formEntity;
|
||||||
|
}
|
||||||
|
public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity){
|
||||||
|
FormResponseBean formResponseBean=new FormResponseBean();
|
||||||
|
formResponseBean.setId(formEntity.getId());
|
||||||
|
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){
|
||||||
|
validateForm(formRequest);
|
||||||
|
CallEntity callEntity=callService.validateCall(callId);
|
||||||
|
List<FlowDataEntity> flowDataEntities=flowDataRepository.findByCallId(callId);
|
||||||
|
List<FlowEdgesEntity> 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);
|
||||||
|
}
|
||||||
|
public void validateForm(FormRequest formRequest){
|
||||||
|
if(formRequest.getContent()==null || formRequest.getLabel()==null ){
|
||||||
|
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public FormResponseBean updateForm(Long formId, FormRequest formRequest,Boolean forceDeleteFlow){
|
||||||
|
ContentRequestBean contentRequestBean2=null;
|
||||||
|
String choosenField=null;
|
||||||
|
FormEntity formEntity = validateForm(formId);
|
||||||
|
callDao.validateUpdate(formEntity.getCall());
|
||||||
|
List<ContentRequestBean> 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<SettingRequestBean> 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<FlowDataEntity> flowDataEntities = flowDataRepository.findByCallId(formEntity.getCall().getId());
|
||||||
|
List<FlowEdgesEntity> 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 convertFormEntityToFormResponseBean(formEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = validateForm(formId);
|
||||||
|
return convertFormEntityToFormResponseBean(formEntity);
|
||||||
|
}
|
||||||
|
public void deleteFormById(Long formId){
|
||||||
|
FormEntity formEntity = validateForm(formId);
|
||||||
|
List<FlowDataEntity> flowDataEntities=flowDataRepository.findByCallId(formEntity.getCall().getId());
|
||||||
|
List<FlowEdgesEntity> 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<FormResponseBean> getFormsByCallId(Long callId){
|
||||||
|
CallEntity callEntity=callService.validateCall(callId);
|
||||||
|
if(callEntity== null){
|
||||||
|
throw new CustomValidationException(Status.VALIDATION_ERROR,
|
||||||
|
Translator.toLocale(GepafinConstant.CALL_NOT_FOUND));
|
||||||
|
}
|
||||||
|
List<FormEntity> formEntities=formRepository.findByCallId(callId);
|
||||||
|
List<FormResponseBean> formResponseBeanList = formEntities.stream()
|
||||||
|
.map(req -> convertFormEntityToFormResponseBean(req))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
return formResponseBeanList;
|
||||||
|
}
|
||||||
|
public String setContentResponseBean(List<ContentRequestBean> contentRequestBeans){
|
||||||
|
return Utils.convertListToJsonString(contentRequestBeans);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validateFormField(List<ApplicationFormFieldRequestBean> applicationFormFieldRequestList, ApplicationEntity applicationEntity, FormEntity formEntity) {
|
||||||
|
Map<String, Object> formFieldMap = new LinkedHashMap<String, Object>();
|
||||||
|
for(ApplicationFormFieldRequestBean applicationFormFieldRequestBean:applicationFormFieldRequestList) {
|
||||||
|
if(applicationFormFieldRequestBean.getFieldValue()==null || applicationFormFieldRequestBean.getFieldValue().isEmpty())
|
||||||
|
continue;
|
||||||
|
formFieldMap.put(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 = (String) formFieldMap.get(fieldId);
|
||||||
|
String fieldLabel=contentResponseBean.getLabel();
|
||||||
|
|
||||||
|
if(value == null && isApplicationFormExist) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class);
|
||||||
|
validator
|
||||||
|
.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(), fieldLabel);
|
||||||
|
if(error != null) {
|
||||||
|
validator.addError(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
validator.validate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean getApplicationFormExist(ApplicationFormEntity applicationFormEntity) {
|
||||||
|
if(applicationFormEntity !=null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean validateCompletedSteps(List<ApplicationFormFieldEntity> applicationFormFieldEntityList, ApplicationEntity applicationEntity, FormEntity formEntity) {
|
||||||
|
Map<String, Object> formFieldMap = new LinkedHashMap<String, Object>();
|
||||||
|
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!=null && value.matches("^\\d{1,11}$")) {
|
||||||
|
Map<String, Object> customData=null;
|
||||||
|
try {
|
||||||
|
Map<String, Object> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
114
src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java
Normal file
114
src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
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.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.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.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 FormFieldDao {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FormFieldRepository formFieldRepository;
|
||||||
|
|
||||||
|
public FormFieldEntity convertFormFieldRequestToFormFieldEntity(FormFieldRequest formFieldRequest) {
|
||||||
|
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);
|
||||||
|
return formFieldEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FormFieldResponseBean convertFormFieldEntityToFormFieldResponseBean(FormFieldEntity formFieldEntity) {
|
||||||
|
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());
|
||||||
|
formFieldResponseBean.setValidators(Utils.convertIntoJson(formFieldEntity.getValidators()));
|
||||||
|
return formFieldResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FormFieldEntity saveFormFieldEntity(FormFieldEntity formFieldEntity) {
|
||||||
|
formFieldEntity = formFieldRepository.save(formFieldEntity);
|
||||||
|
return 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 = 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,
|
||||||
|
Utils.convertMapIntoJsonString(formFieldRequest.getValidators()));
|
||||||
|
formFieldEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
|
||||||
|
formFieldEntity = saveFormFieldEntity(formFieldEntity);
|
||||||
|
return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
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<SettingRequestBean> settingRequestBeans) {
|
||||||
|
return Utils.convertListToJsonString(settingRequestBeans);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<FormFieldResponseBean> getAllFormField() {
|
||||||
|
List<FormFieldEntity> formFieldEntities = formFieldRepository.findAll();
|
||||||
|
List<FormFieldResponseBean> formFieldResponseBeans = formFieldEntities.stream()
|
||||||
|
.map(req -> convertFormFieldEntityToFormFieldResponseBean(req)).collect(Collectors.toList());
|
||||||
|
return formFieldResponseBeans;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
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.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.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 {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FormTemplateRepository formTemplateRepository;
|
||||||
|
|
||||||
|
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 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 = 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<ContentRequestBean> contentRequestBeans) {
|
||||||
|
return Utils.convertListToJsonString(contentRequestBeans);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<FormTemplateResponseBean> getAllFormTemplate() {
|
||||||
|
List<FormTemplateEntity> formTemplateEntities = formTemplateRepository.findAll();
|
||||||
|
List<FormTemplateResponseBean> formTemplateResponseBeans = formTemplateEntities.stream()
|
||||||
|
.map(req -> convertFormTemplateEntityToFormTemplateResponseBean(req)).collect(Collectors.toList());
|
||||||
|
return formTemplateResponseBeans;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
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;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
|
||||||
|
import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
|
||||||
|
|
||||||
|
@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());
|
||||||
|
entity.setValue(lookUpDataReq.getResponse());
|
||||||
|
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 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 = validateLookUpData(id);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteLookUpData(Long id) {
|
||||||
|
LookUpDataEntity entity = validateLookUpData(id);
|
||||||
|
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.setResponse(entity.getResponse());
|
||||||
|
response.setCreatedDate(entity.getCreatedDate());
|
||||||
|
response.setUpdatedDate(entity.getUpdatedDate());
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<LookUpDataResponseBean> getLookUpDataByTypes(List<LookUpDataTypeEnum> types) {
|
||||||
|
return types.stream()
|
||||||
|
.flatMap(type -> lookUpDataRepository.findByType(type.getValue()).stream())
|
||||||
|
.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)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
133
src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java
Normal file
133
src/main/java/net/gepafin/tendermanagement/dao/RegionDao.java
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
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.model.request.RegionReq;
|
||||||
|
import net.gepafin.tendermanagement.model.response.RegionResponseBean;
|
||||||
|
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.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public class RegionDao {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(RegionDao.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RegionRepository regionRepository;
|
||||||
|
|
||||||
|
public RegionResponseBean createRegion(RegionReq regionReq) {
|
||||||
|
log.info("Creating new region with details: {}", regionReq);
|
||||||
|
RegionEntity regionEntity = convertRegionRequestToRegionEntity(regionReq);
|
||||||
|
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());
|
||||||
|
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().getValue());
|
||||||
|
regionEntity.setHealthcareAccess(regionReq.getHealthcareAccess());
|
||||||
|
regionEntity.setInfrastructureScore(regionReq.getInfrastructureScore());
|
||||||
|
regionEntity.setPriorityArea(regionReq.getPriorityArea());
|
||||||
|
regionEntity.setUnemploymentRate(regionReq.getUnemploymentRate());
|
||||||
|
regionEntity.setEducationLevel(regionReq.getEducationLevel());
|
||||||
|
return regionEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public 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(RegionStatusEnum.valueOf(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) {
|
||||||
|
log.info("Updating region with ID: {}", 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;
|
||||||
|
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::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());
|
||||||
|
|
||||||
|
existingRegion = regionRepository.save(existingRegion);
|
||||||
|
|
||||||
|
log.info("Region updated with ID: {}", existingRegion.getId());
|
||||||
|
return Utils.convertObject(existingRegion, RegionResponseBean.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = validateRegion(id);
|
||||||
|
return convertRegionEntityToRegionResponse(regionEntity);
|
||||||
|
}
|
||||||
|
public void deleteById(Long id) {
|
||||||
|
log.info("Deleting region with ID: {}", id);
|
||||||
|
validateRegion(id);
|
||||||
|
regionRepository.deleteById(id);
|
||||||
|
log.info("Region deleted with ID: {}", id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<RegionResponseBean> getAllRegions() {
|
||||||
|
log.info("Fetching all regions");
|
||||||
|
List<RegionResponseBean> regions = regionRepository.findAll()
|
||||||
|
.stream()
|
||||||
|
.map(regionEntity -> Utils.convertObject(regionEntity, RegionResponseBean.class))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
log.info("Total regions found: {}", regions.size());
|
||||||
|
return regions;
|
||||||
|
}
|
||||||
|
}
|
||||||
127
src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java
Normal file
127
src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
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.enums.RoleStatusEnum;
|
||||||
|
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.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;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class RoleDao {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(RoleDao.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RoleRepository roleRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
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.setRoleType(roleReq.getRoleType());
|
||||||
|
roleEntity.setPermissions(String.join(",", roleReq.getPermissions()));
|
||||||
|
roleEntity.setDescription(roleReq.getDescription());
|
||||||
|
RegionEntity regionEntity =regionDao.validateRegion(roleReq.getRegionId());
|
||||||
|
roleEntity.setRegion(regionEntity);
|
||||||
|
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.setRoleType(roleEntity.getRoleType());
|
||||||
|
roleResponseBean.setDescription(roleEntity.getDescription());
|
||||||
|
String permissionsString = roleEntity.getPermissions();
|
||||||
|
List<String> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RoleResponseBean updateRole(Long id, RoleReq roleReq) {
|
||||||
|
log.info("Updating role with ID: {}", id);
|
||||||
|
RoleEntity existingRole = validateRole(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::getRoleType, existingRole::setRoleType, roleReq.getRoleType());
|
||||||
|
setIfUpdated(existingRole::getDescription, existingRole::setDescription, roleReq.getDescription());
|
||||||
|
setIfUpdated(existingRole::getPermissions, existingRole::setPermissions, String.join(",", roleReq.getPermissions()));
|
||||||
|
|
||||||
|
existingRole = roleRepository.save(existingRole);
|
||||||
|
|
||||||
|
log.info("Role updated with ID: {}", existingRole.getId());
|
||||||
|
return Utils.convertObject(existingRole, RoleResponseBean.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = validateRole(id);
|
||||||
|
log.info("Role found: {}", roleEntity);
|
||||||
|
return convertRoleEntityToRoleResponse(roleEntity);
|
||||||
|
}
|
||||||
|
public void deleteById(Long id) {
|
||||||
|
log.info("Deleting role with ID: {}", id);
|
||||||
|
validateRole(id);
|
||||||
|
roleRepository.deleteById(id);
|
||||||
|
log.info("Role deleted with ID: {}", id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<RoleResponseBean> getAllRoles() {
|
||||||
|
log.info("Fetching all roles");
|
||||||
|
List<RoleResponseBean> roles = roleRepository.findAll()
|
||||||
|
.stream()
|
||||||
|
.map(this::convertRoleEntityToRoleResponse)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
log.info("Total roles found: {}", roles.size());
|
||||||
|
return roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RoleEntity getRoleByType(RoleStatusEnum roleStatus) {
|
||||||
|
return roleRepository.findByRoleType(roleStatus.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
292
src/main/java/net/gepafin/tendermanagement/dao/UserDao.java
Normal file
292
src/main/java/net/gepafin/tendermanagement/dao/UserDao.java
Normal file
@@ -0,0 +1,292 @@
|
|||||||
|
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.RoleStatusEnum;
|
||||||
|
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 static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public class UserDao {
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(UserDao.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserRepository userRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AuthenticationService authService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RoleDao roleDao;
|
||||||
|
|
||||||
|
public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) {
|
||||||
|
|
||||||
|
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);
|
||||||
|
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;
|
||||||
|
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());
|
||||||
|
setIfUpdated(userEntity::getAddress, userEntity::setAddress, userReq.getAddress());
|
||||||
|
setIfUpdated(userEntity::getPhoneNumber, userEntity::setPhoneNumber, userReq.getPhoneNumber());
|
||||||
|
if (userReq.getRoleId() != null) {
|
||||||
|
RoleEntity roleEntity = roleDao.validateRole(userReq.getRoleId());
|
||||||
|
setIfUpdated(userEntity::getRoleEntity, userEntity::setRoleEntity, roleEntity);
|
||||||
|
}
|
||||||
|
userEntity = userRepository.save(userEntity);
|
||||||
|
log.info("User updated with ID: {}", userEntity.getId());
|
||||||
|
return convertUserEntityToUserResponse(userEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserEntity convertUserRequestToUserEntity(UserReq userReq) {
|
||||||
|
UserEntity userEntity = new UserEntity();
|
||||||
|
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.ACTIVE.getValue());
|
||||||
|
userEntity.setLastName(userReq.getLastName());
|
||||||
|
userEntity.setOrganization(userReq.getOrganization());
|
||||||
|
userEntity.setAddress(userReq.getAddress());
|
||||||
|
userEntity.setPhoneNumber(userReq.getPhoneNumber());
|
||||||
|
userEntity.setRoleEntity(getRoleEntity(userReq.getRoleId()));
|
||||||
|
userEntity.setCodiceFiscale(userReq.getCodiceFiscale());
|
||||||
|
userEntity.setDateOfBirth(userReq.getDateOfBirth());
|
||||||
|
return 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());
|
||||||
|
userResponseBean.setUpdatedDate(userEntity.getUpdatedDate());
|
||||||
|
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(UserStatusEnum.valueOf(userEntity.getStatus()));
|
||||||
|
RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(userEntity.getRoleEntity());
|
||||||
|
userResponseBean.setRole(roleResponseBean);
|
||||||
|
userResponseBean.setLastLogin(userEntity.getLastLogin());
|
||||||
|
userResponseBean.setCodiceFiscale(userEntity.getCodiceFiscale());
|
||||||
|
userResponseBean.setDateOfBirth(userEntity.getDateOfBirth());
|
||||||
|
return userResponseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserResponseBean getUserById(Long id) {
|
||||||
|
log.info("Fetching user with ID: {}", id);
|
||||||
|
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));
|
||||||
|
// }
|
||||||
|
log.info("User found: {}", userEntity);
|
||||||
|
return convertUserEntityToUserResponse(userEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteUser(Long id) {
|
||||||
|
log.info("Deleting user with ID: {}", id);
|
||||||
|
validateUser(id);
|
||||||
|
userRepository.deleteById(id);
|
||||||
|
log.info("User deleted with ID: {}", id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public JWTToken login(LoginReq 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserEntity validateUser(Long userId) {
|
||||||
|
return userRepository.findById(userId)
|
||||||
|
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
|
||||||
|
Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)));
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = Utils.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));
|
||||||
|
}
|
||||||
|
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())) {
|
||||||
|
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 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);
|
||||||
|
UserEntity userEntity=validateUser(userId);
|
||||||
|
userEntity.setStatus(statusReq.getValue());
|
||||||
|
userEntity = userRepository.save(userEntity);
|
||||||
|
log.info("User status updated to {} for user ID: {}", statusReq, userId);
|
||||||
|
return convertUserEntityToUserResponse(userEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public JWTToken validateExistingUserToken(String token) {
|
||||||
|
return authService.validateExistingUserToken(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserSamlResponse validateNewUserToken(String token) {
|
||||||
|
return authService.validateNewUserToken(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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<String, Object> checkVatNumberApi(String vatNumber) {
|
||||||
|
if (Boolean.TRUE.equals(Boolean.parseBoolean(isVatCheckGloballyDisabled))) {
|
||||||
|
return new HashMap<>();
|
||||||
|
}
|
||||||
|
Map<String, Object> 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<Map<String, Object>> response = vatCheckService.checkVatNumber(baseUrl,vatNumber, headers);
|
||||||
|
|
||||||
|
if (response.getStatusCode() == HttpStatus.OK && response.hasBody()) {
|
||||||
|
log.info("Successfully checked vat number");
|
||||||
|
Map<String, Object> responseMap = response.getBody();
|
||||||
|
if (responseMap != null && responseMap.containsKey("data")) {
|
||||||
|
responseBody = (Map<String, Object>) responseMap.get("data");
|
||||||
|
responseBody.remove("timestamp_creation");
|
||||||
|
responseBody.remove("timestamp_last_update");
|
||||||
|
responseBody.remove("data_iscrizione");
|
||||||
|
responseBody.remove("id");
|
||||||
|
Map<String, Object> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package net.gepafin.tendermanagement.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "APPLICATION_FORM")
|
||||||
|
@Data
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
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", 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")
|
||||||
|
private LocalDateTime startDate;
|
||||||
|
|
||||||
|
@Column(name = "END_DATE")
|
||||||
|
private LocalDateTime endDate;
|
||||||
|
|
||||||
|
@Column(name = "STATUS", length = 255)
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "REGION_ID", foreignKey = @ForeignKey(name = "fk_region_call"))
|
||||||
|
private RegionEntity region;
|
||||||
|
|
||||||
|
@Column(name = "AMOUNT")
|
||||||
|
private BigDecimal amount;
|
||||||
|
|
||||||
|
@Column(name = "AMOUNT_MAX")
|
||||||
|
private BigDecimal amountMax;
|
||||||
|
|
||||||
|
@Column(name = "CONTACT_INFO", columnDefinition = "TEXT")
|
||||||
|
private String contactInfo;
|
||||||
|
|
||||||
|
@Column(name = "SUBMISSION_METHOD", columnDefinition = "TEXT")
|
||||||
|
private String submissionMethod;
|
||||||
|
|
||||||
|
@Column(name = "THRESHOLD")
|
||||||
|
private Long threshold;
|
||||||
|
|
||||||
|
@Column(name="DOCUMENTATION_REQUESTED",columnDefinition = "TEXT")
|
||||||
|
private String documentationRequested;
|
||||||
|
|
||||||
|
@Column(name = "PRIORITY_AREA", columnDefinition = "TEXT")
|
||||||
|
private String priorityArea;
|
||||||
|
|
||||||
|
@Column(name = "CONFIDI")
|
||||||
|
private Boolean confidi;
|
||||||
|
|
||||||
|
@Column(name="INITIAL_FORM")
|
||||||
|
private Long initialForm;
|
||||||
|
|
||||||
|
@Column(name="FINAL_FORM")
|
||||||
|
private Long finalForm;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
@Column(name ="IS_DELETED", nullable = false)
|
||||||
|
private Boolean isDeleted = false;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package net.gepafin.tendermanagement.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.JoinColumn;
|
||||||
|
import jakarta.persistence.ManyToOne;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "DOCUMENT")
|
||||||
|
@Data
|
||||||
|
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;
|
||||||
|
|
||||||
|
@Column(name="SOURCE")
|
||||||
|
private String source;
|
||||||
|
|
||||||
|
@Column(name="SOURCE_ID")
|
||||||
|
private Long sourceId;
|
||||||
|
|
||||||
|
@Column(name ="IS_DELETED", nullable = false)
|
||||||
|
private Boolean isDeleted = false;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package net.gepafin.tendermanagement.entities;
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.JoinColumn;
|
||||||
|
import jakarta.persistence.ManyToOne;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "EVALUATION_CRITERIA")
|
||||||
|
@Data
|
||||||
|
public class EvaluationCriteriaEntity extends BaseEntity {
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "CALL_ID", nullable = false)
|
||||||
|
private CallEntity call;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "LOOKUP_DATA_ID")
|
||||||
|
private LookUpDataEntity lookupData;
|
||||||
|
|
||||||
|
@Column(name = "SCORE", nullable = false)
|
||||||
|
private Long score;
|
||||||
|
|
||||||
|
@Column(name ="IS_DELETED", nullable = false)
|
||||||
|
private Boolean isDeleted = false;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package net.gepafin.tendermanagement.entities;
|
||||||
|
|
||||||
|
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
|
||||||
|
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 = "TITLE", columnDefinition = "TEXT")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
@Column(name = "VALUE", columnDefinition = "TEXT")
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
@Column(name = "RESPONSE", columnDefinition = "TEXT")
|
||||||
|
private String response;
|
||||||
|
|
||||||
|
@Column(name = "RESPONSE_DATE")
|
||||||
|
private LocalDateTime responseDate;
|
||||||
|
|
||||||
|
@Column(name ="IS_DELETED", nullable = false)
|
||||||
|
private Boolean isDeleted = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
@Column(name="TRACKING_ID")
|
||||||
|
private String trackingId;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
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{
|
||||||
|
|
||||||
|
@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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
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 = "SETTINGS")
|
||||||
|
private String settings;
|
||||||
|
|
||||||
|
@Column(name = "VALIDATORS")
|
||||||
|
private String validators;
|
||||||
|
|
||||||
|
@Column(name = "DESCRIPTION")
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
@Column(name = "SORT_ORDER")
|
||||||
|
private Integer sortOrder;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
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{
|
||||||
|
|
||||||
|
@Column(name = "LABEL", length = 255)
|
||||||
|
private String label;
|
||||||
|
|
||||||
|
@Column(name = "CONTENT", length = 255)
|
||||||
|
private String content;
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
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", columnDefinition = "TEXT", 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;
|
||||||
|
|
||||||
|
@Column(name = "RESPONSE", columnDefinition = "TEXT")
|
||||||
|
private String response;
|
||||||
|
|
||||||
|
public enum LookUpDataTypeEnum {
|
||||||
|
CHECKLIST("CHECKLIST"),
|
||||||
|
AIMED_TO("AIMED_TO"),
|
||||||
|
EVALUATION_CRITERIA("EVALUATION_CRITERIA"),
|
||||||
|
FAQ("FAQ");
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
LookUpDataTypeEnum(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonValue
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package net.gepafin.tendermanagement.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
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 = 255, 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;
|
||||||
|
|
||||||
|
@Column(name = "ROLE_TYPE", length = 255, nullable = true)
|
||||||
|
private String roleType;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
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")
|
||||||
|
@Data
|
||||||
|
public class SamlResponseEntity extends BaseEntity{
|
||||||
|
|
||||||
|
@Column(name = "AUTHENTICATION_OBJECT")
|
||||||
|
private String authenticationObject;
|
||||||
|
|
||||||
|
@Column(name = "TOKEN")
|
||||||
|
private String token;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package net.gepafin.tendermanagement.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.Email;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "GEPAFIN_USER")
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class UserEntity extends BaseEntity {
|
||||||
|
|
||||||
|
@Column(name = "PASSWORD", columnDefinition = "TEXT",nullable = true)
|
||||||
|
@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;
|
||||||
|
|
||||||
|
@Column(name = "RESET_PASSWORD_TOKEN", length = 255, nullable = true)
|
||||||
|
private String resetPasswordToken;
|
||||||
|
|
||||||
|
@Column(name = "CODICE_FISCALE")
|
||||||
|
private String codiceFiscale;
|
||||||
|
|
||||||
|
@Column(name = "DATE_OF_BIRTH")
|
||||||
|
private LocalDateTime dateOfBirth;
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package net.gepafin.tendermanagement.enums;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonValue;
|
||||||
|
|
||||||
|
public enum ApplicationStatusTypeEnum {
|
||||||
|
|
||||||
|
DRAFT("DRAFT"),
|
||||||
|
SUBMIT("SUBMIT"),
|
||||||
|
DISCARD("DISCARD");
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
ApplicationStatusTypeEnum(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonValue
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
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"),
|
||||||
|
PUBLISH("PUBLISH"),
|
||||||
|
EXPIRED("EXPIRED"),
|
||||||
|
READY_TO_PUBLISH("READY_TO_PUBLISH");
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
CallStatusEnum(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonValue
|
||||||
|
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<String> getStatusValues() {
|
||||||
|
return Arrays.stream(CallStatusEnum.values())
|
||||||
|
.map(CallStatusEnum::getValue)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import lombok.Data;
|
||||||
|
import net.gepafin.tendermanagement.entities.ApplicationFormEntity;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ApplicationFormFieldRequestBean {
|
||||||
|
|
||||||
|
private String fieldId;
|
||||||
|
|
||||||
|
private String fieldValue;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ApplicationRequest {
|
||||||
|
|
||||||
|
private String comments;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
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 List<ApplicationFormFieldRequestBean> formFields;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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<SettingRequestBean> settings;
|
||||||
|
private Map<String,Object> validators;
|
||||||
|
private Integer dbId;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class CreateCallRequestStep1 {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private String descriptionShort;
|
||||||
|
|
||||||
|
private String descriptionLong;
|
||||||
|
|
||||||
|
private List<LocalDateTime> dates;
|
||||||
|
|
||||||
|
private Long regionId;
|
||||||
|
|
||||||
|
private BigDecimal amount;
|
||||||
|
|
||||||
|
private BigDecimal amountMax;
|
||||||
|
|
||||||
|
private List<LookUpDataReq> aimedTo;
|
||||||
|
|
||||||
|
private String documentationRequested;
|
||||||
|
|
||||||
|
private Boolean confidi;
|
||||||
|
|
||||||
|
private List<FaqReq> faq;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class CreateCallRequestStep2 {
|
||||||
|
|
||||||
|
private Long threshold;
|
||||||
|
|
||||||
|
private List<EvaluationCriteriaReq> criteria;
|
||||||
|
|
||||||
|
private List<LookUpDataReq> checkList;
|
||||||
|
|
||||||
|
private List<DocumentReq> docs;
|
||||||
|
|
||||||
|
private List<DocumentReq> images;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class EvaluationCriteriaReq extends LookUpDataReq{
|
||||||
|
|
||||||
|
private Long score;
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class EvaluationCriteriaRequest extends LookUpDataReq {
|
||||||
|
|
||||||
|
private Long callId;
|
||||||
|
|
||||||
|
private Long score;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class FaqReq extends LookUpDataReq {
|
||||||
|
|
||||||
|
private Boolean isVisible;
|
||||||
|
private String response;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class FlowEdgesRequestBean {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String source;
|
||||||
|
|
||||||
|
private String target;
|
||||||
|
|
||||||
|
private String type;
|
||||||
|
}
|
||||||
@@ -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<FlowDataRequestBean> flowData;
|
||||||
|
|
||||||
|
private List<FlowEdgesRequestBean> flowEdges;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
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 description;
|
||||||
|
|
||||||
|
private Integer sortOrder;
|
||||||
|
|
||||||
|
private String label;
|
||||||
|
|
||||||
|
private List<SettingRequestBean> settings;
|
||||||
|
|
||||||
|
private Map<String,Object> validators;
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class FormRequest {
|
||||||
|
|
||||||
|
private String label;
|
||||||
|
|
||||||
|
private List<ContentRequestBean> content;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class FormTemplateRequest {
|
||||||
|
|
||||||
|
private String label;
|
||||||
|
|
||||||
|
private List<ContentRequestBean> content;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class InitiatePasswordResetReq {
|
||||||
|
private String email;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class LogoutReq {
|
||||||
|
private String email;
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class LookUpDataReq {
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private Long lookUpDataId;
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
private String response;
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
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;
|
||||||
|
private String response;
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import net.gepafin.tendermanagement.enums.RegionStatusEnum;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class RegionReq {
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ResetPasswordReq {
|
||||||
|
private String email;
|
||||||
|
private String token;
|
||||||
|
private String newPassword;
|
||||||
|
private String confirmPassword;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class RoleReq {
|
||||||
|
|
||||||
|
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String roleName;
|
||||||
|
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
private List<String> permissions;
|
||||||
|
|
||||||
|
private Long regionId;
|
||||||
|
|
||||||
|
private String roleType;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class SettingRequestBean {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private Object value;
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
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 List<LocalDateTime> dates;
|
||||||
|
|
||||||
|
private BigDecimal amount;
|
||||||
|
|
||||||
|
private BigDecimal amountMax;
|
||||||
|
|
||||||
|
private List<LookUpDataReq> aimedTo;
|
||||||
|
|
||||||
|
private String documentationRequested;
|
||||||
|
|
||||||
|
private Boolean confidi;
|
||||||
|
|
||||||
|
private List<FaqReq> faq;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import net.gepafin.tendermanagement.enums.RegionStatusEnum;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class UpdateRegionReq {
|
||||||
|
private String regionName;
|
||||||
|
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
private String country;
|
||||||
|
|
||||||
|
private RegionStatusEnum 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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import net.gepafin.tendermanagement.enums.UserStatusEnum;
|
||||||
|
|
||||||
|
@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 UserStatusEnum status;
|
||||||
|
private String country;
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.request;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class UserReq {
|
||||||
|
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
private String confPassword;
|
||||||
|
|
||||||
|
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 codiceFiscale;
|
||||||
|
|
||||||
|
private LocalDateTime dateOfBirth;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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 Object fieldValue;
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.response;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
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 Long callId;
|
||||||
|
|
||||||
|
private String callTitle;
|
||||||
|
|
||||||
|
private List<FormApplicationResponse> form;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
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 String callTitle;
|
||||||
|
|
||||||
|
private LocalDateTime callEndDate;
|
||||||
|
|
||||||
|
private LocalDateTime modifiedDate;
|
||||||
|
|
||||||
|
private Integer progress;
|
||||||
|
|
||||||
|
private LocalDateTime submissionDate;
|
||||||
|
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
private String comments;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package net.gepafin.tendermanagement.model.response;
|
||||||
|
|
||||||
|
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<ApplicationFormFieldResponseBean> formFields;
|
||||||
|
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user