From c01abb6db502335a9f3a7316d9ab88f0f023204c Mon Sep 17 00:00:00 2001 From: ebuka-ngene <73668233+ebuka-ngene@users.noreply.github.com> Date: Tue, 16 Nov 2021 00:39:20 -0800 Subject: [PATCH 1/2] Create .DS_Store --- .DS_Store | Bin 0 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..44af9e39179eea595cabc1ca14a8a27483572735 GIT binary patch literal 6148 zcmeHKyKWOf6upxeSUbdVfkYalrJ#!%|dpA!Wg%sg8zJHIAs#9qocX#nsL>JQ)@S?N8Cz-Ki^kW+ z0+!e7Bzi2Ly(9`dX|ec~t*mA)T)bpiIV-oGd+IcK&q>|1+o`(k$0BvlO`D$fA8;Q1 z@m=p>81xPcSMKmQb;CGlOLFK3sPg1d82h|e<=xot$aWl6U|Cr!dsx`)_jilsEqiyT zJlL}P<((q@n|p&n*1CG5bnD=#b@IIbV({{{nkR;9PTGdX5xjx3V7SLlJC1lP#1ZUu z>R}m+%@$y3owA7KR(m_Ps78IA8S24UYiHJ?X~-yG6gV#mi1Wcl5LnSTR49)QMDhs$ z%phADeDOCyaBPhgjYEYffiXn|Dk{@Y45sMFw{^XW#-Tz*C#D}CO!v(63x&zv(Y`IK z6RRjRu~EP%FsZ<*N*2WZzrXnXKS?qvqkvK1Tq(dZHK$g^ko4U;GdOYA+6YGo!bH8H nLP?p04o}Y3Xuade*~lqCNc{AQw4qluNeBc literal 0 HcmV?d00001 From 1c80c1835d3ae64cefcf14d5c3c84f46e47929fb Mon Sep 17 00:00:00 2001 From: ebuka-ngene <73668233+ebuka-ngene@users.noreply.github.com> Date: Tue, 16 Nov 2021 00:54:58 -0800 Subject: [PATCH 2/2] Commit by Ebuka --- .DS_Store | Bin 6148 -> 8196 bytes ebuka-ngene/.DS_Store | Bin 0 -> 6148 bytes ebuka-ngene/user-service/HELP.md | 19 ++ ebuka-ngene/user-service/mvnw | 310 ++++++++++++++++++ ebuka-ngene/user-service/mvnw.cmd | 182 ++++++++++ ebuka-ngene/user-service/pom.xml | 97 ++++++ .../app/user/UserServiceApplication.java | 43 +++ .../com/exquis/app/user/config/WebConfig.java | 12 + .../com/exquis/app/user/constant/Generic.java | 18 + .../app/user/controller/AuthController.java | 69 ++++ .../app/user/controller/UserController.java | 36 ++ .../exquis/app/user/dto/HttpResponseDto.java | 32 ++ .../exquis/app/user/dto/LoginRequestDto.java | 15 + .../exquis/app/user/dto/LoginResponseDto.java | 20 ++ .../app/user/dto/RegisterUserRequestDto.java | 25 ++ .../app/user/dto/UserWalletResponseDto.java | 15 + .../java/com/exquis/app/user/dto/Wallet.java | 14 + .../exquis/app/user/entity/RecordStatus.java | 42 +++ .../java/com/exquis/app/user/entity/Role.java | 24 ++ .../java/com/exquis/app/user/entity/User.java | 43 +++ .../com/exquis/app/user/enums/Gender.java | 27 ++ .../com/exquis/app/user/enums/RoleType.java | 8 + .../com/exquis/app/user/enums/StatusType.java | 7 + .../exception/HttpBadGatewayException.java | 10 + .../exception/HttpBadRequestException.java | 11 + .../exception/HttpForbiddenException.java | 12 + .../user/exception/HttpNotFoundException.java | 15 + .../repository/RecordStatusRepository.java | 9 + .../app/user/repository/RoleRepository.java | 11 + .../app/user/repository/UserRepository.java | 16 + .../exquis/app/user/service/AuthService.java | 121 +++++++ .../app/user/service/RecordStatusService.java | 95 ++++++ .../exquis/app/user/service/RoleService.java | 77 +++++ .../exquis/app/user/service/UserService.java | 115 +++++++ .../service/contract/AuthServiceContract.java | 10 + .../contract/RecordStatusServiceContract.java | 17 + .../service/contract/RoleServiceContract.java | 28 ++ .../service/contract/UserServiceContract.java | 17 + .../java/com/exquis/app/user/utility/Dto.java | 6 + .../com/exquis/app/user/utility/Helper.java | 90 +++++ .../exquis/app/user/utility/JwtTokenUtil.java | 125 +++++++ .../src/main/resources/application.properties | 1 + .../src/main/resources/application.yml | 15 + .../app/user/UserServiceApplicationTests.java | 13 + .../target/classes/application.properties | 1 + .../target/classes/application.yml | 15 + .../app/user/UserServiceApplication.class | Bin 0 -> 1003 bytes .../controller/RegistrationController.class | Bin 0 -> 512 bytes .../app/user/controller/UserController.class | Bin 0 -> 1996 bytes .../app/user/dto/RegisterUserRequestDto.class | Bin 0 -> 4147 bytes ...onseDto$UserWalletResponseDtoBuilder.class | Bin 0 -> 2249 bytes .../app/user/dto/UserWalletResponseDto.class | Bin 0 -> 4527 bytes .../com/exquis/app/user/dto/Wallet.class | Bin 0 -> 3029 bytes .../exquis/app/user/entity/RecordStatus.class | Bin 0 -> 5762 bytes .../com/exquis/app/user/entity/Role.class | Bin 0 -> 3752 bytes .../com/exquis/app/user/entity/User.class | Bin 0 -> 8128 bytes .../com/exquis/app/user/enums/Gender.class | Bin 0 -> 1655 bytes .../com/exquis/app/user/enums/RoleType.class | Bin 0 -> 1165 bytes .../exquis/app/user/enums/StatusType.class | Bin 0 -> 1167 bytes .../exception/HttpBadGatewayException.class | Bin 0 -> 550 bytes .../exception/HttpBadRequestException.class | Bin 0 -> 548 bytes .../exception/HttpNotFoundException.class | Bin 0 -> 540 bytes .../app/user/repository/UserRepository.class | Bin 0 -> 800 bytes .../exquis/app/user/service/UserService.class | Bin 0 -> 4757 bytes .../contract/UserServiceContract.class | Bin 0 -> 607 bytes .../com/exquis/app/user/utility/Dto.class | Bin 0 -> 143 bytes .../com/exquis/app/user/utility/Helper.class | Bin 0 -> 299 bytes .../compile/default-compile/createdFiles.lst | 21 ++ .../compile/default-compile/inputFiles.lst | 14 + .../default-testCompile/createdFiles.lst | 1 + .../default-testCompile/inputFiles.lst | 1 + .../user/UserServiceApplicationTests.class | Bin 0 -> 558 bytes 72 files changed, 1925 insertions(+) create mode 100644 ebuka-ngene/.DS_Store create mode 100644 ebuka-ngene/user-service/HELP.md create mode 100755 ebuka-ngene/user-service/mvnw create mode 100644 ebuka-ngene/user-service/mvnw.cmd create mode 100644 ebuka-ngene/user-service/pom.xml create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/UserServiceApplication.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/config/WebConfig.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/constant/Generic.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/controller/AuthController.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/controller/UserController.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/HttpResponseDto.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/LoginRequestDto.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/LoginResponseDto.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/RegisterUserRequestDto.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/UserWalletResponseDto.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/Wallet.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/RecordStatus.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/Role.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/User.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/Gender.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/RoleType.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/StatusType.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpBadGatewayException.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpBadRequestException.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpForbiddenException.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpNotFoundException.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/RecordStatusRepository.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/RoleRepository.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/UserRepository.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/AuthService.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/RecordStatusService.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/RoleService.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/UserService.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/AuthServiceContract.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/RecordStatusServiceContract.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/RoleServiceContract.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/UserServiceContract.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/Dto.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/Helper.java create mode 100644 ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/JwtTokenUtil.java create mode 100644 ebuka-ngene/user-service/src/main/resources/application.properties create mode 100644 ebuka-ngene/user-service/src/main/resources/application.yml create mode 100644 ebuka-ngene/user-service/src/test/java/com/exquis/app/user/UserServiceApplicationTests.java create mode 100644 ebuka-ngene/user-service/target/classes/application.properties create mode 100644 ebuka-ngene/user-service/target/classes/application.yml create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/UserServiceApplication.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/controller/RegistrationController.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/controller/UserController.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/dto/RegisterUserRequestDto.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/dto/UserWalletResponseDto$UserWalletResponseDtoBuilder.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/dto/UserWalletResponseDto.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/dto/Wallet.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/entity/RecordStatus.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/entity/Role.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/entity/User.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/enums/Gender.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/enums/RoleType.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/enums/StatusType.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/exception/HttpBadGatewayException.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/exception/HttpBadRequestException.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/exception/HttpNotFoundException.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/repository/UserRepository.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/service/UserService.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/service/contract/UserServiceContract.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/utility/Dto.class create mode 100644 ebuka-ngene/user-service/target/classes/com/exquis/app/user/utility/Helper.class create mode 100644 ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 ebuka-ngene/user-service/target/test-classes/com/exquis/app/user/UserServiceApplicationTests.class diff --git a/.DS_Store b/.DS_Store index 44af9e39179eea595cabc1ca14a8a27483572735..c101ecc468f3f251188bb1062c66536cdee7bd65 100644 GIT binary patch delta 423 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aMAD6lbLH}hr%jz7$c**Q2SHn1=X zOy*%J^yX$rWk_NuWyoeoWYA^EV@L<`^B7V+bMljua`KZvMgZ{*Al~yI41g>K2CTX! z*RW0GFtsqzQ7|$$nk>rhT#wc0oOHwB$PC-*0gim=v2C>d43ogpb$euf_t+d$9Lw*{34!{{dqVz7$GsiusNP*4l@88L10q= delta 358 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50$jG-bU^g=(-(((v!pRjv%j)?V zN*VGPN*FSMIENvXA%#JKA&ns)$W8(Biac}jlaq4tlc2`j0MdK@g8`7mz(7EEPP$=m za(-?BSS^G=)8U40VQ#*Q3)Di6FN$wgTv~Y8k+4OR1%<@r(Tqknd9uBb=;SbA(aC3p z_%=HWCooPd3tY_3!6C>DahU)&kah(H)yBf_%#-_S BOmF}I diff --git a/ebuka-ngene/.DS_Store b/ebuka-ngene/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..07fef44d526058e71b12838dd89b2885cf60cfa7 GIT binary patch literal 6148 zcmeHK!EO^V5FNKEbwUw2RH8>;xCJRmOACieOBxQnAuWOfpmsOAYF65;qwFS88-n&P zs+LnP{gIw}N8;2|KLp111hoo{fCH)`k2HQ`d&bVZ$o38Zutq38EO&8pS!Y+!u0OAzR>Q#9D}yC3|IzkGq7m7W%d5QzPtXv9b|i!0n5N# zF~AB \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -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 "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; 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="`which 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 + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# 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/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# 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. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +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 "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -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 + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/ebuka-ngene/user-service/mvnw.cmd b/ebuka-ngene/user-service/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/ebuka-ngene/user-service/mvnw.cmd @@ -0,0 +1,182 @@ +@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 Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@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 "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\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 DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_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 DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_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('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@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 "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\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% + +exit /B %ERROR_CODE% diff --git a/ebuka-ngene/user-service/pom.xml b/ebuka-ngene/user-service/pom.xml new file mode 100644 index 0000000..aa1f058 --- /dev/null +++ b/ebuka-ngene/user-service/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.6 + + + com.exquis.app + user-service + 0.0.1-SNAPSHOT + user-service + user-service + + 1.8 + 2020.0.4 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + com.h2database + h2 + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + jakarta.platform + jakarta.jakartaee-api + 8.0.0 + + + org.springframework.security + spring-security-core + 5.3.4.RELEASE + + + io.jsonwebtoken + jjwt + 0.9.1 + + + io.swagger + swagger-annotations + 1.5.22 + + + org.springframework.security + spring-security-config + 5.3.4.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/UserServiceApplication.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/UserServiceApplication.java new file mode 100644 index 0000000..32fb76e --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/UserServiceApplication.java @@ -0,0 +1,43 @@ +package com.exquis.app.user; + +import com.exquis.app.user.entity.RecordStatus; +import com.exquis.app.user.entity.Role; +import com.exquis.app.user.enums.RoleType; +import com.exquis.app.user.enums.StatusType; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; + +import java.time.LocalDateTime; + +@SpringBootApplication +public class UserServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(UserServiceApplication.class, args); + } + + @Bean + public RestTemplate restTemplate() + { + return new RestTemplate(); + } + + private void seedRole() + { + Role role = new Role(); + role.setRole(RoleType.ADMIN); + role.setDescription("admin role"); + } + + private void seedRecordStatus() + { + RecordStatus recordStatus = new RecordStatus(); + recordStatus.setStatus(StatusType.ACTIVE); + recordStatus.setCreatedAt(LocalDateTime.now()); + recordStatus.setCreatedBy("ebuka@test1.com"); + + } + +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/config/WebConfig.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/config/WebConfig.java new file mode 100644 index 0000000..12d75aa --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/config/WebConfig.java @@ -0,0 +1,12 @@ +package com.exquis.app.user.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +/** + * + * @author chukwuebuka + */ +@Configuration +public class WebConfig extends WebSecurityConfigurerAdapter { +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/constant/Generic.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/constant/Generic.java new file mode 100644 index 0000000..3c087a0 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/constant/Generic.java @@ -0,0 +1,18 @@ +package com.exquis.app.user.constant; + +public interface Generic { + static String ISSUER = "exquifactory"; + // reg expression + String DIGITS_REG_EXT = "\\d+"; + String PHONE_REG_EX = "\\A[0-9]{11}\\z"; //"^\\+?\\d{1,3}?\\s?[0-9]{6,18}"; + String EMAIL_REG_EX = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.(?:[a-zA-Z]{2,6})$"; + public static final String SIGNING_KEY = "abjfoijefli2o3ur2839ru02h03f0904j4of0490j094775i75i5ki5"; + public static final String AUTHORITIES_KEY = "scopes"; + public static final String TOKEN_PREFIX = "Bearer "; + public static final String HEADER_STRING = "Authorization"; + static int PASSWORD_LENGTH = 7; + static int PHONENUMBER_LENGTH = 11; + static String ALL_ALPHANUMERIC = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + static String ALL_NUMERIC = "1234567890"; + static String ALL_LOWER_ALPHABETS = "abcdefghijklmnopqrstuvwxyz"; +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/controller/AuthController.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/controller/AuthController.java new file mode 100644 index 0000000..15a4fb4 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/controller/AuthController.java @@ -0,0 +1,69 @@ +package com.exquis.app.user.controller; + +import com.exquis.app.user.dto.HttpResponseDto; +import com.exquis.app.user.dto.LoginRequestDto; +import com.exquis.app.user.dto.RegisterUserRequestDto; +import com.exquis.app.user.service.contract.AuthServiceContract; +import com.exquis.app.user.service.contract.UserServiceContract; +import com.exquis.app.user.utility.Helper; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +@CrossOrigin +@RestController +public class AuthController { + @Autowired + private AuthServiceContract authService; + + @ApiOperation("Users registration endpoint.") + @PostMapping( + value = "register", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity registerUser(@Valid @RequestBody RegisterUserRequestDto requestDto) + { + HttpResponseDto httpResponseDto = authService.register(requestDto); + + return new ResponseEntity<>(httpResponseDto, httpResponseDto.getStatusCode()); // return bad request + } + + @PostMapping( + value = "login", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + @ApiOperation("User Login endpoint.") + public ResponseEntity loginUser(@Valid @RequestBody LoginRequestDto requestDto) throws Exception + { + HttpResponseDto successResponse = new HttpResponseDto(); + successResponse.setEntity("User Authentication"); // set entity string + + try{ + successResponse = authService.login(requestDto); // call login process + if(Helper.isNotEmpty(successResponse.getData())) + { + + successResponse.setStatusCode(HttpStatus.OK); + successResponse.setMessage("Successful user login"); + successResponse.setData(successResponse.getData()); + + return new ResponseEntity<>(successResponse, HttpStatus.OK); + } + } + catch(Exception ex) // catch exception and return error message + { + successResponse.setStatusCode(HttpStatus.BAD_REQUEST); + successResponse.setMessage("Something went wrong or Invalid credentials provided."); + } + + return new ResponseEntity<>(successResponse, HttpStatus.BAD_REQUEST); // return bad request with object + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/controller/UserController.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/controller/UserController.java new file mode 100644 index 0000000..c951698 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/controller/UserController.java @@ -0,0 +1,36 @@ +package com.exquis.app.user.controller; + +import com.exquis.app.user.entity.User; +import com.exquis.app.user.service.contract.UserServiceContract; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@CrossOrigin +@RestController +@RequestMapping("users") +public class UserController { + @Autowired private UserServiceContract userService; + + @GetMapping("/") + public List users() + { + return userService.getAll(); + } + + @PutMapping("/") + public User update(@RequestBody User user) + { + return userService.saveOrUpdate(user); + } + + @GetMapping(value = "/{id}") + public User getUserById(@PathVariable("id") String userId) + { + UUID uuid = UUID.fromString(userId); + return userService.findById(uuid); + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/HttpResponseDto.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/HttpResponseDto.java new file mode 100644 index 0000000..89c7903 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/HttpResponseDto.java @@ -0,0 +1,32 @@ +package com.exquis.app.user.dto; + +import com.exquis.app.user.utility.Dto; +import lombok.Data; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +@Data +public class HttpResponseDto implements Dto { + private String message; + private HttpStatus statusCode; + private String entity; + private Object object; + private ResponseEntity data; + + public HttpResponseDto(){} + + public HttpResponseDto(String message, HttpStatus statusCode, String entity, ResponseEntity data, Object object) { + this.message = message; + this.statusCode = statusCode; + this.entity = entity; + this.data = data; + this.object = object; + } + + public HttpResponseDto(String message, HttpStatus statusCode, String entity, ResponseEntity data) { + this.message = message; + this.statusCode = statusCode; + this.entity = entity; + this.data = data; + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/LoginRequestDto.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/LoginRequestDto.java new file mode 100644 index 0000000..f520d14 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/LoginRequestDto.java @@ -0,0 +1,15 @@ +package com.exquis.app.user.dto; + +import com.exquis.app.user.utility.Dto; +import lombok.Data; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotEmpty; + +@Data +public class LoginRequestDto implements Dto { + @Email(message = "Email is required") + private String email; + @NotEmpty(message = "Password is required") + private String password; +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/LoginResponseDto.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/LoginResponseDto.java new file mode 100644 index 0000000..340d8a5 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/LoginResponseDto.java @@ -0,0 +1,20 @@ +package com.exquis.app.user.dto; + +import com.exquis.app.user.entity.Role; +import com.exquis.app.user.utility.Dto; +import lombok.Builder; +import lombok.Data; + +import java.util.Set; +import java.util.UUID; + +@Builder +@Data +public class LoginResponseDto implements Dto { + private UUID id; + private String fullName; + private String phone; + private String email; + private Set role; //RoleDto + private String accessToken; +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/RegisterUserRequestDto.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/RegisterUserRequestDto.java new file mode 100644 index 0000000..9efb54c --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/RegisterUserRequestDto.java @@ -0,0 +1,25 @@ +package com.exquis.app.user.dto; + +import com.exquis.app.user.utility.Dto; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Enumerated; +import javax.validation.constraints.NotEmpty; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RegisterUserRequestDto implements Dto { + @NotEmpty + private String lastName; + @NotEmpty + private String firstName; + @NotEmpty + private String password; + @NotEmpty + private String email; + @NotEmpty + private String contactPhone; +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/UserWalletResponseDto.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/UserWalletResponseDto.java new file mode 100644 index 0000000..c0c13a3 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/UserWalletResponseDto.java @@ -0,0 +1,15 @@ +package com.exquis.app.user.dto; + +import com.exquis.app.user.utility.Dto; +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class UserWalletResponseDto implements Dto { + private String userId; + private String email; + private String contactPhone; + private String walletNumber; + private Double walletAmount; +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/Wallet.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/Wallet.java new file mode 100644 index 0000000..d4b7b0a --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/dto/Wallet.java @@ -0,0 +1,14 @@ +package com.exquis.app.user.dto; + +import com.exquis.app.user.utility.Dto; +import lombok.Data; + +import java.util.UUID; + +@Data +public class Wallet implements Dto { + private String number; + private Double amount; + private UUID userId; + private Long recordId; +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/RecordStatus.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/RecordStatus.java new file mode 100644 index 0000000..dc5ad10 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/RecordStatus.java @@ -0,0 +1,42 @@ +package com.exquis.app.user.entity; + +import com.exquis.app.user.enums.StatusType; +import lombok.Data; +import org.hibernate.annotations.CreationTimestamp; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Data +@Entity +@Table(name = "record_status") +public class RecordStatus { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "record_status_generator") + @SequenceGenerator(name="record_status_generator", sequenceName = "record_status_seq", allocationSize=50, initialValue = 300) + @Column(name = "id", updatable = false, nullable = false) + private long id; + + @Column(name = "created_by") + private String createdBy; + + @Column(name = "created_at", nullable = false) + @CreationTimestamp + private LocalDateTime createdAt = LocalDateTime.now(); + + @Column(name = "updated_by") + private String updatedBy; + + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + @Column(name = "deleted_by") + private String deletedBy; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private StatusType status; +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/Role.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/Role.java new file mode 100644 index 0000000..520898a --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/Role.java @@ -0,0 +1,24 @@ +package com.exquis.app.user.entity; + +import com.exquis.app.user.enums.RoleType; +import lombok.Data; + +import javax.persistence.*; + +@Data +@Entity +public class Role { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + @Column(unique = true, nullable = false) + @Enumerated(EnumType.STRING) + private RoleType role; + + @Column(length = 250) + private String description; + + @OneToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "record_status", referencedColumnName = "id", nullable = false, unique = true) + private RecordStatus recordStatus; +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/User.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/User.java new file mode 100644 index 0000000..ac5b4f7 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/entity/User.java @@ -0,0 +1,43 @@ +package com.exquis.app.user.entity; + +import com.exquis.app.user.enums.Gender; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.Date; +import java.util.Set; +import java.util.UUID; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "user_account") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private UUID id; + @Column(nullable = false, unique = true) + private String email; + @Column(nullable = false) + private String password; + @Column(nullable = false, unique = true) + private String contactPhone; + private String lastName; + private String firstName; + + @ManyToMany( + fetch = FetchType.EAGER, + cascade = {CascadeType.ALL}) + @JoinTable( + name = "user_roles", + joinColumns = @JoinColumn(name = "user_id"), + inverseJoinColumns = @JoinColumn(name = "role_id")) + private Set roles; + + @OneToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "record_status", referencedColumnName = "id", nullable = false, unique = true) + private RecordStatus recordStatus; +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/Gender.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/Gender.java new file mode 100644 index 0000000..a4e0de1 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/Gender.java @@ -0,0 +1,27 @@ +package com.exquis.app.user.enums; + +import com.exquis.app.user.utility.Dto; + +public enum Gender implements Dto { + M("Male"), + F("Female"), + OTHER("Other"); + + private final String description; + + Gender(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + + public static Gender fromName(String name) { + if (name == null || name.isEmpty()) { + return null; + } + + return Gender.valueOf(name); + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/RoleType.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/RoleType.java new file mode 100644 index 0000000..16efbd2 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/RoleType.java @@ -0,0 +1,8 @@ +package com.exquis.app.user.enums; + +import com.exquis.app.user.utility.Dto; + +public enum RoleType implements Dto { + ADMIN, + USER +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/StatusType.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/StatusType.java new file mode 100644 index 0000000..8d068c7 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/enums/StatusType.java @@ -0,0 +1,7 @@ +package com.exquis.app.user.enums; + +public enum StatusType { + ACTIVE, + SUSPENDED, + DELETED +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpBadGatewayException.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpBadGatewayException.java new file mode 100644 index 0000000..e92f181 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpBadGatewayException.java @@ -0,0 +1,10 @@ +package com.exquis.app.user.exception; + +public class HttpBadGatewayException extends RuntimeException{ + public HttpBadGatewayException(){ + super("Gateway Error"); + } + public HttpBadGatewayException(String message){ + super(message); + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpBadRequestException.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpBadRequestException.java new file mode 100644 index 0000000..6cda5df --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpBadRequestException.java @@ -0,0 +1,11 @@ +package com.exquis.app.user.exception; + +public class HttpBadRequestException extends RuntimeException{ + public HttpBadRequestException(){ + super("bad request"); + } + public HttpBadRequestException(String message) + { + super(message); + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpForbiddenException.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpForbiddenException.java new file mode 100644 index 0000000..2c57085 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpForbiddenException.java @@ -0,0 +1,12 @@ +package com.exquis.app.user.exception; + +public class HttpForbiddenException extends RuntimeException{ + + public HttpForbiddenException(){ + super("Forbidden"); + } + public HttpForbiddenException(String message) + { + super(message); + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpNotFoundException.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpNotFoundException.java new file mode 100644 index 0000000..cfd2e3c --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/exception/HttpNotFoundException.java @@ -0,0 +1,15 @@ +package com.exquis.app.user.exception; + +/** + * + * @author chukwuebuka + */ +public class HttpNotFoundException extends RuntimeException { + public HttpNotFoundException(String message) { + super(message); + } + + public HttpNotFoundException() { + super("not found"); + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/RecordStatusRepository.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/RecordStatusRepository.java new file mode 100644 index 0000000..841f9fe --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/RecordStatusRepository.java @@ -0,0 +1,9 @@ +package com.exquis.app.user.repository; + +import com.exquis.app.user.entity.RecordStatus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface RecordStatusRepository extends JpaRepository { +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/RoleRepository.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/RoleRepository.java new file mode 100644 index 0000000..e43168d --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/RoleRepository.java @@ -0,0 +1,11 @@ +package com.exquis.app.user.repository; + +import com.exquis.app.user.entity.Role; +import com.exquis.app.user.enums.RoleType; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface RoleRepository extends JpaRepository { + Role findByRole(RoleType roleType); +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/UserRepository.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/UserRepository.java new file mode 100644 index 0000000..11a7209 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/repository/UserRepository.java @@ -0,0 +1,16 @@ +package com.exquis.app.user.repository; + +import com.exquis.app.user.entity.User; +import com.exquis.app.user.enums.Gender; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.UUID; + +@Repository +public interface UserRepository extends JpaRepository { + User findByUsername(String username); + User findByEmail(String email); + List findByGender(Gender gender); +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/AuthService.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/AuthService.java new file mode 100644 index 0000000..3aecbfd --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/AuthService.java @@ -0,0 +1,121 @@ +package com.exquis.app.user.service; + +import com.exquis.app.user.constant.Generic; +import com.exquis.app.user.dto.HttpResponseDto; +import com.exquis.app.user.dto.LoginRequestDto; +import com.exquis.app.user.dto.LoginResponseDto; +import com.exquis.app.user.dto.RegisterUserRequestDto; +import com.exquis.app.user.entity.User; +import com.exquis.app.user.enums.StatusType; +import com.exquis.app.user.exception.HttpBadRequestException; +import com.exquis.app.user.exception.HttpForbiddenException; +import com.exquis.app.user.service.contract.AuthServiceContract; +import com.exquis.app.user.service.contract.RoleServiceContract; +import com.exquis.app.user.utility.Helper; +import com.exquis.app.user.utility.JwtTokenUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.DisabledException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AuthService implements AuthServiceContract { + @Autowired + private UserService userService; + @Autowired + AuthenticationManager authenticationManager; + @Autowired private JwtTokenUtil jwtTokenUtil; + @Autowired private RoleServiceContract roleService; + + static String ENTITY = "authentication"; + + @Override + public HttpResponseDto register(RegisterUserRequestDto registrationRequestDto) { + HttpResponseDto httpResponseDto = new HttpResponseDto(); + httpResponseDto.setEntity("User Registration"); + + User user = userService.createUserAccount(registrationRequestDto); + if(Helper.isNotEmpty(user)) { + httpResponseDto.setStatusCode(HttpStatus.CREATED); + httpResponseDto.setMessage("Successful user registration"); + httpResponseDto.setData(new ResponseEntity(user, HttpStatus.CREATED)); + } + else{ + httpResponseDto.setStatusCode(HttpStatus.BAD_REQUEST); + httpResponseDto.setMessage("Not successful"); + } + + return httpResponseDto; + } + + @Override + public HttpResponseDto login(LoginRequestDto loginRequestDto) { + final String accessToken; + HttpResponseDto successResponse = new HttpResponseDto(); + //LoginResponseDto loginResponseDto = new LoginResponseDto(); + Authentication authentication = null; + + // I am checking all entries here in case model validation does not work + if(Helper.isEmpty(loginRequestDto.getEmail()) || Helper.isEmpty(loginRequestDto.getPassword())) { + throw new HttpBadRequestException("Please fill in all fields."); + } + // validate that is an email + if(!loginRequestDto.getEmail().matches(Generic.EMAIL_REG_EX)) + { + throw new HttpBadRequestException("Invalid Credentials."); + } + + // confirm that password is valid + List validPassword = Helper.isValidPassword(loginRequestDto.getPassword()); + + if(Helper.isNotEmpty(validPassword) && !validPassword.isEmpty()) + { + throw new HttpBadRequestException(validPassword.toString()); + } + + try{ + authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(loginRequestDto.getEmail(), loginRequestDto.getPassword())); + } + catch(BadCredentialsException ex){ + throw new HttpBadRequestException("Invalid Credentials"); + } + + if(Helper.isNotEmpty(authentication)) + { + SecurityContextHolder.getContext().setAuthentication(authentication); + accessToken = jwtTokenUtil.generateToken(authentication); + // we need to get user object to set our login-response-object + User user = userService.findByEmail(loginRequestDto.getEmail().trim()); // get user by phone or email + + if(Helper.isNotEmpty(user)) // check user object + { + // make sure role if this user is active + if(!roleService.checkRoleStatus(user.getRoles(), StatusType.ACTIVE)) + { + throw new HttpForbiddenException("User role is not active and can't login."); + } + + LoginResponseDto loginResponseDto = LoginResponseDto.builder() + .id(user.getId()) + .email(user.getEmail()) + .accessToken(accessToken) + .fullName(user.getLastName() + user.getFirstName()) + .phone(user.getContactPhone()) + .role(user.getRoles()) + .build(); + + successResponse.setData(new ResponseEntity(loginResponseDto, HttpStatus.OK)); // set to data response with ok http status + } + } + + return successResponse; + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/RecordStatusService.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/RecordStatusService.java new file mode 100644 index 0000000..ccf302f --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/RecordStatusService.java @@ -0,0 +1,95 @@ +package com.exquis.app.user.service; + +import com.exquis.app.user.constant.Generic; +import com.exquis.app.user.entity.RecordStatus; +import com.exquis.app.user.enums.StatusType; +import com.exquis.app.user.repository.RecordStatusRepository; +import com.exquis.app.user.service.contract.RecordStatusServiceContract; +import com.exquis.app.user.utility.Helper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.time.LocalDateTime; + +@Service +public class RecordStatusService implements RecordStatusServiceContract { + + @Autowired + private RecordStatusRepository recordStatusRepository; + + @Override + @Transactional + public RecordStatus create(StatusType type) { + //new + RecordStatus newRecordStatus = new RecordStatus(); + newRecordStatus.setCreatedAt(LocalDateTime.now()); + newRecordStatus.setCreatedBy(Generic.ISSUER); // created_by should be issuer for now + newRecordStatus.setStatus(type); + + return recordStatusRepository.save(newRecordStatus); // call repo to save data + } + + @Override + public RecordStatus create(StatusType type, String createdBy) { + //new + RecordStatus newRecordStatus = new RecordStatus(); + newRecordStatus.setCreatedAt(LocalDateTime.now()); + newRecordStatus.setCreatedBy(createdBy); + newRecordStatus.setStatus(type); + + return recordStatusRepository.save(newRecordStatus); // call repo to save data + } + + @Override + @Transactional + public RecordStatus update(long recordStatusId, StatusType type) { + RecordStatus recordStatus = exist(recordStatusId); + + if(Helper.isNotEmpty(recordStatus)) + { + recordStatus.setUpdatedAt(LocalDateTime.now()); + recordStatus.setUpdatedBy(Generic.ISSUER); + recordStatus.setStatus(type); + + recordStatusRepository.save(recordStatus); + } + return recordStatus; + } + + @Override + @Transactional + public RecordStatus update(long recordStatusId, String updatedBy) { + RecordStatus recordStatus = exist(recordStatusId); + + if(Helper.isNotEmpty(recordStatus)) + { + recordStatus.setUpdatedAt(LocalDateTime.now()); + recordStatus.setUpdatedBy(updatedBy); + + recordStatusRepository.save(recordStatus); + } + return recordStatus; + } + + @Override + @Transactional + public RecordStatus delete(long recordStatusId, String deletedBy) { + RecordStatus recordStatus = exist(recordStatusId); + + if(Helper.isNotEmpty(recordStatus)) + { + recordStatus.setDeletedAt(LocalDateTime.now()); + recordStatus.setDeletedBy(deletedBy); + recordStatus.setStatus(StatusType.DELETED); // partial delete + + recordStatusRepository.save(recordStatus); + } + return recordStatus; + } + + @Override + public RecordStatus exist(long recordStatusId) { + return recordStatusRepository.findById(recordStatusId).orElse(null); + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/RoleService.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/RoleService.java new file mode 100644 index 0000000..9fc765c --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/RoleService.java @@ -0,0 +1,77 @@ +package com.exquis.app.user.service; + +import com.exquis.app.user.entity.Role; +import com.exquis.app.user.enums.RoleType; +import com.exquis.app.user.enums.StatusType; +import com.exquis.app.user.repository.RoleRepository; +import com.exquis.app.user.service.contract.RoleServiceContract; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class RoleService implements RoleServiceContract { + @Autowired RoleRepository roleRepository; + @Autowired + private RecordStatusService recordStatusService; + + /**@Override + public Role findByRole(RoleType roleType) { + return roleRepository.findByRole(roleType); + }***/ + + @Override + public Role findById(Long id) { + return roleRepository.findById(id).orElse(null); + } + + @Override + public Role findByRoleName(String role) { + //return roleRepository.getOne(role); + return roleRepository.findByRole(RoleType.valueOf(role)); + } + + @Override + public Role addOrUpdate(Role role) { + return roleRepository.save(role); + } + + @Override + public List findAll() { + return roleRepository.findAll(); + } + + @Override + public List findByStatus(StatusType status) { + List roles = roleRepository.findAll(); + return roles.stream().filter(role -> role.getRecordStatus().getStatus().equals(status)).collect(Collectors.toList()); + } + + @Override + public Boolean hasRole(Authentication auth, RoleType roleType) { + if (auth.getAuthorities() + .stream() + .anyMatch(s -> s.getAuthority().equals(roleType.toString()))) { + return true; + } + return false; + } + + @Override + public Boolean hasRole(Set role, RoleType roleType) { + if(role.stream().anyMatch(s->s.getId().equals(roleType))) + return true; + return false; + } + + @Override + public Boolean checkRoleStatus(Set roles, StatusType status) { + if(roles.stream().anyMatch(s->s.getRecordStatus().getStatus().equals(status))) + return true; + return false; + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/UserService.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/UserService.java new file mode 100644 index 0000000..f242290 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/UserService.java @@ -0,0 +1,115 @@ +package com.exquis.app.user.service; + +import com.exquis.app.user.dto.RegisterUserRequestDto; +import com.exquis.app.user.dto.UserWalletResponseDto; +import com.exquis.app.user.entity.Role; +import com.exquis.app.user.entity.User; +import com.exquis.app.user.enums.RoleType; +import com.exquis.app.user.enums.StatusType; +import com.exquis.app.user.exception.HttpBadGatewayException; +import com.exquis.app.user.exception.HttpBadRequestException; +import com.exquis.app.user.exception.HttpNotFoundException; +import com.exquis.app.user.dto.Wallet; +import com.exquis.app.user.repository.UserRepository; +import com.exquis.app.user.service.contract.RecordStatusServiceContract; +import com.exquis.app.user.service.contract.RoleServiceContract; +import com.exquis.app.user.service.contract.UserServiceContract; +import com.exquis.app.user.utility.Helper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import javax.transaction.Transactional; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +/** + * + * @author chukwuebuka + */ + +@Slf4j +@Service +public class UserService implements UserServiceContract { + @Autowired private UserRepository userRepository; + @Autowired private RoleServiceContract roleService; + @Autowired private PasswordEncoder passwordEncoder; + @Autowired private RecordStatusServiceContract recordStatusService; + @Autowired private RestTemplate restTemplate; + + @Override + @Transactional + public User saveOrUpdate(User user) { + return userRepository.save(user); + } + + @Override + public List getAll() { + return userRepository.findAll(); + } + + @Override + public User findById(UUID id) { + return userRepository.findById(id).orElseThrow(()-> new HttpNotFoundException()); + } + + @Override + public User findByEmail(String email) { + return userRepository.findByEmail(email); + } + + @Override + public UserWalletResponseDto findUserWithWallet(UUID userId) { + log.info("findUserWithWallet()"); + User user = userRepository.findById(userId).orElseThrow(()-> new HttpNotFoundException("User not found")); + try{ + Wallet wallet = restTemplate.getForObject("http://WALLET-SERVICE/wallets/" + user.getId(), Wallet.class); + + UserWalletResponseDto responseDto = UserWalletResponseDto + .builder() + .userId(user.getId().toString()) + .email(user.getEmail()) + .contactPhone(user.getContactPhone()) + .walletNumber(wallet.getNumber()) + .walletAmount(wallet.getAmount()) + .build(); + + return responseDto; + } + catch(Exception ex) + { + throw new HttpBadGatewayException(); + } + } + + @Override + public User createUserAccount(RegisterUserRequestDto registerUserRequestDto) { + //set user role + Set roles = new HashSet<>(); + + Role userRole = roleService.findByRole(RoleType.USER); + if(Helper.isEmpty(userRole)) { // it means user as a role is not setup in the system + throw new HttpBadRequestException("Make sure user roles and privileges are setup first."); + } + // we hope role is not deleted + if(userRole.getRecordStatus().getStatus() == StatusType.DELETED){ + throw new HttpBadRequestException("User role is deleted and can't be added to user account. \n Suggestion: Find out why user role is not active."); + } + roles.add(userRole); // add to role set + + User user = new User(); + user.setRoles(roles); + user.setEmail(registerUserRequestDto.getEmail()); + user.setLastName(registerUserRequestDto.getLastName()); + user.setFirstName(registerUserRequestDto.getFirstName()); + user.setContactPhone(registerUserRequestDto.getContactPhone()); + user.setPassword(passwordEncoder.encode(registerUserRequestDto.getPassword())); + user.setRecordStatus(recordStatusService.create(StatusType.ACTIVE)); + + return saveOrUpdate(user); // create + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/AuthServiceContract.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/AuthServiceContract.java new file mode 100644 index 0000000..d3062cd --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/AuthServiceContract.java @@ -0,0 +1,10 @@ +package com.exquis.app.user.service.contract; + +import com.exquis.app.user.dto.HttpResponseDto; +import com.exquis.app.user.dto.LoginRequestDto; +import com.exquis.app.user.dto.RegisterUserRequestDto; + +public interface AuthServiceContract { + HttpResponseDto register(RegisterUserRequestDto registerUserRequestDto); + HttpResponseDto login(LoginRequestDto loginRequestDto); +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/RecordStatusServiceContract.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/RecordStatusServiceContract.java new file mode 100644 index 0000000..97734a7 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/RecordStatusServiceContract.java @@ -0,0 +1,17 @@ +package com.exquis.app.user.service.contract; + +import com.exquis.app.user.entity.RecordStatus; +import com.exquis.app.user.enums.StatusType; + +/** + * + * @author Chukwuebuka + */ +public interface RecordStatusServiceContract { + RecordStatus create(StatusType type); + RecordStatus create(StatusType type, String createdBy); + RecordStatus update(long recordStatusId, StatusType type); + RecordStatus update(long recordStatusId, String updatedBy); + RecordStatus delete(long recordStatusId, String deletedBy); + RecordStatus exist(long recordStatusId); +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/RoleServiceContract.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/RoleServiceContract.java new file mode 100644 index 0000000..85696e6 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/RoleServiceContract.java @@ -0,0 +1,28 @@ +package com.exquis.app.user.service.contract; + +import com.exquis.app.user.entity.Role; +import com.exquis.app.user.enums.RoleType; +import com.exquis.app.user.enums.StatusType; +import org.springframework.security.core.Authentication; + +import java.util.List; +import java.util.Set; + +public interface RoleServiceContract { + //Role findByRole(RoleType roleType); + Role findById(Long id); + + Role findByRoleName(String role); + + Role addOrUpdate(Role role); + + List findAll(); + // fill all roles by status + List findByStatus(StatusType status); + /** Check if a user has a certain role* */ + Boolean hasRole(Authentication auth, RoleType roleType); + + Boolean hasRole(Set role, RoleType roleType); + + Boolean checkRoleStatus(Set roles, StatusType status); +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/UserServiceContract.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/UserServiceContract.java new file mode 100644 index 0000000..337f566 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/service/contract/UserServiceContract.java @@ -0,0 +1,17 @@ +package com.exquis.app.user.service.contract; + +import com.exquis.app.user.dto.RegisterUserRequestDto; +import com.exquis.app.user.dto.UserWalletResponseDto; +import com.exquis.app.user.entity.User; + +import java.util.List; +import java.util.UUID; + +public interface UserServiceContract { + User saveOrUpdate(User user); + List getAll(); + User findById(UUID id); + User findByEmail(String email); + UserWalletResponseDto findUserWithWallet(UUID userId); + User createUserAccount(RegisterUserRequestDto registerUserRequestDto); +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/Dto.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/Dto.java new file mode 100644 index 0000000..5defbc9 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/Dto.java @@ -0,0 +1,6 @@ +package com.exquis.app.user.utility; + +import java.io.Serializable; + +public interface Dto extends Serializable { +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/Helper.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/Helper.java new file mode 100644 index 0000000..e3a394a --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/Helper.java @@ -0,0 +1,90 @@ +package com.exquis.app.user.utility; + +import com.exquis.app.user.constant.Generic; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + +import static com.exquis.app.user.constant.Generic.ALL_ALPHANUMERIC; +import static com.exquis.app.user.constant.Generic.ALL_NUMERIC; + +public class Helper { + public static boolean isEmpty(T value) { + if (value == null) return true; + if (value instanceof String && ((String) value).trim().isEmpty()) return true; + return false; + } + + public static boolean isNotEmpty(T value) { + return !isEmpty(value); + } + + public static String getAlphaNumeric(int size) + { + String stringToPickFrom = ALL_ALPHANUMERIC; + StringBuffer stringBuffer = new StringBuffer(size); + for(int i=0; i isValidPassword(String passwordhere) { + + List errorList = new ArrayList(); + + Pattern lowerCasePatten = Pattern.compile("[a-z ]"); + Pattern digitCasePatten = Pattern.compile("[0-9 ]"); + + if (passwordhere.length() <= Generic.PASSWORD_LENGTH) { + errorList.add("Password length must have at least " + String.valueOf(Generic.PASSWORD_LENGTH ) + " character !!"); + } + if (!lowerCasePatten.matcher(passwordhere).find()) { + errorList.add("Password must have at least one lowercase character !!"); + } + if (!digitCasePatten.matcher(passwordhere).find()) { + errorList.add("Password must have at least one digit character !!"); + } + + return errorList; + + } +} diff --git a/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/JwtTokenUtil.java b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/JwtTokenUtil.java new file mode 100644 index 0000000..0386533 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/java/com/exquis/app/user/utility/JwtTokenUtil.java @@ -0,0 +1,125 @@ +package com.exquis.app.user.utility; + +import com.exquis.app.user.constant.Generic; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jws; +import io.jsonwebtoken.JwtParser; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.exquis.app.user.constant.Generic.AUTHORITIES_KEY; +import static com.exquis.app.user.constant.Generic.SIGNING_KEY; + +public class JwtTokenUtil implements Serializable { + private static final long serialVersionUID = -2550185165626007488L; + + public static final long JWT_TOKEN_VALIDITY = 5*60*60; + + @Value("") + private String secret; + + public String getUsernameFromToken(String token) { + return getClaimFromToken(token, Claims::getSubject); + } + + public Date getIssuedAtDateFromToken(String token) { + return getClaimFromToken(token, Claims::getIssuedAt); + } + + public Date getExpirationDateFromToken(String token) { + return getClaimFromToken(token, Claims::getExpiration); + } + + public T getClaimFromToken(String token, Function claimsResolver) { + final Claims claims = getAllClaimsFromToken(token); + return claimsResolver.apply(claims); + } + + private Claims getAllClaimsFromToken(String token) { + return Jwts.parser().setSigningKey(SIGNING_KEY).parseClaimsJws(token).getBody(); + } + + private Boolean isTokenExpired(String token) { + final Date expiration = getExpirationDateFromToken(token); + return expiration.before(new Date()); + } + + private Boolean ignoreTokenExpiration(String token) { + // here you specify tokens, for that the expiration is ignored + return false; + } + + public String generateToken(UserDetails userDetails) { + Map claims = new HashMap<>(); + return doGenerateToken(claims, userDetails.getUsername()); + } + + private String doGenerateToken(Map claims, String subject) { + + return Jwts.builder() + .setClaims(claims) + .setSubject(subject) + .setIssuedAt(new Date(System.currentTimeMillis())) + //.setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY*1000)) + .setExpiration(Date.from( + LocalDateTime.now().plusHours(1).toInstant(ZoneOffset.UTC))) + .signWith(SignatureAlgorithm.HS512, SIGNING_KEY) + .compact(); + } + + public String generateToken(Authentication authentication) { + Date dateIssued = new Date(); + Date dateExpiry = new Date(System.currentTimeMillis() + Helper.getDaysInMiliseconds(30)); + final String authorities = + authentication + .getAuthorities() + .stream() + .map(GrantedAuthority::getAuthority) + .collect(Collectors.joining(",")); + return Jwts.builder() + .setSubject(authentication.getName()) + .claim(AUTHORITIES_KEY, authorities) + .signWith(SignatureAlgorithm.HS256, SIGNING_KEY) + .setIssuedAt(dateIssued) + .setExpiration(dateExpiry) + .compact(); + } + + public Boolean canTokenBeRefreshed(String token) { + return (!isTokenExpired(token) || ignoreTokenExpiration(token)); + } + + public Boolean validateToken(String token, UserDetails userDetails) { + final String username = getUsernameFromToken(token); + return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); + } + UsernamePasswordAuthenticationToken getAuthentication( + final String token, final Authentication existingAuth, final UserDetails userDetails) { + + final JwtParser jwtParser = Jwts.parser().setSigningKey(SIGNING_KEY); + + final Jws claimsJws = jwtParser.parseClaimsJws(token); + + final Claims claims = claimsJws.getBody(); + + final Collection authorities = + Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(",")) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + return new UsernamePasswordAuthenticationToken(userDetails, "", authorities); + } +} diff --git a/ebuka-ngene/user-service/src/main/resources/application.properties b/ebuka-ngene/user-service/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/ebuka-ngene/user-service/src/main/resources/application.yml b/ebuka-ngene/user-service/src/main/resources/application.yml new file mode 100644 index 0000000..1ce3c48 --- /dev/null +++ b/ebuka-ngene/user-service/src/main/resources/application.yml @@ -0,0 +1,15 @@ +server: + port: 8000 + +spring: + application: + name: USER-SERVICE + +eureka: + client: + register-with-eureka: true + fetch-registry: true + service-url: + default-zone: http://localhost:8761/eureka/ + instance: + hostname: localhost \ No newline at end of file diff --git a/ebuka-ngene/user-service/src/test/java/com/exquis/app/user/UserServiceApplicationTests.java b/ebuka-ngene/user-service/src/test/java/com/exquis/app/user/UserServiceApplicationTests.java new file mode 100644 index 0000000..d4e0f6d --- /dev/null +++ b/ebuka-ngene/user-service/src/test/java/com/exquis/app/user/UserServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.exquis.app.user; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class UserServiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/ebuka-ngene/user-service/target/classes/application.properties b/ebuka-ngene/user-service/target/classes/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ebuka-ngene/user-service/target/classes/application.properties @@ -0,0 +1 @@ + diff --git a/ebuka-ngene/user-service/target/classes/application.yml b/ebuka-ngene/user-service/target/classes/application.yml new file mode 100644 index 0000000..1ce3c48 --- /dev/null +++ b/ebuka-ngene/user-service/target/classes/application.yml @@ -0,0 +1,15 @@ +server: + port: 8000 + +spring: + application: + name: USER-SERVICE + +eureka: + client: + register-with-eureka: true + fetch-registry: true + service-url: + default-zone: http://localhost:8761/eureka/ + instance: + hostname: localhost \ No newline at end of file diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/UserServiceApplication.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/UserServiceApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..012c0ba88768869d3414b6fb8dfca3742cbf6c25 GIT binary patch literal 1003 zcmb7C+iuf95S`7D3o&NB@LIA5aK1MQX7dUb5T=*5Kn7&nr^Xo&3fJTv*4)+ zBtC$TLd-e|F_Is^l6Q7zXU?8EGe3WQ`vCw?;l2+oxbDG*4>#bZ2e*7^xbtlWt>;on zyTzd1-<&XLjPyP-SP7)US9ubm*%M(*o?f6M5l@7X?mTxk?4isUJPab8a6J8#%Z!UO z<#~pNzoli2=2%9!ou;vjgq2zi>5W84#bB-fAvhApg2zHl`Pdq%ro)1RFjGRkRB_E< z^(ERvz5hlSk)TCGfn9@{-NPh}g(arEzZqyVSvIWbaCPq%dXMIsxEU-xL2lQMAr)7nNq1iznA3;W4xKnz zMz%RP1NMbBHSlR|70wQvqkVT4K=wSHI&cA2D9R;2BkPjez1rX_)ZZ=heY$a(9_1`C z+OP^2$={>DN$QcIX@<*lxF-v^@6dRE2F=fOU#8Rh3u;E^3dK0GYenqUV!Z|n?>fM5 Dl}83i literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/controller/RegistrationController.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/controller/RegistrationController.class new file mode 100644 index 0000000000000000000000000000000000000000..e123e0e472653428a432df68f2ed01125ef7e72b GIT binary patch literal 512 zcmbVJO-lnY5Pj*VuGQ9h5>MXLgSjXQiXa6~i-jt^XSZ>kx=m`5wf-$nf(L(qKT4ck zq)G ztx9r6`ms$_K30y(`WtM7d-4J&acXB$KR*`arJB!W;kA>gHNn|D=X9hq^1-P<)(n>L znLu=73zzCEDkXM)ryWk!lM>h-6(-P3kI55HaA}MURYM-&IJPd6e(uO*cTUap!ny~! z(1}dQOr%08y(*CLk!hY1^@MmWNK*qyzz_nv$2xo75|fB*U$z#LYK7{*s4DB$Z79%IhE z=8JfOZ`{|@0=_NanLsH^b+V9~H9+j8@{B3U^du zoZa3Ww0nl>WzW8RKXDkcMc0vU#hc8UcbzkGbZWZtRvjprSrf{NNiBblY?(%+Y?d(X z{5glkp2;-1u}419!V)p&dNOjTtFmgMdN&zAXuHN)kU3Y^feJIG6_U(k`*me$yqvl) z<@ALfq}KH;FxiJ|c}?5BxW1v>EUjm%|AscQu7+-(Rm~~l8TrijP1dG!u^rhfbPotnUP?Nt~wZiD{UK_`OeMFAZ*z z(@xs|8R{o;BH;iZ;ZlGR6bo1gu!yk$-{D39O97taMSx|j2t4R@4}I{wl6`+h{b1Lt zZ*|SGxn2-t@4~B$2aB><4nu(;RR?-K*>0b+OP!m*jhM69P2y%tNdk9z%Ijyl0%<8#$fIo{B;jM-g0ZhGXS6Ab3)x@a9+@GTktL4>dH0A zy@G4tHa`Tuz@2vDP2vr3uRQxF@@p>p{bLMuXD|AUlgKmHQFN>2e_BBqckv}L^GtjX wQ}k}va+l60wRHNP=E%sit7V4IM2cC4+~-~n54`_46Fj6X`8;wip08{F0acz4e*gdg literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/dto/RegisterUserRequestDto.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/dto/RegisterUserRequestDto.class new file mode 100644 index 0000000000000000000000000000000000000000..9a9176dc01cc7d77ee20cb5b0f99b308dded9b6a GIT binary patch literal 4147 zcmb_eS#KLv6#mAZ@r>>964SH{Ef7j5iIddq%cLz!X=x!Tp&M;kr^yhzb?nq0vo8|7 zAtc}lgm^(n^raFYkstv=@B$K#JR$MK6Mv#C-gffo$CDCU<0dqKy`I$lv=)Sb3>#946_l;+Mk&pDO4(^#$?^IEmW z@~ndNv$a+iV07AUtKnmfRj1v4zS&w*U@kTrp0ns3SaE9g{&b<*Y%pkc+4bgnf3am^ zGVV{*{mms}3v;!Gd!(~+)@>bk&er`cH5Z-wNvBnld1zF>)s2thu> z7=1$k=o2Rd^bI5apA6Ee6#UPiaR3-5VGtM^bH~Wc^YhNCPaWPT(w>}ObQ%XFWmKz9 zyBe@BIWc*d8Cf`bc>VxWMm^PX+nu_{OAyIKW;}A{^mzYx>GA$aa^r&=?#;t}8D2BE zVf>RlwMNa`r=S_bpN)+AzbwK`o|rOotl4QTx(91=;kL)$o!!zIOk9gG6W58@DdKt& z<05Xrn1bE^?LL|~f>{&0aH9!Zv>DNMi>QdWNyN<}9>IcwZNts!{!XpFgm{WNrMB zzo*N&c!;j zybLk?&&grue5^BR5#y{5I~QV|Nv9ZRZP>XO>r5KPIH!i4M`E3C!L3ZIoZ04>ko1

c3PnzCj}MvHY)GL>FXVN8$UEXgCN~>WSl0`= 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 literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/dto/Wallet.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/dto/Wallet.class new file mode 100644 index 0000000000000000000000000000000000000000..b8f7d55e4d7db337126b4b7f365227c83c2ce0a4 GIT binary patch literal 3029 zcma)7TW?fV6#n+ixy{UJ83qcBRw!DvS4I(0r!8_RNVNr|6a;Ua&Kx>ZrZZ)F#%SWR z@yWy|6BA!0F+3>Il4xS|1rvXhh~GMwxp6QglfBno>s#xr%eVLZ{qL{812}?a8vAf1 z1q1KNa#faVvb=BNgEaRKW%)=@AB%Kd7Dtv<(UnY;(-_1R3$E-pEUd|1u~4ymc3@RzBWUvv(aePy?-V7tk&Igem<8R zenLLmC^@yuPO~cKP^o#9>XyRDVyUrFa6i4(s%{mW&CP;jQz(0l!WE}hb3G=JT64W1 zp2F_2@wf^Faw06U7t$_MAS+>|xhP6^tr-F?w##ipx(iNibut+mdo&U0LUzgZDvk05 zr|E3Cp4()N;udAs;}#|-Zi0!@+ZBfHWG9FW5uN-ZOea0T81Ai>Q{yLlK68F`-7R@D zE@EN>C=OEgw!VgN>2T>lti)OY*hk=k!}mj_`=17rPC~lve9(6S~W7X>c9oslZ)v*C*~l{p7=* z=W6&$3olT%0{~vc7*9%?&$ZY2XC!{?b56%PbC5C4$$sZdtTQJbkO z?>rFe{4x%+p;B{^dxE<$G5HG;@g3U}Ai|DGH)SLWuh36dJY;z|f>+~0CZ9BJbo;0Kor5$p=AM$m)5f@T_(vZTrcE}MwB(HH0Qhm-n!=BuoocJEPc4zWW z7~euq-kJOZ#?sWpHcbCW!8$j^rKnB+g-l+%kDa$+Pv^C5q#{JRs1uSd8hKqX#(m^& zV<4~RjV@58XcCkuT6t4IRtPflRu{-FrU3m8+=@694rz4Pdhgm1le^WMtYT9$Z zi&@OE{2_dYW4t}Wps(;IbxGc#FL9ibhPQANCn)Jyf{T-s4AgK2rzn|d5;afB!q;r& zX-X-4LpGhEl%_9m6gy1o9}Jo}`v7}PEbwQk2iO;gsmF*B8)rEbO&TlYbA-FEn zkUA5O)EV$wZ`Y}_I;k_{_c4FWe3_}@l~G?Xgvmgg*_l~w&L8G*cBaBnTG`3lFsHXM za9#B2q9%sC7FsMBaA3+5b>GC<`c76}k4$#a@J&YB#EH{uIDSZHgIvPolh|O}&oNV- zV>nMK!M5JO1s0U#E4hSsDQPV5FfLNkaTR;9Ov&(@{{yUtRA_9zQfxSsdPv94IU$N6 z=n){oXuYZsW^}6b-ouVub{ji6f(*A@ pE|7UAcI9>lvMusZAoCjR%I%@NjlKQPXZK&m@vz4VD?W`b{|AsN7RUeq literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/entity/RecordStatus.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/entity/RecordStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..9e4b8d633e72f88d9d3ac661cdbcaef5bb804fc8 GIT binary patch literal 5762 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 U?*AaVScH#|KTm)8y8qt)0KY<=2LJ#7 literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/entity/Role.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/entity/Role.class new file mode 100644 index 0000000000000000000000000000000000000000..cd490585479316a808fc2a92ad2f38af54482bcf GIT binary patch literal 3752 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 UW${Zv0u=v;{a10~c(UL7AIc;KWdHyG literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/enums/Gender.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/enums/Gender.class new file mode 100644 index 0000000000000000000000000000000000000000..2ef478b4341affa7a2fc009ecfb5f99493832584 GIT binary patch literal 1655 zcma)6U31e`5IxtHELoNvBZ5m(C}{{_n}SLk=tt5tG;uy!I|dAyN&BSOmqZ{-t}HX< zt$(Bcf`%44?X<&FANr#@-IX+8if4#tq@tKCR z8a_8LjU|39^UW6qR`8`kyHy<(9XEOV72mAsIIUxyw+$ULIyQK_sbNdQwt#2}%s0D1 z-N@W$}m4 zKy^aE?Fl*T3MkQ`ORmNO%e;_K7ZW20d#>+z0{M=6;5*SMq_C$ZP}hj3bReVk@or34 zYi~vr(C>#qe*omC(!uIMc!&D4A^Y*sX|~jMbSOg;Gi;PzjV@OzaBfoUu`jgd)@Ve0L{Rgre zQIXfj8@1*+!{O4Hoay&5-Xe}mewA^*6t>OXD8EWEIi?YJhmHOqdMrQ<`*!sjebCdO z8G*Vw!zBZ>QnB$$b<#hG#XSf?EJ+lP*fSwGlP##xd z(|e9=UO9WU{tLAKCw?N1kR-0A5%T!(W$8PqvsM2aM*SJ|pQxrMq(YvVvatk7&Zj8f z3S~Vr#%QHdTqCT4OhLR9g${Ilgpbo4A3~)QVDk?sdzO*43eRCaMKLx@iZvCR<=8x- zT2^eH%>7B|>=BBcJ>>}H&YpUNlbxp!tY^|rE7m%PDQGkRI!U9FK#5F?xK6kXZu|$h CBU^R= literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/enums/RoleType.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/enums/RoleType.class new file mode 100644 index 0000000000000000000000000000000000000000..882410147e1c0a944b95740bb00cd1bb6bc46543 GIT binary patch literal 1165 zcma)5?@!ZE6g_Y4)~%E=CyGoIg&`XV6&;Dm2!Ze;AsNFkm?3_8+n%GOYq4vIeDhCI zNW^F~eD;qr-q)dyIOCf1-QM@kJ@?%EZomKd{0%?>iwUU6>BwV7Lt4YE4g-(nG8acu zr^7jkn2#eRt*POOh6RS`>iYIpnIT)MyDd|^eG^!1lOG?OL0fpHaDrCb+;wfScX}*} z4C;PmW0yh8R#!{=8x@ABSN#RXPPiS2Hp6r--)D%r<~9VwP|0#cIcU{{x5sNX?Pwv_ z&TEF}xzZ6o;ik=lw z_`;)FVoR1|`O6Hqd+6B8SE*nAp+!JFD?6F(un%?|*K1e~w;2)@tLbn*@F=sAlTq=d zx_!m`vP;SaaV+&y-Ey%fD)24a@=wim-=(Y6D{kP`#ik`&I{533=Vd<)+>kSrHt-bB z7$*Kd8U{vCFmMm|4J0vSAcY}@)eow&lyv3CT8hHa$CX|&?DG(q_8i7pqCLZ(Cn4^qHGdMCn=NyL%GB&C!km8nGe%zuG; zkk*t7#Ltlk9bFBbf#_E{QqE{357aXZRL;R<@=n>wP*aSWsFD0AN$O;o!Xv^&F#Qvn CA_$oP literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/enums/StatusType.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/enums/StatusType.class new file mode 100644 index 0000000000000000000000000000000000000000..30556a137a296940f027b3ed05ac97a0e7d4aeb7 GIT binary patch literal 1167 zcma)5ZBNrs6n^g7wOi@fsEC62h66TGDhg^GArPnu$pn&)CB#pcQK6)3u`fiw`IB@c zVl)~)`=gBKc0^{>WH-6@+|&Eq=RD`!(;q*-dVFIV+Lh)t+COx7^dp2plv#D-z08i^5bJOiJZ`M{G=V3cFf}> zYP>skY7BXM$KJL!*R6F1b=|64jdWLTuGV)fn_>D@zf8&r_Yx;!s8*_dUy|2?eTSh~ zcYS9wY415mm_%PVt<{@EXC!~CoCD(W3WrmS|DA}ks8RYoTC7@Oo1ul2l3tcA&_g$ZR zqR{SvPlXRDvQ!bba!W1mg85mG6pJ{P`pa*b9#FG`By2e^Tv4^+<=f7QqUpFIdT3au z##&@3_tO+QM)5?)ZQRjOL`lbxSPYaH1}`5%sAR~tyuhcp!aB7mGn#^{3yndN%0G0#SP7nXFel)4q4zcf8cM>7rl$ZIBt@6i)NN#{Jnru zl^~^L^JFDDQfFqz&!Bvy?f;lm+!a}*O!*8ZXn&7pIlVH89HuZyAw^0Kr6|VgSIE1D zDxD#BihSy5a_S7Ej-E}Og7S@UQir;2SMFfI-pzJUuus8+o^BGv~~A{`1egzCFJH*h8y?Mg;||+E}yEWUvloD0QD9-`*ZE6po^aV5oUA z6z6F$7V3(R=TvEUkpfq9>;E)2t~OsVlAW4J=Hos z!CBtdY*sueUBz&69{Q)r4&xD>ulMAkRAhb~A zp)!n8<%?r!%x?TKao1=uR2NP*2TDcCK@ko^_g`;dSpW8SnTA>h;_HFfLZ1HGtQ;7P zu_)SI}P@P++zlmC|2kK8EBzQCx;pcqxur94g{Zk{r~^~ literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/exception/HttpBadRequestException.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/exception/HttpBadRequestException.class new file mode 100644 index 0000000000000000000000000000000000000000..d26d5ea321147acc51dc9561450e0e50cb613dcd GIT binary patch literal 548 zcmbV|y-ve06orrbleB4|rO*zD0k#4XS*RF_I)Fe71)&yocN42MYJTcCh}U95V&DOI zD8zMIU;q{}T>IR7KKIyf?=P7ay78(TJ74A!ZPr0z2mJNsjX(s>*RhWbE8 z;wB3xLf!GnoI1@x?DP4UD{1tqS<*9^GMo(jIP}EhB9p1dlf=tXp-B58(K3#_E3K0= z9t_1I6RE!V?DrU2oxweS;NF}^Q*We|jHW#k!wyB7@@YQz2f)y{7J3#3w_Nd1XrU;B zGm10ii%V(3?))+F$apc-COp_x%QP;^a2dM)x&g!Xce-H~X&H*I>tPQ?dTH|&z-Wv` z)h5-=HDDh!*)s}HIZ&bM&=2IGg(~e_IzSlpYqS~*mk49gr`535!Qn3sRU)0-p}nM5 W4#Z;(>*Q3Yvt>rY*fyvZu<-%&-h7t; literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/exception/HttpNotFoundException.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/exception/HttpNotFoundException.class new file mode 100644 index 0000000000000000000000000000000000000000..228dd974ce970eb2326bffef089c820a854a6c6e GIT binary patch literal 540 zcmbV|y-ve06orq|pR}PrP-q7x*h-Pe0G*1uAS#AXA&R=Yt!a%KJ0uR`wV03?cmN&> zah(l}I)EE-(_vuyxukwo7(K)$KH#4csc- RuVviI%C_dxYtkhLJ70SDd5Zu5 literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/repository/UserRepository.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/repository/UserRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..fe6b8c9aed4da574a3fc65a9ca9b2f4f680332dc GIT binary patch literal 800 zcmbVK+fD*85S_|p0TB_r#6Q3o?F&9(OuR?4Mgu{g3zW6E+pcX_CGpFA@B{oP<19-A z6Nm{9O*_+>b7s!W*Z0RK0Mud2fprHq9M~jK>I>OB8MY1Ak_DW=LCqbo7e;+1J=(Hb zNUyQuc2z+6+jArgWnoAo45wULVTUwMZ4fBmaQmowcT6LU<=PO)#bF6*C80T0(z32S z518-?WO#BHlg~>odt4K!*XGbgfuTtdRx~OyvcjjXFcu5QdgJ_jOL&smNMkn-3t%12 zp`UbngmmvyGTn9tylWe-(jGNoELlHR;Z^A;+GCc{LCC1)p)$fMJ*3wmYyMjQ(@pi- zZeN`>V){Z$MY_u`gpXZT;~7j4_hW4cY&RpEP{8kn5gnf&OQ|fgLP;FW?#x;Z&W$TO z3^|>kA=%!n@lW;hmmYUvvO$S7xK;~klO;f42~P?aHAx!dGh4RR=1{J)s2w4UA0XHP{TL1t6 literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/service/UserService.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/service/UserService.class new file mode 100644 index 0000000000000000000000000000000000000000..c5fa2269b93b7283a9d16ea30f8aed6dab3bb774 GIT binary patch literal 4757 zcmb_g347dD6+Id+vd3!TP8)}`rE!AWc$zwDNlHr`0$vll6DN3VhmZo5XJlLUSej@w zc1!~elqKx@zVDPZY0G4z3pSaw1`@_o^}dUN-8?tNE&{@+)g0k9AM zN}>%$GrBO@f*kTHOj)PoF`XjId=fSsVJJ4?R0~{`Qcy52J7pCMNo<1Aghg3TCsB_j zq24TyM^v0q@s=dsibs<;i?=25c07{AV|a%!zEh}o3H5HF&I$D%q28Os7Q9cW_Y3s_ zp*|>&52^UDijO3*3xd=j5h@o5Eh1!r18D&x4*dZ{qAZ&uGZ z)6=Hgtzc8RWV)kf(J5J;<1Q)CGdX8oH&34`TP58n7Ik6J-DM7ae3bxIY#S}xo;7by zSS4$+VD{Ly;~Adi*d+xI1U8GVWlvAJ#=N=cxO4iXY1k!w%E*aH-B=dTd&-`(Xt`#d zYBkp^d1K~$v0!+ng05Iii{_-BD_ExO>7x;LiZ>pxY|A^y;5*Y33hMiuJhg1jShhJ* zo}V<`F@w(fS;-lN3B$GIJ>0DKW-NN2j?D$*U$AnfpNMQgi@POb!941Y7xTWm{hhJ0 zbky>ee9`WB?NJW8E!kJFq|N87F_tkTiRyOaB|EO|Pd=V33{Z%&f6s=w;6; z=ozcz(c|WjS5AW>HE*9Fe1y#NCkfjNIH2qv(T=g{$H->^m%O1-BNA`N_P| zu{IkW_bRxbrxsVOX4Q;-*z<}bjyLF(?R?bujS;!}jEDx}ff|^NYowA!V2Q8_P zRyl@j0Q5bAA_bkX#aJThOvhU)ntI6It>FQ@Qp3x!SH)*Fd=8&iuszo0mBP^Q1q^67 zj4#r5uj6g>}1q#JQwSp#wvSRP(KNj#>v9T4P&^f;m5e3 z;c20s5$ai?o)hXPLj6>zp9%GI{6fPo@hc6##%~ndv|?oWxLMtCzO4pHuaQ5*#%9uP*j))=QPcm!B%zIq4vJwp=Xo=95c2wGwVsJ)4)~4irk} z*o^BeD!4b=I@jum4XU+vUSM7a@-W@GD$pHI`_r8raCrK z&l4MtE2|f$O~J!4DUHA1UYrH`yP1b5U4o5cVBWAe8EMi;R$e0v$7URxEuhK}zP3<< zB*o^C#VfPCOg8g}V6dc2a8*=a<)@x`_Cgl(>T>UQ${afBSSV5DT9t~B>HnOH1|LJx z82(4a^mc1)V;BrZdCrs!HTbqra7Xk!gMvt}{RC0*Ck=nb-!wcV_xbB_Qo+uZ4r|#9 z&YY=d{4t0#fDwK*u)lH2t-h)F2m4OOapuZJ1usMmhYEu6;jm%n3udV!;Ovf+XV?`Y zJF5i8IMhVhum8uuX!58V~QxpK(aDY!OV8E+z zkZ%fJjn~ka2={VLaNTs*Q%LN-jJgD8oBH$INnl0Gc3(?dz!_?x40@d|S$lyp|Lh0rwegpT;J%Q#_@-kWyh#J$X#*T3JhO5|g;vzPu zS}VBm?g~;B+*HBMsV#L+qpgCi&tc2RCA=i~Wm^Tekh-;k+qk^6g4?-lub{oFf*lp? zxdD3TjFoJ=DM8qNTjNm9Wp5gyvcrBwoizbXB%Xdbbn>&;g#7LPAp=dqe-U@ra;NF(83Q6Z?Ue1#I-4!_)jaqBK9rbQ zg^CL8Z4!P-zI>VYkJmQ>Z#Fytxr&1+}%u=)x zW74#gKEFHdwS<7i9n#c<_sXg{653RN=NbtpO^~`#B%s-94`yniWJWrY1D#SwKy{=i zv7*efl=DBp<=V+t+@tcOR*TwBS)-)ZfC_)m@-LPLs zCim*A?g7)p#3}a3u)LD_&~yE_8r5CMK%_I&t<0xcKiNOgmHt z-)uhaS3RF0H#k!9L=GQk7*I)ofCB#j0M8S!1s=ymj*2Xda{|gx;Z&7V1*mbn4fPeW RlOwyZw@Njb6tJK3%})n&t$qLi literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/utility/Dto.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/utility/Dto.class new file mode 100644 index 0000000000000000000000000000000000000000..c8f8d239be4180209dab8dacfa414c50c46699f7 GIT binary patch literal 143 zcmW-aF%H5o5Cr!E#DR)}o*!@xPe8O3d4Xe{&_xCZ$40=@D0l#mLKuqOl}01&`}2GO z*kW!_8yJIzuxLY$PWI}B(Ckv!^!92AYZp!|w@cQM?J#g2C2~&cHQl*rgym0UZ_h_Q gbiKGlSpAU(ZY8Sq`mmjsnn0*ZCgmJur==^*zD@WfumAu6 literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/classes/com/exquis/app/user/utility/Helper.class b/ebuka-ngene/user-service/target/classes/com/exquis/app/user/utility/Helper.class new file mode 100644 index 0000000000000000000000000000000000000000..5b280f6120f7e7fe5f5e164c9b8c1d397ca24722 GIT binary patch literal 299 zcmaivJx;?w5QX13{sCi1#0`ijfP!u4Kr~1Zg%t`=`n9uyi8i)b?;E_BcW$4-G}qk|dgnQ(F%tXCI(<0TD9MR4`;= RN3__^33ic-lcPi<6dQ$VLe~HQ literal 0 HcmV?d00001 diff --git a/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e3ee9ca --- /dev/null +++ b/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,21 @@ +com/exquis/app/user/utility/Helper.class +com/exquis/app/user/enums/Gender.class +com/exquis/app/user/exception/HttpBadRequestException.class +com/exquis/app/user/repository/UserRepository.class +com/exquis/app/user/entity/RecordStatus.class +com/exquis/app/user/exception/HttpBadGatewayException.class +com/exquis/app/user/dto/RegisterUserRequestDto.class +com/exquis/app/user/dto/Wallet.class +com/exquis/app/user/entity/User.class +com/exquis/app/user/controller/UserController.class +com/exquis/app/user/enums/StatusType.class +com/exquis/app/user/dto/UserWalletResponseDto$UserWalletResponseDtoBuilder.class +com/exquis/app/user/UserServiceApplication.class +com/exquis/app/user/utility/Dto.class +com/exquis/app/user/enums/RoleType.class +com/exquis/app/user/controller/RegistrationController.class +com/exquis/app/user/exception/HttpNotFoundException.class +com/exquis/app/user/entity/Role.class +com/exquis/app/user/dto/UserWalletResponseDto.class +com/exquis/app/user/service/contract/UserServiceContract.class +com/exquis/app/user/service/UserService.class diff --git a/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..e95049e --- /dev/null +++ b/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,14 @@ +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/UserServiceApplication.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/enums/RoleType.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/enums/Gender.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/entity/Role.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/exception/HttpBadRequestException.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/enums/StatusType.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/entity/User.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/service/UserService.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/repository/UserRepository.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/utility/Dto.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/entity/RecordStatus.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/controller/UserController.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/exception/HttpNotFoundException.java +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/main/java/com/exquis/app/user/service/contract/UserServiceContract.java diff --git a/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..866f39e --- /dev/null +++ b/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +com/exquis/app/user/UserServiceApplicationTests.class diff --git a/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..9f48df8 --- /dev/null +++ b/ebuka-ngene/user-service/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +/Users/chukwuebuka/Documents/personal/lightWeight/user-service/src/test/java/com/exquis/app/user/UserServiceApplicationTests.java diff --git a/ebuka-ngene/user-service/target/test-classes/com/exquis/app/user/UserServiceApplicationTests.class b/ebuka-ngene/user-service/target/test-classes/com/exquis/app/user/UserServiceApplicationTests.class new file mode 100644 index 0000000000000000000000000000000000000000..0ceffcdb2020dde83f8d6ba4465d200389260957 GIT binary patch literal 558 zcmb7>%}N6?5XUFm*41{kwR#ae^ymi|1o5H>Rq(VZ*xGwGjdkj7vSzcjujNVb-~;$j z;%wT3AP6pGCiC(C%`Ex+dj9}`6WDG-4K_pQhOot8