From d85140a300bcadc7b2010adda61b408bc28e29f9 Mon Sep 17 00:00:00 2001 From: Heril Muratovic Date: Sun, 5 Dec 2021 18:41:41 +0100 Subject: [PATCH] Initial commit --- .gitignore | 33 ++ .mvn/wrapper/MavenWrapperDownloader.java | 118 +++++++ .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .mvn/wrapper/maven-wrapper.properties | 2 + README.md | 60 ++++ mvnw | 310 ++++++++++++++++++ mvnw.cmd | 182 ++++++++++ pom.xml | 73 +++++ .../HexagonalSpringApplication.java | 13 + .../config/RestTemplateConfiguration.java | 43 +++ .../adapter/persistence/CustomerAdapter.java | 25 ++ .../persistence/CustomerRepository.java | 13 + .../adapter/web/CustomerController.java | 37 +++ .../application/port/in/CustomerUseCase.java | 11 + .../application/port/out/CustomerPort.java | 11 + .../application/service/CustomerService.java | 28 ++ .../hexagonalspring/customer/config/.gitkeep | 0 .../customer/domain/Customer.java | 39 +++ .../hexagonalspring/customer/dto/.gitkeep | 0 .../hexagonalspring/customer/mapper/.gitkeep | 0 .../customer/validator/.gitkeep | 0 .../adapter/api/ExternalProductAdapter.java | 49 +++ .../adapter/persistence/ProductAdapter.java | 25 ++ .../persistence/ProductRepository.java | 8 + .../adapter/web/ProductController.java | 50 +++ .../port/in/ExternalFakeProductUseCase.java | 10 + .../application/port/in/ProductUseCase.java | 11 + .../port/out/ExternalFakeProductPort.java | 10 + .../application/port/out/ProductPort.java | 11 + .../application/service/ProductService.java | 38 +++ .../hexagonalspring/product/config/.gitkeep | 0 .../product/domain/Product.java | 44 +++ .../product/dto/FakeProductDTO.java | 18 + .../product/dto/ProductDTO.java | 18 + .../hexagonalspring/product/mapper/.gitkeep | 0 .../product/validator/.gitkeep | 0 src/main/resources/application.yml | 43 +++ src/main/resources/data/hex-schema.png | Bin 0 -> 102468 bytes .../hexagonal-apis.postman_collection.json | 136 ++++++++ src/main/resources/data/schema_and_data.sql | 35 ++ .../HexagonalSpringApplicationTests.java | 13 + 41 files changed, 1517 insertions(+) create mode 100644 .gitignore create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 README.md create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/com/hedza06/hexagonalspring/HexagonalSpringApplication.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/config/RestTemplateConfiguration.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/adapter/persistence/CustomerAdapter.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/adapter/persistence/CustomerRepository.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/adapter/web/CustomerController.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/application/port/in/CustomerUseCase.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/application/port/out/CustomerPort.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/application/service/CustomerService.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/config/.gitkeep create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/domain/Customer.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/dto/.gitkeep create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/mapper/.gitkeep create mode 100644 src/main/java/com/hedza06/hexagonalspring/customer/validator/.gitkeep create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/adapter/api/ExternalProductAdapter.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/adapter/persistence/ProductAdapter.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/adapter/persistence/ProductRepository.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/adapter/web/ProductController.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/application/port/in/ExternalFakeProductUseCase.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/application/port/in/ProductUseCase.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/application/port/out/ExternalFakeProductPort.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/application/port/out/ProductPort.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/application/service/ProductService.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/config/.gitkeep create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/domain/Product.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/dto/FakeProductDTO.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/dto/ProductDTO.java create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/mapper/.gitkeep create mode 100644 src/main/java/com/hedza06/hexagonalspring/product/validator/.gitkeep create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/data/hex-schema.png create mode 100644 src/main/resources/data/hexagonal-apis.postman_collection.json create mode 100644 src/main/resources/data/schema_and_data.sql create mode 100644 src/test/java/com/hedza06/hexagonalspring/HexagonalSpringApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..a45eb6b --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed 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. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..a9f1ef8 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.3/apache-maven-3.8.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/README.md b/README.md new file mode 100644 index 0000000..af655a4 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +## Spring Hexagonal Architecture +This project illustrates usage of Hexagonal Architecture in Spring Boot. + +The hexagonal architecture is based on three principles and techniques: + +- Explicitly separate User-Side, Business Logic, and Server-Side +- Dependencies are going from User-Side and Server-Side to the Business Logic +- We isolate the boundaries by using Ports and Adapters + +Outside the hexagon we have any real world thing that the application interacts with. +These things include humans, other applications, or any hardware/software device. They are the actors. +We could say that actors are the environment of the application. + +Actors are arranged around the hexagon depending on who triggers the interaction between the application and the actor. + +### Hexagonal architecture schema +![alt text](https://github.com/hedza06/hexagonal-spring/resources/data/hex-schema.png) + +### Ports +The interactions between actors and the application are organized at the hexagon boundary by the reason why they +are interacting with the application. Each group of interactions with a given purpose/intention is a port. + +Ports should be named according to what they are for, not according to any technology. +So, in order to name a port, we should use a verb ending with “ing” and we should say “this port is for …ing something”. +For example: + +- This driver port is for “adding products to the shopping cart”; +- This driven port (repository) is “for obtaining information about products”; +- This driven port (recipient) is for “sending notifications”. + +Ports are the application boundary, in the picture a port is an edge of the hexagon. From the outside world, actors +can only interact with the hexagon ports, they shouldn’t be able to access the inside of the hexagon. + +Ports are interfaces that the application offers to the outside world for allowing actors interact with the application. + +### Adapters +Actors interact with hexagon ports through adapters using a specific technology. An adapter is a software component +that allows a technology to interact with a port of the hexagon. Given a port, there may be an adapter for each desired +technology that we want to use. Adapters are outside the application. + +A driver adapter uses a driver port interface, converting a specific technology request into a technology +agnostic request to a driver port. + +A driven adapter implements a driven port interface, converting the technology agnostic methods of the port into +specific technology methods. + +### Contribution/Suggestions +If someone is interested for contribution or have some suggestions please contact me on e-mail `hedzaprog@gmail.com`. +There are more to come from hexagonal architecture and first I'm planing to write tests for given examples in project. + +### Author +Heril Muratović +Software Engineer +
+**Mobile**: +38269657962 +**E-mail**: hedzaprog@gmail.com +**Skype**: hedza06 +**Twitter**: hedzakirk +**LinkedIn**: https://www.linkedin.com/in/heril-muratovi%C4%87-021097132/ +**StackOverflow**: https://stackoverflow.com/users/4078505/heril-muratovic \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..a16b543 --- /dev/null +++ b/mvnw @@ -0,0 +1,310 @@ +#!/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 /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="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..1e9cd46 --- /dev/null +++ b/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.1 + + + com.hedza06 + hexagonal-spring + 0.0.1-SNAPSHOT + hexagonal-spring + Hexagonal Architecture With Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.apache.httpcomponents + httpclient + 4.5.12 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/hedza06/hexagonalspring/HexagonalSpringApplication.java b/src/main/java/com/hedza06/hexagonalspring/HexagonalSpringApplication.java new file mode 100644 index 0000000..96db198 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/HexagonalSpringApplication.java @@ -0,0 +1,13 @@ +package com.hedza06.hexagonalspring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HexagonalSpringApplication { + + public static void main(String[] args) { + SpringApplication.run(HexagonalSpringApplication.class, args); + } + +} diff --git a/src/main/java/com/hedza06/hexagonalspring/config/RestTemplateConfiguration.java b/src/main/java/com/hedza06/hexagonalspring/config/RestTemplateConfiguration.java new file mode 100644 index 0000000..a15cdd8 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/config/RestTemplateConfiguration.java @@ -0,0 +1,43 @@ +package com.hedza06.hexagonalspring.config; + +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.TrustStrategy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import javax.net.ssl.SSLContext; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; + +@Configuration +public class RestTemplateConfiguration { + + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + @Bean(name = "restHttpsTemplate") + public RestTemplate restHttpsTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException + { + TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true; + SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom() + .loadTrustMaterial(null, acceptingTrustStrategy) + .build(); + + SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext); + CloseableHttpClient httpClient = HttpClients.custom() + .setSSLSocketFactory(csf) + .build(); + + HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); + requestFactory.setHttpClient(httpClient); + + return new RestTemplate(requestFactory); + } +} diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/adapter/persistence/CustomerAdapter.java b/src/main/java/com/hedza06/hexagonalspring/customer/adapter/persistence/CustomerAdapter.java new file mode 100644 index 0000000..ba39e8d --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/customer/adapter/persistence/CustomerAdapter.java @@ -0,0 +1,25 @@ +package com.hedza06.hexagonalspring.customer.adapter.persistence; + +import com.hedza06.hexagonalspring.customer.application.port.out.CustomerPort; +import com.hedza06.hexagonalspring.customer.domain.Customer; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +class CustomerAdapter implements CustomerPort { + + private final CustomerRepository customerRepository; + + @Override + public Customer save(Customer customer) { + return customerRepository.save(customer); + } + + @Override + public List findByFirstNameStartingWith(String pattern) { + return customerRepository.findByFirstNameStartingWith(pattern); + } +} diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/adapter/persistence/CustomerRepository.java b/src/main/java/com/hedza06/hexagonalspring/customer/adapter/persistence/CustomerRepository.java new file mode 100644 index 0000000..dd9ac0e --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/customer/adapter/persistence/CustomerRepository.java @@ -0,0 +1,13 @@ +package com.hedza06.hexagonalspring.customer.adapter.persistence; + +import com.hedza06.hexagonalspring.customer.domain.Customer; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CustomerRepository extends JpaRepository +{ + List findByFirstNameStartingWith(String pattern); +} diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/adapter/web/CustomerController.java b/src/main/java/com/hedza06/hexagonalspring/customer/adapter/web/CustomerController.java new file mode 100644 index 0000000..f5715ab --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/customer/adapter/web/CustomerController.java @@ -0,0 +1,37 @@ +package com.hedza06.hexagonalspring.customer.adapter.web; + +import com.hedza06.hexagonalspring.customer.application.port.in.CustomerUseCase; +import com.hedza06.hexagonalspring.customer.domain.Customer; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/customer") +class CustomerController { + + private final CustomerUseCase customerUseCase; + + @PostMapping + public ResponseEntity persist(@RequestBody Customer customer) + { + Customer persistedCustomer = customerUseCase.save(customer); + return new ResponseEntity<>(persistedCustomer, HttpStatus.CREATED); + } + + @GetMapping(value = "/by-first-name-starting-with") + public ResponseEntity> findByNameStartingWith(@RequestParam(value = "pattern") String pattern) + { + List customers = customerUseCase.findByFirstNameStartingWith(pattern); + return new ResponseEntity<>(customers, HttpStatus.OK); + } +} diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/application/port/in/CustomerUseCase.java b/src/main/java/com/hedza06/hexagonalspring/customer/application/port/in/CustomerUseCase.java new file mode 100644 index 0000000..d4294cc --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/customer/application/port/in/CustomerUseCase.java @@ -0,0 +1,11 @@ +package com.hedza06.hexagonalspring.customer.application.port.in; + +import com.hedza06.hexagonalspring.customer.domain.Customer; + +import java.util.List; + +public interface CustomerUseCase +{ + Customer save(Customer customer); + List findByFirstNameStartingWith(String pattern); +} diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/application/port/out/CustomerPort.java b/src/main/java/com/hedza06/hexagonalspring/customer/application/port/out/CustomerPort.java new file mode 100644 index 0000000..3f5354c --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/customer/application/port/out/CustomerPort.java @@ -0,0 +1,11 @@ +package com.hedza06.hexagonalspring.customer.application.port.out; + +import com.hedza06.hexagonalspring.customer.domain.Customer; + +import java.util.List; + +public interface CustomerPort +{ + Customer save(Customer customer); + List findByFirstNameStartingWith(String pattern); +} diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/application/service/CustomerService.java b/src/main/java/com/hedza06/hexagonalspring/customer/application/service/CustomerService.java new file mode 100644 index 0000000..af8f022 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/customer/application/service/CustomerService.java @@ -0,0 +1,28 @@ +package com.hedza06.hexagonalspring.customer.application.service; + +import com.hedza06.hexagonalspring.customer.application.port.in.CustomerUseCase; +import com.hedza06.hexagonalspring.customer.application.port.out.CustomerPort; +import com.hedza06.hexagonalspring.customer.domain.Customer; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class CustomerService implements CustomerUseCase { + + private final CustomerPort customerPort; + + @Override + public Customer save(Customer customer) { + return customerPort.save(customer); + } + + @Override + public List findByFirstNameStartingWith(String pattern) { + return customerPort.findByFirstNameStartingWith(pattern); + } +} diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/config/.gitkeep b/src/main/java/com/hedza06/hexagonalspring/customer/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/domain/Customer.java b/src/main/java/com/hedza06/hexagonalspring/customer/domain/Customer.java new file mode 100644 index 0000000..99fcab7 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/customer/domain/Customer.java @@ -0,0 +1,39 @@ +package com.hedza06.hexagonalspring.customer.domain; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import java.util.Date; + +@Data +@Entity +@NoArgsConstructor +@Table(name = "customer") +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "first_name") + private String firstName; + + @Column(name = "last_name") + private String lastName; + + @Column + private String address; + + @Column(name = "created_at") + @Temporal(TemporalType.TIMESTAMP) + private Date createdAt; + +} diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/dto/.gitkeep b/src/main/java/com/hedza06/hexagonalspring/customer/dto/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/mapper/.gitkeep b/src/main/java/com/hedza06/hexagonalspring/customer/mapper/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/hedza06/hexagonalspring/customer/validator/.gitkeep b/src/main/java/com/hedza06/hexagonalspring/customer/validator/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/hedza06/hexagonalspring/product/adapter/api/ExternalProductAdapter.java b/src/main/java/com/hedza06/hexagonalspring/product/adapter/api/ExternalProductAdapter.java new file mode 100644 index 0000000..906a6c4 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/adapter/api/ExternalProductAdapter.java @@ -0,0 +1,49 @@ +package com.hedza06.hexagonalspring.product.adapter.api; + +import com.hedza06.hexagonalspring.product.application.port.out.ExternalFakeProductPort; +import com.hedza06.hexagonalspring.product.dto.FakeProductDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.util.Collections; +import java.util.List; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ExternalProductAdapter implements ExternalFakeProductPort { + + @Qualifier("restHttpsTemplate") + private final RestTemplate restTemplate; + + @Override + public List fetchAllFakeProducts() + { + log.info("Getting fake products from external API..."); + + String url = "https://fakestoreapi.com/products"; + try + { + ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>(){}; + ResponseEntity> responseEntity = restTemplate.exchange( + url, HttpMethod.GET, null, typeReference + ); + log.info("Http status code: {}", responseEntity.getStatusCodeValue()); + log.info("Sending back to client fetched fake products..."); + + return responseEntity.getBody(); + } + catch (RestClientException e) + { + log.error("Error occurred while fetching fake products. Error message: {}", e.getMessage()); + return Collections.emptyList(); + } + } +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/adapter/persistence/ProductAdapter.java b/src/main/java/com/hedza06/hexagonalspring/product/adapter/persistence/ProductAdapter.java new file mode 100644 index 0000000..ec942d7 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/adapter/persistence/ProductAdapter.java @@ -0,0 +1,25 @@ +package com.hedza06.hexagonalspring.product.adapter.persistence; + +import com.hedza06.hexagonalspring.product.application.port.out.ProductPort; +import com.hedza06.hexagonalspring.product.domain.Product; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +@RequiredArgsConstructor +public class ProductAdapter implements ProductPort { + + private final ProductRepository productRepository; + + @Override + public Product save(Product product) { + return productRepository.save(product); + } + + @Override + public Optional findById(Integer id) { + return productRepository.findById(id); + } +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/adapter/persistence/ProductRepository.java b/src/main/java/com/hedza06/hexagonalspring/product/adapter/persistence/ProductRepository.java new file mode 100644 index 0000000..d0e87fe --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/adapter/persistence/ProductRepository.java @@ -0,0 +1,8 @@ +package com.hedza06.hexagonalspring.product.adapter.persistence; + +import com.hedza06.hexagonalspring.product.domain.Product; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProductRepository extends JpaRepository { } diff --git a/src/main/java/com/hedza06/hexagonalspring/product/adapter/web/ProductController.java b/src/main/java/com/hedza06/hexagonalspring/product/adapter/web/ProductController.java new file mode 100644 index 0000000..1a00ba7 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/adapter/web/ProductController.java @@ -0,0 +1,50 @@ +package com.hedza06.hexagonalspring.product.adapter.web; + +import com.hedza06.hexagonalspring.product.application.port.in.ExternalFakeProductUseCase; +import com.hedza06.hexagonalspring.product.application.port.in.ProductUseCase; +import com.hedza06.hexagonalspring.product.domain.Product; +import com.hedza06.hexagonalspring.product.dto.FakeProductDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/product") +public class ProductController { + + private final ProductUseCase productUseCase; + private final ExternalFakeProductUseCase fakeProductUseCase; + + @PostMapping + public ResponseEntity persist(@RequestBody Product product) + { + Product persistedProduct = productUseCase.save(product); + return new ResponseEntity<>(persistedProduct, HttpStatus.CREATED); + } + + @GetMapping(value = "/{id}") + public ResponseEntity findOne(@PathVariable Integer id) + { + Optional optionalProduct = productUseCase.findById(id); + return optionalProduct + .map(product -> new ResponseEntity<>(product, HttpStatus.OK)) + .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); + } + + @GetMapping(value = "/fake") + public ResponseEntity> getFakeProducts() + { + List fakeProducts = fakeProductUseCase.fetchAllFakeProducts(); + return new ResponseEntity<>(fakeProducts, HttpStatus.OK); + } +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/application/port/in/ExternalFakeProductUseCase.java b/src/main/java/com/hedza06/hexagonalspring/product/application/port/in/ExternalFakeProductUseCase.java new file mode 100644 index 0000000..aff9067 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/application/port/in/ExternalFakeProductUseCase.java @@ -0,0 +1,10 @@ +package com.hedza06.hexagonalspring.product.application.port.in; + +import com.hedza06.hexagonalspring.product.dto.FakeProductDTO; + +import java.util.List; + +public interface ExternalFakeProductUseCase +{ + List fetchAllFakeProducts(); +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/application/port/in/ProductUseCase.java b/src/main/java/com/hedza06/hexagonalspring/product/application/port/in/ProductUseCase.java new file mode 100644 index 0000000..56527a8 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/application/port/in/ProductUseCase.java @@ -0,0 +1,11 @@ +package com.hedza06.hexagonalspring.product.application.port.in; + +import com.hedza06.hexagonalspring.product.domain.Product; + +import java.util.Optional; + +public interface ProductUseCase +{ + Product save(Product product); + Optional findById(Integer id); +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/application/port/out/ExternalFakeProductPort.java b/src/main/java/com/hedza06/hexagonalspring/product/application/port/out/ExternalFakeProductPort.java new file mode 100644 index 0000000..92d706b --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/application/port/out/ExternalFakeProductPort.java @@ -0,0 +1,10 @@ +package com.hedza06.hexagonalspring.product.application.port.out; + +import com.hedza06.hexagonalspring.product.dto.FakeProductDTO; + +import java.util.List; + +public interface ExternalFakeProductPort +{ + List fetchAllFakeProducts(); +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/application/port/out/ProductPort.java b/src/main/java/com/hedza06/hexagonalspring/product/application/port/out/ProductPort.java new file mode 100644 index 0000000..23d12fb --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/application/port/out/ProductPort.java @@ -0,0 +1,11 @@ +package com.hedza06.hexagonalspring.product.application.port.out; + +import com.hedza06.hexagonalspring.product.domain.Product; + +import java.util.Optional; + +public interface ProductPort +{ + Product save(Product product); + Optional findById(Integer id); +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/application/service/ProductService.java b/src/main/java/com/hedza06/hexagonalspring/product/application/service/ProductService.java new file mode 100644 index 0000000..1395d85 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/application/service/ProductService.java @@ -0,0 +1,38 @@ +package com.hedza06.hexagonalspring.product.application.service; + +import com.hedza06.hexagonalspring.product.application.port.in.ExternalFakeProductUseCase; +import com.hedza06.hexagonalspring.product.application.port.in.ProductUseCase; +import com.hedza06.hexagonalspring.product.application.port.out.ExternalFakeProductPort; +import com.hedza06.hexagonalspring.product.application.port.out.ProductPort; +import com.hedza06.hexagonalspring.product.domain.Product; +import com.hedza06.hexagonalspring.product.dto.FakeProductDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +@Service +@Transactional +@RequiredArgsConstructor +public class ProductService implements ProductUseCase, ExternalFakeProductUseCase { + + private final ProductPort productPort; + private final ExternalFakeProductPort fakeProductPort; + + @Override + public Product save(Product product) { + return productPort.save(product); + } + + @Override + public Optional findById(Integer id) { + return productPort.findById(id); + } + + @Override + public List fetchAllFakeProducts() { + return fakeProductPort.fetchAllFakeProducts(); + } +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/config/.gitkeep b/src/main/java/com/hedza06/hexagonalspring/product/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/hedza06/hexagonalspring/product/domain/Product.java b/src/main/java/com/hedza06/hexagonalspring/product/domain/Product.java new file mode 100644 index 0000000..509369f --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/domain/Product.java @@ -0,0 +1,44 @@ +package com.hedza06.hexagonalspring.product.domain; + +import com.hedza06.hexagonalspring.customer.domain.Customer; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Entity +@NoArgsConstructor +@Table(name = "product") +public class Product { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "catalog_name") + private String catalogName; + + @Column + private BigDecimal price; + + @Temporal(TemporalType.DATE) + @Column(name = "created_at") + private Date createdAt; + + @ManyToOne + @JoinColumn(name = "customer_id") + private Customer customer; + +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/dto/FakeProductDTO.java b/src/main/java/com/hedza06/hexagonalspring/product/dto/FakeProductDTO.java new file mode 100644 index 0000000..296f366 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/dto/FakeProductDTO.java @@ -0,0 +1,18 @@ +package com.hedza06.hexagonalspring.product.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Data +@NoArgsConstructor +public class FakeProductDTO { + + private Integer id; + private String title; + private BigDecimal price; + private String description; + private String category; + +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/dto/ProductDTO.java b/src/main/java/com/hedza06/hexagonalspring/product/dto/ProductDTO.java new file mode 100644 index 0000000..7af6d00 --- /dev/null +++ b/src/main/java/com/hedza06/hexagonalspring/product/dto/ProductDTO.java @@ -0,0 +1,18 @@ +package com.hedza06.hexagonalspring.product.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@NoArgsConstructor +public class ProductDTO { + + private Integer id; + private String catalogName; + private BigDecimal price; + private Date createdAt; + +} diff --git a/src/main/java/com/hedza06/hexagonalspring/product/mapper/.gitkeep b/src/main/java/com/hedza06/hexagonalspring/product/mapper/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/hedza06/hexagonalspring/product/validator/.gitkeep b/src/main/java/com/hedza06/hexagonalspring/product/validator/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..1d15c66 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,43 @@ +spring: + # Jackson Configuration + jackson: + serialization.indent_output: true + # Datasource Configuration + datasource: + name: MySQL RDBMS Database Connection + driver-class-name: com.mysql.jdbc.Driver + # driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/hex_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=CET&allowPublicKeyRetrieval=true + username: root + password: root + # Hikari CP Configuration + hikari: + data-source-properties: + cachePrepStmts: true + prepStmtCacheSize: 250 + prepStmtCacheSqlLimit: 2048 + useServerPrepStmts: true + # Java Persistence API Configuration + jpa: + database-platform: org.hibernate.dialect.MySQLInnoDBDialect + database: MYSQL + show-sql: true + open-in-view: false + # Hibernate Properties + properties: + hibernate.cache.use_second_level_cache: false + hibernate.cache.use_query_cache: false + hibernate.generate_statistics: false + hibernate.show_sql: true + hibernate.SQL: true +# API context path configuration +server: + servlet: + context-path: /api + +# Logging configuration +logging: + level: + com.hedza06.hexagonalspring: DEBUG + +debug: false \ No newline at end of file diff --git a/src/main/resources/data/hex-schema.png b/src/main/resources/data/hex-schema.png new file mode 100644 index 0000000000000000000000000000000000000000..5ffcb9fba114425e417a3471b91605d668538b9a GIT binary patch literal 102468 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hexagonal-apis.postman_collection.json b/src/main/resources/data/hexagonal-apis.postman_collection.json new file mode 100644 index 0000000..c4a4a5f --- /dev/null +++ b/src/main/resources/data/hexagonal-apis.postman_collection.json @@ -0,0 +1,136 @@ +{ + "info": { + "_postman_id": "169461dd-f7db-45e9-a9a7-9fe1fbaf3bd3", + "name": "hexagonal-apis", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "Get customers by first name term", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:8080/api/customer/by-first-name-starting-with?pattern=John", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "api", + "customer", + "by-first-name-starting-with" + ], + "query": [ + { + "key": "pattern", + "value": "John" + } + ] + } + }, + "response": [] + }, + { + "name": "Persist Customer", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"firstName\": \"Marc\",\n \"lastName\": \"Anothony\",\n \"address\": \"Test address\",\n \"createdAt\": \"2021-01-01T12:12:47.105+01:00\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8080/api/customer", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "api", + "customer" + ] + } + }, + "response": [] + }, + { + "name": "Find product by id", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:8080/api/product/1", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "api", + "product", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Persist Product", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"catalogName\": \"Test catalog name 1\",\n \"price\": 100.00,\n \"createdAt\": \"2021-02-02T10:12:00.97+02:00\",\n \"customer\": {\n \"id\": 1\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8080/api/product", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "api", + "product" + ] + } + }, + "response": [] + }, + { + "name": "Get fake products", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:8080/api/product/fake", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "api", + "product", + "fake" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/schema_and_data.sql b/src/main/resources/data/schema_and_data.sql new file mode 100644 index 0000000..a80154c --- /dev/null +++ b/src/main/resources/data/schema_and_data.sql @@ -0,0 +1,35 @@ +-- DATABASE +CREATE DATABASE IF NOT EXISTS hex_db; +USE hex_db; + +-- TABLES +CREATE TABLE `customer` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `first_name` VARCHAR(32) NOT NULL, + `last_name` VARCHAR(64) NOT NULL, + `address` VARCHAR(255) NULL, + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`)); + +CREATE TABLE `product` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `customer_id` INT UNSIGNED NOT NULL, + `catalog_name` VARCHAR(255) NOT NULL, + `price` DECIMAL(15,2) NOT NULL, + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + INDEX `fk_product_customer_id_key_idx` (`customer_id` ASC), + CONSTRAINT `fk_product_customer_id_key` + FOREIGN KEY (`customer_id`) + REFERENCES `hex_db`.`customer` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION); + +-- SEEDS +INSERT INTO `customer` (first_name, last_name, address) VALUES +('Heril', 'Muratovic', 'Test address 01'), +('John', 'Wick', '121 Mill Neck in Long Island, NY'); + +INSERT INTO `product` (customer_id, catalog_name, price) VALUES +((SELECT id FROM customer WHERE first_name = 'Heril' AND last_name = 'Muratovic' LIMIT 1), 'SIG-Sauer P320', 1560.12), +((SELECT id FROM customer WHERE first_name = 'John' AND last_name = 'Wick' LIMIT 1), 'Coharie Arms CA-415', 3500.00); \ No newline at end of file diff --git a/src/test/java/com/hedza06/hexagonalspring/HexagonalSpringApplicationTests.java b/src/test/java/com/hedza06/hexagonalspring/HexagonalSpringApplicationTests.java new file mode 100644 index 0000000..a1c8efd --- /dev/null +++ b/src/test/java/com/hedza06/hexagonalspring/HexagonalSpringApplicationTests.java @@ -0,0 +1,13 @@ +package com.hedza06.hexagonalspring; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class HexagonalSpringApplicationTests { + + @Test + void contextLoads() { + } + +}