From 6d6a14a0610cc6e1669e6b88e42d9e7015afeac2 Mon Sep 17 00:00:00 2001 From: droideparanoico Date: Sat, 8 Oct 2022 12:27:21 +0200 Subject: [PATCH] Application revamp --- .github/ISSUE_TEMPLATE/bug_report.md | 31 --- .github/ISSUE_TEMPLATE/config.yml | 5 - .github/ISSUE_TEMPLATE/feature_request.md | 20 -- .github/rviewer_logo--dark.png | Bin 42508 -> 0 bytes .github/workflows/sonarqube-scanner.yaml | 70 ------ INSTRUCTIONS.md | 77 ------ LICENSE | 4 +- Makefile | 4 +- README.md | 76 ++++++ api.spec.yaml | 175 ------------- build.gradle | 5 +- docker-compose.yml | 61 ++--- gradlew | 234 ------------------ gradlew.bat | 89 ------- hexagonal.png | Bin 0 -> 90840 bytes postgres.dev.env | 4 - readme.md | 115 --------- settings.gradle | 2 +- sonar-project.properties | 6 - .../CartChainApplication.java} | 6 +- .../application/adapter/CartController.java | 16 +- .../exception/CartAlreadyExistsException.java | 2 +- .../exception/CartNotFoundException.java | 2 +- .../exception/ControllerExceptionHandler.java | 2 +- .../application/request/CreateCartReq.java | 4 +- .../application/request/UpdateCartReq.java | 4 +- .../exception/HashGenerationException.java | 2 +- .../domain/model/Block.java | 4 +- .../domain/model/Blockchain.java | 5 +- .../domain/model/Cart.java | 2 +- .../domain/model/Item.java | 2 +- .../domain/model/RandomNonce.java | 2 +- .../domain/ports/inbound/CartServicePort.java | 4 +- .../ports/outbound/CartDatabasePort.java | 4 +- .../domain/service/CartService.java | 12 +- .../database/adapter/CartDatabaseAdapter.java | 10 +- .../database/dto/PostgresCart.java | 4 +- .../database/dto/PostgresItem.java | 4 +- .../repository/PostgresCartRepository.java | 4 +- src/main/resources/application.properties | 13 +- src/main/resources/banner.txt | 14 +- .../adapter/CartControllerTest.java | 23 +- .../domain/model/BlockchainTest.java | 2 +- .../adapter/CartDatabaseAdapterTest.java | 10 +- src/test/resources/application.properties | 2 +- src/test/resources/banner.txt | 14 +- 46 files changed, 205 insertions(+), 946 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/rviewer_logo--dark.png delete mode 100644 .github/workflows/sonarqube-scanner.yaml delete mode 100644 INSTRUCTIONS.md create mode 100644 README.md delete mode 100644 api.spec.yaml delete mode 100755 gradlew delete mode 100644 gradlew.bat create mode 100644 hexagonal.png delete mode 100644 postgres.dev.env delete mode 100644 readme.md delete mode 100644 sonar-project.properties rename src/main/java/com/{rviewer/skeletons/RviewerSkeletonApplication.java => cartchain/CartChainApplication.java} (58%) rename src/main/java/com/{rviewer/skeletons => cartchain}/application/adapter/CartController.java (83%) rename src/main/java/com/{rviewer/skeletons => cartchain}/application/exception/CartAlreadyExistsException.java (87%) rename src/main/java/com/{rviewer/skeletons => cartchain}/application/exception/CartNotFoundException.java (87%) rename src/main/java/com/{rviewer/skeletons => cartchain}/application/exception/ControllerExceptionHandler.java (96%) rename src/main/java/com/{rviewer/skeletons => cartchain}/application/request/CreateCartReq.java (63%) rename src/main/java/com/{rviewer/skeletons => cartchain}/application/request/UpdateCartReq.java (63%) rename src/main/java/com/{rviewer/skeletons => cartchain}/domain/exception/HashGenerationException.java (78%) rename src/main/java/com/{rviewer/skeletons => cartchain}/domain/model/Block.java (93%) rename src/main/java/com/{rviewer/skeletons => cartchain}/domain/model/Blockchain.java (92%) rename src/main/java/com/{rviewer/skeletons => cartchain}/domain/model/Cart.java (86%) rename src/main/java/com/{rviewer/skeletons => cartchain}/domain/model/Item.java (91%) rename src/main/java/com/{rviewer/skeletons => cartchain}/domain/model/RandomNonce.java (83%) rename src/main/java/com/{rviewer/skeletons => cartchain}/domain/ports/inbound/CartServicePort.java (60%) rename src/main/java/com/{rviewer/skeletons => cartchain}/domain/ports/outbound/CartDatabasePort.java (61%) rename src/main/java/com/{rviewer/skeletons => cartchain}/domain/service/CartService.java (81%) rename src/main/java/com/{rviewer/skeletons => cartchain}/infrastructure/database/adapter/CartDatabaseAdapter.java (70%) rename src/main/java/com/{rviewer/skeletons => cartchain}/infrastructure/database/dto/PostgresCart.java (90%) rename src/main/java/com/{rviewer/skeletons => cartchain}/infrastructure/database/dto/PostgresItem.java (88%) rename src/main/java/com/{rviewer/skeletons => cartchain}/infrastructure/database/repository/PostgresCartRepository.java (71%) rename src/test/java/com/{rviewer/skeletons => cartchain}/application/adapter/CartControllerTest.java (89%) rename src/test/java/com/{rviewer/skeletons => cartchain}/domain/model/BlockchainTest.java (99%) rename src/test/java/com/{rviewer/skeletons => cartchain}/infrastructure/database/adapter/CartDatabaseAdapterTest.java (87%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 194ab54..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: Bug report 🐛 -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. Ubuntu 21.04] - - Docker version: [e.g. Docker version 20.10.12] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 6c1ee26..0000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: true -contact_links: - - name: Ask a question ❓ - url: https://github.com/Rviewer-Challenges/skeleton-java-spring-rest/discussions/new - about: Ask a question or request support for using this skeleton \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index be1cb51..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request ✨ -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/rviewer_logo--dark.png b/.github/rviewer_logo--dark.png deleted file mode 100644 index 94f24c0a267a1279eee6bccd4b29c3ee9560fa29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42508 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 EFG%S3hyVZp diff --git a/.github/workflows/sonarqube-scanner.yaml b/.github/workflows/sonarqube-scanner.yaml deleted file mode 100644 index 627517b..0000000 --- a/.github/workflows/sonarqube-scanner.yaml +++ /dev/null @@ -1,70 +0,0 @@ -on: - workflow_dispatch: - push: - branches: - - main - - devel - pull_request: - types: - - opened - - reopened - - synchronize - branches: - - main - - devel - -jobs: - secrets-gate: - runs-on: ubuntu-latest - outputs: - ok: ${{ steps.check-secrets.outputs.ok }} - steps: - - name: check for secrets needed to run SonarQube - id: check-secrets - run: | - if [ ! -z "${{ secrets.SONAR_TOKEN }}" ] && [ ! -z "${{ secrets.SONAR_HOST_URL }}" ]; then - echo "::set-output name=ok::true" - fi - - sonarqube: - needs: - - secrets-gate - if: ${{ needs.secrets-gate.outputs.ok == 'true' }} - runs-on: ubuntu-latest - services: - postgres-skeleton-db: - image: postgres - env: - POSTGRES_DB: postgres_rv_database - POSTGRES_USER: rv_user - POSTGRES_PASSWORD: rv_password - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - ports: - - 5432:5432 - steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: 17 - - - uses: gradle/gradle-build-action@v2 - with: - gradle-version: 7.4.2 - - - name: Gradle execute tests - run: gradle clean build - - - name: SonarQube Scan - uses: sonarsource/sonarqube-scan-action@master - with: - args: > - -Dsonar.projectKey=${{ github.event.repository.name }} - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md deleted file mode 100644 index ee7fce6..0000000 --- a/INSTRUCTIONS.md +++ /dev/null @@ -1,77 +0,0 @@ - - -## Rviewer skeleton: Java, Spring & PostgreSQL - -[![Twitter](https://img.shields.io/badge/rviewer__-%231DA1F2.svg?style=for-the-badge&logo=Twitter&logoColor=white)](https://twitter.com/Rviewer_/) - -[![Rviewer Discord](https://badgen.net/discord/members/VVN4ur8FaQ)](https://discord.gg/VVN4ur8FaQ) - -
- -This repository is a Java skeleton with Spring & PostgreSQL designed for quickly getting started developing an API. -Check the [Getting Started](#getting-started) for full details. - -## Technologies - -* [Java 18](https://openjdk.java.net/projects/jdk/18/) -* [Gradle 7](https://docs.gradle.org/7.0/release-notes.html) -* [Spring boot](https://spring.io/projects/spring-boot) -* [Lombok](https://projectlombok.org/) -* [Junit](https://junit.org/junit5/) -* [JaCoCo](https://docs.gradle.org/current/userguide/jacoco_plugin.html) -* [Docker](https://www.docker.com/) -* [Make](https://www.gnu.org/software/make/manual/make.html) - -## Getting Started - -Within the [Makefile](Makefile) you can handle the entire flow to get everything up & running: - -1. Install `make` on your computer, if you do not already have it. -2. Start the application: `make up` -3. Run the application tests: `make test` - -As you could see on the [Makefile](Makefile) script and the [Docker-Compose File](docker-compose.yml), the whole API -is containerized with Docker and the API is using the internal DNS to connect with the PostgreSQL instance. - -Go to `http://127.0.0.1:8080/ping` to see that everything is up & running! - -## Overview - -This skeleton is based on -a [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) approach, so you -could find the first basic layers: - -> You could find here two amazing articles ([here](https://www.educative.io/blog/clean-architecture-tutorial) -> and [here](https://www.freecodecamp.org/news/modern-clean-architecture/)) explaining the Clean Architecture with Java! -> (credits to [@bertilMuth](https://twitter.com/BertilMuth) and [@ryanthelin](https://dev.to/ryanthelin)). - -### Infrastructure - -Here you will find the different files to interact with the outside. In this folder you there are two different folders: - -* `controllers`: Here you will have the classes that handle the REST endpoints and the Request/Response -* `persistence`: Here it is the persistence layer, which interact with the PostgreSQL database, decoupling the rest of - the application - -You can use this as a starting point to continue with this architecture, or adapt it to your preferences. - -### Domain - -Any of your domain Entities, or Services, that models your business logic. These classes should be completely isolated -of any external dependency or framework, but interact with them. This layer should follow the Dependency Inversion -principle. - -## Support - -If you are having problems or need anything else, please let us know by -[raising a new issue](https://github.com/Rviewer-Challenges/skeleton-java-spring-rest/issues/new/choose). - -## License - -This project is licensed with the [MIT license](LICENSE). - ---- - -

- Made with ❤️ by Rviewer -

diff --git a/LICENSE b/LICENSE index 02697ef..77c87e7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Rviewer +Copyright (c) 2022 droideparanoico Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/Makefile b/Makefile index cc3ecb1..788da7f 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,9 @@ down: docker-compose down up: - docker-compose run -d -p "8080:8080" java-skeleton-api gradle clean build bootRun -x test + docker-compose run -d -p "8080:8080" java-cartchain-api gradle clean build bootRun -x test test: - docker-compose run --rm --no-deps -p "8080:8080" java-skeleton-api gradle test + docker-compose run --rm --no-deps -p "8080:8080" java-cartchain-api gradle test coverage: test diff --git a/README.md b/README.md new file mode 100644 index 0000000..b71d227 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# CartChain + +Proof of concept for an e-commerce API implementing blockchain technology by using a simple private chain (no mining) + +## How it works? + +The aim of this API is to manage a shopping cart of an ecommerce website. So, through it, the client will be +able to request and create, update or delete any item in the current cart. + +Every action of the API will generate a new _Block_ on the _Blockchain_ in order to create a history and persist the +information, so we can retrieve it later, but also keeps a history of which items have the user added to the cart. + +### Workflow + +The workflow of this API is as follows: + +* Create + +1. Create request is received +2. Check if the `id` for a Cart is not already used + 1. If it has been used we return error + 2. If it has not been used, we create the cart with the given item and generates a new Block to add to the + Blockchain +3. Add the new _Block_ to the _Blockchain_ with the current information of this Cart + +* Update + +1. Update request is received +2. Check if the `id` for a Cart exists + 1. If not exists return error + 2. If exist retrieve it +3. Update the items in the cart and generate a new Block with the information +4. Add the new _Block_ to the _Blockchain_ + +* Delete + +1. Delete request is received +2. Check if the `id` for a Cart exists + 1. If not exists return error + 2. If exist retrieve it +3. Remove cart information and create a new _Block_ +4. Add the new _Block_ to the _Blockchain_ + +## Technical Considerations + +### Stack +* [Java 17](https://openjdk.java.net/projects/jdk/17/) +* [Gradle 7](https://docs.gradle.org/7.0/release-notes.html) +* [Spring boot](https://spring.io/projects/spring-boot) +* [Lombok](https://projectlombok.org/) +* [Junit](https://junit.org/junit5/) +* [JaCoCo](https://docs.gradle.org/current/userguide/jacoco_plugin.html) +* [Docker](https://www.docker.com/) +* [Make](https://www.gnu.org/software/make/manual/make.html) + +### Architecture + +This app is implemented using hexagonal architecture (ports & adapters) and DDD approach. + +The architecture helps to have a decoupled code and being easy to modify or extend it. Following diagram hints how this is achieved: + +![Architecture](hexagonal.png) + +More info at [Hexagonal Architecture](https://alistair.cockburn.us/hexagonal-architecture/) +### Getting Started + +Within the [Makefile](Makefile) you can handle the entire flow to get everything up & running: + +1. Install `make` on your computer, if you do not already have it. +2. Start the application: `make up` +3. Run the application tests: `make test` + +Go to [localhost:8080/swagger-ui/index.html](http://localhost:8080/swagger-ui/index.html) to see the API description. + +As you can see on the [Makefile](Makefile) script and the [docker-Compose File](docker-compose.yml), the whole API +is containerized with docker and the API is using the internal DNS to connect with the PostgreSQL instance. diff --git a/api.spec.yaml b/api.spec.yaml deleted file mode 100644 index 7cb2ece..0000000 --- a/api.spec.yaml +++ /dev/null @@ -1,175 +0,0 @@ -openapi: 3.0.0 -info: - title: Shopping Cart API - description: | - Shopping Cart API is a REST API responsible for manage the shopping car for an e-commerce with a Blockchain storage - system, where the users could create, update and delete their cart. - version: 1.0.0 -paths: - /carts/{id}: - get: - summary: | - This endpoint returns a cart for the given id. - parameters: - - name: id - description: The id of the cart. - required: true - in: path - schema: - type: string - format: uuid - responses: - '200': - description: created - content: - application/json: - schema: - $ref: '#/components/schemas/CreateCartRes' - '404': - description: Cart not found - content: - application/json: - schema: - type: object - properties: - error: - type: string - example: Cart not found for the given ID - post: - summary: | - This endpoint creates a cart for the given id. - parameters: - - name: id - description: The id of the cart. - required: true - in: path - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/CreateCartReq' - responses: - '201': - description: created - '409': - description: Already exists - content: - application/json: - schema: - type: object - properties: - error: - type: string - example: Invalid identifier. - '400': - description: Invalid body provided - content: - application/json: - schema: - type: object - properties: - error: - type: string - example: Invalid body provided, check the payload. - patch: - summary: | - This endpoint updates totally or partially a cart for the given id. - parameters: - - name: id - description: The id of the cart. - required: true - in: path - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UpdateCartReq' - responses: - '200': - description: created - '404': - description: Not found - content: - application/json: - schema: - type: object - properties: - error: - type: string - example: Cart not found for the given id - '400': - description: Invalid body provided - content: - application/json: - schema: - type: object - properties: - error: - type: string - example: Invalid body provided, check the payload. - delete: - summary: | - This endpoint deletes a cart for the given id. - parameters: - - name: id - description: The id of the cart. - required: true - in: path - schema: - type: string - format: uuid - responses: - '200': - description: deleted - '404': - description: Cart not found - content: - application/json: - schema: - type: object - properties: - error: - type: string - example: Cart not found for the given ID -components: - schemas: - CartItem: - type: object - properties: - id: - type: string - format: uuid - name: - type: string - quantity: - type: number - price: - type: number - CartItems: - type: array - items: - $ref: '#/components/schemas/CartItem' - CreateCartReq: - type: object - properties: - items: - $ref: '#/components/schemas/CartItems' - UpdateCartReq: - properties: - items: - $ref: '#/components/schemas/CartItems' - CreateCartRes: - type: object - properties: - id: - type: string - format: uuid - items: - $ref: '#/components/schemas/CartItems' - diff --git a/build.gradle b/build.gradle index a4d4fe2..adbfbee 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'jacoco' } -group = 'com.rviewer.skeletons' +group = 'com.cartchain' version = '1.0.0' sourceCompatibility = '17' @@ -25,9 +25,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springdoc:springdoc-openapi-ui:1.6.11' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' - testImplementation 'com.h2database:h2:2.1.212' + testImplementation 'com.h2database:h2:2.1.214' runtimeOnly 'org.postgresql:postgresql' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/docker-compose.yml b/docker-compose.yml index 74c98bf..203721a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,37 +1,40 @@ version: '3.9' services: - java-skeleton-api: - container_name: java-skeleton-api - image: gradle:latest # this is due to some Mac M1 issues with Docker :_ - depends_on: - - postgres-skeleton-db - volumes: - - "${PWD}:/home/gradle/project" - - "rv-gradle-cache:/home/gradle/.gradle" - working_dir: "/home/gradle/project" - ports: - - "8080:8080" - networks: - internal-net: + java-cartchain-api: + container_name: java-cartchain-api + image: gradle:latest # this is due to some Mac M1 issues with Docker :_ + depends_on: + - postgres-cartchain-db + volumes: + - "${PWD}:/home/gradle/project" + - "gradle-cache:/home/gradle/.gradle" + working_dir: "/home/gradle/project" + ports: + - "8080:8080" + networks: + internal-net: - postgres-skeleton-db: - container_name: postgres-skeleton-db - image: postgres:13.4-alpine - restart: on-failure - volumes: - - rv-volume:/var/lib/postgresql/data - ports: - - "5432:5432" - env_file: - - postgres.dev.env - networks: - internal-net: + postgres-cartchain-db: + container_name: postgres-cartchain-db + image: postgres:13.4-alpine + restart: on-failure + volumes: + - volume:/var/lib/postgresql/data + ports: + - "5432:5432" + environment: + - POSTGRES_NAME=postgres-cartchain-db + - POSTGRES_DB=postgres_database + - POSTGRES_USER=user + - POSTGRES_PASSWORD=password + networks: + internal-net: volumes: - rv-volume: - rv-gradle-cache: + volume: + gradle-cache: networks: - internal-net: - name: rv-skeleton-net + internal-net: + name: cartchain-net diff --git a/gradlew b/gradlew deleted file mode 100755 index 1b6c787..0000000 --- a/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original 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. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -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 - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index ac1b06f..0000000 --- a/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem 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, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/hexagonal.png b/hexagonal.png new file mode 100644 index 0000000000000000000000000000000000000000..0c21144aa1802e54a857c560da86369a22ae7a4b GIT binary patch literal 90840 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 z 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 - If you have any feedback or problem, let us know! 🤘 -

- Made with ❤️ by Rviewer -

diff --git a/settings.gradle b/settings.gradle index 08047b7..f57b10f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -rootProject.name = 'rviewer-skeleton-java-spring' +rootProject.name = 'cartchain' diff --git a/sonar-project.properties b/sonar-project.properties deleted file mode 100644 index b5b52eb..0000000 --- a/sonar-project.properties +++ /dev/null @@ -1,6 +0,0 @@ -sonar.sources=src/main/java -sonar.java.binaries=build/classes/java/ -sonar.java.libraries=build/libs/rviewer-skeleton-java-spring-1.0.0.jar -sonar.language=java -sonar.sourceEncoding=UTF-8 -sonar.coverage.jacoco.xmlReportPaths=build/reports/jacoco/test/jacocoTestReport.xml diff --git a/src/main/java/com/rviewer/skeletons/RviewerSkeletonApplication.java b/src/main/java/com/cartchain/CartChainApplication.java similarity index 58% rename from src/main/java/com/rviewer/skeletons/RviewerSkeletonApplication.java rename to src/main/java/com/cartchain/CartChainApplication.java index 4d3cf85..4e8f6fb 100644 --- a/src/main/java/com/rviewer/skeletons/RviewerSkeletonApplication.java +++ b/src/main/java/com/cartchain/CartChainApplication.java @@ -1,13 +1,13 @@ -package com.rviewer.skeletons; +package com.cartchain; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class RviewerSkeletonApplication { +public class CartChainApplication { public static void main(String[] args) { - SpringApplication.run(RviewerSkeletonApplication.class, args); + SpringApplication.run(CartChainApplication.class, args); } } diff --git a/src/main/java/com/rviewer/skeletons/application/adapter/CartController.java b/src/main/java/com/cartchain/application/adapter/CartController.java similarity index 83% rename from src/main/java/com/rviewer/skeletons/application/adapter/CartController.java rename to src/main/java/com/cartchain/application/adapter/CartController.java index 8b8aa16..6c3b6d6 100644 --- a/src/main/java/com/rviewer/skeletons/application/adapter/CartController.java +++ b/src/main/java/com/cartchain/application/adapter/CartController.java @@ -1,12 +1,12 @@ -package com.rviewer.skeletons.application.adapter; +package com.cartchain.application.adapter; -import com.rviewer.skeletons.application.exception.CartAlreadyExistsException; -import com.rviewer.skeletons.application.exception.CartNotFoundException; -import com.rviewer.skeletons.domain.model.Cart; -import com.rviewer.skeletons.domain.model.Item; -import com.rviewer.skeletons.domain.ports.inbound.CartServicePort; -import com.rviewer.skeletons.application.request.CreateCartReq; -import com.rviewer.skeletons.application.request.UpdateCartReq; +import com.cartchain.application.exception.CartAlreadyExistsException; +import com.cartchain.application.exception.CartNotFoundException; +import com.cartchain.application.request.CreateCartReq; +import com.cartchain.application.request.UpdateCartReq; +import com.cartchain.domain.model.Item; +import com.cartchain.domain.model.Cart; +import com.cartchain.domain.ports.inbound.CartServicePort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; diff --git a/src/main/java/com/rviewer/skeletons/application/exception/CartAlreadyExistsException.java b/src/main/java/com/cartchain/application/exception/CartAlreadyExistsException.java similarity index 87% rename from src/main/java/com/rviewer/skeletons/application/exception/CartAlreadyExistsException.java rename to src/main/java/com/cartchain/application/exception/CartAlreadyExistsException.java index dab25e1..e752701 100644 --- a/src/main/java/com/rviewer/skeletons/application/exception/CartAlreadyExistsException.java +++ b/src/main/java/com/cartchain/application/exception/CartAlreadyExistsException.java @@ -1,4 +1,4 @@ -package com.rviewer.skeletons.application.exception; +package com.cartchain.application.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/src/main/java/com/rviewer/skeletons/application/exception/CartNotFoundException.java b/src/main/java/com/cartchain/application/exception/CartNotFoundException.java similarity index 87% rename from src/main/java/com/rviewer/skeletons/application/exception/CartNotFoundException.java rename to src/main/java/com/cartchain/application/exception/CartNotFoundException.java index bf5b3df..304bf65 100644 --- a/src/main/java/com/rviewer/skeletons/application/exception/CartNotFoundException.java +++ b/src/main/java/com/cartchain/application/exception/CartNotFoundException.java @@ -1,4 +1,4 @@ -package com.rviewer.skeletons.application.exception; +package com.cartchain.application.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/src/main/java/com/rviewer/skeletons/application/exception/ControllerExceptionHandler.java b/src/main/java/com/cartchain/application/exception/ControllerExceptionHandler.java similarity index 96% rename from src/main/java/com/rviewer/skeletons/application/exception/ControllerExceptionHandler.java rename to src/main/java/com/cartchain/application/exception/ControllerExceptionHandler.java index 08af670..12dead5 100644 --- a/src/main/java/com/rviewer/skeletons/application/exception/ControllerExceptionHandler.java +++ b/src/main/java/com/cartchain/application/exception/ControllerExceptionHandler.java @@ -1,4 +1,4 @@ -package com.rviewer.skeletons.application.exception; +package com.cartchain.application.exception; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/rviewer/skeletons/application/request/CreateCartReq.java b/src/main/java/com/cartchain/application/request/CreateCartReq.java similarity index 63% rename from src/main/java/com/rviewer/skeletons/application/request/CreateCartReq.java rename to src/main/java/com/cartchain/application/request/CreateCartReq.java index 1830318..fa25947 100644 --- a/src/main/java/com/rviewer/skeletons/application/request/CreateCartReq.java +++ b/src/main/java/com/cartchain/application/request/CreateCartReq.java @@ -1,6 +1,6 @@ -package com.rviewer.skeletons.application.request; +package com.cartchain.application.request; -import com.rviewer.skeletons.domain.model.Item; +import com.cartchain.domain.model.Item; import lombok.Getter; import javax.validation.constraints.NotNull; diff --git a/src/main/java/com/rviewer/skeletons/application/request/UpdateCartReq.java b/src/main/java/com/cartchain/application/request/UpdateCartReq.java similarity index 63% rename from src/main/java/com/rviewer/skeletons/application/request/UpdateCartReq.java rename to src/main/java/com/cartchain/application/request/UpdateCartReq.java index e208ee1..1b25c97 100644 --- a/src/main/java/com/rviewer/skeletons/application/request/UpdateCartReq.java +++ b/src/main/java/com/cartchain/application/request/UpdateCartReq.java @@ -1,6 +1,6 @@ -package com.rviewer.skeletons.application.request; +package com.cartchain.application.request; -import com.rviewer.skeletons.domain.model.Item; +import com.cartchain.domain.model.Item; import lombok.Getter; import javax.validation.constraints.NotNull; diff --git a/src/main/java/com/rviewer/skeletons/domain/exception/HashGenerationException.java b/src/main/java/com/cartchain/domain/exception/HashGenerationException.java similarity index 78% rename from src/main/java/com/rviewer/skeletons/domain/exception/HashGenerationException.java rename to src/main/java/com/cartchain/domain/exception/HashGenerationException.java index c04499f..9dca770 100644 --- a/src/main/java/com/rviewer/skeletons/domain/exception/HashGenerationException.java +++ b/src/main/java/com/cartchain/domain/exception/HashGenerationException.java @@ -1,4 +1,4 @@ -package com.rviewer.skeletons.domain.exception; +package com.cartchain.domain.exception; public class HashGenerationException extends RuntimeException { public HashGenerationException(Throwable cause) { diff --git a/src/main/java/com/rviewer/skeletons/domain/model/Block.java b/src/main/java/com/cartchain/domain/model/Block.java similarity index 93% rename from src/main/java/com/rviewer/skeletons/domain/model/Block.java rename to src/main/java/com/cartchain/domain/model/Block.java index c766d01..8016b3b 100644 --- a/src/main/java/com/rviewer/skeletons/domain/model/Block.java +++ b/src/main/java/com/cartchain/domain/model/Block.java @@ -1,6 +1,6 @@ -package com.rviewer.skeletons.domain.model; +package com.cartchain.domain.model; -import com.rviewer.skeletons.domain.exception.HashGenerationException; +import com.cartchain.domain.exception.HashGenerationException; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/com/rviewer/skeletons/domain/model/Blockchain.java b/src/main/java/com/cartchain/domain/model/Blockchain.java similarity index 92% rename from src/main/java/com/rviewer/skeletons/domain/model/Blockchain.java rename to src/main/java/com/cartchain/domain/model/Blockchain.java index 19ea7a4..527bc59 100644 --- a/src/main/java/com/rviewer/skeletons/domain/model/Blockchain.java +++ b/src/main/java/com/cartchain/domain/model/Blockchain.java @@ -1,4 +1,4 @@ -package com.rviewer.skeletons.domain.model; +package com.cartchain.domain.model; import org.springframework.stereotype.Component; @@ -13,9 +13,8 @@ public class Blockchain { return blockchainList; } - public Block addBlock(Block block) { + public void addBlock(Block block) { blockchainList.add(block); - return blockchainList.getLast(); } public Boolean replace(List blockchainList) { diff --git a/src/main/java/com/rviewer/skeletons/domain/model/Cart.java b/src/main/java/com/cartchain/domain/model/Cart.java similarity index 86% rename from src/main/java/com/rviewer/skeletons/domain/model/Cart.java rename to src/main/java/com/cartchain/domain/model/Cart.java index 391ee65..6b6e836 100644 --- a/src/main/java/com/rviewer/skeletons/domain/model/Cart.java +++ b/src/main/java/com/cartchain/domain/model/Cart.java @@ -1,4 +1,4 @@ -package com.rviewer.skeletons.domain.model; +package com.cartchain.domain.model; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/rviewer/skeletons/domain/model/Item.java b/src/main/java/com/cartchain/domain/model/Item.java similarity index 91% rename from src/main/java/com/rviewer/skeletons/domain/model/Item.java rename to src/main/java/com/cartchain/domain/model/Item.java index 66f884d..f104ea5 100644 --- a/src/main/java/com/rviewer/skeletons/domain/model/Item.java +++ b/src/main/java/com/cartchain/domain/model/Item.java @@ -1,4 +1,4 @@ -package com.rviewer.skeletons.domain.model; +package com.cartchain.domain.model; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/rviewer/skeletons/domain/model/RandomNonce.java b/src/main/java/com/cartchain/domain/model/RandomNonce.java similarity index 83% rename from src/main/java/com/rviewer/skeletons/domain/model/RandomNonce.java rename to src/main/java/com/cartchain/domain/model/RandomNonce.java index 4b5e624..8f8921c 100644 --- a/src/main/java/com/rviewer/skeletons/domain/model/RandomNonce.java +++ b/src/main/java/com/cartchain/domain/model/RandomNonce.java @@ -1,4 +1,4 @@ -package com.rviewer.skeletons.domain.model; +package com.cartchain.domain.model; import java.util.Random; diff --git a/src/main/java/com/rviewer/skeletons/domain/ports/inbound/CartServicePort.java b/src/main/java/com/cartchain/domain/ports/inbound/CartServicePort.java similarity index 60% rename from src/main/java/com/rviewer/skeletons/domain/ports/inbound/CartServicePort.java rename to src/main/java/com/cartchain/domain/ports/inbound/CartServicePort.java index 5f79be0..4feb01c 100644 --- a/src/main/java/com/rviewer/skeletons/domain/ports/inbound/CartServicePort.java +++ b/src/main/java/com/cartchain/domain/ports/inbound/CartServicePort.java @@ -1,6 +1,6 @@ -package com.rviewer.skeletons.domain.ports.inbound; +package com.cartchain.domain.ports.inbound; -import com.rviewer.skeletons.domain.model.Cart; +import com.cartchain.domain.model.Cart; import java.util.Optional; diff --git a/src/main/java/com/rviewer/skeletons/domain/ports/outbound/CartDatabasePort.java b/src/main/java/com/cartchain/domain/ports/outbound/CartDatabasePort.java similarity index 61% rename from src/main/java/com/rviewer/skeletons/domain/ports/outbound/CartDatabasePort.java rename to src/main/java/com/cartchain/domain/ports/outbound/CartDatabasePort.java index b33daf5..982cc96 100644 --- a/src/main/java/com/rviewer/skeletons/domain/ports/outbound/CartDatabasePort.java +++ b/src/main/java/com/cartchain/domain/ports/outbound/CartDatabasePort.java @@ -1,6 +1,6 @@ -package com.rviewer.skeletons.domain.ports.outbound; +package com.cartchain.domain.ports.outbound; -import com.rviewer.skeletons.domain.model.Cart; +import com.cartchain.domain.model.Cart; import java.util.Optional; diff --git a/src/main/java/com/rviewer/skeletons/domain/service/CartService.java b/src/main/java/com/cartchain/domain/service/CartService.java similarity index 81% rename from src/main/java/com/rviewer/skeletons/domain/service/CartService.java rename to src/main/java/com/cartchain/domain/service/CartService.java index 34b39f6..29f5cc6 100644 --- a/src/main/java/com/rviewer/skeletons/domain/service/CartService.java +++ b/src/main/java/com/cartchain/domain/service/CartService.java @@ -1,10 +1,10 @@ -package com.rviewer.skeletons.domain.service; +package com.cartchain.domain.service; -import com.rviewer.skeletons.domain.model.Block; -import com.rviewer.skeletons.domain.model.Blockchain; -import com.rviewer.skeletons.domain.model.Cart; -import com.rviewer.skeletons.domain.ports.inbound.CartServicePort; -import com.rviewer.skeletons.domain.ports.outbound.CartDatabasePort; +import com.cartchain.domain.model.Block; +import com.cartchain.domain.model.Blockchain; +import com.cartchain.domain.model.Cart; +import com.cartchain.domain.ports.inbound.CartServicePort; +import com.cartchain.domain.ports.outbound.CartDatabasePort; import org.springframework.stereotype.Component; import javax.transaction.Transactional; diff --git a/src/main/java/com/rviewer/skeletons/infrastructure/database/adapter/CartDatabaseAdapter.java b/src/main/java/com/cartchain/infrastructure/database/adapter/CartDatabaseAdapter.java similarity index 70% rename from src/main/java/com/rviewer/skeletons/infrastructure/database/adapter/CartDatabaseAdapter.java rename to src/main/java/com/cartchain/infrastructure/database/adapter/CartDatabaseAdapter.java index 4de0bf0..d616d54 100644 --- a/src/main/java/com/rviewer/skeletons/infrastructure/database/adapter/CartDatabaseAdapter.java +++ b/src/main/java/com/cartchain/infrastructure/database/adapter/CartDatabaseAdapter.java @@ -1,9 +1,9 @@ -package com.rviewer.skeletons.infrastructure.database.adapter; +package com.cartchain.infrastructure.database.adapter; -import com.rviewer.skeletons.domain.model.Cart; -import com.rviewer.skeletons.domain.ports.outbound.CartDatabasePort; -import com.rviewer.skeletons.infrastructure.database.dto.PostgresCart; -import com.rviewer.skeletons.infrastructure.database.repository.PostgresCartRepository; +import com.cartchain.domain.model.Cart; +import com.cartchain.domain.ports.outbound.CartDatabasePort; +import com.cartchain.infrastructure.database.dto.PostgresCart; +import com.cartchain.infrastructure.database.repository.PostgresCartRepository; import org.springframework.stereotype.Component; import java.util.Optional; diff --git a/src/main/java/com/rviewer/skeletons/infrastructure/database/dto/PostgresCart.java b/src/main/java/com/cartchain/infrastructure/database/dto/PostgresCart.java similarity index 90% rename from src/main/java/com/rviewer/skeletons/infrastructure/database/dto/PostgresCart.java rename to src/main/java/com/cartchain/infrastructure/database/dto/PostgresCart.java index 6c5af54..adf6c8d 100644 --- a/src/main/java/com/rviewer/skeletons/infrastructure/database/dto/PostgresCart.java +++ b/src/main/java/com/cartchain/infrastructure/database/dto/PostgresCart.java @@ -1,6 +1,6 @@ -package com.rviewer.skeletons.infrastructure.database.dto; +package com.cartchain.infrastructure.database.dto; -import com.rviewer.skeletons.domain.model.Cart; +import com.cartchain.domain.model.Cart; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.With; diff --git a/src/main/java/com/rviewer/skeletons/infrastructure/database/dto/PostgresItem.java b/src/main/java/com/cartchain/infrastructure/database/dto/PostgresItem.java similarity index 88% rename from src/main/java/com/rviewer/skeletons/infrastructure/database/dto/PostgresItem.java rename to src/main/java/com/cartchain/infrastructure/database/dto/PostgresItem.java index 73ea065..80692f9 100644 --- a/src/main/java/com/rviewer/skeletons/infrastructure/database/dto/PostgresItem.java +++ b/src/main/java/com/cartchain/infrastructure/database/dto/PostgresItem.java @@ -1,6 +1,6 @@ -package com.rviewer.skeletons.infrastructure.database.dto; +package com.cartchain.infrastructure.database.dto; -import com.rviewer.skeletons.domain.model.Item; +import com.cartchain.domain.model.Item; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.With; diff --git a/src/main/java/com/rviewer/skeletons/infrastructure/database/repository/PostgresCartRepository.java b/src/main/java/com/cartchain/infrastructure/database/repository/PostgresCartRepository.java similarity index 71% rename from src/main/java/com/rviewer/skeletons/infrastructure/database/repository/PostgresCartRepository.java rename to src/main/java/com/cartchain/infrastructure/database/repository/PostgresCartRepository.java index 55e714e..99394ac 100644 --- a/src/main/java/com/rviewer/skeletons/infrastructure/database/repository/PostgresCartRepository.java +++ b/src/main/java/com/cartchain/infrastructure/database/repository/PostgresCartRepository.java @@ -1,6 +1,6 @@ -package com.rviewer.skeletons.infrastructure.database.repository; +package com.cartchain.infrastructure.database.repository; -import com.rviewer.skeletons.infrastructure.database.dto.PostgresCart; +import com.cartchain.infrastructure.database.dto.PostgresCart; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c2bbd6e..051f2a9 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,11 +1,12 @@ server.port=8080 -application.title=Cartfidential +application.title=CartChain application.version=1.0.0 spring.sql.init.mode=always -spring.datasource.username = rv_user -spring.datasource.password = rv_password -spring.datasource.driverClassName = org.postgresql.Driver -spring.jpa.hibernate.ddl-auto = update +spring.datasource.username=user +spring.datasource.password=password +spring.datasource.driverClassName=org.postgresql.Driver +spring.jpa.hibernate.ddl-auto=update spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect -spring.datasource.url = jdbc:postgresql://localhost:5432/postgres_rv_database +spring.datasource.url=jdbc:postgresql://postgres-cartchain-db:5432/postgres_database +springdoc.api-docs.path=/api-docs diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt index 0c2529e..764ebdd 100644 --- a/src/main/resources/banner.txt +++ b/src/main/resources/banner.txt @@ -1,8 +1,10 @@ -,------. ,--. -| .--. ' ,--. ,--. `--' ,---. ,--. ,--. ,---. ,--.--. -| '--'.' \ `' / ,--. | .-. : | |.'.| | | .-. : | .--' -| |\ \ \ / | | \ --. | .'. | \ --. | | -`--' '--' `--' `--' `----' '--' '--' `----' `--' + /$$$$$$ /$$ /$$$$$$ /$$ /$$ + /$$__ $$ | $$ /$$__ $$| $$ |__/ +| $$ \__/ /$$$$$$ /$$$$$$ /$$$$$$ | $$ \__/| $$$$$$$ /$$$$$$ /$$ /$$$$$$$ +| $$ |____ $$ /$$__ $$|_ $$_/ | $$ | $$__ $$ |____ $$| $$| $$__ $$ +| $$ /$$$$$$$| $$ \__/ | $$ | $$ | $$ \ $$ /$$$$$$$| $$| $$ \ $$ +| $$ $$ /$$__ $$| $$ | $$ /$$| $$ $$| $$ | $$ /$$__ $$| $$| $$ | $$ +| $$$$$$/| $$$$$$$| $$ | $$$$/| $$$$$$/| $$ | $$| $$$$$$$| $$| $$ | $$ + \______/ \_______/|__/ \___/ \______/ |__/ |__/ \_______/|__/|__/ |__/ ${application.title} - v${application.version} -Powered by Rviewer \ No newline at end of file diff --git a/src/test/java/com/rviewer/skeletons/application/adapter/CartControllerTest.java b/src/test/java/com/cartchain/application/adapter/CartControllerTest.java similarity index 89% rename from src/test/java/com/rviewer/skeletons/application/adapter/CartControllerTest.java rename to src/test/java/com/cartchain/application/adapter/CartControllerTest.java index 3a2b790..3fd3b9c 100644 --- a/src/test/java/com/rviewer/skeletons/application/adapter/CartControllerTest.java +++ b/src/test/java/com/cartchain/application/adapter/CartControllerTest.java @@ -1,11 +1,13 @@ -package com.rviewer.skeletons.application.adapter; +package com.cartchain.application.adapter; +import com.cartchain.application.exception.CartAlreadyExistsException; +import com.cartchain.application.exception.CartNotFoundException; +import com.cartchain.application.exception.ControllerExceptionHandler; import com.fasterxml.jackson.databind.ObjectMapper; -import com.rviewer.skeletons.domain.model.Cart; -import com.rviewer.skeletons.domain.model.Item; -import com.rviewer.skeletons.domain.ports.inbound.CartServicePort; -import com.rviewer.skeletons.application.exception.CartAlreadyExistsException; -import com.rviewer.skeletons.application.exception.CartNotFoundException; +import com.cartchain.domain.model.Cart; +import com.cartchain.domain.model.Item; +import com.cartchain.domain.ports.inbound.CartServicePort; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -21,7 +23,6 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import static com.rviewer.skeletons.application.exception.ControllerExceptionHandler.INVALID_BODY; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.when; @@ -102,7 +103,7 @@ class CartControllerTest { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) .andExpect(result -> assertTrue(result.getResolvedException() instanceof MethodArgumentNotValidException)) - .andExpect(result -> assertEquals(INVALID_BODY, result.getResponse().getContentAsString())); + .andExpect(result -> Assertions.assertEquals(ControllerExceptionHandler.INVALID_BODY, result.getResponse().getContentAsString())); } @Test @@ -116,7 +117,7 @@ class CartControllerTest { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) .andExpect(result -> assertTrue(result.getResolvedException() instanceof HttpMessageNotReadableException)) - .andExpect(result -> assertEquals(INVALID_BODY, result.getResponse().getContentAsString())); + .andExpect(result -> Assertions.assertEquals(ControllerExceptionHandler.INVALID_BODY, result.getResponse().getContentAsString())); } @Test @@ -159,7 +160,7 @@ class CartControllerTest { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) .andExpect(result -> assertTrue(result.getResolvedException() instanceof MethodArgumentNotValidException)) - .andExpect(result -> assertEquals(INVALID_BODY, result.getResponse().getContentAsString())); + .andExpect(result -> Assertions.assertEquals(ControllerExceptionHandler.INVALID_BODY, result.getResponse().getContentAsString())); } @Test @@ -173,7 +174,7 @@ class CartControllerTest { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) .andExpect(result -> assertTrue(result.getResolvedException() instanceof HttpMessageNotReadableException)) - .andExpect(result -> assertEquals(INVALID_BODY, result.getResponse().getContentAsString())) + .andExpect(result -> Assertions.assertEquals(ControllerExceptionHandler.INVALID_BODY, result.getResponse().getContentAsString())) ; } diff --git a/src/test/java/com/rviewer/skeletons/domain/model/BlockchainTest.java b/src/test/java/com/cartchain/domain/model/BlockchainTest.java similarity index 99% rename from src/test/java/com/rviewer/skeletons/domain/model/BlockchainTest.java rename to src/test/java/com/cartchain/domain/model/BlockchainTest.java index fa7115c..0082392 100644 --- a/src/test/java/com/rviewer/skeletons/domain/model/BlockchainTest.java +++ b/src/test/java/com/cartchain/domain/model/BlockchainTest.java @@ -1,4 +1,4 @@ -package com.rviewer.skeletons.domain.model; +package com.cartchain.domain.model; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/rviewer/skeletons/infrastructure/database/adapter/CartDatabaseAdapterTest.java b/src/test/java/com/cartchain/infrastructure/database/adapter/CartDatabaseAdapterTest.java similarity index 87% rename from src/test/java/com/rviewer/skeletons/infrastructure/database/adapter/CartDatabaseAdapterTest.java rename to src/test/java/com/cartchain/infrastructure/database/adapter/CartDatabaseAdapterTest.java index dcf7515..33534b0 100644 --- a/src/test/java/com/rviewer/skeletons/infrastructure/database/adapter/CartDatabaseAdapterTest.java +++ b/src/test/java/com/cartchain/infrastructure/database/adapter/CartDatabaseAdapterTest.java @@ -1,9 +1,9 @@ -package com.rviewer.skeletons.infrastructure.database.adapter; +package com.cartchain.infrastructure.database.adapter; -import com.rviewer.skeletons.domain.model.Cart; -import com.rviewer.skeletons.domain.model.Item; -import com.rviewer.skeletons.infrastructure.database.dto.PostgresCart; -import com.rviewer.skeletons.infrastructure.database.repository.PostgresCartRepository; +import com.cartchain.infrastructure.database.dto.PostgresCart; +import com.cartchain.infrastructure.database.repository.PostgresCartRepository; +import com.cartchain.domain.model.Cart; +import com.cartchain.domain.model.Item; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 29f6242..43d8743 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -1,5 +1,5 @@ server.port=8080 -application.title=Cartfidential +application.title=CartChain application.version=1.0.0 spring.datasource.driver-class-name=org.h2.Driver diff --git a/src/test/resources/banner.txt b/src/test/resources/banner.txt index 0c2529e..764ebdd 100644 --- a/src/test/resources/banner.txt +++ b/src/test/resources/banner.txt @@ -1,8 +1,10 @@ -,------. ,--. -| .--. ' ,--. ,--. `--' ,---. ,--. ,--. ,---. ,--.--. -| '--'.' \ `' / ,--. | .-. : | |.'.| | | .-. : | .--' -| |\ \ \ / | | \ --. | .'. | \ --. | | -`--' '--' `--' `--' `----' '--' '--' `----' `--' + /$$$$$$ /$$ /$$$$$$ /$$ /$$ + /$$__ $$ | $$ /$$__ $$| $$ |__/ +| $$ \__/ /$$$$$$ /$$$$$$ /$$$$$$ | $$ \__/| $$$$$$$ /$$$$$$ /$$ /$$$$$$$ +| $$ |____ $$ /$$__ $$|_ $$_/ | $$ | $$__ $$ |____ $$| $$| $$__ $$ +| $$ /$$$$$$$| $$ \__/ | $$ | $$ | $$ \ $$ /$$$$$$$| $$| $$ \ $$ +| $$ $$ /$$__ $$| $$ | $$ /$$| $$ $$| $$ | $$ /$$__ $$| $$| $$ | $$ +| $$$$$$/| $$$$$$$| $$ | $$$$/| $$$$$$/| $$ | $$| $$$$$$$| $$| $$ | $$ + \______/ \_______/|__/ \___/ \______/ |__/ |__/ \_______/|__/|__/ |__/ ${application.title} - v${application.version} -Powered by Rviewer \ No newline at end of file