Commit 96011622 authored by Destin DERVAN TATI's avatar Destin DERVAN TATI

first-commit

parents
Pipeline #561 failed with stages
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.2.0
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "$(uname)" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
else
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=$(java-config --jre-home)
fi
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="$(which javac)"
if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=$(which readlink)
if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
if $darwin ; then
javaHome="$(dirname "\"$javaExecutable\"")"
javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
else
javaExecutable="$(readlink -f "\"$javaExecutable\"")"
fi
javaHome="$(dirname "\"$javaExecutable\"")"
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=$(cd "$wdir/.." || exit 1; pwd)
fi
# end of workaround
done
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
# Remove \r in case we run on Windows within Git Bash
# and check out the repository with auto CRLF management
# enabled. Otherwise, we may read lines that are delimited with
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
# splitting rules.
tr -s '\r\n' ' ' < "$1"
fi
}
log() {
if [ "$MVNW_VERBOSE" = true ]; then
printf '%s\n' "$1"
fi
}
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
log "$MAVEN_PROJECTBASEDIR"
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
if [ -r "$wrapperJarPath" ]; then
log "Found $wrapperJarPath"
else
log "Couldn't find $wrapperJarPath, downloading it ..."
if [ -n "$MVNW_REPOURL" ]; then
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
else
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
fi
while IFS="=" read -r key value; do
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
safeValue=$(echo "$value" | tr -d '\r')
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
log "Downloading from: $wrapperUrl"
if $cygwin; then
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
fi
if command -v wget > /dev/null; then
log "Found wget ... using wget"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
log "Found curl ... using curl"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
else
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
fi
else
log "Falling back to using Java to download"
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaSource=$(cygpath --path --windows "$javaSource")
javaClass=$(cygpath --path --windows "$javaClass")
fi
if [ -e "$javaSource" ]; then
if [ ! -e "$javaClass" ]; then
log " - Compiling MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/javac" "$javaSource")
fi
if [ -e "$javaClass" ]; then
log " - Running MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
wrapperSha256Sum=""
while IFS="=" read -r key value; do
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
if [ -n "$wrapperSha256Sum" ]; then
wrapperSha256Result=false
if command -v sha256sum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
elif command -v shasum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
exit 1
fi
if [ $wrapperSha256Result = false ]; then
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
exit 1
fi
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
# shellcheck disable=SC2086 # safe args
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.2.0
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %WRAPPER_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
SET WRAPPER_SHA_256_SUM=""
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
)
IF NOT %WRAPPER_SHA_256_SUM%=="" (
powershell -Command "&{"^
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
" exit 1;"^
"}"^
"}"
if ERRORLEVEL 1 goto error
)
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%
File added
<?xml version="1.0" encoding="UTF-8"?>
<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>2.7.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>bmci.esign</groupId>
<artifactId>backend-end</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>backend-esign</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
<version>7.18.0</version>
</dependency>
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
-->
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.16.3</version>
</dependency>
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.26</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package bmci.esign.backendend;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.StdDateFormat;
import org.modelmapper.ModelMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import javax.annotation.PostConstruct;
import java.util.TimeZone;
@SpringBootApplication
public class BackendEsignApplication {
@Bean
public ModelMapper modelMapper() {
return new ModelMapper();
}
public static void main(String[] args) {
SpringApplication.run(BackendEsignApplication.class, args);
}
}
package bmci.esign.backendend;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(BackendEsignApplication.class);
}
}
package bmci.esign.backendend.Tasklist;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class SendDocument implements JavaDelegate {
private static final Logger LOGGER = LoggerFactory.getLogger(SendNotification.class);
@Override
public void execute(DelegateExecution delegateExecution) throws Exception {
LOGGER.info("SendDocument interest of the loan");
}
}
package bmci.esign.backendend.Tasklist;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class SendNotification implements JavaDelegate {
private static final Logger LOGGER = LoggerFactory.getLogger(SendNotification.class);
@Override
public void execute(DelegateExecution delegateExecution) throws Exception {
LOGGER.info("SendNotification interest of the loan");
}
}
package bmci.esign.backendend.Tasklist;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class SignedDocument implements JavaDelegate {
private static final Logger LOGGER = LoggerFactory.getLogger(SendNotification.class);
@Override
public void execute(DelegateExecution delegateExecution) throws Exception {
LOGGER.info("SignedDocument interest of the loan");
}
}
package bmci.esign.backendend.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer()
{
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH")
.allowedHeaders("*")
.allowedOrigins("*");
}
};
}
}
package bmci.esign.backendend.config;
import bmci.esign.backendend.dto.StatutDto;
import bmci.esign.backendend.dto.TypeDemandeDto;
import bmci.esign.backendend.models.enums.EDemande;
import bmci.esign.backendend.models.enums.EStatut;
import bmci.esign.backendend.services.StatutService;
import bmci.esign.backendend.services.TypeDemandeService;
import bmci.esign.backendend.services.TypeDocumentService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
public class InitData {
private final StatutService statutService;
private final TypeDocumentService typeDocumentService;
private final TypeDemandeService typeDemandeService;
public InitData(StatutService statutService, TypeDocumentService typeDocumentService, TypeDemandeService typeDemandeService) {
this.statutService = statutService;
this.typeDocumentService = typeDocumentService;
this.typeDemandeService = typeDemandeService;
}
@Bean
CommandLineRunner runner(){
return args -> {
StatutDto statutDto = statutService.addStatut(new StatutDto(0L, EStatut.WAITING, new Date(), new Date()
));
StatutDto statutDto1 = statutService.addStatut(new StatutDto(0L, EStatut.CANCELED, new Date(), new Date()
));
StatutDto statutDto2 = statutService.addStatut(new StatutDto(0L, EStatut.COMPLETE, new Date(), new Date()
));
TypeDemandeDto typeDemandeDto = typeDemandeService.addTypeDemande(new TypeDemandeDto(0L, "Parallèle", new Date(), new Date()));
TypeDemandeDto typeDemandeDto1 = typeDemandeService.addTypeDemande(new TypeDemandeDto(0L, "Séquence", new Date(), new Date()));
};
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.AuthorityDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.services.AuthorityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/authority")
public class AuthorityController {
@Autowired
private AuthorityService authorityService;
@GetMapping("/get")
public ResponseModelStandard<List<AuthorityDto>> getAll(){
return new ResponseModelStandard<>("000", authorityService.getAll());
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.models.enums.EStatut;
import bmci.esign.backendend.services.DemandeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/demande")
public class DemandeController {
@Autowired
private DemandeService demandeService;
@PostMapping("/add")
public ResponseModelStandard<Long> addDemande(@RequestBody DemandeDto demandeDto){
System.out.println("ggg");
System.out.println("ggg");
try {
demandeService.addDemande(demandeDto);
return new ResponseModelStandard<>("000");
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
@GetMapping("/get")
public ResponseModelStandard<DemandeDto> getDemande(@RequestParam( name = "id") Long id){
try {
DemandeDto demandeDto = demandeService.getDemande(id);
return new ResponseModelStandard<>("000", demandeDto);
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
@GetMapping("/relaunch")
public ResponseModelStandard<Long> relaunchDemande(@RequestParam( name = "idDemand") Long id,
@RequestParam(name = "idDestinataire") Long idDestinataire){
try {
String message = demandeService.relaunchUser(id, idDestinataire);
if(message.equals("success")){
return new ResponseModelStandard<>("000");
}
return new ResponseModelStandard<>("099");
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
@GetMapping("/canceled")
public ResponseModelStandard<Long> canceledDemande(@RequestParam( name = "idDemand") Long id){
try {
DemandeDto demandeDto = demandeService.getDemande(id);
if(demandeDto.getStatut().equals(EStatut.WAITING.name())){
String message = demandeService.cancelDemand(demandeDto);
if(message.equals("success")){
return new ResponseModelStandard<>("000");
}
}
return new ResponseModelStandard<>("099");
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
@GetMapping("/getForUser")
public ResponseModelStandard<List<DemandeDto>> getForUserDemande(@RequestParam(name = "id") Long id){
try {
List<DemandeDto> demandeDtoList = demandeService.getAllbyUser(id);
return new ResponseModelStandard<>("000",demandeDtoList);
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
@GetMapping("/getForUser/search")
public ResponseModelStandard<Map<String, Object>> getForUserDemandeSearch(@RequestParam(name = "id") Long id,
@RequestParam(name = "page") int page,
@RequestParam(name = "limit") int limit,
@RequestParam(name = "statut") String statut,
@RequestParam(name = "eDemande") String eDemande,
@RequestParam(name = "date") @DateTimeFormat(pattern = "yyyy-MM-dd") Date dateStart){
try {
Map<String, Object> demandeDtoList = demandeService.getForUserDemandeSearch(id, page, limit, statut,eDemande, dateStart);
return new ResponseModelStandard<>("000",demandeDtoList);
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.DestinataireDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.services.DestinataireService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/destinataire")
public class DestinataireController {
@Autowired
private DestinataireService destinataireService;
@PostMapping("/addAll")
public ResponseModelStandard<Long> addAllDestinataire(@RequestBody List<DestinataireDto> destinataireDtos){
List<DestinataireDto> list = destinataireService.addAll(destinataireDtos);
return new ResponseModelStandard<>("000");
}
@PostMapping("/add")
public ResponseModelStandard<Long> addDestinataire(@RequestBody DestinataireDto destinataireDto){
DestinataireDto destinataire = destinataireService.addDestinataire(destinataireDto);
return new ResponseModelStandard<>("000");
}
@GetMapping("/get")
public ResponseModelStandard<List<DestinataireDto>> findAllByDemandeId(@RequestParam(name = "id") Long id){
List<DestinataireDto> destinataireDtos = destinataireService.findAllByDemandeId(id);
return new ResponseModelStandard<>("000", destinataireDtos);
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.PositionDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.services.PositionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/position")
public class PositionController {
@Autowired
private PositionService positionService;
@PostMapping("/add")
public ResponseModelStandard<Long> addPosition(@RequestBody PositionDto positionDto){
positionService.addPosition(positionDto);
return new ResponseModelStandard<>("000");
}
@GetMapping("/getByDestinataire")
public ResponseModelStandard<List<PositionDto>> findAllByDestinataire(@RequestParam(name = "id") Long id){
List<PositionDto> positionDtos = positionService.findAllByDestinataireId(id);
return new ResponseModelStandard<>("000", positionDtos);
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.SignatureDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.services.SignatureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/signature")
public class SignatureController {
@Autowired
private SignatureService signatureService;
@PostMapping("/add")
public ResponseModelStandard<Long> addSignature(@RequestBody SignatureDto signatureDto){
try {
signatureService.addSignature(signatureDto);
return new ResponseModelStandard<>("000");
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
@GetMapping("/get")
public ResponseModelStandard<List<SignatureDto>> getSignature(@RequestParam(name = "id") Long id){
try {
List<SignatureDto> signatureDtos = signatureService.findAllByUserId(id);
return new ResponseModelStandard<>("000", signatureDtos);
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.StatutDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.services.StatutService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/statut")
public class StatutController {
@Autowired
private StatutService statutService;
@GetMapping("/get")
public ResponseModelStandard<List<StatutDto>> getAllStatut(){
try {
List<StatutDto> statutDtos = statutService.getAll();
return new ResponseModelStandard<>("000", statutDtos);
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
}
package bmci.esign.backendend.controllers;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.ProcessEngines;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.camunda.bpm.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/tasks")
public class TaskController {
// Define the process definition key
private static final String PROCESS_DEFINITION_KEY = "esignapp-process";
// Autowire TaskService for managing tasks
@Autowired
private TaskService taskService;
// Instance ID to track process instances
static String instanceId = "";
// Endpoint to start a process instance
@GetMapping("/demarrer-proccess")
public ResponseEntity<String> demarrerProccess() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
// Define process variables
Map<String, Object> processVariables = new HashMap<>();
processVariables.put("operationidworkflow", "next");
// Start a new process instance
ProcessInstance pi = runtimeService.startProcessInstanceByKey(PROCESS_DEFINITION_KEY, processVariables);
// Get the process instance key
String processInstanceKey = pi.getProcessInstanceId();
// Create a response message including the process instance key
String responseMessage = "Le processus a démarré avec la clé : " + processInstanceKey;
// Store the process instance ID for future reference
instanceId = processInstanceKey;
// Return a success response
return ResponseEntity.ok("User task completed successfully" + responseMessage);
}
// Endpoint to add a demand
@GetMapping("/adddemande/{instance}")
public ResponseEntity<String> adddemande(@PathVariable(name = "instance") String key) {
try {
// Query for the user task associated with the process instance and assigned to the specified user
Task userTask = taskService.createTaskQuery()
.processInstanceId(key)
.taskCandidateUser("demo")
.singleResult();
if (userTask != null) {
// Set a process variable
taskService.setVariable(userTask.getId(), "variableName", "variable ");
// Complete the user task
taskService.complete(userTask.getId());
return ResponseEntity.ok("User task adddemande completed");
} else {
return ResponseEntity.badRequest().body("No user task found for the specified process instance and assignee");
}
} catch (Exception e) {
return ResponseEntity.badRequest().body("Error completing user task: " + e.getMessage());
}
}
// Endpoint to e-sign a file
@GetMapping("/esignfile/{instance}/{operation}")
public ResponseEntity<String> esignfile(@PathVariable(name = "instance") String key, @PathVariable(name = "operation") String operation) {
try {
// Query for the user task associated with the process instance and assigned to the specified user
Task userTask = taskService.createTaskQuery()
.processInstanceId(key)
.taskDefinitionKey("Activity_0gktoje")
.singleResult();
if (userTask != null) {
// Set a process variable
taskService.setVariable(userTask.getId(), "operationidworkflow", operation);
// Complete the user task
taskService.complete(userTask.getId());
return ResponseEntity.ok("esignfile completed");
} else {
return ResponseEntity.badRequest().body("No user task found for the specified process instance and assignee");
}
} catch (Exception e) {
return ResponseEntity.badRequest().body("Error completing user task: " + e.getMessage());
}
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.models.MailRequest;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.models.enums.EMailStatus;
import bmci.esign.backendend.models.enums.EStatut;
import bmci.esign.backendend.repositories.MailRequestRepository;
import bmci.esign.backendend.services.DemandeService;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/token")
public class TokenController {
private final MailRequestRepository mailRequestRepository;
private final DemandeService demandeService;
public TokenController(MailRequestRepository mailRequestRepository, DemandeService demandeService) {
this.mailRequestRepository = mailRequestRepository;
this.demandeService = demandeService;
}
@GetMapping("/getToken")
public ResponseModelStandard<DemandeDto> getToken(@RequestParam(name = "token") String token){
MailRequest mailRequest = mailRequestRepository.findByToken(token);
if(mailRequest != null){
if(mailRequest.getStatus().equals(EMailStatus.SENT)){
mailRequest.setStatus(EMailStatus.CLICKED);
mailRequestRepository.save(mailRequest);
}
DemandeDto demandeDto = demandeService.getDemande(mailRequest.getDemandeId());
if(demandeDto.getStatut().equals(EStatut.COMPLETE.name())){
return new ResponseModelStandard<>("014");
}else if(demandeDto.getStatut().equals(EStatut.CANCELED.name())){
return new ResponseModelStandard<>("015");
}
if(demandeDto.getExpirationDate().compareTo(new Date()) < 0){
return new ResponseModelStandard<>("013");
}
demandeDto.setDestinataires(
demandeDto.getDestinataires().stream().filter(destinataireDto -> destinataireDto.getEmail().equals(mailRequest.getDestination())).collect(Collectors.toList()));
if(demandeDto.getDestinataires().get(0).getStatut().equals(EStatut.COMPLETE.name())){
return new ResponseModelStandard<>("014");
}else if(demandeDto.getDestinataires().get(0).getStatut().equals(EStatut.CANCELED.name())){
return new ResponseModelStandard<>("015");
}
return new ResponseModelStandard<>("000", demandeDto);
}else{
return new ResponseModelStandard<>("012");
}
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.TypeDemandeDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.services.TypeDemandeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/TDemande")
public class TypeDemandeController {
@Autowired
private TypeDemandeService typeDemandeService;
@GetMapping("/get")
public ResponseModelStandard<List<TypeDemandeDto>> getAlltypeDemande(){
try {
List<TypeDemandeDto> typeDemandeDtos = typeDemandeService.getAll();
return new ResponseModelStandard<>("000", typeDemandeDtos);
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.TypeDocumentDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.services.TypeDocumentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/TDocument")
public class TypeDocumentController {
@Autowired
private TypeDocumentService typeDocumentService;
@GetMapping("/get")
public ResponseModelStandard<List<TypeDocumentDto>> getAllTypeDocument(){
try {
List<TypeDocumentDto> typeDocumentDtos = typeDocumentService.getAll();
return new ResponseModelStandard<>("000", typeDocumentDtos);
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.dto.SignaturePageDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.Demande;
import bmci.esign.backendend.models.MailRequest;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.models.enums.EMailStatus;
import bmci.esign.backendend.models.enums.EStatut;
import bmci.esign.backendend.repositories.MailRequestRepository;
import bmci.esign.backendend.services.DemandeService;
import bmci.esign.backendend.services.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.net.MalformedURLException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/upload")
public class UploadController {
@Value("${file.upload-dir.access}")
private String UPLOAD_DIR;
@Autowired
private UploadService uploadService;
@Autowired
private MailRequestRepository mailRequestRepository;
@Autowired
private DemandeService demandeService;
@Autowired
private IMapClassWithDto<Demande, DemandeDto> demandeMapping;
public UploadController(UploadService uploadService) {
this.uploadService = uploadService;
}
@PostMapping("/pdf")
public ResponseModelStandard<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
if (file.isEmpty()) {
return new ResponseModelStandard<>("099", "The file is empty.");
}
String fileDownloadUri = uploadService.uploadFile(file);
return new ResponseModelStandard<>("000", fileDownloadUri);
} catch (Exception ex) {
return new ResponseModelStandard<>("099", "Error downloading file");
}
}
@GetMapping("/documents/{fileName}")
public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {
try {
Path filePath = Paths.get(UPLOAD_DIR).resolve(fileName).normalize();
Resource resource = new UrlResource(filePath.toUri());
if (resource.exists() && resource.isReadable()) {
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_PDF)
.header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + resource.getFilename() + "\"")
.body(resource);
} else {
return ResponseEntity.notFound().build();
}
} catch (MalformedURLException ex) {
return ResponseEntity.status(500).body(null);
}
}
@PostMapping("/modifyPdf/{token}")
public ResponseModelStandard<Long> modifyPdfbyToken(@RequestBody List<SignaturePageDto> signaturePageDtos, @PathVariable String token) {
MailRequest mailRequest = mailRequestRepository.findByToken(token);
if(mailRequest != null){
if(mailRequest.getStatus().equals(EMailStatus.SENT)){
mailRequest.setStatus(EMailStatus.CLICKED);
mailRequestRepository.save(mailRequest);
}
DemandeDto demandeDto = demandeService.getDemande(mailRequest.getDemandeId());
if(demandeDto.getStatut().equals(EStatut.COMPLETE.name())){
return new ResponseModelStandard<>("014");
}else if(demandeDto.getStatut().equals(EStatut.CANCELED.name())){
return new ResponseModelStandard<>("015");
}
if(demandeDto.getExpirationDate().compareTo(new Date()) < 0){
return new ResponseModelStandard<>("013");
}
demandeDto.setDestinataires(
demandeDto.getDestinataires().stream().filter(destinataireDto -> destinataireDto.getEmail().equals(mailRequest.getDestination())).collect(Collectors.toList()));
String var = uploadService.modifyPdf(signaturePageDtos,demandeDto);
if(var.equals("success")){
Demande demande = demandeService.findDemande(mailRequest.getDemandeId());
demandeService.processEmail(demande);
return new ResponseModelStandard<>("000");
}else if(var.equals("cancel")){
DemandeDto demandeDto1 = demandeService.getDemande(mailRequest.getDemandeId());
demandeDto1.setStatut(EStatut.CANCELED.name());
demandeService.updateDemande(demandeDto1, demandeDto1.getId());
}
return new ResponseModelStandard<>("015");
}else{
return new ResponseModelStandard<>("012");
}
}
}
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.UserDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.services.UserService;
import org.springframework.web.bind.annotation.*;
import java.nio.file.LinkOption;
@RestController
@RequestMapping("/user")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping("/add")
public ResponseModelStandard<Long> addUser(@RequestBody UserDto userDto){
userService.addUser(userDto);
return new ResponseModelStandard<>("000");
}
@GetMapping("/get")
public ResponseModelStandard<UserDto> getUser(@RequestParam(name = "email") String email){
return new ResponseModelStandard<>("000", userService.findByEmail(email));
}
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.enums.ERole;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data @NoArgsConstructor @AllArgsConstructor
public class AuthorityDto {
private Long id;
private ERole name;
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.TypeDocument;
import bmci.esign.backendend.models.enums.EDemande;
import bmci.esign.backendend.models.enums.EStatut;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor @NoArgsConstructor
public class DemandeDto implements Serializable {
private Long id;
private String confidentiality;
private String priority;
private String objetMail;
private String message;
private String statut;
private String edemande;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private UserDto user;
private TypeDocument typeDocument;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date expirationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date modificationDate;
private List<DestinataireDto> destinataires;
private List<DocumentDto> documents;
public String getEDemande() {
return EDemande.valueOf(edemande).getDisplayName();
}
public String getStringDemand(){
return edemande;
}
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.Demande;
import bmci.esign.backendend.models.Position;
import bmci.esign.backendend.models.enums.EStatut;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
@NoArgsConstructor @AllArgsConstructor
public class DestinataireDto {
private Long id;
private String name;
private String email;
private String role;
private String statut;
private String envoie;
private int place;
@JsonIgnore
private DemandeDto demande;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date modificationDate;
private List<PositionDto> positions;
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.Demande;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data @AllArgsConstructor @NoArgsConstructor
public class DocumentDto {
private Long id;
private String directory;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Demande demande;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date modificationDate;
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.enums.EMailStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MailRequestDto {
private Long id;
private String destination;
private String email_type;
private long demandeId;
private String processCamundaId ;
private String token;
private String expiration_date;
private String name;
private String userMessage;
private EMailStatus status;
private String responseMessage;
private String url_sign;
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.enums.EObjet;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.File;
@Data
@NoArgsConstructor @AllArgsConstructor
public class ObjetSignatureDto {
private File file;
private String fileBase64;
private String text;
private String typeObjet;
private int height;
private int width;
private int x;
private int y;
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.Destinataire;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Type;
import javax.persistence.Column;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Data @AllArgsConstructor
@NoArgsConstructor
public class PositionDto {
private Long id;
@JsonIgnore
private Destinataire destinataire;
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private HashMap<String, Object> information;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date modificationDate;
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.User;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SignatureDto {
private Long id;
private String directory;
private User user;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date modificationDate;
}
package bmci.esign.backendend.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor @AllArgsConstructor
public class SignaturePageDto {
private int Page;
private List<ObjetSignatureDto> objetSignatureDtos;
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.enums.EDemande;
import bmci.esign.backendend.models.enums.EStatut;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StatutDto {
private Long id;
private EStatut name;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date modificationDate;
}
package bmci.esign.backendend.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TypeDemandeDto {
private Long id;
private String name;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date modificationDate;
}
package bmci.esign.backendend.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TypeDocumentDto {
private Long id;
private String name;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date modificationDate;
}
package bmci.esign.backendend.dto;
import bmci.esign.backendend.models.Authority;
import bmci.esign.backendend.models.Demande;
import bmci.esign.backendend.models.Signature;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.Set;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {
private Long id;
private String firstname;
private String lastname;
private String avatar;
private String email;
private String password;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date modificationDate;
private Set<Authority> authorities;
}
package bmci.esign.backendend.dto.services;
import org.springframework.data.domain.Page;
import java.util.Collection;
import java.util.List;
public interface IMapClassWithDto<E,D> {
D convertToDto(E entity, Class<D> dtoClass);
E convertToEntity(D dto, Class<E> entityClass);
List<D> convertListToListDto(Collection<E> entityList, Class<D> outCLass);
List<D> convertPageToListDto(Page<E> entityList, Class<D> outCLass);
List<E> convertListToListEntity(Collection<D> dtoList, Class<E> outCLass);
}
package bmci.esign.backendend.dto.services;
import org.modelmapper.Conditions;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class MapClassWithDto<E, D> implements IMapClassWithDto<E, D> {
@Autowired
private ModelMapper modelMapper;
@Override
public D convertToDto(E entity, Class<D> dtoClass) {
if(entity == null){
return null;
}
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT).setPropertyCondition(Conditions.isNotNull());
return modelMapper.map(entity,dtoClass);
}
@Override
public E convertToEntity(D dto, Class<E> entityClass) {
if(dto == null)
return null;
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT).setPropertyCondition(Conditions.isNotNull());
return modelMapper.map(dto, entityClass);
}
@Override
public List<D> convertListToListDto(Collection<E> entityList, Class<D> outCLass) {
if(entityList == null)
return Collections.emptyList();
return entityList.stream().map(entity -> convertToDto(entity, outCLass)).collect(Collectors.toList());
}
@Override
public List<D> convertPageToListDto(Page<E> entityList, Class<D> outCLass) {
if(entityList == null)
return Collections.emptyList();
return entityList.stream().map(entity -> convertToDto(entity, outCLass)).collect(Collectors.toList());
}
@Override
public List<E> convertListToListEntity(Collection<D> dtoList, Class<E> outCLass) {
if(dtoList == null)
return Collections.emptyList();
return dtoList.stream().map(dto -> convertToEntity(dto, outCLass)).collect(Collectors.toList());
}
}
package bmci.esign.backendend.models;
import bmci.esign.backendend.models.enums.ERole;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@AllArgsConstructor @NoArgsConstructor
@Table
@Entity
public class Authority {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
@Column(length = 20)
private ERole name;
}
package bmci.esign.backendend.models;
import bmci.esign.backendend.models.enums.EDemande;
import bmci.esign.backendend.models.enums.EStatut;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Demande {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String confidentiality;
private String priority;
private String objetMail;
private String message;
@Enumerated(EnumType.STRING)
@Column(length = 50)
private EStatut statut;
@Enumerated(EnumType.STRING)
@Column(length = 50)
private EDemande edemande;
@ManyToOne
@JoinColumn(name = "user_id")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private User user;
@ManyToOne
@JoinColumn(name = "typeDocument_id")
private TypeDocument typeDocument;
@Temporal(TemporalType.TIMESTAMP)
private Date expirationDate;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
@OneToMany(mappedBy = "demande")
private List<Destinataire> destinataires;
@OneToMany(mappedBy = "demande")
private List<Document> documents;
}
package bmci.esign.backendend.models;
import bmci.esign.backendend.models.enums.EStatut;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
@Data
@NoArgsConstructor @AllArgsConstructor
@Entity
public class Destinataire {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
private String role;
@Enumerated(EnumType.STRING)
@Column(length = 50)
private EStatut statut;
private String envoie;
private int place;
@ManyToOne
@JoinColumn(name = "demande_id") @JsonIgnore
private Demande demande;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
@OneToMany(mappedBy = "destinataire")
private List<Position> positions;
}
package bmci.esign.backendend.models;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.Date;
@Data @AllArgsConstructor @NoArgsConstructor
@Entity
public class Document {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String directory;
@ManyToOne
@JoinColumn(name = "demande_id")
private Demande demande;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
}
package bmci.esign.backendend.models;
import bmci.esign.backendend.models.enums.EMailStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class MailRequest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String destination;
private String email_type;
private long demandeId;
private String processCamundaId ;
@Column(unique = true)
private String token;
private String expiration_date;
private String name;
private String userMessage;
private EMailStatus status;
private String responseMessage;
private String url_sign;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
}
package bmci.esign.backendend.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.vladmihalcea.hibernate.type.json.JsonBinaryType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.*;
import javax.persistence.*;
import javax.persistence.Entity;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Data
@AllArgsConstructor @NoArgsConstructor
@TypeDefs({
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
@Entity
public class Position {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "destinataire_id") @JsonIgnore
private Destinataire destinataire;
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private HashMap<String, Object> information;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
}
package bmci.esign.backendend.models;
import bmci.esign.backendend.models.enums.EStatusLabel;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Data
public class ResponseModelStandard<T> {
private String status_code ;
private String status_label;
@JsonInclude(JsonInclude.Include.NON_NULL)
private T response_data;
public ResponseModelStandard(String status_code, String status_label) {
if(status_code.equals("Exception")){
this.status_code= "009";
}else{
this.status_code= status_code;
}
this.status_label= status_label;
}
public ResponseModelStandard(String status_code) {
this.status_code= status_code;
this.status_label= EStatusLabel.status.get(status_code);
}
public ResponseModelStandard(String status_code, T response_data) {
this.status_code= status_code;
this.status_label= EStatusLabel.status.get(status_code);
this.response_data= response_data;
}
}
package bmci.esign.backendend.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.Date;
@Data
@NoArgsConstructor @AllArgsConstructor
@Table
@Entity
public class Signature {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String directory;
@ManyToOne
@JoinColumn(name = "user_id") @JsonIgnore
private User user;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
}
package bmci.esign.backendend.models;
import bmci.esign.backendend.models.enums.EDemande;
import bmci.esign.backendend.models.enums.EStatut;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Statut {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
@Column(length = 50)
private EStatut name;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
}
package bmci.esign.backendend.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class TypeDemande {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
}
package bmci.esign.backendend.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
@NoArgsConstructor @AllArgsConstructor
@Data
@Entity
public class TypeDocument {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
@OneToMany(mappedBy = "typeDocument") @JsonIgnore
private List<Demande> demandes;
}
package bmci.esign.backendend.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
@Data
@NoArgsConstructor @AllArgsConstructor
@Entity
@Table(name = "userEntity")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 120)
private String firstname;
@Column(length = 120)
private String lastname;
private String avatar;
@Column(unique = true)
private String email;
@Column(length = 60)
private String password;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
@OneToMany(mappedBy = "user") @JsonIgnore
private List<Demande> demandes = new ArrayList<>();
@OneToMany(mappedBy = "user") @JsonIgnore
private List<Signature> signatures = new ArrayList<>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable( name = "user_authority",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "authority_id")
)
private Set<Authority> authorities;
}
package bmci.esign.backendend.models.enums;
public enum EDemande {
PARALLELE("En parallèle"),
SEQUENCE("En séquence"),
SIMULTANEE("En simultanée");
private final String displayName;
EDemande(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
public static EDemande fromString(String text) {
for (EDemande statut : EDemande.values()) {
if (statut.displayName.equalsIgnoreCase(text)) {
return statut;
}
}
throw new IllegalArgumentException("No constant with text " + text + " found");
}
}
package bmci.esign.backendend.models.enums;
public enum EMailStatus {
SENT,
CLICKED
}
package bmci.esign.backendend.models.enums;
public enum EObjet {
SIGNATURE,
CACHET,
NAME,
DATE,
VALIDATION,
}
package bmci.esign.backendend.models.enums;
public enum EPriority {
URGENT("urgent");
private final String displayName;
EPriority(String displayName) {
this.displayName = displayName;
}
public static EPriority fromString(String text) {
for (EPriority category : EPriority.values()) {
if (category.displayName.equalsIgnoreCase(text)) {
return category;
}
}
throw new IllegalArgumentException("No constant with text " + text + " found");
}
}
package bmci.esign.backendend.models.enums;
public enum ERole {
ROLE_ADMIN,
ROLE_USER,
}
package bmci.esign.backendend.models.enums;
import java.util.HashMap;
import java.util.Map;
public class EStatusLabel {
public static Map<String,String> status = new HashMap<>();
static {
status.put("000","successfully");
status.put("001","Created successfully");
status.put("002","Accepted");
status.put("003","Not Modified");
status.put("004","Bad Request");
status.put("005","Delete successfully");
status.put("006","INTERNAL_SERVER_ERROR");
status.put("007","Error: Email not exist!");
status.put("008","Error: Your account deactivated!");
status.put("009","Error: The email you entered is already in use. Please enter a different email address or contact customer support for assistance.");
status.put("010","Error: The name page you entered is already used.");
status.put("011","Error: Not found this page.");
status.put("012","Error: Token not found.");
status.put("013","Error: Token expired.");
status.put("014","Info: Process completed.");
status.put("015","Info: Process canceled.");
status.put("099","Error: System error. Please test again.");
}
}
package bmci.esign.backendend.models.enums;
public enum EStatut {
WAITING("En attente"),
CANCELED("Expiré"),
COMPLETE("Signé");
private final String displayName;
EStatut(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
public static EStatut fromString(String text) {
for (EStatut statut : EStatut.values()) {
if (statut.displayName.equalsIgnoreCase(text)) {
return statut;
}
}
throw new IllegalArgumentException("No constant with text " + text + " found");
}
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.Authority;
import org.springframework.data.jpa.repository.JpaRepository;
public interface AuthorityRepository extends JpaRepository<Authority, Long> {
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.Demande;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface DemandeRepository extends JpaRepository<Demande, Long> {
List<Demande> findAllByUserId(Long id);
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.Destinataire;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface DestinataireRepository extends JpaRepository<Destinataire, Long> {
List<Destinataire> findAllByDemandeId(Long id);
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.Document;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface DocumentRepository extends JpaRepository<Document, Long> {
List<Document> findAllByDemandeId(Long id);
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.MailRequest;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MailRequestRepository extends JpaRepository<MailRequest, Long> {
MailRequest findByToken(String token);
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.Position;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface PositionRepository extends JpaRepository<Position, Long> {
List<Position> findAllByDestinataireId(Long id);
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.Signature;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface SignatureRepository extends JpaRepository<Signature, Long> {
List<Signature> findAllByUserId(Long id);
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.Statut;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface StatutRepository extends JpaRepository<Statut, Long> {
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.TypeDemande;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TypeDemandeRepository extends JpaRepository<TypeDemande, Long> {
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.TypeDocument;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TypeDocumentRepository extends JpaRepository<TypeDocument, Long> {
}
package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.User;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
User findByEmail(String email);
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.AuthorityDto;
import java.util.List;
public interface AuthorityService {
AuthorityDto addAuthority(AuthorityDto authorityDto);
AuthorityDto getAuthority(Long id);
List<AuthorityDto> getAll();
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.models.Demande;
import bmci.esign.backendend.models.enums.EStatut;
import java.util.Date;
import java.util.List;
import java.util.Map;
public interface DemandeService {
DemandeDto addDemande(DemandeDto demandeDto);
DemandeDto updateDemande(DemandeDto demandeDto, Long id);
DemandeDto getDemande(Long id);
Demande findDemande(Long id);
void processEmail(Demande demande);
String relaunchUser(Long idDemand, Long idDestinatiare);
String cancelDemand(DemandeDto demandeDto);
void deleteDemande(Long id);
List<DemandeDto> getAll();
List<DemandeDto> getAllbyUser(Long userId);
Map<String, Object> getForUserDemandeSearch(Long userId, int page, int limit, String statut, String eDemande, Date dateStart);
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.DestinataireDto;
import bmci.esign.backendend.models.Destinataire;
import java.util.List;
public interface DestinataireService {
DestinataireDto addDestinataire(DestinataireDto destinataireDto);
List<DestinataireDto> addAll(List<DestinataireDto> destinataireDtos);
DestinataireDto updateDestinataire(DestinataireDto destinataireDto, Long id);
DestinataireDto getDestinataire(Long id);
Destinataire findDestinataire(Long id);
List<DestinataireDto> findAllByDemandeId(Long id);
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.DocumentDto;
import java.util.List;
public interface DocumentService {
DocumentDto addDocument(DocumentDto documentDto);
DocumentDto updateDocument(DocumentDto documentDto, Long id);
DocumentDto getDocument(Long id);
List<DocumentDto> findAllByDemandeId(Long id);
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.models.MailRequest;
import java.util.Map;
public interface EmailService {
String generateVerificationCode();
String generateUrl(String sdkType);
void SendEmail(MailRequest req, Map<String, String> model);
}
package bmci.esign.backendend.services;
public interface MailRequestService {
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.PositionDto;
import java.util.List;
public interface PositionService {
PositionDto addPosition(PositionDto positionDto);
PositionDto updatePosition(PositionDto positionDto, Long id);
PositionDto getPosition(Long id);
List<PositionDto> findAllByDestinataireId(Long id);
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.SignatureDto;
import java.util.List;
public interface SignatureService {
SignatureDto addSignature(SignatureDto signatureDto);
SignatureDto updateSignature(SignatureDto signatureDto, Long id);
SignatureDto getSignature(Long id);
List<SignatureDto> findAllByUserId(Long id);
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.StatutDto;
import java.util.List;
public interface StatutService {
StatutDto addStatut(StatutDto statutDto);
StatutDto getStatut(Long id);
List<StatutDto> getAll();
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.TypeDemandeDto;
import java.util.List;
public interface TypeDemandeService {
TypeDemandeDto addTypeDemande(TypeDemandeDto typeDemandeDto);
List<TypeDemandeDto> getAll();
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.TypeDocumentDto;
import java.util.List;
public interface TypeDocumentService {
TypeDocumentDto addTypeDocument(TypeDocumentDto typeDocumentDto);
List<TypeDocumentDto> getAll();
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.dto.SignaturePageDto;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface UploadService {
String uploadFile(MultipartFile file);
String modifyPdf(List<SignaturePageDto> signaturePageDtos, DemandeDto demandeDto);
}
package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.UserDto;
import bmci.esign.backendend.models.User;
public interface UserService {
UserDto addUser(UserDto userDto);
UserDto updateUser(UserDto userDto,Long id);
UserDto getUser(Long id);
User findUser(Long id);
UserDto findByEmail(String email);
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.AuthorityDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.Authority;
import bmci.esign.backendend.repositories.AuthorityRepository;
import bmci.esign.backendend.services.AuthorityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class AuthorityServiceImpl implements AuthorityService {
@Autowired
private AuthorityRepository authorityRepository;
@Autowired
private IMapClassWithDto<Authority, AuthorityDto> authorityMapping;
@Override
public AuthorityDto addAuthority(AuthorityDto authorityDto) {
return null;
}
@Override
public AuthorityDto getAuthority(Long id) {
return null;
}
@Override
public List<AuthorityDto> getAll() {
List<Authority> authorities = authorityRepository.findAll();
return authorityMapping.convertListToListDto(authorities, AuthorityDto.class);
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.dto.DestinataireDto;
import bmci.esign.backendend.dto.PositionDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.*;
import bmci.esign.backendend.models.enums.EDemande;
import bmci.esign.backendend.models.enums.EStatut;
import bmci.esign.backendend.repositories.DemandeRepository;
import bmci.esign.backendend.repositories.DestinataireRepository;
import bmci.esign.backendend.repositories.DocumentRepository;
import bmci.esign.backendend.repositories.PositionRepository;
import bmci.esign.backendend.services.DemandeService;
import bmci.esign.backendend.services.EmailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class DemandeServiceImpl implements DemandeService {
@Autowired
private DemandeRepository demandeRepository;
@Autowired
private DestinataireRepository destinataireRepository;
@Autowired
private PositionRepository positionRepository;
@Autowired
private DocumentRepository documentRepository;
@Autowired
private EmailService emailService;
@Autowired
EntityManager entityManager;
@Autowired
private IMapClassWithDto<Demande, DemandeDto> demandeMapping;
@Autowired
private IMapClassWithDto<Destinataire, DestinataireDto> destinataireMapping;
@Autowired
private IMapClassWithDto<Position, PositionDto> positionMapping;
@Override
public DemandeDto addDemande(DemandeDto demandeDto) {
List<DestinataireDto> destinataireDtos = demandeDto.getDestinataires();
Demande demande = demandeMapping.convertToEntity(demandeDto, Demande.class);
demande.setStatut(EStatut.WAITING);
demande.setEdemande(EDemande.fromString(demandeDto.getStringDemand()));
System.out.println(demande);
demande = demandeRepository.save(demande);
demandeDto = demandeMapping.convertToDto(demande, DemandeDto.class);
if(demande.getDocuments().size() > 0){
Optional<Document> document = demande.getDocuments().stream().findFirst();
if(document.isPresent()){
Demande demande1 = new Demande();
demande1.setId(demande.getId());
document.get().setDemande(demande1);
documentRepository.save(document.get());
}
}
for (DestinataireDto destinataireDto: destinataireDtos){
destinataireDto.setStatut(EStatut.WAITING.name());
destinataireDto.setDemande(demandeDto);
}
List<Destinataire> destinataires = destinataireRepository.saveAll(destinataireMapping.convertListToListEntity(destinataireDtos, Destinataire.class));
for (DestinataireDto destinataireDto: destinataireDtos){
for (PositionDto positionDto: destinataireDto.getPositions()){
for (Destinataire destinataire: destinataires){
if(destinataire.getEmail().equals(destinataireDto.getEmail())){
Destinataire destinataire1 = new Destinataire();
destinataire1.setId(destinataire.getId());
positionDto.setDestinataire(destinataire1);
positionRepository.save(positionMapping.convertToEntity(positionDto, Position.class));
}
}
}
}
demande.setDestinataires(destinataires);
processEmail(demande);
return demandeDto;
}
@Override
public DemandeDto updateDemande(DemandeDto demandeDto, Long id) {
Optional<Demande> demande = demandeRepository.findById(id);
if(demande.isPresent()){
if(demandeDto.getId().equals(demande.get().getId())){
Demande demande1 = demandeMapping.convertToEntity(demandeDto, Demande.class);
demande1.setEdemande(EDemande.fromString(demandeDto.getStringDemand()));
demande1.setStatut(EStatut.valueOf(demandeDto.getStatut()));
demandeRepository.save(demande1);
return demandeDto;
}
}
return null;
}
@Override
public DemandeDto getDemande(Long id) {
Optional<Demande> demande = demandeRepository.findById(id);
return demande.map(value -> demandeMapping.convertToDto(value, DemandeDto.class)).orElse(null);
}
@Override
public Demande findDemande(Long id) {
Optional<Demande> demande = demandeRepository.findById(id);
return demande.orElse(null);
}
@Override
public void processEmail(Demande demande) {
List<Destinataire> destinataires = demande.getDestinataires().stream().filter(destinataire ->
destinataire.getStatut().name().equals(EStatut.WAITING.name())).collect(Collectors.toList());
if(demande.getEdemande().equals(EDemande.SEQUENCE) || demande.getEdemande().equals(EDemande.SIMULTANEE)){
detectProcessActive(demande, destinataires);
List<Destinataire> destinataireList = demande.getDestinataires().stream().filter(destinataire ->
destinataire.getStatut().name().equals(EStatut.COMPLETE.name())).collect(Collectors.toList());
if(destinataireList.size() == demande.getDestinataires().size()){
demande.setStatut(EStatut.COMPLETE);
Optional<Demande> demande1 = demandeRepository.findById(demande.getId());
if(demande1.isPresent()){
demande.setEdemande(demande1.get().getEdemande());
demandeRepository.save(demande);
}
}
}else if(demande.getEdemande().equals(EDemande.PARALLELE)){
List<Destinataire> destinataireList = demande.getDestinataires().stream().filter(destinataire ->
destinataire.getStatut().name().equals(EStatut.COMPLETE.name())).collect(Collectors.toList());
if(destinataireList.size() > 0){
demande.setStatut(EStatut.COMPLETE);
Optional<Demande> demande1 = demandeRepository.findById(demande.getId());
if(demande1.isPresent()){
demande.setEdemande(demande1.get().getEdemande());
demandeRepository.save(demande);
}
}else{
detectProcessActive(demande, destinataires);
}
}else{
}
}
private void detectProcessActive(Demande demande, List<Destinataire> destinataires) {
if(destinataires.size() > 1){
Destinataire destinataire = destinataires.stream().findFirst().get();
for (Destinataire dest : destinataires){
if(dest.getStatut().name().equals(EStatut.WAITING.name()) && dest.getPlace() == destinataire.getPlace()){
SendData(demande, dest, "bmci_t1");
}
}
}else{
for (Destinataire dest : destinataires){
if(dest.getStatut().name().equals(EStatut.WAITING.name())){
SendData(demande, dest, "bmci_t1");
}
}
}
}
@Override
public String relaunchUser(Long idDemand, Long idDestinatiare) {
try {
Demande demande = findDemande(idDemand);
Destinataire destinataire = demande.getDestinataires().stream().filter(destinataire1 -> destinataire1.getId().equals(idDestinatiare)).collect(Collectors.toList()).get(0);
SendData(demande, destinataire, "bmci_t1");
return "success";
}catch (Exception e){
return "failed";
}
}
@Override
public String cancelDemand(DemandeDto demandeDto) {
try {
demandeDto.setStatut(EStatut.CANCELED.name());
EDemande eDemande = EDemande.valueOf(demandeDto.getStringDemand());
demandeDto.setEdemande(eDemande.getDisplayName());
updateDemande(demandeDto, demandeDto.getId());
List<Destinataire> destinataires = destinataireRepository.findAllByDemandeId(demandeDto.getId());
for(Destinataire destinataire : destinataires){
if(destinataire.getStatut().equals(EStatut.WAITING)){
destinataire.setStatut(EStatut.CANCELED);
destinataireRepository.save(destinataire);
}
}
return "success";
}catch (Exception e){
return "failed";
}
}
private void SendData(Demande demande, Destinataire dest, String type) {
MailRequest mailRequest = new MailRequest();
Map<String,String> model = new HashMap<>();
mailRequest.setDemandeId(demande.getId());
mailRequest.setDestination(dest.getEmail());
mailRequest.setName(dest.getName());
mailRequest.setEmail_type(type);
mailRequest.setExpiration_date(demande.getExpirationDate().toString());
model.put("objet", demande.getObjetMail());
model.put("message", demande.getMessage());
model.put("name", dest.getName());
emailService.SendEmail(mailRequest,model);
}
@Override
public void deleteDemande(Long id) {
}
@Override
public List<DemandeDto> getAll() {
return null;
}
@Override
public List<DemandeDto> getAllbyUser(Long userId) {
List<Demande> demandes = demandeRepository.findAllByUserId(userId);
return demandeMapping.convertListToListDto(demandes, DemandeDto.class);
}
@Override
public Map<String, Object> getForUserDemandeSearch(Long userId, int page, int limit, String statut, String eDemande, Date dateStart) {
Map<String, Object> resp = new HashMap<String, Object>();
Calendar cal = Calendar.getInstance();
cal.setTime(dateStart);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
Date date_Start = cal.getTime();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Demande> criteriaQuery = criteriaBuilder.createQuery(Demande.class);
Root<Demande> root = criteriaQuery.from(Demande.class);
Predicate namePredicate = criteriaBuilder.and(
criteriaBuilder.equal(criteriaBuilder.coalesce(criteriaBuilder.toLong(root.get("user").get("id")), 0L), userId),
criteriaBuilder.lessThanOrEqualTo(root.get("creationDate"), date_Start));
if(!statut.equals("")){
namePredicate = criteriaBuilder.and(criteriaBuilder.equal(root.get("statut"), EStatut.fromString(statut)));
}else if(!eDemande.equals("")){
namePredicate = criteriaBuilder.and(criteriaBuilder.equal(root.get("edemande"), EDemande.fromString(eDemande)));
}
if(!statut.equals("") && !eDemande.equals("")){
namePredicate = criteriaBuilder.and(criteriaBuilder.equal(root.get("statut"), EStatut.fromString(statut)) , criteriaBuilder.equal(root.get("edemande"), EDemande.fromString(eDemande)));
}
namePredicate = criteriaBuilder.and(namePredicate, criteriaBuilder.lessThanOrEqualTo(root.get("creationDate"), date_Start));
criteriaQuery.where(namePredicate);
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("creationDate")));
int firstResult = (page) * limit;
TypedQuery<Demande> query = entityManager.createQuery(criteriaQuery).setMaxResults(limit).setFirstResult(firstResult);
long total = 0;
TypedQuery<Demande> countquery = entityManager.createQuery(criteriaQuery);
total = countquery.getResultList().size();
// System.out.println("total : " + total);
resp.put("data", demandeMapping.convertListToListDto(query.getResultList(), DemandeDto.class));
resp.put("totalElements", total);
return resp;
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.DestinataireDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.Destinataire;
import bmci.esign.backendend.models.enums.EStatut;
import bmci.esign.backendend.repositories.DestinataireRepository;
import bmci.esign.backendend.services.DestinataireService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DestinataireServiceImpl implements DestinataireService {
@Autowired
private DestinataireRepository destinataireRepository;
@Autowired
private IMapClassWithDto<Destinataire, DestinataireDto> destinataireMapping;
@Override
public DestinataireDto addDestinataire(DestinataireDto destinataireDto) {
destinataireDto.setStatut(EStatut.WAITING.name());
Destinataire destinataire = destinataireMapping.convertToEntity(destinataireDto, Destinataire.class);
destinataire = destinataireRepository.save(destinataire);
return destinataireMapping.convertToDto(destinataire, DestinataireDto.class);
}
@Override
public List<DestinataireDto> addAll(List<DestinataireDto> destinataireDtos) {
List<Destinataire> destinataires = destinataireMapping.convertListToListEntity(destinataireDtos, Destinataire.class);
destinataires = destinataireRepository.saveAll(destinataires);
return destinataireMapping.convertListToListDto(destinataires, DestinataireDto.class);
}
@Override
public DestinataireDto updateDestinataire(DestinataireDto destinataireDto, Long id) {
destinataireRepository.save(destinataireMapping.convertToEntity(destinataireDto, Destinataire.class));
return destinataireDto;
}
@Override
public DestinataireDto getDestinataire(Long id) {
return destinataireMapping.convertToDto(destinataireRepository.findById(id).orElse(null), DestinataireDto.class);
}
@Override
public Destinataire findDestinataire(Long id) {
return destinataireRepository.findById(id).orElse(null);
}
@Override
public List<DestinataireDto> findAllByDemandeId(Long id) {
return destinataireMapping.convertListToListDto(destinataireRepository.findAllByDemandeId(id), DestinataireDto.class);
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.DestinataireDto;
import bmci.esign.backendend.dto.DocumentDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.Destinataire;
import bmci.esign.backendend.models.Document;
import bmci.esign.backendend.repositories.DocumentRepository;
import bmci.esign.backendend.services.DocumentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.print.Doc;
import java.util.List;
@Service
public class DocumentServiceImpl implements DocumentService {
@Autowired
private DocumentRepository documentRepository;
@Autowired
private IMapClassWithDto<Document, DocumentDto> documentMapping;
@Override
public DocumentDto addDocument(DocumentDto documentDto) {
Document document = documentRepository.save(documentMapping.convertToEntity(documentDto, Document.class));
return documentMapping.convertToDto(document, DocumentDto.class);
}
@Override
public DocumentDto updateDocument(DocumentDto documentDto, Long id) {
return null;
}
@Override
public DocumentDto getDocument(Long id) {
return null;
}
@Override
public List<DocumentDto> findAllByDemandeId(Long id) {
List<Document> documents = documentRepository.findAllByDemandeId(id);
return documentMapping.convertListToListDto(documents, DocumentDto.class);
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.models.MailRequest;
import bmci.esign.backendend.models.enums.EMailStatus;
import bmci.esign.backendend.repositories.MailRequestRepository;
import bmci.esign.backendend.services.EmailService;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.core.env.Environment;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.util.Map;
import java.util.Random;
@Service
public class EmailServiceImpl implements EmailService {
@Autowired
private JavaMailSender mailSender;
@Autowired
private Environment environment;
@Autowired
private MailRequestRepository mailRequestRepository;
@Autowired
private Configuration config ;
@Value("${spring.mail.username}")
private String senderMail;
private static final String CHARACTERS = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
private static final int CODE_LENGTH = 16;
@Override
public String generateVerificationCode() {
Random random = new Random();
StringBuilder code = new StringBuilder(CODE_LENGTH);
for (int i = 0; i < CODE_LENGTH; i++) {
code.append(CHARACTERS.charAt(random.nextInt(CHARACTERS.length())));
}
return code.toString();
}
@Override
public String generateUrl(String sdkType) {
return null;
}
@Override
public void SendEmail(MailRequest req, Map<String, String> model) {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = null;
String template_name = "";
String subject = "" ;
String url_sign = "";
Template template = null;
try {
helper = new MimeMessageHelper( mimeMessage, true);
if(req.getEmail_type().equals("bmci_t1")) {
template_name="sendDoc.ftl" ;
subject=model.get("objet") ;
url_sign= generateVerificationCode();
model.put("url_sign", environment.getProperty("url.esign.acess")+":"+url_sign);
}
template = config.getTemplate(template_name);
String HtmlMsg = FreeMarkerTemplateUtils.processTemplateIntoString(template,model) ;
req.setToken(url_sign);
helper.setFrom(senderMail);
helper.setTo(req.getDestination());
helper.setSubject(subject);
helper.setText(HtmlMsg,true);
mailSender.send(mimeMessage);
req.setStatus(EMailStatus.SENT);
req.setUrl_sign(model.get("url_sign"));
mailRequestRepository.save(req);
} catch (IOException | TemplateException | MessagingException e) {
e.printStackTrace();
}
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.DocumentDto;
import bmci.esign.backendend.dto.PositionDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.Document;
import bmci.esign.backendend.models.Position;
import bmci.esign.backendend.repositories.PositionRepository;
import bmci.esign.backendend.services.PositionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class PositionServiceImpl implements PositionService {
@Autowired
private PositionRepository positionRepository;
@Autowired
private IMapClassWithDto<Position, PositionDto> positionMapping;
@Override
public PositionDto addPosition(PositionDto positionDto) {
Position position = positionMapping.convertToEntity(positionDto,Position.class);
position = positionRepository.save(position);
return positionMapping.convertToDto(position, PositionDto.class);
}
@Override
public PositionDto updatePosition(PositionDto positionDto, Long id) {
return null;
}
@Override
public PositionDto getPosition(Long id) {
return null;
}
@Override
public List<PositionDto> findAllByDestinataireId(Long id) {
List<Position> positions = positionRepository.findAllByDestinataireId(id);
return positionMapping.convertListToListDto(positions, PositionDto.class);
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.PositionDto;
import bmci.esign.backendend.dto.SignatureDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.Position;
import bmci.esign.backendend.models.Signature;
import bmci.esign.backendend.repositories.SignatureRepository;
import bmci.esign.backendend.services.SignatureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SignatureServiceImpl implements SignatureService {
@Autowired
private SignatureRepository signatureRepository;
@Autowired
private IMapClassWithDto<Signature, SignatureDto> signatureMapping;
@Override
public SignatureDto addSignature(SignatureDto signatureDto) {
Signature signature = signatureMapping.convertToEntity(signatureDto, Signature.class);
signature = signatureRepository.save(signature);
return signatureMapping.convertToDto(signature, SignatureDto.class);
}
@Override
public SignatureDto updateSignature(SignatureDto signatureDto, Long id) {
return null;
}
@Override
public SignatureDto getSignature(Long id) {
return null;
}
@Override
public List<SignatureDto> findAllByUserId(Long id) {
List<Signature> signatures = signatureRepository.findAllByUserId(id);
return signatureMapping.convertListToListDto(signatures, SignatureDto.class);
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.StatutDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.Statut;
import bmci.esign.backendend.repositories.StatutRepository;
import bmci.esign.backendend.services.StatutService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StatutServiceImpl implements StatutService {
@Autowired
private StatutRepository statutRepository;
@Autowired
private IMapClassWithDto<Statut, StatutDto> statutMapping;
@Override
public StatutDto addStatut(StatutDto statutDto) {
Statut statut = statutMapping.convertToEntity(statutDto, Statut.class);
statut = statutRepository.save(statut);
return statutMapping.convertToDto(statut, StatutDto.class);
}
@Override
public StatutDto getStatut(Long id) {
return null;
}
@Override
public List<StatutDto> getAll() {
List<Statut> statuts = statutRepository.findAll();
return statutMapping.convertListToListDto(statuts, StatutDto.class);
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.TypeDemandeDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.TypeDemande;
import bmci.esign.backendend.repositories.TypeDemandeRepository;
import bmci.esign.backendend.services.TypeDemandeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TypeDemandeServiceImpl implements TypeDemandeService {
@Autowired
private TypeDemandeRepository typeDemandeRepository;
@Autowired
private IMapClassWithDto<TypeDemande, TypeDemandeDto> typeDemandeMapping;
@Override
public TypeDemandeDto addTypeDemande(TypeDemandeDto typeDemandeDto) {
TypeDemande typeDemande = typeDemandeMapping.convertToEntity(typeDemandeDto, TypeDemande.class);
typeDemande = typeDemandeRepository.save(typeDemande);
return typeDemandeMapping.convertToDto(typeDemande, TypeDemandeDto.class);
}
@Override
public List<TypeDemandeDto> getAll() {
List<TypeDemande> typeDemandes = typeDemandeRepository.findAll();
return typeDemandeMapping.convertListToListDto(typeDemandes, TypeDemandeDto.class);
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.TypeDocumentDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.TypeDocument;
import bmci.esign.backendend.repositories.TypeDocumentRepository;
import bmci.esign.backendend.services.TypeDocumentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TypeDocumentServiceImpl implements TypeDocumentService {
@Autowired
private TypeDocumentRepository typeDocumentRepository;
@Autowired
private IMapClassWithDto<TypeDocument, TypeDocumentDto> typeDocumentMapping;
@Override
public TypeDocumentDto addTypeDocument(TypeDocumentDto typeDocumentDto) {
TypeDocument typeDocument = typeDocumentMapping.convertToEntity(typeDocumentDto, TypeDocument.class);
typeDocument = typeDocumentRepository.save(typeDocument);
return typeDocumentMapping.convertToDto(typeDocument, TypeDocumentDto.class);
}
@Override
public List<TypeDocumentDto> getAll() {
List<TypeDocument> typeDocuments = typeDocumentRepository.findAll();
return typeDocumentMapping.convertListToListDto(typeDocuments, TypeDocumentDto.class);
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.dto.DestinataireDto;
import bmci.esign.backendend.dto.ObjetSignatureDto;
import bmci.esign.backendend.dto.SignaturePageDto;
import bmci.esign.backendend.models.Destinataire;
import bmci.esign.backendend.models.Position;
import bmci.esign.backendend.models.enums.EObjet;
import bmci.esign.backendend.models.enums.EStatut;
import bmci.esign.backendend.repositories.DestinataireRepository;
import bmci.esign.backendend.services.DestinataireService;
import bmci.esign.backendend.services.UploadService;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
@Service
public class UploadServiceImpl implements UploadService {
@Value("${file.upload-dir.access}")
private String UPLOAD_DIR;
@Autowired
private DestinataireService destinataireService;
@Override
public String uploadFile(MultipartFile file) {
try {
String fileName = identifiant() + ".pdf";
//file
Path uploadPath = Paths.get(UPLOAD_DIR);
if (!Files.exists(uploadPath)) {
Files.createDirectories(uploadPath);
}
Path filePath = uploadPath.resolve(fileName);
Files.copy(file.getInputStream(), filePath);
return fileName;
} catch (IOException ex) {
return ex.getMessage();
}
}
@Override
public String modifyPdf(List<SignaturePageDto> signaturePageDtos, DemandeDto demandeDto) {
String state = "";
String filename = demandeDto.getDocuments().get(0).getDirectory();
DestinataireDto destinataireDto = demandeDto.getDestinataires().get(0);
if(destinataireDto.getRole().equals("Signataire")){
try (
PDDocument document = PDDocument.load(new File(UPLOAD_DIR+"/"+ filename))) {
PDPage page = new PDPage(PDRectangle.A4);
for (SignaturePageDto signaturePageDto: signaturePageDtos){
page = document.getPage(signaturePageDto.getPage());
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);
if(signaturePageDto.getObjetSignatureDtos().size() > 0){
for (ObjetSignatureDto objetSignatureDto:signaturePageDto.getObjetSignatureDtos()){
double y = resize(objetSignatureDto.getY(), 0.75);
double x = resize(objetSignatureDto.getX(),0.75);
double width = resize(objetSignatureDto.getWidth(), 0.75);
double height = resize(objetSignatureDto.getHeight(), 0.75);
y = 841 - y;
if(x+width > PDRectangle.A4.getWidth()){
x = (PDRectangle.A4.getWidth() - width) - 5;
}else if(x < 0) {
x = 5;
}
if((y+height) > PDRectangle.A4.getHeight()){
y = PDRectangle.A4.getHeight() - height - 5;
}
else if(y < height){
y = height + 5;
}
if(objetSignatureDto.getTypeObjet().equals("NAME") ||
objetSignatureDto.getTypeObjet().equals("DATE")){
// Ajouter du texte
contentStream.beginText();
//Setting the font to the Content stream
contentStream.setFont(PDType1Font.TIMES_ROMAN, 12);
//Setting the position for the line
contentStream.newLineAtOffset((float) x, (float) (y+height));
String text = objetSignatureDto.getText();
//Adding text in the form of string
contentStream.showText(text);
//Ending the content stream
contentStream.endText();
}else{
if(!objetSignatureDto.getFileBase64().equals("") || objetSignatureDto.getFileBase64() != null){
byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(objetSignatureDto.getFileBase64());
BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageBytes));
PDImageXObject pdImage = LosslessFactory.createFromImage(document, bufferedImage);
contentStream.drawImage(pdImage, (float) x, (float) y,(float) width,(float) height);
}else if(objetSignatureDto.getFile() != null){
BufferedImage bImage = ImageIO.read(new File(String.valueOf(objetSignatureDto.getFile())));
PDImageXObject pdImage = PDImageXObject.createFromByteArray(document, toByteArray(bImage), "image");
contentStream.drawImage(pdImage, (float) x, (float) y,(float) width,(float) height);
}
}
}
}
contentStream.close();
document.save(UPLOAD_DIR+"/"+filename);
}
destinataireDto.setStatut(EStatut.COMPLETE.name());
destinataireService.updateDestinataire(destinataireDto, destinataireDto.getId());
return "success";
} catch (IOException e) {
DestinataireDto destinataire = demandeDto.getDestinataires().get(0);
destinataire.setStatut(EStatut.CANCELED.name());
destinataireService.updateDestinataire(destinataire, destinataire.getId());
e.printStackTrace();
}
}else{
destinataireDto.setStatut(EStatut.COMPLETE.name());
destinataireService.updateDestinataire(destinataireDto, destinataireDto.getId());
return "success";
}
return "cancel";
}
private static String identifiant(){
return UUID.randomUUID().toString();
}
// Convertir BufferedImage en tableau de bytes
private static byte[] toByteArray(BufferedImage image) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
return baos.toByteArray();
}
private static double resize(double heigth, double pourcent){
heigth = heigth * pourcent;
return heigth;
}
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.UserDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.User;
import bmci.esign.backendend.repositories.UserRepository;
import bmci.esign.backendend.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private IMapClassWithDto<User, UserDto> userMapping;
@Override
public UserDto addUser(UserDto userDto) {
User user = userMapping.convertToEntity(userDto, User.class);
user = userRepository.save(user);
return userMapping.convertToDto(user, UserDto.class);
}
@Override
public UserDto updateUser(UserDto userDto, Long id) {
Optional<User> user = userRepository.findById(id);
if(user.isPresent()){
if(userDto.getId().equals(user.get().getId())){
User userConvert = userMapping.convertToEntity(userDto, User.class);
userRepository.save(userConvert);
return userDto;
}
}
return null;
}
@Override
public UserDto getUser(Long id) {
return userMapping.convertToDto(userRepository.findById(id).orElse(null), UserDto.class);
}
@Override
public User findUser(Long id) {
return userRepository.findById(id).orElse(null);
}
@Override
public UserDto findByEmail(String email) {
User user = userRepository.findByEmail(email);
return userMapping.convertToDto(user, UserDto.class);
}
}
spring.application.name=backend-esign
# App Properties
spring.mvc.converters.preferred-json-mapper=gson
server.address=192.168.1.40
server.servlet.context-path=/esignback
#server.address=192.168.11.106
#server.servlet-path=/*
server.port=9091
spring.sql.init.platform= postgres
#server.ssl.enabled= true
#spring.datasource.url= jdbc:postgresql://192.168.1.46:5433/esigndb?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT+1:00
spring.datasource.url= jdbc:postgresql://localhost:5432/esigndb?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT+1:00
spring.datasource.password= 2011
#spring.datasource.password= @sql$23asas
spring.datasource.username=postgres
spring.jpa.database = postgresql
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto= update
spring.jackson.time-zone=GMT+1:00
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=demo.eer.test@gmail.com
spring.mail.password=vyueseddcsolvkto
spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=200KB
spring.servlet.multipart.max-file-size=3MB
spring.servlet.multipart.max-request-size=10MB
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
#file.upload-dir.access=/opt/SIGNATURES
file.upload-dir.access=C:\\Users\\hp\\Documents\\SIGNATURES
url.esign.acess=http://localhost:4200/#/online-signature/
#url.esign.acess=https://skyanalytics.indatacore.com/esign/#/online-signature/
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_026mzl1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.22.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.21.0">
<bpmn:process id="esignapp-process" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0mp8xan</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:userTask id="Activity_1gejdnt" name="Add Demand" camunda:formKey="" camunda:candidateUsers="demo">
<bpmn:extensionElements />
<bpmn:incoming>Flow_0mp8xan</bpmn:incoming>
<bpmn:outgoing>Flow_1iadqxh</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0mp8xan" sourceRef="StartEvent_1" targetRef="Activity_1gejdnt" />
<bpmn:serviceTask id="Activity_029fblo" name="Send Document" camunda:class="bmci.esign.backendend.Tasklist.SendDocument">
<bpmn:incoming>Flow_1iadqxh</bpmn:incoming>
<bpmn:incoming>Flow_0ywk3s7</bpmn:incoming>
<bpmn:outgoing>Flow_0ji6kol</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sequenceFlow id="Flow_1iadqxh" sourceRef="Activity_1gejdnt" targetRef="Activity_029fblo" />
<bpmn:userTask id="Activity_0gktoje" name="waiting for signature">
<bpmn:incoming>Flow_0ji6kol</bpmn:incoming>
<bpmn:outgoing>Flow_09gstxq</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0ji6kol" sourceRef="Activity_029fblo" targetRef="Activity_0gktoje" />
<bpmn:exclusiveGateway id="Gateway_0rukznb">
<bpmn:incoming>Flow_09gstxq</bpmn:incoming>
<bpmn:outgoing>Flow_0ywk3s7</bpmn:outgoing>
<bpmn:outgoing>Flow_01pkyhn</bpmn:outgoing>
<bpmn:outgoing>Flow_0959lve</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_09gstxq" sourceRef="Activity_0gktoje" targetRef="Gateway_0rukznb" />
<bpmn:sequenceFlow id="Flow_0ywk3s7" name="Not signed Document" sourceRef="Gateway_0rukznb" targetRef="Activity_029fblo">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{operationidworkflow=='next'} </bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_01pkyhn" name="Cancel" sourceRef="Gateway_0rukznb" targetRef="messageCancelled">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{operationidworkflow=='cancel'} </bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:serviceTask id="Activity_0glrkuv" name="Send signed Document" camunda:class="bmci.esign.backendend.Tasklist.SignedDocument">
<bpmn:incoming>Flow_0959lve</bpmn:incoming>
<bpmn:outgoing>Flow_10nvs1d</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sequenceFlow id="Flow_0959lve" name="Signed document" sourceRef="Gateway_0rukznb" targetRef="Activity_0glrkuv">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{operationidworkflow=='signed'} </bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:endEvent id="Event_0r5vae6">
<bpmn:incoming>Flow_10nvs1d</bpmn:incoming>
<bpmn:incoming>Flow_06gcpcc</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_10nvs1d" sourceRef="Activity_0glrkuv" targetRef="Event_0r5vae6" />
<bpmn:intermediateCatchEvent id="messageCancelled">
<bpmn:incoming>Flow_01pkyhn</bpmn:incoming>
<bpmn:outgoing>Flow_025utcp</bpmn:outgoing>
<bpmn:messageEventDefinition id="MessageEventDefinition_0typ99s" messageRef="Message_0o1nics" />
</bpmn:intermediateCatchEvent>
<bpmn:serviceTask id="Activity_07ufhhk" name="Send Notification" camunda:class="bmci.esign.backendend.Tasklist.SendNotification">
<bpmn:incoming>Flow_025utcp</bpmn:incoming>
<bpmn:outgoing>Flow_06gcpcc</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sequenceFlow id="Flow_025utcp" sourceRef="messageCancelled" targetRef="Activity_07ufhhk" />
<bpmn:sequenceFlow id="Flow_06gcpcc" sourceRef="Activity_07ufhhk" targetRef="Event_0r5vae6" />
</bpmn:process>
<bpmn:message id="Message_0o1nics" name="MessageCancel" />
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="esignapp-process">
<bpmndi:BPMNShape id="Activity_1gejdnt_di" bpmnElement="Activity_1gejdnt">
<dc:Bounds x="280" y="210" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_029fblo_di" bpmnElement="Activity_029fblo">
<dc:Bounds x="450" y="210" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0gktoje_di" bpmnElement="Activity_0gktoje">
<dc:Bounds x="620" y="210" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0rukznb_di" bpmnElement="Gateway_0rukznb" isMarkerVisible="true">
<dc:Bounds x="795" y="225" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="232" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0glrkuv_di" bpmnElement="Activity_0glrkuv">
<dc:Bounds x="950" y="210" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0r5vae6_di" bpmnElement="Event_0r5vae6">
<dc:Bounds x="1162" y="232" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0uz8ca5_di" bpmnElement="messageCancelled">
<dc:Bounds x="852" y="412" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_07ufhhk_di" bpmnElement="Activity_07ufhhk">
<dc:Bounds x="940" y="390" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_0mp8xan_di" bpmnElement="Flow_0mp8xan">
<di:waypoint x="215" y="250" />
<di:waypoint x="280" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1iadqxh_di" bpmnElement="Flow_1iadqxh">
<di:waypoint x="380" y="250" />
<di:waypoint x="450" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ywk3s7_di" bpmnElement="Flow_0ywk3s7">
<di:waypoint x="820" y="225" />
<di:waypoint x="820" y="110" />
<di:waypoint x="500" y="110" />
<di:waypoint x="500" y="210" />
<bpmndi:BPMNLabel>
<dc:Bounds x="634" y="76" width="53" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ji6kol_di" bpmnElement="Flow_0ji6kol">
<di:waypoint x="550" y="250" />
<di:waypoint x="620" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_09gstxq_di" bpmnElement="Flow_09gstxq">
<di:waypoint x="720" y="250" />
<di:waypoint x="795" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_01pkyhn_di" bpmnElement="Flow_01pkyhn">
<di:waypoint x="820" y="275" />
<di:waypoint x="820" y="430" />
<di:waypoint x="852" y="430" />
<bpmndi:BPMNLabel>
<dc:Bounds x="762" y="323" width="35" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0959lve_di" bpmnElement="Flow_0959lve">
<di:waypoint x="845" y="250" />
<di:waypoint x="950" y="250" />
<bpmndi:BPMNLabel>
<dc:Bounds x="846" y="263" width="87" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_10nvs1d_di" bpmnElement="Flow_10nvs1d">
<di:waypoint x="1050" y="250" />
<di:waypoint x="1162" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_06gcpcc_di" bpmnElement="Flow_06gcpcc">
<di:waypoint x="1040" y="430" />
<di:waypoint x="1101" y="430" />
<di:waypoint x="1101" y="250" />
<di:waypoint x="1162" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_025utcp_di" bpmnElement="Flow_025utcp">
<di:waypoint x="888" y="430" />
<di:waypoint x="940" y="430" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>Demande de Signature</h2>
<p>Bonjour ${name}</p>
<p>Veuillez signer le document ci-après en cliquant sur ce lein ci-dessous.</p>
<a href="${url_sign}">${url_sign}</a>
</body>
</html>
\ No newline at end of file
package bmci.esign.backendend;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class BackendEsignApplicationTests {
@Test
void contextLoads() {
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment