From 321c0e8a9bf498254d3545f1d52a8ff2d8595eb4 Mon Sep 17 00:00:00 2001 From: "trung.m.nguyen" Date: Sat, 22 Apr 2023 22:38:15 +0700 Subject: [PATCH 1/4] add project structure --- docker-compose.yml | 53 +++ mvnw | 316 ++++++++++++++++++ mvnw.cmd | 188 +++++++++++ pom.xml | 56 ++++ task-service/Dockerfile | 5 + task-service/HELP.md | 25 ++ task-service/mvnw | 316 ++++++++++++++++++ task-service/mvnw.cmd | 188 +++++++++++ task-service/pom.xml | 97 ++++++ .../com/manabie/todo/TaskApplication.java | 13 + .../src/main/resources/application.properties | 17 + .../manabie/todo/TodoApplicationTests.java | 13 + user-service/Dockerfile | 5 + user-service/HELP.md | 25 ++ user-service/mvnw | 316 ++++++++++++++++++ user-service/mvnw.cmd | 188 +++++++++++ user-service/pom.xml | 93 ++++++ .../com/manabie/todo/UserApplication.java | 13 + .../src/main/resources/application.properties | 18 + .../manabie/todo/TodoApplicationTests.java | 13 + 20 files changed, 1958 insertions(+) create mode 100644 docker-compose.yml create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 task-service/Dockerfile create mode 100644 task-service/HELP.md create mode 100755 task-service/mvnw create mode 100644 task-service/mvnw.cmd create mode 100644 task-service/pom.xml create mode 100644 task-service/src/main/java/com/manabie/todo/TaskApplication.java create mode 100644 task-service/src/main/resources/application.properties create mode 100644 task-service/src/test/java/com/manabie/todo/TodoApplicationTests.java create mode 100644 user-service/Dockerfile create mode 100644 user-service/HELP.md create mode 100755 user-service/mvnw create mode 100644 user-service/mvnw.cmd create mode 100644 user-service/pom.xml create mode 100644 user-service/src/main/java/com/manabie/todo/UserApplication.java create mode 100644 user-service/src/main/resources/application.properties create mode 100644 user-service/src/test/java/com/manabie/todo/TodoApplicationTests.java diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..317cc09f4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,53 @@ +version: "3.7" +services: + redis: + image: redis:latest + restart: always + ports: + - '6379:6379' + + ##PostgresDB for user-service + postgres-user: + container_name: postgres-user + image: postgres:latest + environment: + POSTGRES_DB: user + POSTGRES_USER: manabie + POSTGRES_PASSWORD: manabie@123 + PGDATA: /data/postgres + volumes: + - ./docker/postgres/user:/data/postgres + expose: + - "5431" + ports: + - "5431:5431" + command: -p 5431 + restart: always + + ##PostgresDB for task-service + postgres-task: + container_name: postgres-task + image: postgres:latest + environment: + POSTGRES_DB: task + POSTGRES_USER: manabie + POSTGRES_PASSWORD: manabie@123 + PGDATA: /data/postgres + volumes: + - ./docker/postgres/task:/data/postgres + expose: + - "5431" + ports: + - "5432:5431" + restart: always + + postgres-admin: + image: dpage/pgadmin4:latest + environment: + PGADMIN_DEFAULT_EMAIL: admin@gmail.com + PGADMIN_DEFAULT_PASSWORD: admin + ports: + - '5433:80' + +networks: + common: \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100755 index 000000000..8a8fb2282 --- /dev/null +++ b/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + 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="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 000000000..1d8ab018e --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,188 @@ +@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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..a1c26a628 --- /dev/null +++ b/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.0.6 + + + com.manabie.challenge + todo + 0.0.1-SNAPSHOT + todo + manabie challenge + pom + + + 17 + 2022.0.1 + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + user-service + task-service + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + diff --git a/task-service/Dockerfile b/task-service/Dockerfile new file mode 100644 index 000000000..fea31b964 --- /dev/null +++ b/task-service/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:17-slim-buster + +COPY target/*.jar app.jar + +ENTRYPOINT ["java","-jar","/app.jar"] diff --git a/task-service/HELP.md b/task-service/HELP.md new file mode 100644 index 000000000..42dc22d80 --- /dev/null +++ b/task-service/HELP.md @@ -0,0 +1,25 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.5/maven-plugin/reference/html/) +* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.0.5/maven-plugin/reference/html/#build-image) +* [Spring Web](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#web) +* [Spring Data JPA](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#data.sql.jpa-and-spring-data) +* [Liquibase Migration](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#howto.data-initialization.migration-tool.liquibase) +* [Spring Data Redis (Access+Driver)](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#data.nosql.redis) +* [Spring for Apache Kafka](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#messaging.kafka) +* [Validation](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#io.validation) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) +* [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/) +* [Messaging with Redis](https://spring.io/guides/gs/messaging-redis/) +* [Validation](https://spring.io/guides/gs/validating-form-input/) + diff --git a/task-service/mvnw b/task-service/mvnw new file mode 100755 index 000000000..8a8fb2282 --- /dev/null +++ b/task-service/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + 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="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/task-service/mvnw.cmd b/task-service/mvnw.cmd new file mode 100644 index 000000000..1d8ab018e --- /dev/null +++ b/task-service/mvnw.cmd @@ -0,0 +1,188 @@ +@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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/task-service/pom.xml b/task-service/pom.xml new file mode 100644 index 000000000..ed7853d31 --- /dev/null +++ b/task-service/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + com.manabie.challenge + todo + 0.0.1-SNAPSHOT + + com.manabie.challenge + task-service + 0.0.1-SNAPSHOT + task-service + task service + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.integration + spring-integration-redis + + + org.springframework.data + spring-data-redis + + + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.kafka + spring-kafka + + + + org.postgresql + postgresql + runtime + + + org.projectlombok + lombok + true + + + org.modelmapper + modelmapper + 3.1.1 + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/task-service/src/main/java/com/manabie/todo/TaskApplication.java b/task-service/src/main/java/com/manabie/todo/TaskApplication.java new file mode 100644 index 000000000..0ee4fbca8 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/TaskApplication.java @@ -0,0 +1,13 @@ +package com.manabie.todo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TaskApplication { + + public static void main(String[] args) { + SpringApplication.run(TaskApplication.class, args); + } + +} diff --git a/task-service/src/main/resources/application.properties b/task-service/src/main/resources/application.properties new file mode 100644 index 000000000..c9493c485 --- /dev/null +++ b/task-service/src/main/resources/application.properties @@ -0,0 +1,17 @@ +spring.application.name=task-service +server.port=8082 + +spring.data.redis.host=localhost +spring.data.redis.port=6379 + +spring.datasource.hikari.connectionTimeout=20000 +spring.datasource.hikari.maximumPoolSize=5 + +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5432/task +spring.datasource.username=manabie +spring.datasource.password=manabie@123 + +spring.jpa.hibernate.ddl-auto=update +spring.jpa.generate-ddl=true +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file diff --git a/task-service/src/test/java/com/manabie/todo/TodoApplicationTests.java b/task-service/src/test/java/com/manabie/todo/TodoApplicationTests.java new file mode 100644 index 000000000..5afdce587 --- /dev/null +++ b/task-service/src/test/java/com/manabie/todo/TodoApplicationTests.java @@ -0,0 +1,13 @@ +package com.manabie.todo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class TodoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/user-service/Dockerfile b/user-service/Dockerfile new file mode 100644 index 000000000..fea31b964 --- /dev/null +++ b/user-service/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:17-slim-buster + +COPY target/*.jar app.jar + +ENTRYPOINT ["java","-jar","/app.jar"] diff --git a/user-service/HELP.md b/user-service/HELP.md new file mode 100644 index 000000000..42dc22d80 --- /dev/null +++ b/user-service/HELP.md @@ -0,0 +1,25 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.5/maven-plugin/reference/html/) +* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.0.5/maven-plugin/reference/html/#build-image) +* [Spring Web](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#web) +* [Spring Data JPA](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#data.sql.jpa-and-spring-data) +* [Liquibase Migration](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#howto.data-initialization.migration-tool.liquibase) +* [Spring Data Redis (Access+Driver)](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#data.nosql.redis) +* [Spring for Apache Kafka](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#messaging.kafka) +* [Validation](https://docs.spring.io/spring-boot/docs/3.0.5/reference/htmlsingle/#io.validation) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) +* [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/) +* [Messaging with Redis](https://spring.io/guides/gs/messaging-redis/) +* [Validation](https://spring.io/guides/gs/validating-form-input/) + diff --git a/user-service/mvnw b/user-service/mvnw new file mode 100755 index 000000000..8a8fb2282 --- /dev/null +++ b/user-service/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + 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="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/user-service/mvnw.cmd b/user-service/mvnw.cmd new file mode 100644 index 000000000..1d8ab018e --- /dev/null +++ b/user-service/mvnw.cmd @@ -0,0 +1,188 @@ +@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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/user-service/pom.xml b/user-service/pom.xml new file mode 100644 index 000000000..b5f7021f2 --- /dev/null +++ b/user-service/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + + com.manabie.challenge + todo + 0.0.1-SNAPSHOT + + com.manabie.challenge + user-service + 0.0.1-SNAPSHOT + user-service + user service + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.integration + spring-integration-redis + + + org.springframework.data + spring-data-redis + + + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.kafka + spring-kafka + + + + org.postgresql + postgresql + runtime + + + org.projectlombok + lombok + true + + + org.modelmapper + modelmapper + 3.1.1 + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/user-service/src/main/java/com/manabie/todo/UserApplication.java b/user-service/src/main/java/com/manabie/todo/UserApplication.java new file mode 100644 index 000000000..570d88b23 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/UserApplication.java @@ -0,0 +1,13 @@ +package com.manabie.todo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class UserApplication { + + public static void main(String[] args) { + SpringApplication.run(UserApplication.class, args); + } + +} diff --git a/user-service/src/main/resources/application.properties b/user-service/src/main/resources/application.properties new file mode 100644 index 000000000..5e3c9e4d5 --- /dev/null +++ b/user-service/src/main/resources/application.properties @@ -0,0 +1,18 @@ +spring.application.name=user-service +server.port=8081 + +spring.data.redis.host=localhost +spring.data.redis.port=6379 + +spring.datasource.hikari.connectionTimeout=20000 +spring.datasource.hikari.maximumPoolSize=5 + +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5432/user +spring.datasource.username=postgres +spring.datasource.password=postgres + +spring.jpa.hibernate.ddl-auto=update +spring.jpa.generate-ddl=true +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.show-sql=true \ No newline at end of file diff --git a/user-service/src/test/java/com/manabie/todo/TodoApplicationTests.java b/user-service/src/test/java/com/manabie/todo/TodoApplicationTests.java new file mode 100644 index 000000000..5afdce587 --- /dev/null +++ b/user-service/src/test/java/com/manabie/todo/TodoApplicationTests.java @@ -0,0 +1,13 @@ +package com.manabie.todo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class TodoApplicationTests { + + @Test + void contextLoads() { + } + +} From 1649d91d5dbec4d5d7928199fa4a495f48318879 Mon Sep 17 00:00:00 2001 From: "trung.m.nguyen" Date: Sat, 22 Apr 2023 22:47:31 +0700 Subject: [PATCH 2/4] + update docker-compose: - add nginx container - add user service container - add task service container +update readme - add system architecture - add service structure --- README.md | 72 +++++++++++++++++++++++++--------------------- docker-compose.yml | 25 ++++++++++++++++ 2 files changed, 65 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 6398b5c09..d9ca8b7eb 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,40 @@ -### Requirements - -- Implement one single API which accepts a todo task and records it - - There is a maximum **limit of N tasks per user** that can be added **per day**. - - Different users can have **different** maximum daily limit. -- Write integration (functional) tests -- Write unit tests -- Choose a suitable architecture to make your code simple, organizable, and maintainable -- Using Docker to run locally - - Using Docker for database (if used) is mandatory. -- Write a concise README - - How to run your code locally? - - A sample “curl” command to call your API - - How to run your unit tests locally? - - What do you love about your solution? - - What else do you want us to know about however you do not have enough time to complete? - -### Notes - -- We're using Golang at Manabie. **However**, we encourage you to use the programming language that you are most comfortable with because we want you to **shine** with all your skills and knowledge. - -### How to submit your solution? - -- Fork this repo and show us your development progress via a PR - -### Interesting facts about Manabie - -- Monthly there are about 2 million lines of code changes (inserted/updated/deleted) committed into our GitHub repositories. To avoid **regression bugs**, we write different kinds of **automated tests** (unit/integration (functionality)/end2end) as parts of the definition of done of our assigned tasks. -- We nurture the cultural values: **knowledge sharing** and **good communication**, therefore good written documents and readable, organizable, and maintainable code are in our blood when we build any features to grow our products. -- We have **collaborative** culture at Manabie. Feel free to ask trieu@manabie.com any questions. We are very happy to answer all of them. - -Thank you for spending time to read and attempt our take-home assessment. We are looking forward to your submission. +# Architecture +![togo_user_domain_sequence_diagram](./docs/images/todo_context_diagram.png) +The project's design is based on microservice architecture and communicate via Restful + +The system have 6 component: +- Reverse proxy & Load balancer (`Nginx`) +- User Service: manage user account and all setting +- Task Service: + + task counter: `rate limiter` is based on `leaky bucket algorithm` with no `weight` + + manage task by user +- User Database: is a `Postgres` instance for User Service +- Task Database: is a `Postgres` instance for Task Service +- Distributed Lock: is a `Redis` instance for caching & concurrent lock in distributed system + +# Source structures +```sh +└── com + └── manabie + └──todo + ├── config : infrastructure config + ├── constant : All constants values that can be used in the services + ├── controller : It is the public face of the application layer. It routes incoming requests and returns responses. + ├── entity : Object was mapped with database + ├── exception: Common exception + ├── model: Object was mapped with request/response and business model + ├── repository: interact with infrastructure to get resources for service layer + ├── service: The domain layer is responsible for encapsulating complex business logic, or simple business logic that is reused by multiple Controller +``` +# Software usage +- Spring Boot +- Spring Reactive Webflux +>Spring Framework uses Project Reactor as the base implementation of its reactive support, and also comes with a new web framework, Spring WebFlux, which supports the development of reactive, that is, non-blocking, HTTP clients and services. +- Docker +>Deploying Our Microservices Using Docker + +# Running the microservices +1. Run `mvn clean package` to build the applications. +2. Run `docker-compose up -d` to create the docker image locally and start the applications. +# How to use +# Todo \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 317cc09f4..5dfeda7b6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,5 +49,30 @@ services: ports: - '5433:80' + load-balancer: + platform: linux/arm64/v8 + build: ./docker/nginx + container_name: load-balancer + image: manabie-challenge/load-balancer:latest + ports: + - '8080:8080' + + ## User-Service Docker Compose Config + user-service: + platform: linux/arm64/v8 + build: ./user-service + container_name: user-service + image: manabie-challenge/user-service:latest + environment: + - SPRING_PROFILES_ACTIVE=docker + + ## User-Service Docker Compose Config + task-service: + platform: linux/arm64/v8 + build: ./task-service + container_name: task-service + image: manabie-challenge/task-service:latest + environment: + - SPRING_PROFILES_ACTIVE=docker networks: common: \ No newline at end of file From bb9d84ff26d5ea7ad52f8e777b2b553c769d8fea Mon Sep 17 00:00:00 2001 From: "trung.m.nguyen" Date: Sat, 22 Apr 2023 23:43:47 +0700 Subject: [PATCH 3/4] add first version --- .../com/manabie/todo/config/BeanConfig.java | 15 ++++ .../com/manabie/todo/config/RedisConfig.java | 15 ++++ .../manabie/todo/config/WebClientConfig.java | 14 +++ .../com/manabie/todo/constant/CacheKey.java | 8 ++ .../com/manabie/todo/constant/TaskStatus.java | 7 ++ .../todo/controller/TaskController.java | 37 ++++++++ .../todo/entity/TaskCounterEntity.java | 23 +++++ .../com/manabie/todo/entity/TaskEntity.java | 27 ++++++ .../todo/exception/ManabieException.java | 15 ++++ .../exception/ManabieExceptionHandler.java | 24 +++++ .../com/manabie/todo/model/BaseResponse.java | 52 +++++++++++ .../manabie/todo/model/CreateTaskRequest.java | 17 ++++ .../com/manabie/todo/model/TaskModel.java | 21 +++++ .../java/com/manabie/todo/model/UserInfo.java | 18 ++++ .../repository/TaskCounterRepository.java | 10 +++ .../todo/repository/TaskRepository.java | 12 +++ .../todo/service/TaskLimitService.java | 5 ++ .../com/manabie/todo/service/TaskService.java | 20 +++++ .../service/impl/TaskLimitServiceImpl.java | 32 +++++++ .../todo/service/impl/TaskServiceImpl.java | 87 +++++++++++++++++++ .../resources/application-docker.properties | 17 ++++ .../manabie/todo/TodoApplicationTests.java | 13 --- .../todo/controller/TaskServiceTest.java | 67 ++++++++++++++ .../com/manabie/todo/config/BeanConfig.java | 15 ++++ .../com/manabie/todo/config/RedisConfig.java | 15 ++++ .../manabie/todo/config/WebClientConfig.java | 14 +++ .../com/manabie/todo/constant/CacheKey.java | 8 ++ .../com/manabie/todo/constant/TaskStatus.java | 7 ++ .../todo/controller/UserController.java | 32 +++++++ .../com/manabie/todo/entity/UserEntity.java | 24 +++++ .../manabie/todo/exception/BaseResponse.java | 44 ++++++++++ .../todo/exception/ManabieException.java | 15 ++++ .../exception/ManabieExceptionHandler.java | 24 +++++ .../com/manabie/todo/model/BaseResponse.java | 52 +++++++++++ .../manabie/todo/model/CreateUserRequest.java | 18 ++++ .../java/com/manabie/todo/model/UserInfo.java | 18 ++++ .../todo/repository/UserRepository.java | 9 ++ .../com/manabie/todo/service/UserService.java | 12 +++ .../todo/service/impl/UserServiceImpl.java | 37 ++++++++ .../resources/application-docker.properties | 18 ++++ .../manabie/todo/TodoApplicationTests.java | 13 --- 41 files changed, 905 insertions(+), 26 deletions(-) create mode 100644 task-service/src/main/java/com/manabie/todo/config/BeanConfig.java create mode 100644 task-service/src/main/java/com/manabie/todo/config/RedisConfig.java create mode 100644 task-service/src/main/java/com/manabie/todo/config/WebClientConfig.java create mode 100644 task-service/src/main/java/com/manabie/todo/constant/CacheKey.java create mode 100644 task-service/src/main/java/com/manabie/todo/constant/TaskStatus.java create mode 100644 task-service/src/main/java/com/manabie/todo/controller/TaskController.java create mode 100644 task-service/src/main/java/com/manabie/todo/entity/TaskCounterEntity.java create mode 100644 task-service/src/main/java/com/manabie/todo/entity/TaskEntity.java create mode 100644 task-service/src/main/java/com/manabie/todo/exception/ManabieException.java create mode 100644 task-service/src/main/java/com/manabie/todo/exception/ManabieExceptionHandler.java create mode 100644 task-service/src/main/java/com/manabie/todo/model/BaseResponse.java create mode 100644 task-service/src/main/java/com/manabie/todo/model/CreateTaskRequest.java create mode 100644 task-service/src/main/java/com/manabie/todo/model/TaskModel.java create mode 100644 task-service/src/main/java/com/manabie/todo/model/UserInfo.java create mode 100644 task-service/src/main/java/com/manabie/todo/repository/TaskCounterRepository.java create mode 100644 task-service/src/main/java/com/manabie/todo/repository/TaskRepository.java create mode 100644 task-service/src/main/java/com/manabie/todo/service/TaskLimitService.java create mode 100644 task-service/src/main/java/com/manabie/todo/service/TaskService.java create mode 100644 task-service/src/main/java/com/manabie/todo/service/impl/TaskLimitServiceImpl.java create mode 100644 task-service/src/main/java/com/manabie/todo/service/impl/TaskServiceImpl.java create mode 100644 task-service/src/main/resources/application-docker.properties delete mode 100644 task-service/src/test/java/com/manabie/todo/TodoApplicationTests.java create mode 100644 task-service/src/test/java/com/manabie/todo/controller/TaskServiceTest.java create mode 100644 user-service/src/main/java/com/manabie/todo/config/BeanConfig.java create mode 100644 user-service/src/main/java/com/manabie/todo/config/RedisConfig.java create mode 100644 user-service/src/main/java/com/manabie/todo/config/WebClientConfig.java create mode 100644 user-service/src/main/java/com/manabie/todo/constant/CacheKey.java create mode 100644 user-service/src/main/java/com/manabie/todo/constant/TaskStatus.java create mode 100644 user-service/src/main/java/com/manabie/todo/controller/UserController.java create mode 100644 user-service/src/main/java/com/manabie/todo/entity/UserEntity.java create mode 100644 user-service/src/main/java/com/manabie/todo/exception/BaseResponse.java create mode 100644 user-service/src/main/java/com/manabie/todo/exception/ManabieException.java create mode 100644 user-service/src/main/java/com/manabie/todo/exception/ManabieExceptionHandler.java create mode 100644 user-service/src/main/java/com/manabie/todo/model/BaseResponse.java create mode 100644 user-service/src/main/java/com/manabie/todo/model/CreateUserRequest.java create mode 100644 user-service/src/main/java/com/manabie/todo/model/UserInfo.java create mode 100644 user-service/src/main/java/com/manabie/todo/repository/UserRepository.java create mode 100644 user-service/src/main/java/com/manabie/todo/service/UserService.java create mode 100644 user-service/src/main/java/com/manabie/todo/service/impl/UserServiceImpl.java create mode 100644 user-service/src/main/resources/application-docker.properties delete mode 100644 user-service/src/test/java/com/manabie/todo/TodoApplicationTests.java diff --git a/task-service/src/main/java/com/manabie/todo/config/BeanConfig.java b/task-service/src/main/java/com/manabie/todo/config/BeanConfig.java new file mode 100644 index 000000000..fe680feff --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/config/BeanConfig.java @@ -0,0 +1,15 @@ +package com.manabie.todo.config; + +import org.modelmapper.ModelMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class BeanConfig { + @Bean + ModelMapper modelMapper() { + ModelMapper modelMapper = new ModelMapper(); + modelMapper.getConfiguration().setSkipNullEnabled(true); + return modelMapper; + } +} diff --git a/task-service/src/main/java/com/manabie/todo/config/RedisConfig.java b/task-service/src/main/java/com/manabie/todo/config/RedisConfig.java new file mode 100644 index 000000000..a1b727ece --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/config/RedisConfig.java @@ -0,0 +1,15 @@ +package com.manabie.todo.config; + +import com.manabie.todo.constant.CacheKey; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.integration.redis.util.RedisLockRegistry; + +@Configuration +public class RedisConfig { + @Bean(destroyMethod = "destroy") + public RedisLockRegistry userLockRegistry(RedisConnectionFactory redisConnectionFactory) { + return new RedisLockRegistry(redisConnectionFactory, CacheKey.USER_LOCK); + } +} diff --git a/task-service/src/main/java/com/manabie/todo/config/WebClientConfig.java b/task-service/src/main/java/com/manabie/todo/config/WebClientConfig.java new file mode 100644 index 000000000..e3fa5cf65 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/config/WebClientConfig.java @@ -0,0 +1,14 @@ +package com.manabie.todo.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.WebClient; + +@Configuration +public class WebClientConfig { + + @Bean + public WebClient.Builder webClientBuilder() { + return WebClient.builder(); + } +} diff --git a/task-service/src/main/java/com/manabie/todo/constant/CacheKey.java b/task-service/src/main/java/com/manabie/todo/constant/CacheKey.java new file mode 100644 index 000000000..b027fd845 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/constant/CacheKey.java @@ -0,0 +1,8 @@ +package com.manabie.todo.constant; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class CacheKey { + public final String USER_LOCK = "lock:user"; +} diff --git a/task-service/src/main/java/com/manabie/todo/constant/TaskStatus.java b/task-service/src/main/java/com/manabie/todo/constant/TaskStatus.java new file mode 100644 index 000000000..b29b27a6a --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/constant/TaskStatus.java @@ -0,0 +1,7 @@ +package com.manabie.todo.constant; + +public enum TaskStatus { + NEW, + PROCESSING, + COMPLETED +} diff --git a/task-service/src/main/java/com/manabie/todo/controller/TaskController.java b/task-service/src/main/java/com/manabie/todo/controller/TaskController.java new file mode 100644 index 000000000..5aefa35a3 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/controller/TaskController.java @@ -0,0 +1,37 @@ +package com.manabie.todo.controller; + +import com.manabie.todo.model.BaseResponse; +import com.manabie.todo.model.CreateTaskRequest; +import com.manabie.todo.model.TaskModel; +import com.manabie.todo.service.TaskService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/task") +@RequiredArgsConstructor +public class TaskController { + final TaskService taskService; + + @PostMapping() + BaseResponse createTask(@RequestBody CreateTaskRequest request) { + return BaseResponse.ofSucceeded(taskService.createTask(request)); + } + + @GetMapping + BaseResponse> findAllTask() { + return BaseResponse.ofSucceeded(taskService.findAllTask()); + } + + @GetMapping("/owner/{userId}") + BaseResponse> findAllTaskByOwner(@PathVariable Long userId) { + return BaseResponse.ofSucceeded(taskService.findAllByOwner(userId)); + } + + @GetMapping("/{id}") + TaskModel getTaskById(@PathVariable Long id) { + return BaseResponse.ofSucceeded(taskService.getTaskById(id)).getData(); + } +} \ No newline at end of file diff --git a/task-service/src/main/java/com/manabie/todo/entity/TaskCounterEntity.java b/task-service/src/main/java/com/manabie/todo/entity/TaskCounterEntity.java new file mode 100644 index 000000000..df40238e4 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/entity/TaskCounterEntity.java @@ -0,0 +1,23 @@ +package com.manabie.todo.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "task_counter") +@Getter +@Setter +public class TaskCounterEntity { + @Id + private Long userId; + private Long counter; + private LocalDateTime createdAt; + private String createdBy; + private LocalDateTime updatedAt; + private String updatedBy; +} \ No newline at end of file diff --git a/task-service/src/main/java/com/manabie/todo/entity/TaskEntity.java b/task-service/src/main/java/com/manabie/todo/entity/TaskEntity.java new file mode 100644 index 000000000..ec8d0d53f --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/entity/TaskEntity.java @@ -0,0 +1,27 @@ +package com.manabie.todo.entity; + +import com.manabie.todo.constant.TaskStatus; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "task") +@Getter +@Setter +public class TaskEntity { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "task_id_seq") + @SequenceGenerator(name = "task_id_seq", sequenceName = "task_id_seq", allocationSize = 1) + private Long id; + private String title; + private String description; + private Long owner; + private TaskStatus status; + private LocalDateTime createdAt; + private String createdBy; + private LocalDateTime updatedAt; + private String updatedBy; +} diff --git a/task-service/src/main/java/com/manabie/todo/exception/ManabieException.java b/task-service/src/main/java/com/manabie/todo/exception/ManabieException.java new file mode 100644 index 000000000..3b9e477b0 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/exception/ManabieException.java @@ -0,0 +1,15 @@ +package com.manabie.todo.exception; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import org.springframework.http.HttpStatus; + +@Builder +@Data +@AllArgsConstructor +public class ManabieException extends RuntimeException { + private int code; + private String message; + private HttpStatus httpStatus; +} diff --git a/task-service/src/main/java/com/manabie/todo/exception/ManabieExceptionHandler.java b/task-service/src/main/java/com/manabie/todo/exception/ManabieExceptionHandler.java new file mode 100644 index 000000000..d1de81706 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/exception/ManabieExceptionHandler.java @@ -0,0 +1,24 @@ +package com.manabie.todo.exception; + +import com.manabie.todo.model.BaseResponse; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class ManabieExceptionHandler { + @ExceptionHandler({ManabieException.class}) + public ResponseEntity vuiException(ManabieException ex) { + BaseResponse body = BaseResponse.ofFailed(ex.getCode(), ex.getMessage()); + return ResponseEntity.status(ex.getHttpStatus()).body(body); + } + + @ExceptionHandler({Exception.class}) + @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) + public ResponseEntity exception(Exception ex) { + BaseResponse body = BaseResponse.ofFailed(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(body); + } +} diff --git a/task-service/src/main/java/com/manabie/todo/model/BaseResponse.java b/task-service/src/main/java/com/manabie/todo/model/BaseResponse.java new file mode 100644 index 000000000..d4526f4df --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/model/BaseResponse.java @@ -0,0 +1,52 @@ +package com.manabie.todo.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import org.springframework.http.HttpStatus; + +@JsonInclude(JsonInclude.Include.NON_NULL) + +@Data +public class BaseResponse { + private Status status; + private T data; + + public static BaseResponse ofSucceeded(T data) { + BaseResponse response = new BaseResponse<>(); + response.data = data; + + Status responseStatus=new Status(); + responseStatus.setCode(HttpStatus.OK.value()); + response.status=responseStatus; + return response; + } + + public static BaseResponse ofSucceeded() { + BaseResponse response = new BaseResponse<>(); + Status responseStatus=new Status(); + responseStatus.setCode(HttpStatus.OK.value()); + response.status=responseStatus; + return response; + } + + public static BaseResponse ofFailed(Integer errorCode) { + return ofFailed(errorCode, null); + } + + public static BaseResponse ofFailed(Integer errorCode, String message) { + BaseResponse response = new BaseResponse<>(); + + Status responseStatus=new Status(); + responseStatus.setCode(errorCode); + responseStatus.setMessage(message); + response.status=responseStatus; + return response; + } + + @Data + public static class Status { + private String message; + Integer code; + boolean success; + } +} diff --git a/task-service/src/main/java/com/manabie/todo/model/CreateTaskRequest.java b/task-service/src/main/java/com/manabie/todo/model/CreateTaskRequest.java new file mode 100644 index 000000000..7d9907b77 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/model/CreateTaskRequest.java @@ -0,0 +1,17 @@ +package com.manabie.todo.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CreateTaskRequest { + @NotBlank(message = "title is mandatory") + private String title; + + private String description; + + @NotBlank(message = "owner is mandatory") + private Long owner; +} diff --git a/task-service/src/main/java/com/manabie/todo/model/TaskModel.java b/task-service/src/main/java/com/manabie/todo/model/TaskModel.java new file mode 100644 index 000000000..3c6547242 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/model/TaskModel.java @@ -0,0 +1,21 @@ +package com.manabie.todo.model; + +import com.manabie.todo.constant.TaskStatus; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +public class TaskModel { + private Long id; + private String title; + private String description; + private Long owner; + private TaskStatus status; + private LocalDateTime createdAt; + private String createdBy; + private LocalDateTime updatedAt; + private String updatedBy; +} diff --git a/task-service/src/main/java/com/manabie/todo/model/UserInfo.java b/task-service/src/main/java/com/manabie/todo/model/UserInfo.java new file mode 100644 index 000000000..2b50882f2 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/model/UserInfo.java @@ -0,0 +1,18 @@ +package com.manabie.todo.model; + +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +public class UserInfo { + private Long id; + private String username; + private Integer maxTaskPerDay; + private LocalDateTime createdAt; + private String createdBy; + private LocalDateTime updatedAt; + private String updatedBy; +} diff --git a/task-service/src/main/java/com/manabie/todo/repository/TaskCounterRepository.java b/task-service/src/main/java/com/manabie/todo/repository/TaskCounterRepository.java new file mode 100644 index 000000000..77edc56fe --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/repository/TaskCounterRepository.java @@ -0,0 +1,10 @@ +package com.manabie.todo.repository; + +import com.manabie.todo.entity.TaskCounterEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TaskCounterRepository extends JpaRepository { + TaskCounterEntity findByUserId(Long userId); +} diff --git a/task-service/src/main/java/com/manabie/todo/repository/TaskRepository.java b/task-service/src/main/java/com/manabie/todo/repository/TaskRepository.java new file mode 100644 index 000000000..cef231ec8 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/repository/TaskRepository.java @@ -0,0 +1,12 @@ +package com.manabie.todo.repository; + +import com.manabie.todo.entity.TaskEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface TaskRepository extends JpaRepository { + List findAllByOwner(Long userId); +} diff --git a/task-service/src/main/java/com/manabie/todo/service/TaskLimitService.java b/task-service/src/main/java/com/manabie/todo/service/TaskLimitService.java new file mode 100644 index 000000000..2f5cd9cd3 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/service/TaskLimitService.java @@ -0,0 +1,5 @@ +package com.manabie.todo.service; + +public interface TaskLimitService { + boolean checkLimitAndIncreaseCounter(Long userId, Integer maxTaxPerDay); +} diff --git a/task-service/src/main/java/com/manabie/todo/service/TaskService.java b/task-service/src/main/java/com/manabie/todo/service/TaskService.java new file mode 100644 index 000000000..d5d50fa9c --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/service/TaskService.java @@ -0,0 +1,20 @@ +package com.manabie.todo.service; + +import com.manabie.todo.model.CreateTaskRequest; +import com.manabie.todo.model.TaskModel; +import com.manabie.todo.model.UserInfo; + +import java.util.List; + +public interface TaskService { + TaskModel createTask(CreateTaskRequest request); + + List findAllTask(); + + List findAllByOwner(final Long userId); + + TaskModel getTaskById(Long id); + + UserInfo getUserInfo(Long userId); + +} diff --git a/task-service/src/main/java/com/manabie/todo/service/impl/TaskLimitServiceImpl.java b/task-service/src/main/java/com/manabie/todo/service/impl/TaskLimitServiceImpl.java new file mode 100644 index 000000000..8e186fc10 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/service/impl/TaskLimitServiceImpl.java @@ -0,0 +1,32 @@ +package com.manabie.todo.service.impl; + +import com.manabie.todo.entity.TaskCounterEntity; +import com.manabie.todo.repository.TaskCounterRepository; +import com.manabie.todo.service.TaskLimitService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; + +@Service +@RequiredArgsConstructor +public class TaskLimitServiceImpl implements TaskLimitService { + final TaskCounterRepository taskCounterRepository; + + @Override + public boolean checkLimitAndIncreaseCounter(Long userId, Integer maxTaxPerDay) { + TaskCounterEntity taskCounter = taskCounterRepository.findByUserId(userId); + if (null == taskCounter) { + taskCounter = new TaskCounterEntity(); + taskCounter.setUserId(userId); + taskCounter.setCounter(0L); + taskCounter.setCreatedAt(LocalDateTime.now()); + } + if (taskCounter.getCounter() < maxTaxPerDay) { + taskCounter.setCounter(taskCounter.getCounter() + 1); + taskCounterRepository.save(taskCounter); + return false; + } + return true; + } +} diff --git a/task-service/src/main/java/com/manabie/todo/service/impl/TaskServiceImpl.java b/task-service/src/main/java/com/manabie/todo/service/impl/TaskServiceImpl.java new file mode 100644 index 000000000..13dd4c065 --- /dev/null +++ b/task-service/src/main/java/com/manabie/todo/service/impl/TaskServiceImpl.java @@ -0,0 +1,87 @@ +package com.manabie.todo.service.impl; + +import com.manabie.todo.constant.TaskStatus; +import com.manabie.todo.entity.TaskEntity; +import com.manabie.todo.exception.ManabieException; +import com.manabie.todo.model.CreateTaskRequest; +import com.manabie.todo.model.TaskModel; +import com.manabie.todo.model.UserInfo; +import com.manabie.todo.repository.TaskRepository; +import com.manabie.todo.service.TaskLimitService; +import com.manabie.todo.service.TaskService; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.http.HttpStatus; +import org.springframework.integration.redis.util.RedisLockRegistry; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; + +@Service +@RequiredArgsConstructor +public class TaskServiceImpl implements TaskService { + final ModelMapper modelMapper; + final TaskRepository taskRepository; + final TaskLimitService taskLimitService; + final RedisLockRegistry userLockRegistry; + final WebClient.Builder webClientBuilder; + + @Override + public TaskModel createTask(CreateTaskRequest request) { + UserInfo userInfo = getUserInfo(request.getOwner()); + if (null == userInfo) { + throw new ManabieException(HttpStatus.NOT_FOUND.ordinal(), "User not found", HttpStatus.NOT_FOUND); + } + + TaskModel taskModel = null; + Lock lock = userLockRegistry.obtain(request.getOwner() + ""); + boolean isLock = false; + try { + isLock = lock.tryLock(100, TimeUnit.MILLISECONDS); + if (isLock) { + if (!taskLimitService.checkLimitAndIncreaseCounter(request.getOwner(),userInfo.getMaxTaskPerDay())) { + TaskEntity taskEntity = modelMapper.map(request, TaskEntity.class); + taskEntity.setStatus(TaskStatus.NEW); + taskEntity.setCreatedAt(LocalDateTime.now()); + + taskModel = modelMapper.map(taskRepository.save(taskEntity), TaskModel.class); + } + lock.unlock(); + } + } catch (Exception e) { + if (isLock) { + lock.unlock(); + } + } + return taskModel; + } + + @Override + public List findAllTask() { + return taskRepository.findAll().stream().map(t -> modelMapper.map(t, TaskModel.class)).toList(); + } + + @Override + public List findAllByOwner(final Long userId) { + return taskRepository.findAllByOwner(userId).stream().map(t -> modelMapper.map(t, TaskModel.class)).toList(); + } + + @Override + public TaskModel getTaskById(Long id) { + return modelMapper.map(taskRepository.getReferenceById(id), TaskModel.class); + } + + @Override + public UserInfo getUserInfo(Long userId) { + return webClientBuilder.build().get() + .uri("http://user-service:8080", + uriBuilder -> uriBuilder.pathSegment("user",userId + "").build()) + .retrieve() + .bodyToMono(UserInfo.class) + .block(); + } +} diff --git a/task-service/src/main/resources/application-docker.properties b/task-service/src/main/resources/application-docker.properties new file mode 100644 index 000000000..1d9b8f772 --- /dev/null +++ b/task-service/src/main/resources/application-docker.properties @@ -0,0 +1,17 @@ +spring.application.name=task-service +server.port=8080 + +spring.data.redis.host=redis +spring.data.redis.port=6379 + +spring.datasource.hikari.connectionTimeout=20000 +spring.datasource.hikari.maximumPoolSize=5 + +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://postgres-task:5432/task +spring.datasource.username=manabie +spring.datasource.password=manabie@123 + +spring.jpa.hibernate.ddl-auto=update +spring.jpa.generate-ddl=true +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file diff --git a/task-service/src/test/java/com/manabie/todo/TodoApplicationTests.java b/task-service/src/test/java/com/manabie/todo/TodoApplicationTests.java deleted file mode 100644 index 5afdce587..000000000 --- a/task-service/src/test/java/com/manabie/todo/TodoApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.manabie.todo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class TodoApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/task-service/src/test/java/com/manabie/todo/controller/TaskServiceTest.java b/task-service/src/test/java/com/manabie/todo/controller/TaskServiceTest.java new file mode 100644 index 000000000..d009d2b4a --- /dev/null +++ b/task-service/src/test/java/com/manabie/todo/controller/TaskServiceTest.java @@ -0,0 +1,67 @@ +package com.manabie.todo.controller; + +import com.manabie.todo.model.CreateTaskRequest; +import com.manabie.todo.model.TaskModel; +import com.manabie.todo.model.UserInfo; +import com.manabie.todo.repository.TaskRepository; +import com.manabie.todo.service.TaskLimitService; +import com.manabie.todo.service.TaskService; +import com.manabie.todo.service.impl.TaskServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +import org.mockito.MockitoAnnotations; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.redis.util.RedisLockRegistry; +import org.springframework.web.reactive.function.client.WebClient; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; + +@Slf4j +public class TaskServiceTest { + + @Mock + private ModelMapper modelMapper; + @Mock + private TaskRepository taskRepository; + @Mock + private TaskLimitService taskLimitService; + @Autowired + private RedisLockRegistry userLockRegistry; + @Mock + private WebClient.Builder webClientBuilder; + @Mock + private TaskService taskService; + + + @BeforeEach + public void setUp() { + MockitoAnnotations.openMocks(this); + taskService = new TaskServiceImpl(modelMapper,taskRepository,taskLimitService,userLockRegistry,webClientBuilder); + } + + + @Test + public void createTask_returnSuccess() throws Exception { + CreateTaskRequest request=new CreateTaskRequest(); + request.setTitle("Task 1"); + request.setDescription("This is Task 1"); + request.setOwner(1000L); + + UserInfo fakedUserInfo=new UserInfo(); + fakedUserInfo.setId(1000L); + fakedUserInfo.setUsername("trungnguyen.tech"); + fakedUserInfo.setId(1000L); + fakedUserInfo.setMaxTaskPerDay(3); + + when(taskService.getUserInfo(any())).thenReturn(fakedUserInfo); + + TaskModel taskModel = taskService.createTask(request); + assertNotNull(taskModel); + } +} diff --git a/user-service/src/main/java/com/manabie/todo/config/BeanConfig.java b/user-service/src/main/java/com/manabie/todo/config/BeanConfig.java new file mode 100644 index 000000000..fe680feff --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/config/BeanConfig.java @@ -0,0 +1,15 @@ +package com.manabie.todo.config; + +import org.modelmapper.ModelMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class BeanConfig { + @Bean + ModelMapper modelMapper() { + ModelMapper modelMapper = new ModelMapper(); + modelMapper.getConfiguration().setSkipNullEnabled(true); + return modelMapper; + } +} diff --git a/user-service/src/main/java/com/manabie/todo/config/RedisConfig.java b/user-service/src/main/java/com/manabie/todo/config/RedisConfig.java new file mode 100644 index 000000000..a1b727ece --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/config/RedisConfig.java @@ -0,0 +1,15 @@ +package com.manabie.todo.config; + +import com.manabie.todo.constant.CacheKey; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.integration.redis.util.RedisLockRegistry; + +@Configuration +public class RedisConfig { + @Bean(destroyMethod = "destroy") + public RedisLockRegistry userLockRegistry(RedisConnectionFactory redisConnectionFactory) { + return new RedisLockRegistry(redisConnectionFactory, CacheKey.USER_LOCK); + } +} diff --git a/user-service/src/main/java/com/manabie/todo/config/WebClientConfig.java b/user-service/src/main/java/com/manabie/todo/config/WebClientConfig.java new file mode 100644 index 000000000..e3fa5cf65 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/config/WebClientConfig.java @@ -0,0 +1,14 @@ +package com.manabie.todo.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.WebClient; + +@Configuration +public class WebClientConfig { + + @Bean + public WebClient.Builder webClientBuilder() { + return WebClient.builder(); + } +} diff --git a/user-service/src/main/java/com/manabie/todo/constant/CacheKey.java b/user-service/src/main/java/com/manabie/todo/constant/CacheKey.java new file mode 100644 index 000000000..41568a30c --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/constant/CacheKey.java @@ -0,0 +1,8 @@ +package com.manabie.todo.constant; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class CacheKey { + public final String USER_LOCK = "lock::user::"; +} diff --git a/user-service/src/main/java/com/manabie/todo/constant/TaskStatus.java b/user-service/src/main/java/com/manabie/todo/constant/TaskStatus.java new file mode 100644 index 000000000..b29b27a6a --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/constant/TaskStatus.java @@ -0,0 +1,7 @@ +package com.manabie.todo.constant; + +public enum TaskStatus { + NEW, + PROCESSING, + COMPLETED +} diff --git a/user-service/src/main/java/com/manabie/todo/controller/UserController.java b/user-service/src/main/java/com/manabie/todo/controller/UserController.java new file mode 100644 index 000000000..e893de253 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/controller/UserController.java @@ -0,0 +1,32 @@ +package com.manabie.todo.controller; + +import com.manabie.todo.model.BaseResponse; +import com.manabie.todo.model.CreateUserRequest; +import com.manabie.todo.model.UserInfo; +import com.manabie.todo.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/user") +public class UserController { + final UserService userService; + + @PostMapping + BaseResponse createUser(@RequestBody CreateUserRequest request) { + return BaseResponse.ofSucceeded(userService.create(request)); + } + + @GetMapping("/{userId}") + BaseResponse getUserTaskById(@PathVariable Long userId) { + return BaseResponse.ofSucceeded(userService.getById(userId)); + } + + @GetMapping() + BaseResponse> getAllUser() { + return BaseResponse.ofSucceeded(userService.findAll()); + } +} \ No newline at end of file diff --git a/user-service/src/main/java/com/manabie/todo/entity/UserEntity.java b/user-service/src/main/java/com/manabie/todo/entity/UserEntity.java new file mode 100644 index 000000000..aac036456 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/entity/UserEntity.java @@ -0,0 +1,24 @@ +package com.manabie.todo.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "users") +@Getter +@Setter +public class UserEntity { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_seq") + @SequenceGenerator(name = "user_id_seq", sequenceName = "user_id_seq", allocationSize = 1) + private Long id; + private String username; + private Integer maxTaskPerDay; + private LocalDateTime createdAt; + private String createdBy; + private LocalDateTime updatedAt; + private String updatedBy; +} diff --git a/user-service/src/main/java/com/manabie/todo/exception/BaseResponse.java b/user-service/src/main/java/com/manabie/todo/exception/BaseResponse.java new file mode 100644 index 000000000..17cfa0985 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/exception/BaseResponse.java @@ -0,0 +1,44 @@ +package com.manabie.todo.exception; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import org.springframework.http.HttpStatus; + +@JsonInclude(JsonInclude.Include.NON_NULL) + +@Data +public class BaseResponse { + private Status status; + private T data; + + public static BaseResponse ofSucceeded(T data) { + BaseResponse response = new BaseResponse<>(); + response.data = data; + response.status.code = HttpStatus.OK.value(); + return response; + } + + public static BaseResponse ofSucceeded() { + BaseResponse response = new BaseResponse<>(); + response.status.code = HttpStatus.OK.value(); + return response; + } + + public static BaseResponse ofFailed(Integer errorCode) { + return ofFailed(errorCode, null); + } + + public static BaseResponse ofFailed(Integer errorCode, String message) { + BaseResponse response = new BaseResponse<>(); + response.status.code = errorCode; + response.status.message = message; + return response; + } + + @Data + public static class Status { + private String message; + Integer code; + boolean success; + } +} diff --git a/user-service/src/main/java/com/manabie/todo/exception/ManabieException.java b/user-service/src/main/java/com/manabie/todo/exception/ManabieException.java new file mode 100644 index 000000000..3b9e477b0 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/exception/ManabieException.java @@ -0,0 +1,15 @@ +package com.manabie.todo.exception; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import org.springframework.http.HttpStatus; + +@Builder +@Data +@AllArgsConstructor +public class ManabieException extends RuntimeException { + private int code; + private String message; + private HttpStatus httpStatus; +} diff --git a/user-service/src/main/java/com/manabie/todo/exception/ManabieExceptionHandler.java b/user-service/src/main/java/com/manabie/todo/exception/ManabieExceptionHandler.java new file mode 100644 index 000000000..d1de81706 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/exception/ManabieExceptionHandler.java @@ -0,0 +1,24 @@ +package com.manabie.todo.exception; + +import com.manabie.todo.model.BaseResponse; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class ManabieExceptionHandler { + @ExceptionHandler({ManabieException.class}) + public ResponseEntity vuiException(ManabieException ex) { + BaseResponse body = BaseResponse.ofFailed(ex.getCode(), ex.getMessage()); + return ResponseEntity.status(ex.getHttpStatus()).body(body); + } + + @ExceptionHandler({Exception.class}) + @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) + public ResponseEntity exception(Exception ex) { + BaseResponse body = BaseResponse.ofFailed(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(body); + } +} diff --git a/user-service/src/main/java/com/manabie/todo/model/BaseResponse.java b/user-service/src/main/java/com/manabie/todo/model/BaseResponse.java new file mode 100644 index 000000000..d4526f4df --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/model/BaseResponse.java @@ -0,0 +1,52 @@ +package com.manabie.todo.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import org.springframework.http.HttpStatus; + +@JsonInclude(JsonInclude.Include.NON_NULL) + +@Data +public class BaseResponse { + private Status status; + private T data; + + public static BaseResponse ofSucceeded(T data) { + BaseResponse response = new BaseResponse<>(); + response.data = data; + + Status responseStatus=new Status(); + responseStatus.setCode(HttpStatus.OK.value()); + response.status=responseStatus; + return response; + } + + public static BaseResponse ofSucceeded() { + BaseResponse response = new BaseResponse<>(); + Status responseStatus=new Status(); + responseStatus.setCode(HttpStatus.OK.value()); + response.status=responseStatus; + return response; + } + + public static BaseResponse ofFailed(Integer errorCode) { + return ofFailed(errorCode, null); + } + + public static BaseResponse ofFailed(Integer errorCode, String message) { + BaseResponse response = new BaseResponse<>(); + + Status responseStatus=new Status(); + responseStatus.setCode(errorCode); + responseStatus.setMessage(message); + response.status=responseStatus; + return response; + } + + @Data + public static class Status { + private String message; + Integer code; + boolean success; + } +} diff --git a/user-service/src/main/java/com/manabie/todo/model/CreateUserRequest.java b/user-service/src/main/java/com/manabie/todo/model/CreateUserRequest.java new file mode 100644 index 000000000..78f6c561b --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/model/CreateUserRequest.java @@ -0,0 +1,18 @@ +package com.manabie.todo.model; + +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CreateUserRequest { + @NotBlank(message = "username is mandatory") + private String username; + + @Min(value=1, message="maxTaskPerDay must be equal or greater than 1") + @Max(value=45, message="maxTaskPerDay must be equal or less than 10") + private Integer maxTaskPerDay; +} diff --git a/user-service/src/main/java/com/manabie/todo/model/UserInfo.java b/user-service/src/main/java/com/manabie/todo/model/UserInfo.java new file mode 100644 index 000000000..2b50882f2 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/model/UserInfo.java @@ -0,0 +1,18 @@ +package com.manabie.todo.model; + +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +public class UserInfo { + private Long id; + private String username; + private Integer maxTaskPerDay; + private LocalDateTime createdAt; + private String createdBy; + private LocalDateTime updatedAt; + private String updatedBy; +} diff --git a/user-service/src/main/java/com/manabie/todo/repository/UserRepository.java b/user-service/src/main/java/com/manabie/todo/repository/UserRepository.java new file mode 100644 index 000000000..c38940926 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/repository/UserRepository.java @@ -0,0 +1,9 @@ +package com.manabie.todo.repository; + +import com.manabie.todo.entity.UserEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends JpaRepository { +} diff --git a/user-service/src/main/java/com/manabie/todo/service/UserService.java b/user-service/src/main/java/com/manabie/todo/service/UserService.java new file mode 100644 index 000000000..dc9c73231 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/service/UserService.java @@ -0,0 +1,12 @@ +package com.manabie.todo.service; + +import com.manabie.todo.model.CreateUserRequest; +import com.manabie.todo.model.UserInfo; + +import java.util.List; + +public interface UserService { + UserInfo create(CreateUserRequest request); + UserInfo getById(Long userId); + List findAll(); +} diff --git a/user-service/src/main/java/com/manabie/todo/service/impl/UserServiceImpl.java b/user-service/src/main/java/com/manabie/todo/service/impl/UserServiceImpl.java new file mode 100644 index 000000000..2608f7163 --- /dev/null +++ b/user-service/src/main/java/com/manabie/todo/service/impl/UserServiceImpl.java @@ -0,0 +1,37 @@ +package com.manabie.todo.service.impl; + +import com.manabie.todo.entity.UserEntity; +import com.manabie.todo.model.CreateUserRequest; +import com.manabie.todo.model.UserInfo; +import com.manabie.todo.repository.UserRepository; +import com.manabie.todo.service.UserService; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class UserServiceImpl implements UserService { + final UserRepository userRepository; + final ModelMapper modelMapper; + + @Override + public UserInfo create(CreateUserRequest request) { + UserEntity userEntity = modelMapper.map(request, UserEntity.class); + userEntity.setCreatedAt(LocalDateTime.now()); + return modelMapper.map(userRepository.save(userEntity), UserInfo.class); + } + + @Override + public UserInfo getById(Long userId) { + return modelMapper.map(userRepository.getReferenceById(userId), UserInfo.class); + } + + @Override + public List findAll() { + return userRepository.findAll().stream().map(u -> modelMapper.map(u, UserInfo.class)).toList(); + } +} diff --git a/user-service/src/main/resources/application-docker.properties b/user-service/src/main/resources/application-docker.properties new file mode 100644 index 000000000..342115d89 --- /dev/null +++ b/user-service/src/main/resources/application-docker.properties @@ -0,0 +1,18 @@ +spring.application.name=user-service +server.port=8080 + +spring.data.redis.host=redis +spring.data.redis.port=6379 + +spring.datasource.hikari.connectionTimeout=20000 +spring.datasource.hikari.maximumPoolSize=5 + +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://postgres-user:5431/user +spring.datasource.username=manabie +spring.datasource.password=manabie@123 + +spring.jpa.hibernate.ddl-auto=update +spring.jpa.generate-ddl=true +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.show-sql=true \ No newline at end of file diff --git a/user-service/src/test/java/com/manabie/todo/TodoApplicationTests.java b/user-service/src/test/java/com/manabie/todo/TodoApplicationTests.java deleted file mode 100644 index 5afdce587..000000000 --- a/user-service/src/test/java/com/manabie/todo/TodoApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.manabie.todo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class TodoApplicationTests { - - @Test - void contextLoads() { - } - -} From 363fb801b2d1276f22a48e53da215fe6d457fac1 Mon Sep 17 00:00:00 2001 From: "trung.m.nguyen" Date: Sun, 23 Apr 2023 00:44:28 +0700 Subject: [PATCH 4/4] update readme --- README.md | 69 ++++++++++++++++++++++++++- docs/images/todo_context_diagram.png | Bin 0 -> 233739 bytes 2 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 docs/images/todo_context_diagram.png diff --git a/README.md b/README.md index d9ca8b7eb..aac84b893 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,72 @@ The system have 6 component: >Deploying Our Microservices Using Docker # Running the microservices -1. Run `mvn clean package` to build the applications. +1. Run `mvn clean package -Dmaven.test.skip` to build the applications. 2. Run `docker-compose up -d` to create the docker image locally and start the applications. # How to use -# Todo \ No newline at end of file + +1. First create new user to test +- Sample curl +```bash +curl --location 'localhost:8080/api/user' --header 'Content-Type: application/json' --data '{"username":"trungnguyen.tech","maxTaskPerDay":3}' +``` + +Which will respond with something like: + +```json +{ + "status": { + "message": null, + "code": 200, + "success": false + }, + "data": { + "id": 7, + "username": "trungnguyen.tech1", + "maxTaskPerDay": 3, + "createdAt": "2023-04-22T16:05:55.162259378", + "createdBy": null, + "updatedAt": null, + "updatedBy": null + } +} +``` +2. Call the create task with owner id (user was created in step 1) +> The endpoint http://localhost:8080/api/user used as gateway to `hide` the services behind the outside. + +- Sample curl +```bash +curl --location 'http://localhost:8080/api/task' --header 'Content-Type: application/json' --data '{"title":"join daily meeting","description":"join daily meeting","owner":3}' +``` + +- Sample Response +```json +{ + "status": { + "message": null, + "code": 200, + "success": false + }, + "data": { + "id": 1, + "title": "join daily meeting", + "description": "join daily meeting", + "owner": 7, + "status": "NEW", + "createdAt": "2023-04-22T16:01:59.052947339", + "createdBy": null, + "updatedAt": null, + "updatedBy": null + } +} +``` + +## TODO +- Apply Authentication & Authorization service to protect system +- Apply *Kubernetes & Istio* as alternative deployment +- Apply Grafana, Prometheus and Kiali ... for tracing and monitoring to easilier debug and scale. +- Apply Kafka for internal call to get highly performant and scalable. +- Convert from Spring boot to Quarkus to enhance the performace + (CPU & Memory usage). +- Do more testing & integration test on user-service ,task-service. +- Store user info in Redis cached for better perfomance and reduce cost. \ No newline at end of file diff --git a/docs/images/todo_context_diagram.png b/docs/images/todo_context_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..acffba35c34049502438388158720d9c3eb09cd4 GIT binary patch literal 233739 zcmeFa3p|s5|39u2sgTZ6R;hF#bRegxC`l}xD90$u`8P@5Af;Iy|4R*ZT@Oudgk< za?46SK0aZcGg=q;_yo=P_?B&7Apm@GI-CRH<68~Bt*LolM^khAc~>Xv+x9p4_|619 zH54?u_-SL3@r51l`IcTd>2%k9=^3Ht%O9C7lh`4&=4`0YiR$o!`wKj??g*Q1Fc`bj zCZ-xtY#x0oUhdHp-|_zK z^#i)z%h!PT_|W}9yYKU@87vumc`|EjXAyNp4=)17?JE9UsEpEHSgr<}$OS-?rui1?qT|<9( z$jWj@t3M;)5jrz)^Q)ncJ0Cx#r71u@KTzgpt|^`<++narLUZe$&&Z%Fld)Gn$ct1t z-+vZ)|9--*hr-*F5Ge&Ez{yxT(M;J_JE`7&hZrUE3vA+=&bp-yHE~SggWs z=UxHC$z6QkDqJdp&6e!FJBK@Q#oJ@))!?3;)eqGsmh~@PvwW(r^qj)kBg3-G)gFXS zfO-lurz}clGe5KD)iuifY>XZST~Wwhf?Qpw@)CLT(T#28 z_aw_&WGG&}jhcg?iMA6f6-RA!?ZJ5<)sV!hdMoWrf%5Wjt1zPjo|nP}4RKc0qgy7T zo;{Qn9bGZs=hXY@^Wl9SuRTUQXJ3pRSbr`Glf13f<`M%22%uH;F*c>R6#xtmc?R;B8WSY{Fyij$9YY>vg)2W_p~L>aBB&1i+wAz1P<}y!buw(fuhX3|8D|eodIkWV(#nw=;V1}De%(4{!_Gjy# z1njohZL~`9PMw8n+j5$}fb+71Wj5ufzKUe{t2)oP`)_)-se~UTwrt0aBlp5L@3ek+ zwEtnjj&r;CgigJPShh>})A4LEv7MSJJKP?*-Vo2;*nY2hyKjW%N1Xw+Z~k2;CAW8f zv>R9#{CqU+pzYm`XO#wfKA%kfy31WAE=*r5q_J>#r~A=sVPq{*W90Cu=`9^WWye|a zcV1s-#wZWnQ&3Rc81l;MYRs~D|EJeC7#+P5c(j5DTTZI-$wVF#OC_xC63XaZp(al3 zTQ@1rI0=(2+lIy(PaI(Imu#9p{Y)%WD14du(m?s(M|v?@dv{-2lebo6t$t-`^C>Uw zU2A88^0b@^HZ?sgta@E_zsjSkyJ}sPNWYXNC`jwjF6GB_I$668zJ7G+>^02}9Toke zbE7-q+tVZJJ~|G_yQ*B(I=I8|5%du`43p*U;u9&Ee(!`(C(4&0YJ=!tq>h9)I>j53f8=;Mk z40{j18rEw~Z&rPSdyO3F9Cn+g&TJx4nlKsjw;z65)4HbO(Q?hv2PTqJJr-#v9{HC) z`(lw_aWnw(V0GpBO0~*Y4}>4kL!G4rlf9C4PLsm)C1zH)Y#UX2qV(Q=xa@g;n1Pib zVHx3dO?;Sf80*|Qy$^a-d+g5X$4uy49QwWv+ViR-AXeLuae^g&4b!Y0eRKa>?ePjLZdf|Gx zKx1JDsLY+w-iJ3)Go3QcE9i1*aS3ymb#ZWoj}P_MxTU)nkLtULx}ipThB==r8#Q~g zdI%}f-EJ?5Y7N#6XtN%(wP+QzqtgM(YRZ0!#5q&zt!_K038EF!Z8j+lVkl&pS=s$E z7HodXZK{^q*+;j(H@>3cp{$hTtTDrltuzZ2kY9ResiJ_pK%Af}e>y)%;Hto6K%Rj5 z&GsDEtEyM!0!;7jt`H2s=fK;W+NDosKAL!x{V4Bz;@5$%xzFj9G9R)lZ7Y2$)hkmU zpdN15(mEv*R#2hPH*xG}LeCk>$B_tGgHeMZ1G{9&)2dp!FXB(Xkdo3q2=Z2{Q8~T7 zY0WB2<*ZsON_BgUUa0C;NGLJ{9g29|8z(Q@XTMY31=b&41=Xq035g`{>fBxXIR4_1 zi#0EsUzR|Gbxfl=lx-PlBgqF-#9s+DZE4aO**9X`#5x@qZl+vh7fOuzrhvnCgeR)e z=8h%1%o4)Gaa$X14&1nMlQz{>a=B#F+;+}Nzx;CZ%ySb* zYBlVxw&vK+j}5kWEBh;NP*y*g=lpKsvZEIHK^NUS%e!-mNxevgZhExp&`OaYcP;N1 zQ9>!}_CSW$s0Qm+C$57_XC$;82zqS)bmzCMZ#5@P8B+NDIg#w0zUSAUzjSr_`i0Lg z*^#-@A$#)mU1G8=J~#De_Ty9fFM3~$PmP7dtB+T>w@&LFek2}yIL_u;eS&I^-4({$ z@toH=RO@-O{tMY}2gVbcmG#{8hU(*3!_gDwwz@~p?tY~-G+Wmx4?@W$;PcAi6>-b) zpBXndeK!4k;4?;MK(=HeorF$DjGI5nO>@Y?_0Q-&)Ya0>kP|j3g2&Rb`)?wnkS1oB zyIC*nt2>_(43p3kX>FOoMQ8KgxOq&E)*QWJ7xi{FThV4b_jB*(?#nfoSH0;$6VSya z;9Kx+fk@#&39!R@$CAQ*u#50qJ&$VZ{-GCjki3`n$}9V`q}>O=_JLhKr^U3H+>E2wrt?~mEOb$iqK-WUO$mCV%6BhL1Omg4BA#_f6F z%;PO5m=)PRFa6HKoiz0|ZLF?YVV{50tkd(;6BJbi^>|jzof$MJO%6dCAnVjy5hV;S zywGG&Qe?X{=qS>u%+0p>b-L`NtV3$DK1y|+=TP(2)^-AMu3?)p#h3GS`Oy6bA!eIM z#_GnR9P%uyLJ^(E)a{Ah(h2W~S2^vzwRo%7?7-7U2W&E2Gt5dhy1gU#OwGhA)pQM) ze8S9*UE#bl%nxxylpQ7=>~m~af9Jb_9!4>ozdny8>!a(FMNdk;2cLs^5ydEtA=qzN z^P(Z}bM@C=wzT&{v7I?m-PgOv8?-ejK0Ev-3sa{d;~ME^9i?g$hF{I!l_vWXo9UR% zV9Xdb6Lop{l1}lgekK`nz>7W$Zx^f-?bJA=k;Hz&92p_%n4dAfg28{V#5##whINo+&)syix-c}YC~ zyrUyurp+ofzZ38}1-`0AzB5xx(u!FY+m5C0tA9Fm@*eR{SOPkBd2BC!{a`FLumIuc zZ_>g)*Tq@2Qw-)W~#9sw`zIp5#;A3xv|1pc=cczHcr`t#Rt3>sZc^Vb^7A@cH{GmUZ#%o+c5>X#z3z2OCl7b^ zojbWV`t|p{oj1L1FWkw|?MJtO4$5)AkyAJ*FZb)(z^Q87PgTy}_PS|*RqM6`FlN9# zzzXt571ekr{KHoZw_J3p(V|n29s8S87k%~jr(Slu>8k1E0Nm6ayf9%u?z{NQA1A8G zar?e#EWQsk?^9r;!7J6|e$5(qrAQ~V517cUx3wUbfOkO5xPMF60RQa${tg^3!OdjM z_5cy_aXuZb6PLV}j3o*d*q?fux2jU(kX87@JG;;Wt6~&FU+Bw+1S?yfT)kNyd0pV# z-t9VH!o`bCzhs&xP3r9CI8f;UF>?o$M8`NjIt*JEXEnLPMatjG= zH&bS_sk^jdUuuGDAwgitisL|A?f_9Z-)|0U_heQK>MG3-E-Q=KN$7 zR)2Y&nlyR^ZC2VJI=3$T{?nbJFvjJJWmxUl2-I_nR}ZhxPWTPJ8=_1`5Z8t8H`-@u zq~EN4OR>8~J5CRwRdH6Va_R+`=}Evc9=Zk1@P6Rfto>yoQxv4R=e6YW1E*HkBAI8d zl4*qGS}EvD?j@BkfRvkZ6kuPBo?KgbC3tg`^o&6^y!se;^jNzL?~MCQ`IUp6I~f*) z+_8Pi0r!)%n#7In-S6=}QLA=-Kp|@LgBWI-@vW6aMw;98oQW)>w-f$IpQSU0H;`;) z6hikCsYSW3oWqeSn-o`pLaJAS7-`byH7;gl)U2&ca|NS~jsL}|W>Xb4c8Tf3G8=u? z*FJL-+sN!aC7Y}nfi<$+Y&M$g7_l#bkX(Pi?gQ2`>w_S8RH(V((%bZ`D)~1F4W!nn z56a+ClQtQc%*F$--sGg?>~qycTXa_^f1WLIbodvidVdm>Kzn4o$T1o=kO`od)Hy!)^m_)-eC$ACrtAyN_tUfesa_>Ia%b<4n`(#H0lYQe~%-HWc_FFmmGueM8 z`_Ib${qp=TwB7%=S2nT^OEsT(p;AyAGZT&Bcub|Gn~&SpdbzVT{pcDPHyo$f4yR#J z9~-O&7>}?0$&UX2sK68KOdZb8m-KzXa0Y`BER*rkan5)$VCmRo=sY0QvAcy)|uZjd+x7>cj1tKcg= zwr#Px{^}z?Xl9i#h?4Ud!3We zm2fP$URtGW)1NFE!@cNDwG`$GB{NZV#vPyMzindUIxm`=`B0me>4`e~8_kuMGA~qR zhGO4mRn^#e3m<50F|rJO2X6C{#R(q%Yq!YcvQXw^(TAZ8@w;h{+lSNF1tL}S6?M5T zjq7u8=*ig!$U{;Zl{uD#mUVrSzwxn{%i6rg*ImV0AzaD^Qw7F%XJ=iKUb!$>C*hm# zPYHu=p7wiSQ(coT{XzXV&e}B4s1E7ua4e@^O#*%M5zjx`Cjq~SSL6pSdFkzh0!CEP zj1;S|?k}5EemRU!0)4GmpxjSPt$D4TKxT)_62vZ9VErs!rtguNMduYT|aa1M{dw4xiIUF_Qm;vf4Y0^8NNT0rf9qM6{W;otb^{_|4h zHKdht%Xt!XYS9>d()o$Ow?cPO2=I1g80pOCajry$oK(*~&rQHWRi?-#pTQY?!Iq~<1h4X!} zHpT1o!B$guQMouc$^6*i9e*9H9Y4(-(9?Cl8&Fq8Gp8J%r=7Gb@p2JHOb0_7%(%)t zTU-N-OY|Cz)kS)Qhv9?-IHC(8aa^nSn>qV)qDN~x*+xSZm*`gC&;^=jXy;dNjE8Wb zBxC&N?%@YY>r2;uSR7GWO!Bm3c-zM`!8bfpfV^$>dN4J2@&vqjT^j1Oks-JSXb-f# z?+Urq*lAQ>ZL*5_@@{N?VVy%)tcG$!;v5?U@oD!G?)|!8chr}%)To8zVdU0MQsVr? z`-^1+#U92GRl_+J>D9B!tRFlTfz$)RYwHwU@C@dr6f7y(Wpa0P0S?2lfVTBHeR_bm zL8TV5ljgTVsqs!v60zGCOF_m;o($D;`eC(o2Yf%-PqzeBYHyQ{f5q)X;d#*M=dem{ zjN5lr)`sAbI-cjAp4U}XI$SO1s*PY&a`vT@L6Z-)3vgw$8M3quilWc%gGeK<6LME> zi~OmG3WC>qO|8X_24;yZ1H8t`Lv;xB8nCjvR$>WmX~bP_tLV15Z2y2;di^2nGv#T!a57wmHK zImf>+k99fshftX_rHFkWv8+rC`x@}nZ4B3N_EV#>!XS4T(zXnI;Oxj{7 zMKePZ#nENW;A&_08m9BD26YhGj2ee4LM6EQvpC55q;nPokB>o;zofqxnDkK{nfabF zeMVkBhGY_-0q)4h%C!-m3mz5pz8)0e%bltC9w6uJ2zhe7WZajxC}4>#l{Xpd2RMm(9io) zmpvfGt5QmGR9RiCx<#Y?h%JslRGMS8=jQ|)s&n;OF;#GUas|D;!Ow3(i?*)|Q9vh? zMG=eu)+nxQZNxyMeJBCmO7A|3_SVDa%G2#j4u-BYTQE+Wk8;~+Bqt$0bDX!H ztpK%BLP!peth>O~JSH`lcuRWbN_;_`QfaJPv|L4-#R#IdK!Z4EUUaxY1@D|asq(yh z{=`od#{bw7*88E|(HvWOuc27Gu1H!(aT6lHxVyTPb`(vXo()Jeqzq@cgxN7Fhv*?w zmn#8r19i_heq}p!%I39o!N+1mi^lUhQ!4vv%{gyaScKpC)CQ5VnL4>5z%%pyiYZeC z^dny2q3AEfCu0jw+#CKzWmZX>)!G?xF%K*InJmC;7&~NTb=ni+Wo$4WMG)Vf<(rB@ zD0nsQ#bgl9HSExWluZjI_%TKIn4=_U8q+&OT|r*+#UC@n~>zz}R zJd0TD4t()8Xh($uraRA(HJwa4ZXlF(Z2x*OC*_5Wi+Ay1ShB`_B#e(`vQBhmBh!+ z4UB}zBHbF)8{l*6P@WpE<%tq^(?e`<2 zD{Ip87rCct(wTtRXvjH)k0Z(@y6nv9HTKUC93sM*;>8jp*C-VkxF^Ab-SI>+v4@>R z*Ty1!YM_I+e|C8h&Wb^La7wueJQC0 znj$`MU{&-`DIjNvFEdAltu5*Du#=>NjGu0|rgrww4$`L#=j?2#@2PiQ1#E+M^_0$} zX?8n!cHcZS9b#@WtcZ6l=De?%d@YUWbjYcDa~tF0^&v7zlC5%6W8@Coe1rzC2lLlJ zSuBJzUio@n&|IjET8l&exFR{W!6ylEi^!4HE^AjG2|{|9&wj>rY0Ne8t6Fh-ThKnS zos{J)eMJNuL|=r>hUjojJFQ=?K7X$HS?LYMsL`sv1znRSntZ;jFZs*IhKaX;;x3xq zqvRoh9}^&DQ$`OK4CBZNRJpj4t%_!)8_2&Lh~w)1-b!Y2h0_=46M-7_aJB^g%}Ps& zSE#wF#sG9%F2uEm;wS2YSDhSqL!6AXlt9yNx3e@X8pf=jAxgR_o~fz@NWW?JC*eNl z3?~${XV#H)xf^0=MpVIhQdo3ofv+69jHG6cv5(J=cj#gJSk{tCQ0$Kmnf`16>=-Rg zTcdFsD+}^PCF&Xxm0#06P(uUBt3bb21Qte@Oh1kE9GM@R@uQN=-P5l)i~}8GzA?n4 z6tt7gE3H7(Gjv-1ww_O^m`Ph@te+@OBd{AY+pAPSRHNU&j(f%qMtEoWw(C;e1Vmpf zD5&Gd^?6R|gyh-j_bud;fGz_<1ow+cMapfba4fM;EG#x!w)sR}gakuRO=w}`LsJ(uDPSB>B zQKyoQR3~W9jD92OtLV%-RN+VNnBO@V^wbOZwT33s5= zaDb+Cp4H%i5makt;}GzyCU!Rk)-wKn`f?qImih{9T1NA58WNSJ)Ascv5o48+o?jA$ z+eq!VlH*Usb^&0$3l=uOc5^E6qx(u17I)2Vy}(1q&CR_vX0Zz5Qb#&mE^dx+u@mk+6(>Ez6Pg2jiGAb7tb}S2Y{3 zY*rQHR5YhGalY1ER=q}9(M)yHe@=gWY(ZY#X6=YQslij(U`GQWPi~D zbn(zpwDN3NODcsuR*{e|=@H}mfq-tiSIl^<+qEaYzO1YjQdXNtIWjxi6CzjWK0*q_ zE6vJ6G=?ZF33L{^KR2u(pl4bI%IfTHW%nTw&R9v75d8taC=H@eNxWEaDh^b@r2&A9AiiZ7IPD4`{8H$N# zO@5;g${4%RD+2e7L;U8X$e?+bvar62$ghhu|JNtnP(L*KSExT3qZoC~@0tXtSzFzo z85`^|XvKA~2=Qi7Zf&I$eFT*c_@l_La^4Rw;rA@vZQaBdJ9@$d{24okpeyML1K@ zn1Vo!sY&uh6!V;8hsD?@U-h0+W{VsJmOII{s>SW6jopWO`e^wcKnO!jg|k2tK6ED* z6hWWqH|KmYr5E91zj)8BOX`?q8zI|LN)3%n zjeoTxUp?ASkhTsr=iWA0KRY7YUFTF5;rq?Zw^$T5F5S8E@GF9u@$b}!ig9&&K5efR(?PaJ?FURvHq&cXqTsUbA>=g=Ovh*;6=Si+&qbI`^0 zGm4`n(^z$y0eRd>wFGcMdYF08LK_X@a*nerVh#cC=$<)PEL`T=3KqMKf`xW7a-%ud~J1RP(66bmL3i(+q?iX8$VZb;}|}FoNfqVkb@%ex7pJ! zsBN%BG-^{1-Md}d22@0}`mnDF;%Ek&tagm7%V4}rLs?+zY%z_aP81ld@00C7Ih|)d&{P) z8$6Tt&}Kdnlc-YAocL~c6$%SK|GcMr2q{Lrs;In-}}tZ z8tsjQs8qve?C|a==CsXYiL7Y$=+gYY2e>%3bofeWlX1pq<^;+%7q0>zBUnoWdb%Iz(NRc*xfHhg!wWZ*tK$G%xC5fKQrg`MNmmK{QvO&?X z@&rpO6`tM19Y|3)Bbh7&fyII1x;m+C)M`f-m~x6N>*VcgGmN!K8U+HeCVlg1C9FCXO_?Pl244zg0z@7N#-Rha~rEinuwc41YZ#qaj_Aj}FX(Y+~VqamOMRrFA5REoFw$$s5%vIjH|0$%KRAEYd%#tw z*Q#)!LrnzaP;iib6*~|Rh8xUSDk=CY4r-O-jvi)iP>$?`hF3cwnTBH;i6h8LU)GJ+ z@DE2y-~^JnbAD;vK_Dcf4AdVZd>J`U&c8x&!>D&{Dw`M_>2fBtfJeNE#a(VH)?t+* z@JQd$i%D%GR6)@Wf*3gm#V*lE=t8r*s}JV;k4j_xe5V8P^GThy>9Xu674Wg9c+gyV zaknPTtJj?zT{gXe4xxKbOt)>BpN*Y&7WHLVsY<*qgiLigosmW(wqY{H{DcrEI4nT=A`5vZ|@rN$*4BW z(2sC57^VNq9m_nwtd&$l`i9U^W>=;6ACSYYt-SJe0SQm$s0;JbA*ih0^ap>#A;_!+ zhR)Epj*U0YEn9_{ya){-nd9S{;!VF5G&vR*M?#c6I&6eBewhJijXroX-m!Q*Z)BPc zcu42KVd9<-B+!_$u|xTdb;S~>EWB_o*4(|ZTGyP^$*ybW#$a&DJ@kDD${sU5PVsE; zp;1){Xjrvwm#%rXd8(Y6S9`7bcn>2*DbSQ$0NF+&d!T*Ku>c25qqr`=tEU~%An}6} zbxv?BNQD*Gw@QxjdKCiI;-`CbZl!g+Ju)X@%(L%4#vP03(~X2MXqez*bKRHYjXS)? z5#w3vLxQOYoI~l%mDaJYv2_J~<8io>8h5MsFx;cn4!=gxxkaiMK*PIl+CT@yDxKV} z8tyD)SMV5$9xg*c8jA=Pjs0dgtY4YGTLI?oJrK^t`rV#v4)_Ibhv-@W zpnG)L*yTv{d*PfcNVH_hw9segixZ|4KU616yg?{cPjMN04-ts2Pt&=f(P2k(QP^}~ zk1AWZNrN+qtoOsuv?1Xy4$F0U<@&c-PZZ-lp7;XzLjt&7QHkzXQCWaGM6gs13{jTd_PB`>K zYxG7dP9-;v&L)r4De5&a`gF*9l*%UG%i$Po%6zY9VVxrx@Y2Q4QBg-q0SP4?EF4%1 z9g5W;!z^1g%F8U<%4`b|EHYi+6}Ft zVUZGr)Q0)lZ`Rbn1o)tf7s=@Y*YrRw@Ls)kT{CECsgNe?Y@cs8%P$~7h7zbgT|qvr zR2HF1Yl9R(U{g)kV{}yKRED^kRe;iaYH?_gxrPS{34do2GyfeX5zqoa95C(ya-X

s_YIi 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

*P2e53l-(sq0_)m;*@ zP_K_djLs=lB}!{p%l*YsL{C3{oBQKbM-qwLlY>~YPc*uh2!jr1N(`&|cyL`ZfmOWa zf9T`^uh%rsSEAnV$t|(u=G5Yc-$W)e7cNzVg}aNPEa`!y#pC2-jsqYa-g_9Q06>RD z-|*$z067xuG`DUbJd($1;52?!*+ZFoBb(7Md0q0oM%tKb4tRV;_N{jj=UQ`zF^8cf z$I2FdMwK@zIHg6i%Mg6a)yzl7q0+TAl#V4X@!92?Cr>|UcwZ^fmGs!SI=+tjI zxK==FT?AWLkdXKAr*Poeiy~9LvAYC0xERk3&=!G_=2=!6lA9k22t~SHidfS&+#iFO z13~N*b-p?1z-ujjUVqoC0N7{g*r$;JNO5bj`r6V~w8ZT85?#lr-g;^`#$ClIB}RSYN}A8F=b; z+FVb9V66MHk>{8bs|pHe#!Y*@QQR2nMQTvXC7O2fx($H@z&P!QEIR;+SrR5PFAk8Y zhZ8{J1}8Du6M8zixs?T0s*d&Unq>x|jStf4N@>bYK{BVvWKKqk&M8F+&G8^g9H*}e zU=1T=WjMIQV^~~z^K@8KKz8KkP9r1G$CbooQw>1fbgSJ(m`czGL@nBbVz**6mt$E+ z)3y!iWrG+56IE@i!!Icn&r#236HC}Ym>cXS{QSXEyf`6Nv#Ve{I_1GLty!{Lq_qw> zRU_6Thi+kTtKCk?M=6GBCigRlM_eVfQ=kvC6Y_tUL0(YrC6v=jtugeORw)Z?e3PDM z@V|7@@B9Zw!~%3Z!TKxXnSBI8D5t-zW{>HF(}#tp+DeBT(bL~+&fb$AJvDfp^$ z?TYnsDr9%f_L?W{-^CUR!Oo%*t>P>t*e5mfQo00Jnt$-nB**fk@L2cqy9s zGUT+rZY{LxPz4kXn))@6_emjl02*6o#?;%KARJ|wFZz~FNEgLsukV3$(M(7elzaQR z5EDkgSPm0mdcG)%A@i5%PY-Q%=bi(QC5ARazSW+9caw^h)mbkv3ugn zTlye1;U{?M5w>+Mg3{7517tIe=)NNpj<)oO$0k|v_u{9auH~f|hrQ?2Hq1=KMkbPD z$``0JWF7!%*5JyWQy`yD67#wDZ}K_(!%Dy}E8v6F6ONDUKYhJ=uJn7r1Rz22Rgs)@ zfZAf|=X%YRDsb~v=$jwheVN^6pGFBx=nXoA)H;k5Yq5*k{cYrUtyoOG@>?bB;_#!V zs<-2(uQru8PR;HTBCDDxx=HolGzJ2>ck1>af4PIU;{1JAB3?iL8@w)k7SX1u7YoxZ z`)GMS4qDuOO!X6qLwE7O+^dx$ql0lSJa^TLIIp#{+pG7u7!*AE(tNR^Kc9oob@kEQ zKw+9A^73-Ho^6^ev&S&G+sa&hhIvS1s`P`LJ=fXmgOf#WRp&@|ojgSs`;*k#v``@t zdhm*pv}zVAi2}hxtI18~Y4LIsjh^@L+v`b|xfSAiA9(awGn&Ykz9y@(v@YxUXi;om z%6mt1aKwe_dLHdU#U@nwJ=?UeTK$|kANF(ja>rrlqrjULIXc(P&b7Hrp5m1&ZTtEm z+}bTA`lJ~tV0XM;k~mBhcXwE3e9}Gqu>Iw>>lNk|`I!rE#Dy-PuX%3J3V3$OjB^^) zMC)KYj>bWQKKV409Re&-s+zHQTjVWkH(YAl*Bylh>Vd0`xMrnzHS)0wa9(#`@ej*P ztG$=qeb1%I9;QdwJe=*cGs4{%T2QsEk)Fm|N7BJMuZeYO;>CuTqvVJ6CepfHOM|k_ z+ogOu!Iu%;V^=9x*0qsn?#cP&`i*ht^Sr{sb^Wkel535&_&QMmg6_$`Y+u(AG3UP zIydgHXu0%073b~=kAH5192bT}N3bj-%zCC>E#!`Ke(lB|-rMDapCYoginN$|@zfg^ zGp0a|VKS8Q0tG7$d}^(K!Bn@nzA-?vrU*`9rfSfNp+GDrRWjg5)oT%9csC+aL~s`6fbOjAy5HHi3kRt zl}sw0(ggvVR=S;ucH`W#k()(|{LJpiHEc9o=Zyo5|PWbTKR2Y(zi#_Hkn@%}+rCbSe1Y zKkZU*md6PAMkX`@;2e5|tE}=s<#ukGCOYEW@U-|y`wB^c>#6C-^BfBR3Sj7OkpTA- zBK9Y~zs=$=8o5jFds=5hUv%b9`eoXZU^$anq>9wU73g-XbCu*6 z?5kvtNmYq59$~p0`W`bgqY$^MTsRpX-L0XeubHN%S;?G<*@x)ieLK&Y1D+3w?)Sn7 zLj}<3yIx2{0_axf;&@hd3)eh(BcdM(gmTlfFhG)v2Vkx{g{%Qw>h>hBNji!?E=DJa@)A78$kZH6U=qm6a(=c^Tg4=xC!@RAtZ<+a2)-kz zQw$OMZ|wcs05G+WTbu^JJLv|miLg1~VxpSJE)t~pw+MZ^=zib659O#q`=BuKTCg(i zJQsq*!35&jrGcXZxq-SW{0}G~N_dLVw&K;I=eIG)-uh5A72bTWjW++O#LQOHXbLA} zuU~9FPuf$KGwx{&`m+2u2GB(Ee?}9z;dKuI7*9?;$qw3Wsra)lkA8rvlhiJb!fpGC zi0a5do;_WSA;-H5C8ivRL%Gr%*dLH;f9Y5UBcjMYgToY3(1nzupKjZO?UGSgIAnC7G-b zuu;=?-zt?9jADkCH~uhi9&tRLigxU&#_OimXU}1NVOH<{o>{HhDg!9%Ps;x|pa@R< zagxhM=my^N{1+D@kmJG7etN|4+=oquHKi zd4EPsk$HS~xhLaYLr;8hlhM5zWrx*+diS>lH60()oZe~Mx#KWmvec1IW#)3h5>X{& z;JV4)Q{`5gE*;YXoZh*5&`^z3V%|6JzjEM-g!H+ReP0g-;EC~-^4DB==;X5)1uNi5 z@fZiGh>g~_rj#?rQsg0DZ_y*xUjI2!oZ*|Z(#+#5I5rOrOwXq6Fyv{qF1|KmjEvF< z+mD7QLFa(CfHP%tG>H?omBf4Wzruduq?Mp-ixNncn!n};6DvZ{Mi?!#BHU%1rTD{P zx)rTigHP*69lqz)s5QMoAC*QI#S2Sx?HrONP&Ukb4?t7euhhQZ(UeQJgWvYoi3qX~ z|NVn6{)(a~DFBiDciBJ+eM|t6zMe!*_-7)z3KEgzlj>*hgQ%PAv@-*5F89_ALx)g` zAcV9Tnuqau=2b-9{=$!V(GG{8H$+|VF z@GZpElS_i%f~E~`lh0DoKI+yrV1|FsAn@c{M3^Nj92y#^v@E`VPMd97_N__z8bK-Y zIhw%rvg#9prww^h6+$o&vf}ln-xz3Rvsu}dphJm0b1sa~s{FNmvQ{#oCk2d*tGTZC z)|l3Z;qW%5ZF*wmvUWAo41Ff_2xIkt7PhH!0ulUatIt&h^e>OtZCY)2)|DzI-c*`5 zo5i2Do2y=A=t&#W?J1UKToP>Hi56U$quVPA-EgckbjL9%MGE<*!bEB|%IdgZ!8h>6 zMcvBMfz2)DA!ZWIU;Nwm&tIp|V7xKm_C#st`yT|JZb~)xw`II6zVdg=1b)~=3*HnH zksn#mgCX5W(aQ7^b&s1JaaYxiXe|)^R@};@Oc4*e9B|Snk2pqy8(g&7h zU;Pz8{chA)ZQN-sY^RHZc|>t2Zrq?w3lf@>-kz_bqZlz3TXJzbuHf80g$87#85 zh{&bgkPikz*21e51nc}X%VUJUIm~C`o!55x$W8~M(n*#r5Qx`?e|F7b0-$RD)rciS z*5I{PZ!}*a<28&h zNfYcQtyHW`ARVe&Qk%5D;IYD7)h%A&Rp%+r7O>;y2I{lI!Qh>h8#>b(VnrDIfPqi1 zFY_X}@gVB`>;yQY|FZ~MmIR&9DlS}hMHRQzy5OVev$;{#GL$yl*gUmgQkon{sl_Pj zcYx~+BNQK|-F>!cnwyZxLhD^7A^CPqEk&xfu9i4YKBLqAR=G(K?qQG5eLbmaX$?U> zD;9T&y$qq{-;bY5fx=TF_S4Y2^C=Mqv)9D7v-!o79CMr&Zl5Kb{0Cnqc{`!$6ycu- zB_7I9s^5YicpGT|j>1}=NH)wm#SNpO{Noxnz#6Ew1UqrsLoQ(4cLs1WWIq+;!35?D z!FmzU@LZtsTZ--wXU*RGj&msj#K)PnA8e@F=Nd1$YAE^j$~AUgS{hJj^@@Qz0%Wkd z`{j`#$1#xsuusN1Ro5`x2+kOXfTqP%##~(7v!Fwl2_xZfoZmwh&8q~i4ojvc{PUof z2H19=&dXQTz~5)=YvWD;xH=$oU0?Q=rqogeR=S3x0suas^B)4||J8pgw=}vy_r2gK z^B2i#QV60!HE}}wjj=aX;FW{N>NRj=e~LgfZCm*uv=odJw}}08fwr=ltCSUDRQfU-Rdg_S)619EoVjc1wkpny}vX%BvFlC)G|!%!lrupLp@#Je>Ji zL}r>Q;`|g;{7BZNlv2||$KBT12K18Y*Guy1Upe&ymG%3*Rv6eGRPgS*IZtnyGCR$< z-Qhy0iO-5|+IL#lJVH19=1M#Ko|iP&2U)UEzl(C<)D^2tM}Q+BcP)(aF5d>W1P+Y4 z^_K9M_zr|W=*Am>Olb{B>^1(q5FBjG8Z`lr*?rGhY;IQbYgFp@Oej$Oz4L=8{GI~2 zk|k_PkMQ>iS~*W_qjcg}?j{r;m`SMRvyv|W(BNd!{Twu?-ak=Vu?uB*gw4VL))k_s zyPJ~@8+DxBzbnKH_@?;3<(qE>AR0>p&nesvg`hVtYeSZ~9#VOC?_DkoqY8Gf5X^oD z=#KPL5pw%a8i>om#DQe-IeRqH7}@7a_A2h?L;Xp1+3;!E^fKyK9ju2G@8z?BvVY+a zNq_^`#iQShgdIV3DYSl6M){ohh`ul-2a&Jrniok+Num82hxV_e$Vvv})*#yNFGwUV zV=%{Y-zPHlE|*^O28knC<8#~H zc~+wB$psZ?jMLV80h=A)o*GZ7imA*NOEH~0dO%#Zyr{^4yVaIuNZ)zP*GlhBa!1dN zL$zs;`iGl>4e0FRikXnSiWSjEMx29=7+hV{866H0sf&zW$KwxRmsKA<1RU7yqczkW z^|J4p8-qnAo-}f&xlAvX44myLutun_eoF==^Zb1+0tRCk1(hGI=Z>fi5>UbCvL25D1er#0v{w5X~?&eMcvJ*6O*Ala_K)uIi4 zkkRcw9I1#%hJFJ-?w29Jh|5C$P+O6OZ;%P2&$jFp=9=q()0Og?Jc`Xb%$^}Dh_pyK zd^`M?y8!y%=$ePxe12xFn`&h~wL$YZPqVU|0j2O5S@M%A(@(dL{joC>KR%?y{wq;7 zCl22^+!OTPQw{f~a&fJtr8xiL=J6$U3PwQ($;tlw38cwUiU7|lIfG~YLh|j`o_;$3 z63sU@UUBo?CaU2(f>IAF^wKhsd4O;tYSiLH_dC~5)N`c|%;;eJj%zVT*hyE=(B1;& z+Ru;p3xml^ofT`JYAn35B;T7tbKol)UWFD@0*-_|;^1#M5`LgqyUYtN$ja+}kwlbk z#9jLfRQ0)V#UioouGLdj#5Kxr-%rmJm(A62p%%*wQ@68o7^)adB+l1b4hWet73^ms80PTZpa3q() zi}uok>8;G#J)*6lS9Z}GOrb}>44!Z zIuX>T;&3enAIpV-FK(HkhI0Cgs4Wgb{c`KBnx$qDW90a5?Zii?PJ~uTQ&}Sjx^=Ov zz1^ps;Ph#CGkI1r9-wO}&69sBBg+5}BBpe5^6mkE*CT#UZ+sxa6j2H~w9zlsv+o7n zp#)zE9s<&9tC#^qZ_alOI!u=$@lK=nlRP2O0jZ9CUQDYlM#x{$0yB=C!135u)zdzA#nq!Et8V_k8 z%n>Dsh6VuY|7%0{XiW${x#^>7FL&$h+y8oCJv0Ln}MK!aLF5&IUq6CL@)l&B?UzI>Bw-kulAQlDfI+*2BT;eLK^=YsqzWobA8jNN>_vYd@RrPd7a{!>@ zB4Fr5dTd@=7@Z~!{^QO)PyO2850E{<5WJkY_YzZ{o&_q;R(&<#e z1tWh4G3TOJ7|dXe5{?$B7If5RiH+|OcBa?N-avEm46+_2EjMs4vRq|V{uggN4btLa zXxYg;cw0-q(jbBQGCA@W>;!nUZW2`+!lSwVmq!aa+nCk;G@mm3XS-p{<8t97aP?q9 zUz{D7E9-F`!fjo_^?1A$bpxX%e5JQM^UG5W>%MI-Eec^R?dIyfY1aXj+*rP>c;{jc z24UhUuQ#`;l7=A%{;l>7B+j&BiNj!=BZvw9Jy{w`Xf3qTzCUEz*JQU~>UEcIp9fZ9 z{{r|M9XbQBaG4Usv|vav-0!;K1ORLdO<_+;J*bjc2`QUeLR8)oi`Fo=c9kdG+wurE z#_~(n2_sNx3r)u_1|GX&Se>{WLT*2UnKkTc9WYcI63WT2Z=x(3t+4FQ3b8#8FyCBvvT7o;)7en8-elKsD(kl<(wv2q@ridkGqHh*-~YJon3U@VfzPL^@*Px z1}L1n*-@is2a+V5M#H~~&yo#33px1iTJL?k@qxW$)F{J(Aa0cLYNFCn8+D4duhxvl z$W&JAUuk3QNM^fr&&tB^yZL|=R4D(Dyh!l1vp#M17*!i;f+D2C+~jpQ=oQ})4LWgB z?$mjr$Q~HzwqOLQyQX0NI4@+g@Py}^?|1g#UkIqd zazVR%!i#fegP(Wxc!ksAy^t{`RlT!?jzb=BT1E#XcBb#W5^11BO*@|*rUCi~==tVYf_|$o-PK02OY$}Wm$(^ZUj!tq&m&^$vWUDvD)+N=J*5UP z41`~p)`W(KaYj1o)AL?j`k9F^!?qU0cclV0*8%~#IJPF4s%JMAOCcdYj*0o$V}e61 z`$epqjgaI1TG4ii53%SlF79|vOQEYOg(UK=H zFK2U%_d~VblHQ{Vo61R}!Swa5qP{50j@LSd-3?#5{n~UqL^fxnXPU|PvgtJ1gkGbp zLcB zx;|{5;c8!6dH{eaCT>26rOr!hCdau=hcQ+aHw~*IN$B)xfk)k5>*?ud zzF{;@y&qq_A<>L8IBNEYAUG{-g18crx&78YfJi);kyyt_eE9!yjeiEK-bZ-Cl| zpUfr|UFSa5brpiVcj=)Em#1JPg#O@bt;MvK?hh5^>GUh2)@o|)j|+36-*HJ=^9y|D zSa8oYgc=%yiMz(cMGN2ni4W&=j^#gH&jw_ic)xF=$3VV_Xf#S z!Q&S5fz`=TooGSp@tgs1CShZmwq58|YvD(H#kQ!vw_(WsuZNx2CSWlljT@CYTB8oU zu^6}|(qwJWQ4Bi1n1!FH7iu0U%_*gqu`Gg&DD-|fsM^gTh^K04do0CkAkVGU*CS*N zE;IY)eI;VDMXRHS*R+F_MTsl2J22hgyZ<+vSWzg#xI}~sjUAZge=>;GDVk!)F~2!R zk^Y4%OWPD7WlT5?p*t@5nWqWNB=CyR(22?u1m)zfju>Gc7u|03hH!MMH`|vuTm9SS z!&Mlf1R_#noEVV;kaBp5O14jxY5%7(4e@S>*0^K+tqF|)azfLlKNSM2dIlI%A&`mN zK_(`}KD}VXqL*WW!hYhW&AVmo)F zfL{-3?<}V?kS(m*t_)9dZXlKzGJ#R`}-zVk#@ztbF3mfBr+ z=xtly%&309QDNJ#^{U1uZ+579-3hjmZnl)9M2buChKmF;v#b#Wlsi zyxM!DX8;Pp!nIsG zpwq>FovV@37w`f-Z)RB70v$r};@9V|R&>QQyZ9iRmzx*Xb`R&`A~!-O-TUofU_ETQRFDsEM_^f}d#C3!GCz zoY1V@3B6Kdq0Q68w4ztB7H_5oqEF);Ms%TC!li}X;j`WJ#=^si^$xuA`Z|tccR^Pu z!*#YlK|+ZM6N4(1pc3(ixHyJt?RJ@zcCG34GNkW>&c*v0+!7w$%+q37_cTsj@Emg; z<9C{N7n54NUol%?KRZ*u1`o>M4Ff@-`mZ3c!ltADxZ}~F1}nI~B#e1ibZ?;K{hERR zP8(gx)kbd(L}hZWSbCIbkD5i7p|?z($OOnU}@g*gmUMN9jWR z8P?b`W+RO#{XOVtLrt1a!InzSDbRNpQ5e!A_#g(2xqliLZ6>J6KrId$(~ot8dSp(I zuyTO7eBy!72x-A3t)v(V25wr6W?%NWZq8uvbhB-D=>z5bQ1qzBcdv{57?oFP7i`O? zRcqdnE>$uvsJq+_H#8L6@;>IUm&Cfm$+Nk`0*40ZBKn%)s35JHyu8|cwDW?DmZ8HL ziaC@XB4C(V09%Uf$Z9OZs z-iO@kUur-wR6E*gyu_ zUg|P!c5B~KVONP4iSFawIhw1h4OfFpg!V1 zYs0P}p$Y^)(qMV5#j&&nOc+>GCcZsiST!=$79H|(MYKYZBVkVZDU(^U&soHSn#T-Q zX2Y<^mF5-WnmdfA8J%IM3V}8t*ddrP=?C5$Ou2bz@ZU(G8WYk?NWZCGGw#r``3Qg!VPqK!a+%1SW`Fau>_bkcU4A z8)0?UzqP$6*)ujBwBF=-TWrDewe9kV)8wYZkEOL06QF0SiP}ie<4p5n-YnyzGbax*aoi2 zfQ{HT!Nj&61I+uqs_s2`;%n5Mz=->ZwsowM{Vv5&(;~9qv%ucN#)ux1LWv#BoJuP* zbVmgHS&bL!IAkLd$y|jANJO2-bQd-4Zr&c}v~x8!aoQr~J?p83BLBLwR|`;({(d`L z(54!(bbUkk+a~7fZz-Dvkm)Xq-o7q-CkSOX(U|kP@p+U58=v{=sfxKdG%__FHu$9{ z%M9M?FcGe2lW@(X@lmS86EdJu!BIcyFO&OTlWZ%)t#vi+bW6CVA?X#poq8&%j%2xz zD@h9V;IR6Q@fx@pbx^DTii(VXYp0on(HOC%^ps)Zg6dS3&1y!-qfVE}l2^roid4rY z!iH!+g`(#QX7E;Hb97K_Neyb!;l>%_#j_vek1bEr?}~>!`rgjRq>I1lX2Ulih8!|A zyWdh$6&%Aw*AzPBVvzsvh@gS9Nqk$s7IR89V>rzA>0(W8QiP!=DzI{Qyr#pHaUEB( zE;;`QYV#v{bnSA}Ie9Jpr#_xnJtpFO;}ZW5YwsBkXWOp}r->dZx-b!m8a+ys5fPC{ zqC^;i86}8Lw9!QkAtHJYq7FtUYV<@8#^{V1Mjvf3yw}M6JnP=~Uh7?ZuiyTVZ^U(- z=f52P<2cUq%Ajlz?x1XVyPv!W+CccVVa+m9GkRF1_jd|eko9;rR;P}sr(TxgD>9^O zrIf6=!}D(v`7M}oBy;OG5h>E!BaISS>kUgrQom1}HM=*4DyL2)lkJA&>a4}(mB98j zFpxBhDrS|xN+-|qz zHye%cJT_y5%!R1U(OM0&S9@PJP7Dw-@pdu!m#emxEzP&)dUMPgLDCu1kxvAuwdm=i z)%va5yzL8flz_v55%XM7!K&$VGbe83lw`o+;#;@-YE)sbtjmYW>@a(GH)q2?r({iD zcj?tI{+*FKg(pz|+20p!d=mU!YN+R6)Y02L_2kMzY*9tv&XW%K{IUPMpqZR>x%K_* z>&3?Us=>2>>jCgFF0;Q2b1zRH>&?UKt1}{1`!>y>b7AMaM50nX%5-dM*6pP>SD0rD zl`4C-pJ1FCEJo~pfbW{T>Q-g3o1l(8iXI*pt&5R(GpgcdcEJhTuby1-Ms~InnR_@r zaa5uM`uKHsb=2(;Sh9W)O%~$BJ_Z!)I2#L#`Q?DDebO85@!?S|fIO%kC5NYeuiFV} za7QXFFfP?6Z|?E^t{wwzCsY!rO=A~*ox#D?y?Y(r1?#dBdJltEAcqvw+_ReAMmu|? zYl<#V4Py_6L|kBWIqZq& zb@ZcY>c`G4QEYUcGl1(mS=&%uhxNCP1QcJcVSWd=BqLoDqAwPv;l4QM?Z4Syls2~B z3@6n&h5_C=7r>MC`)b1C^Ke)U@{R{jlS4$#5^vbbeceYUPr?Q3_kH&Tm)@>@TkKb4 z(2x26p%(Sa$riQl?)rMY(^XGfxA~b7&#YL8x&C4PUSt^hWLyKMSiI_Le^SH|or#Us z|InNPoc0Fz?#nn1kLx5)iKo2fmopEY@Geu%W7bM1l2{=Nyk@uUry-ZwokG%+*}BPS zp4d+K{FKZ5lq-tC>%rT-z>c)en|4LgB`Jq%idS@Oo*dam}pm+{%55q%ijo^YM0sm!Krq!-vz>u3D2ea{oe z9v&sv`F>AIu%VRgmTuWAL`<4Beyvo!%%YRt>o6k}{oLi4)pO(5L&1-!4;Q#TTQdxW zbh|+-rYtl@y?c{y(wL<5)@}y^V27nVg6oG4px8}rzYslGN!<6&28@;xXMhvjr=Li% zav0pHq4L7EHexHXffGl7%Si6RWplu;i(vXJatA?3dx8Q0Cy^)xE(IkelK}iN$#-`2 zX{43K{(ND@wnPdz+)H`(P&?Q@^X*{l6xglTdlKp;WDlA9>%;tw;UX}qCdWP{^yGwEL}9x^J&Bj5S2gBHO#-Ca-OR$ z!gQpXz{95C1(|y-q8v+KGJ3Zuq@3TVriOc_Rfw2k7ivIhktc4!48`-D=YNM~ukU8y zor<}Vae^ngiVY9O7>6reFwwP#zt$;KUsb%B>_WKCt_qjUdMR0|?w4VHE=kU+i-3!7uL7BC->w?3hEgzi_x?|S5RxF+a5%=(@Z$W+d5Ce7n>cI zU1Qz4WtKmAF2(R2XGz@Kl7K>%g!;nWF%i0Nev2pK53{HV=_82^0dWaGEV| zw~-jgV-^3nDz&y)3_t29TT}P)g-HOXd>-%D7qB_u1^ndXirDtU(00^nuTDAZBdf)4 z_-DUP*|100Pk+uw0k}oSYep>MOAM)rCQavpyWyY9#(;}yd1y{OCq@8#LEnODZN)}; zB=v+)$75`tWlBt)jPos?Q2wcdR@@))Z`^!2KG0xr{`{PNcKbgzX=TL2(2IfP-I-k| zI6tX|4eS$jY{6K4`Cf?Oq>Ayo%~$Sq$^*2T=$5+<8~fi0<2Et>xRBFdun<d2iG74f|&`87l;GF(q=X+ z#6wJw#j+Rd$RTFk?;i-9_*?a!Te`hi%mZJ|l{QCocUacegDo5}Pml?)zEKZ5xv3i; zEqgy8>z=zGtv!@`$P^X*dn{UF;_2eiEHje-$e$+>S!-21mNscyxV4LIUQcIF9AeJX zqu*`85}68A4eEGk89-R(1e;{Zaf_wORj<4DTXzxKvhP!Yqi4l4+1Wb>2SwBXa}{kb zSGmaB*uhCem(y&xMZoB>JIc|YLS*Uq{?iFTuFSAjiiQbs{`BT#qI?)ku)KUqMCXA4 zPd7{pSgRM$&>YsYn)CTssg+8j=UIGM66tBZX!cQ4lra<#lJENi457_)f}sZZ}>Z#rEe=gg;xKu%13Nidv#2)5`D3l7zL!b*Lx!tms~Jz( zWX0dqD#sNjfruv@Jg+BI>|mpL#LYc{&U8|Guuj7OT%#siU}0i{%d||wszlHOCPBwu~<*u7uHgw#Vch|@~s2G!PANV0L zxigCYoeY6DJV&JX*8LXrPA^qGR(JwR4~2M9-)#_ykF6;@BxQB}&UU-~?O7IV_R#_J z@)W3wLEmGN$B_t4I}4GntUI~wY>#4TK6sV5?xG#cml;Is99)*lE)`VvjHbCRKV=6z zEm1L5G;ceJ-fFo>w)uSl;w^Nn8P3p3LPZZfa$`h~N)?l42xl|Hil)gvT zusJ%eD3Y!1nIg^ln=y$f5l{TNJ?r1T%e?XYXRzu~#=^WE;P(08gq;&sFJ4((Kg*;_ zxJ~j>x7k{ln2cccvUv6MRw5zt*&m?xYs_q5b=tURtAb|IMWTAW%^Poj&=zM8a!1zA zmo%O~=#%c1o7Tjt#xDmJdfl--*-PFt|6T9B9fE%4K%F4GW@0gzlU4~6nB6&gYMbt@ z?@*I!++V}-1{K3!OUOA%+(AhUI`tKL?fe-Bb~kqUepPzQ;jgoL&3uD;4H-9Or{Yy- zRakK{POmBl2SY`mco#$bo}nxGaUl|-y)Sp{IaNQlf|bQ|nN-4@z^wKgU?Mp^pq`zw z9#9NT4fFb#AYr+@N_wIy0pE1Ib0ri#O~%vf^=(~Uy`X6k!7b7{&nern`M=SycL5oO zsp~Yo5_arP4j>1w>aZIPKnkPX_Nw0KEv>GeSjg3 z1f~$PrT38*sSAL%Ip1zeBL>5}=;QbFQ6fdQwr=a0-U$5zt5K?D+1Iw--aXm2YKbTa zZV%N~um^s`m8@ah!G=2|EVVtg>}s^MsY~s-?i|g~c5y;lP)6J6l2@ex`|8{8_S=n0 z*Xks_q6HiJA^h_q&~`7$2=TFbm*uj-8Z!yE45m;T!LwQ`9E&;BE?_g(>Wg>B~i>z)f$lI&Q~% z#f!Kw+|hf;Lf_V!WV`6@w3zHgmF&H+>6J7(J$1p9Feu{QgcvNeW+~Sd1en2r2>pLk zwKLn?=zp+O$SQ!P8WlKIilm?CX8`QJ(r>mQ}aY*uWgQ<v`(&)JUirA)TO_`xewugc z`|LsZlv{{Y8En8-;aeyKjA=zr$`jShlkuc=mqS9J_^5&Ba=8}+k;EI8a;JUHr0rQT*&0&)WU=p;yLAL z#TUqw2lDrm-_zH6X-*bNq*nYJHVh}5vR2tiS5zjXoW3%_ycEMPc?Yk-r^z)}nM$qt zhV}p{O^W0GKle1;LImm!t&XCQi(IRF(Ew2O51Yz@4>z+@-*hkxm;(o2`&}p*=nLzx z>ft^5IfR6TDJMuU{`$3Sl}y|Er%<~ z;aju`QpOjp`|6~vtGrwYpYkRE{2wD=lad%-@!^!`SGk7e2F&`xr=)T@8?VZ{e-UKB zP#MR>@-7`++Kdz?BHaVTTOVae$jYC+q_vgE_JW@8AKpf1Zu`mWz&zO z%%;`-bI{T1ZwDQTj96cDfRCqDd6+)oDMVZkP+yV6Gmn-_+8D^(n$z#pBXnQPqo|m1 z*KU%Q1`LzlBJz_dIQzg2a;*}O54`841!bKPW=Bh{ z^LL^6Ju7eT8Q4;BHmqNRu~Lw5Xuf^2qEDJcTfXP*bFRPU<&{sI%F%f@$=++rw-(+Y z<-X}l%ko^U*zcy1qN04!F`X56OzMqv?&lFVUwn1BB2V(}q&6wOv#0x+NNJ7j-U1Yy zTGM^Yc46ML;isu>L+opVRBY);=FJMh2Iv`9fzGQ!>N1m6j^eaZg$5P7hVN20LJ(od z`prv+i{!E~&&NHfq7T-9ogr^S#0!$@ffr>s}2P{s>^Ahej&6 z4dXf9SnlJZnT((wx3+4itjM<_H2fj7_c|*jCobBp&wy5H6Yg!GVQOjfOzAmRJeGWW zy>gm}fWCY46MF`~fiH9D?Zqi$XIeU<4YrzTK8gGkX0*o=yCgK9?yyG_3lG0Y``z9UW*%2JCye*CQ@NF;`(uXR#8D+hQqN?u_E$_Pyg8+W@b+LT6d5LwljDUF7Zl?*0AFVbT*9RKs4m z&|J)#oyW)upVJ^+3P>fDjJ3yN=^*q*0IZ8}>0+42pah!-Tj5rVW}(?#+Z8-~dDu=7 zM@}t0{9re1qPoeSbbZ$<)oo$jY`ykOfv$LPv7)fsT(fFx{wpnNn{}7-RBK}sP9Mz6 znjL)HX|B(Yw%fUz&+QIPqVG4J!=u_4MrA0GKhwY~M_0RkNw?dlu zYDk8fWl9Na7`?>P1B@oZ);iw z6dKmSvcC@6S2R{dx}Le(UfgEAryMomxD!3YJjQp85_y&U1cKbectbW`c{PYMKig_- zLNGzww5|?+(Pd(i-tQICmzJVL%E#X=&HfEh-+cEz3%f65EIkl{7gG9g6~Rq`+&8(+ ziRTrV+0WdH(DjEPHIcM@PwR5FuIdv;{nImHb+JfCUNcN|0Qv?&-Lrw>E$s4G&i?l} zJP^`2+9Xj>v0j<=*bo%Mtb6TPHX;DR^|=^bb$e|b|G|I|*j?n*uCjl)?icf2hoVF0 zrWqoOI?V`QQY-=2OS``}kq$CkwM{gbuuW`LPQ1n&9b}=&_hB_y{q;cR4ojuB(IW4@ zJzmi6S-po^@q>Gk89E#}uQJouhWydSGJFtZfEZSy5sCHkbD{@VxzQTuy~sUxSE~FY z;_?dWlVeCXBFt;Ps(gM+)6!t6MDvrJw^t6d{OVx7I!eP%Gd1AmiHN29LMDA>Vuck$ z6??W>>Il_Q#lXwd2;HqawVXlbDZSnHncq9QgN`mK)F)I9k6o2pe`MW?NZmL?X&rmxmp9PL~#9$C;}2`$u%5IgqZch!pWk`@#mk zIFd{ndZ?d$MtRl^8kUGcm`Bk@-s;UXD((Z#mmXhn`(zKmIKz+hx3$!1q1_SUr7!V6 z_?!4{&Q>hbb!xD`b_*^XW<#P1d)#0Avay2I1_z)wZYltaWY0EN|D|H-z*XY$by{t8 zU|-{DL>GX6Nqr&b5Jg~ZxY%L@KhxPqH_FM1HWIEMHTQtzb(>R>U6(WFI3&oC87WC; zjJfJ=J^t~G{Y>-6Uc8qiR zK;N5xeBeZDQ&nw?y~gWApR5LM%9q90BS(``a{|?2EuGP%2g@yhe~&KdO_dsETC2F3 zU^IK_TP3r%fgn%8-KVFWGxY0sGBU-8sksP?XA$E&qGz@_&aU&*X>{|^Lw9O(Jmxqt zC`%OI%}1V-2wrerC_XsXa7{fmS-@57qiEtwzYo26S8~jk4)DB>FE2Av0r9O%0UBmo zXbz=YXr|&SOaC6yMB3IgdtSXSyNI~%?J@j}z=FtLHo%D8lkrcM^Q{P6bP#Rf#{YQU zgqxS!7mSsjb=u_&Fn-gvH5ajgIO{N$vpqqq*A|nI;m=nLF1+|~2B>w7a{p25l)-N!H>BnogD~HgkYl%= zUH7DMEcWkx(9UWW>uOTC;?3f*-GF>3HtEu>$lw)JGIM9UlJ7$m9bK*R_Ow|%(6gR z8!dsC7u@ga!FbJvNd&a;M%}0th!BS8@Nv%Cn^I8SOUB8m`@uV#w;Jdwx#Q9|u+cAz z`#UdoJ|7EzP*{ZYPKRe6Wwtf(L3h0G1kFEUT{KKJd<(1gniMmyDN8%u{$`KIS_D`; zjkm|(D~kN40|ShvNeC|V49BOQ)4XtQ`bS>Cybk&GJZ8H`9#`dfO23)dzAHI!ATK}2 zFIF{u^YCaWv{TSe!(zx$^qPt4b609DBusFNhKlJm>pREtABZNbQ?g(n`CjOcU8=

FNPU}Y6a5dU2eq;uA;jWvLHQzu`Y(f?}4KD@n? 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 @pIs2=l}{ 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%0AT*HlGjI`W_W&emq_8%3^zs+~ZxO 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 literal 0 HcmV?d00001