From 95454a7f6d9c0829495c371c66c6830ce55242ba Mon Sep 17 00:00:00 2001 From: Pablo736 Date: Wed, 28 Jun 2023 18:50:18 -0500 Subject: [PATCH] Added project --- microservices/.gitignore | 22 ++ microservices/README.md | 27 ++ microservices/api/.classpath | 57 ++++ microservices/api/.factorypath | 76 +++++ .../.mvn/wrapper/MavenWrapperDownloader.java | 117 +++++++ .../api/.mvn/wrapper/maven-wrapper.properties | 2 + microservices/api/.project | 39 +++ microservices/api/Dockerfile | 4 + microservices/api/HELP.md | 26 ++ microservices/api/README.md | 2 + microservices/api/mvnw | 310 +++++++++++++++++ microservices/api/mvnw.cmd | 182 ++++++++++ microservices/api/pom.xml | 86 +++++ .../OpenmarketSystemApplication.java | 13 + .../access/dao/ICategoryRequestDAO.java | 9 + .../access/dao/IProductRequestDAO.java | 9 + .../domain/model/CategoryEvent.java | 43 +++ .../domain/model/ProductEvent.java | 44 +++ .../model/wrapper/CategoryRequestWrapper.java | 20 ++ .../model/wrapper/ProductRequestWrapper.java | 20 ++ .../service/CategoryRequestImplService.java | 67 ++++ .../domain/service/EmailImplService.java | 45 +++ .../domain/service/ICategoryEventService.java | 6 + .../domain/service/IEmailService.java | 11 + .../domain/service/IProductEventService.java | 6 + .../service/IServiceRequestService.java | 15 + .../service/ProductRequestImplService.java | 67 ++++ .../rest/CategoryRequestController.java | 89 +++++ .../rest/ProductRequestController.java | 89 +++++ .../rest/exception/EnumErrorCode.java | 5 + .../rest/exception/ErrorsPayload.java | 11 + .../GlobalDefaultExceptionHandler.java | 60 ++++ .../OpenmarketErrorDomainException.java | 17 + .../exception/OpenmarketRequestError.java | 10 + .../exception/ResourceNotFoundException.java | 15 + .../openmarketapp/utilities/DateTimeUtil.java | 15 + .../utilities/EmailTemplateUtil.java | 14 + .../src/main/resources/application.properties | 18 + .../BookingSystemApplicationTests.java | 13 + microservices/consumercategory/.gitignore | 33 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 59925 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 + microservices/consumercategory/Dockerfile | 4 + microservices/consumercategory/mvnw | 316 ++++++++++++++++++ microservices/consumercategory/mvnw.cmd | 188 +++++++++++ microservices/consumercategory/pom.xml | 87 +++++ .../ConsumercategoryApplication.java | 13 + .../repository/ICategoryEventRepository.java | 9 + .../config/RabbitMQConfig.java | 46 +++ .../domain/entity/CategoryEvent.java | 39 +++ .../service/CategoryEventServiceImpl.java | 88 +++++ .../CategoryRequestConsumerImplService.java | 36 ++ .../domain/service/ICategoryEventService.java | 6 + .../ICategoryRequestConsumerService.java | 7 + .../domain/service/IService.java | 16 + .../domain/service/RabbitMQConsumer.java | 43 +++ .../rest/CategorysController.java | 84 +++++ .../utilities/CategoryRequestsConstants.java | 13 + .../utilities/DateTimeUtil.java | 15 + .../src/main/resources/application.properties | 4 + .../src/main/resources/import.sql | 0 .../ConsumercategoryApplicationTests.java | 13 + microservices/consumerproduct/.gitignore | 33 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 59925 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 + microservices/consumerproduct/Dockerfile | 4 + microservices/consumerproduct/mvnw | 316 ++++++++++++++++++ microservices/consumerproduct/mvnw.cmd | 188 +++++++++++ microservices/consumerproduct/pom.xml | 89 +++++ .../ConsumerProductApplication.java | 13 + .../repository/IProductEventRepository.java | 9 + .../config/RabbitMQConfig.java | 46 +++ .../domain/entity/ProductEvent.java | 41 +++ .../domain/service/IProductEventService.java | 6 + .../IProductRequestConsumerService.java | 7 + .../domain/service/IService.java | 16 + .../service/ProductEventServiceImpl.java | 88 +++++ .../ProductRequestConsumerImplService.java | 36 ++ .../domain/service/RabbitMQConsumer.java | 43 +++ .../presentation/rest/ProductsController.java | 84 +++++ .../utilities/DateTimeUtil.java | 15 + .../utilities/ProductRequestsConstants.java | 13 + .../src/main/resources/application.properties | 4 + .../src/main/resources/import.sql | 0 .../ConsumerproductApplicationTests.java | 13 + microservices/deploy.sh | 31 ++ microservices/docker-compose.yml | 76 +++++ microservices/docs/categoryhttp.png | Bin 0 -> 61205 bytes microservices/docs/docker.png | Bin 0 -> 78961 bytes microservices/docs/emailcategory.png | Bin 0 -> 22790 bytes microservices/docs/emailproduct.png | Bin 0 -> 22177 bytes microservices/docs/producthttp.png | Bin 0 -> 49565 bytes microservices/producercategory/.gitignore | 33 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 59925 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 + microservices/producercategory/Dockerfile | 4 + microservices/producercategory/mvnw | 316 ++++++++++++++++++ microservices/producercategory/mvnw.cmd | 188 +++++++++++ microservices/producercategory/pom.xml | 83 +++++ .../ProducerCategoryApplication.java | 13 + .../repository/ICategoryRepository.java | 9 + .../config/RabbitMQConfig.java | 32 ++ .../domain/entity/Category.java | 40 +++ .../domain/service/CategoryServiceImpl.java | 92 +++++ .../domain/service/ICategoryService.java | 6 + .../domain/service/IService.java | 16 + .../domain/service/RabbitMQProducer.java | 22 ++ .../rest/CategoriesController.java | 84 +++++ .../src/main/resources/application.properties | 3 + .../src/main/resources/import.sql | 4 + .../ProducerCategoryApplicationTests.java | 13 + microservices/producerproduct/.gitignore | 33 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 59925 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 + microservices/producerproduct/Dockerfile | 4 + microservices/producerproduct/mvnw | 316 ++++++++++++++++++ microservices/producerproduct/mvnw.cmd | 188 +++++++++++ microservices/producerproduct/pom.xml | 85 +++++ .../ProducerProductApplication.java | 13 + .../access/repository/IProductRepository.java | 9 + .../config/RabbitMQConfig.java | 32 ++ .../domain/entity/Product.java | 45 +++ .../domain/service/IProductService.java | 6 + .../domain/service/IService.java | 16 + .../domain/service/ProductServiceImpl.java | 97 ++++++ .../domain/service/RabbitMQProducer.java | 21 ++ .../presentation/rest/ProductsController.java | 84 +++++ .../src/main/resources/application.properties | 3 + .../src/main/resources/import.sql | 4 + .../ProducerProductApplicationTests.java | 13 + 130 files changed, 5911 insertions(+) create mode 100644 microservices/.gitignore create mode 100644 microservices/README.md create mode 100644 microservices/api/.classpath create mode 100644 microservices/api/.factorypath create mode 100644 microservices/api/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 microservices/api/.mvn/wrapper/maven-wrapper.properties create mode 100644 microservices/api/.project create mode 100644 microservices/api/Dockerfile create mode 100644 microservices/api/HELP.md create mode 100644 microservices/api/README.md create mode 100644 microservices/api/mvnw create mode 100644 microservices/api/mvnw.cmd create mode 100644 microservices/api/pom.xml create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/OpenmarketSystemApplication.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/access/dao/ICategoryRequestDAO.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/access/dao/IProductRequestDAO.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/CategoryEvent.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/ProductEvent.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/wrapper/CategoryRequestWrapper.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/wrapper/ProductRequestWrapper.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/CategoryRequestImplService.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/EmailImplService.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/ICategoryEventService.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IEmailService.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IProductEventService.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IServiceRequestService.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/ProductRequestImplService.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/CategoryRequestController.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/ProductRequestController.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/EnumErrorCode.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/ErrorsPayload.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/GlobalDefaultExceptionHandler.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/OpenmarketErrorDomainException.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/OpenmarketRequestError.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/ResourceNotFoundException.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/utilities/DateTimeUtil.java create mode 100644 microservices/api/src/main/java/com/sahydo/openmarketapp/utilities/EmailTemplateUtil.java create mode 100644 microservices/api/src/main/resources/application.properties create mode 100644 microservices/api/src/test/java/com/sahydo/openmarketapp/BookingSystemApplicationTests.java create mode 100644 microservices/consumercategory/.gitignore create mode 100644 microservices/consumercategory/.mvn/wrapper/maven-wrapper.jar create mode 100644 microservices/consumercategory/.mvn/wrapper/maven-wrapper.properties create mode 100644 microservices/consumercategory/Dockerfile create mode 100644 microservices/consumercategory/mvnw create mode 100644 microservices/consumercategory/mvnw.cmd create mode 100644 microservices/consumercategory/pom.xml create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/ConsumercategoryApplication.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/access/repository/ICategoryEventRepository.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/config/RabbitMQConfig.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/entity/CategoryEvent.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/CategoryEventServiceImpl.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/CategoryRequestConsumerImplService.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/ICategoryEventService.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/ICategoryRequestConsumerService.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/IService.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/RabbitMQConsumer.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/presentation/rest/CategorysController.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/utilities/CategoryRequestsConstants.java create mode 100644 microservices/consumercategory/src/main/java/com/unicauca/consumercategory/utilities/DateTimeUtil.java create mode 100644 microservices/consumercategory/src/main/resources/application.properties create mode 100644 microservices/consumercategory/src/main/resources/import.sql create mode 100644 microservices/consumercategory/src/test/java/com/unicauca/consumercategory/ConsumercategoryApplicationTests.java create mode 100644 microservices/consumerproduct/.gitignore create mode 100644 microservices/consumerproduct/.mvn/wrapper/maven-wrapper.jar create mode 100644 microservices/consumerproduct/.mvn/wrapper/maven-wrapper.properties create mode 100644 microservices/consumerproduct/Dockerfile create mode 100644 microservices/consumerproduct/mvnw create mode 100644 microservices/consumerproduct/mvnw.cmd create mode 100644 microservices/consumerproduct/pom.xml create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/ConsumerProductApplication.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/access/repository/IProductEventRepository.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/config/RabbitMQConfig.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/entity/ProductEvent.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IProductEventService.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IProductRequestConsumerService.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IService.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/ProductEventServiceImpl.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/ProductRequestConsumerImplService.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/RabbitMQConsumer.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/presentation/rest/ProductsController.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/utilities/DateTimeUtil.java create mode 100644 microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/utilities/ProductRequestsConstants.java create mode 100644 microservices/consumerproduct/src/main/resources/application.properties create mode 100644 microservices/consumerproduct/src/main/resources/import.sql create mode 100644 microservices/consumerproduct/src/test/java/com/unicauca/consumerproduct/ConsumerproductApplicationTests.java create mode 100644 microservices/deploy.sh create mode 100644 microservices/docker-compose.yml create mode 100644 microservices/docs/categoryhttp.png create mode 100644 microservices/docs/docker.png create mode 100644 microservices/docs/emailcategory.png create mode 100644 microservices/docs/emailproduct.png create mode 100644 microservices/docs/producthttp.png create mode 100644 microservices/producercategory/.gitignore create mode 100644 microservices/producercategory/.mvn/wrapper/maven-wrapper.jar create mode 100644 microservices/producercategory/.mvn/wrapper/maven-wrapper.properties create mode 100644 microservices/producercategory/Dockerfile create mode 100644 microservices/producercategory/mvnw create mode 100644 microservices/producercategory/mvnw.cmd create mode 100644 microservices/producercategory/pom.xml create mode 100644 microservices/producercategory/src/main/java/com/unicauca/producercategory/ProducerCategoryApplication.java create mode 100644 microservices/producercategory/src/main/java/com/unicauca/producercategory/access/repository/ICategoryRepository.java create mode 100644 microservices/producercategory/src/main/java/com/unicauca/producercategory/config/RabbitMQConfig.java create mode 100644 microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/entity/Category.java create mode 100644 microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/CategoryServiceImpl.java create mode 100644 microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/ICategoryService.java create mode 100644 microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/IService.java create mode 100644 microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/RabbitMQProducer.java create mode 100644 microservices/producercategory/src/main/java/com/unicauca/producercategory/presentation/rest/CategoriesController.java create mode 100644 microservices/producercategory/src/main/resources/application.properties create mode 100644 microservices/producercategory/src/main/resources/import.sql create mode 100644 microservices/producercategory/src/test/java/com/unicauca/producercategory/ProducerCategoryApplicationTests.java create mode 100644 microservices/producerproduct/.gitignore create mode 100644 microservices/producerproduct/.mvn/wrapper/maven-wrapper.jar create mode 100644 microservices/producerproduct/.mvn/wrapper/maven-wrapper.properties create mode 100644 microservices/producerproduct/Dockerfile create mode 100644 microservices/producerproduct/mvnw create mode 100644 microservices/producerproduct/mvnw.cmd create mode 100644 microservices/producerproduct/pom.xml create mode 100644 microservices/producerproduct/src/main/java/com/unicauca/producerproduct/ProducerProductApplication.java create mode 100644 microservices/producerproduct/src/main/java/com/unicauca/producerproduct/access/repository/IProductRepository.java create mode 100644 microservices/producerproduct/src/main/java/com/unicauca/producerproduct/config/RabbitMQConfig.java create mode 100644 microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/entity/Product.java create mode 100644 microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/IProductService.java create mode 100644 microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/IService.java create mode 100644 microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/ProductServiceImpl.java create mode 100644 microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/RabbitMQProducer.java create mode 100644 microservices/producerproduct/src/main/java/com/unicauca/producerproduct/presentation/rest/ProductsController.java create mode 100644 microservices/producerproduct/src/main/resources/application.properties create mode 100644 microservices/producerproduct/src/main/resources/import.sql create mode 100644 microservices/producerproduct/src/test/java/com/unicauca/ProducerProduct/ProducerProductApplicationTests.java diff --git a/microservices/.gitignore b/microservices/.gitignore new file mode 100644 index 0000000..102a55e --- /dev/null +++ b/microservices/.gitignore @@ -0,0 +1,22 @@ +## FOR MAVEN +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar +*.env \ No newline at end of file diff --git a/microservices/README.md b/microservices/README.md new file mode 100644 index 0000000..69a3206 --- /dev/null +++ b/microservices/README.md @@ -0,0 +1,27 @@ +# Microservices/Docker Practice + +## Docker Containers + +

+ +

+ +## Product Email + +

+ +

+ +

+ +

+ +## Category Email + +

+ +

+ +

+ +

diff --git a/microservices/api/.classpath b/microservices/api/.classpath new file mode 100644 index 0000000..c6f2285 --- /dev/null +++ b/microservices/api/.classpath @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/microservices/api/.factorypath b/microservices/api/.factorypath new file mode 100644 index 0000000..888b54d --- /dev/null +++ b/microservices/api/.factorypath @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/microservices/api/.mvn/wrapper/MavenWrapperDownloader.java b/microservices/api/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..e76d1f3 --- /dev/null +++ b/microservices/api/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * 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/microservices/api/.mvn/wrapper/maven-wrapper.properties b/microservices/api/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..a9f1ef8 --- /dev/null +++ b/microservices/api/.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/microservices/api/.project b/microservices/api/.project new file mode 100644 index 0000000..42d3c3d --- /dev/null +++ b/microservices/api/.project @@ -0,0 +1,39 @@ + + + openmarket-app + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + + + 1687937687134 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/microservices/api/Dockerfile b/microservices/api/Dockerfile new file mode 100644 index 0000000..8a4ce77 --- /dev/null +++ b/microservices/api/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:11-jdk-slim +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/microservices/api/HELP.md b/microservices/api/HELP.md new file mode 100644 index 0000000..8801ae4 --- /dev/null +++ b/microservices/api/HELP.md @@ -0,0 +1,26 @@ +# Read Me First +The following was discovered as part of building this project: + +* The original package name 'com.sahydo.openmarket-app' is invalid and this project uses 'com.sahydo.openmarketapp' instead. + +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.6.2/maven-plugin/reference/html/) +* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.6.2/maven-plugin/reference/html/#build-image) +* [Spring Web](https://docs.spring.io/spring-boot/docs/2.6.2/reference/htmlsingle/#boot-features-developing-web-applications) +* [Spring Data JPA](https://docs.spring.io/spring-boot/docs/2.6.2/reference/htmlsingle/#boot-features-jpa-and-spring-data) +* [Spring Boot DevTools](https://docs.spring.io/spring-boot/docs/2.6.2/reference/htmlsingle/#using-boot-devtools) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/) +* [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/) +* [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/) + diff --git a/microservices/api/README.md b/microservices/api/README.md new file mode 100644 index 0000000..59d9651 --- /dev/null +++ b/microservices/api/README.md @@ -0,0 +1,2 @@ +# openmarket-app +This project contains a REST API to control business logic to save and get Openmarket Requests. diff --git a/microservices/api/mvnw b/microservices/api/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/microservices/api/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/microservices/api/mvnw.cmd b/microservices/api/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/microservices/api/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/microservices/api/pom.xml b/microservices/api/pom.xml new file mode 100644 index 0000000..bc01fc2 --- /dev/null +++ b/microservices/api/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.2 + + + com.sahydo + openmarket-app-api + 0.0.1-SNAPSHOT + Openmarket system + This project contains a REST API to control business logic to save and get Openmarket Requests. + + 11 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-hateoas + + + org.springframework.boot + spring-boot-starter-mail + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/OpenmarketSystemApplication.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/OpenmarketSystemApplication.java new file mode 100644 index 0000000..da37ab6 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/OpenmarketSystemApplication.java @@ -0,0 +1,13 @@ +package com.sahydo.openmarketapp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class OpenmarketSystemApplication { + + public static void main(String[] args) { + SpringApplication.run(OpenmarketSystemApplication.class, args); + } + +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/access/dao/ICategoryRequestDAO.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/access/dao/ICategoryRequestDAO.java new file mode 100644 index 0000000..9cb2bf7 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/access/dao/ICategoryRequestDAO.java @@ -0,0 +1,9 @@ +package com.sahydo.openmarketapp.access.dao; + +import org.springframework.data.repository.PagingAndSortingRepository; + +import com.sahydo.openmarketapp.domain.model.CategoryEvent; + +public interface ICategoryRequestDAO extends PagingAndSortingRepository { + +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/access/dao/IProductRequestDAO.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/access/dao/IProductRequestDAO.java new file mode 100644 index 0000000..6bce00e --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/access/dao/IProductRequestDAO.java @@ -0,0 +1,9 @@ +package com.sahydo.openmarketapp.access.dao; + +import org.springframework.data.repository.PagingAndSortingRepository; + +import com.sahydo.openmarketapp.domain.model.ProductEvent; + +public interface IProductRequestDAO extends PagingAndSortingRepository { + +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/CategoryEvent.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/CategoryEvent.java new file mode 100644 index 0000000..978d4f5 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/CategoryEvent.java @@ -0,0 +1,43 @@ +package com.sahydo.openmarketapp.domain.model; + +import java.io.Serializable; + +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.validation.constraints.NotNull; + +import lombok.Data; + +/** + * @author Santiago Hyun + */ +@Entity +@Table(name = "categories") +@Data +public class CategoryEvent implements Serializable { + private static final long serialVersionUID = 1L; + + @Id // This makes the id as primary key + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name") + @NotNull(message = "El nombre es obligatorio") + private String name; + + @Column(name = "description") + private String description; + + @Column(name = "action") + @NotNull(message = "La accion es obligatoria") + private String action; + + @Column(name = "holderEmail") + @NotNull(message = "El correo es obligatorio") + private String holderEmail; + +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/ProductEvent.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/ProductEvent.java new file mode 100644 index 0000000..6075041 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/ProductEvent.java @@ -0,0 +1,44 @@ +package com.sahydo.openmarketapp.domain.model; + +import java.io.Serializable; + +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.validation.constraints.NotNull; + +import lombok.Data; + +/** + * @author Santiago Hyun + */ +@Entity +@Table(name = "products") +@Data +public class ProductEvent implements Serializable { + private static final long serialVersionUID = 1L; + + @Id // This makes the id as primary key + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name") + @NotNull(message = "El nombre es obligatorio") + private String name; + + @Column(name = "price") + @NotNull(message = "El precio es obligatorio") + private Double price; + + @Column(name = "action") + @NotNull(message = "La accion es obligatoria") + private String action; + + @Column(name = "holderEmail") + @NotNull(message = "El correo es obligatorio") + private String holderEmail; + +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/wrapper/CategoryRequestWrapper.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/wrapper/CategoryRequestWrapper.java new file mode 100644 index 0000000..950ff73 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/wrapper/CategoryRequestWrapper.java @@ -0,0 +1,20 @@ +package com.sahydo.openmarketapp.domain.model.wrapper; + +import org.springframework.hateoas.RepresentationModel; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.sahydo.openmarketapp.domain.model.CategoryEvent; + +public class CategoryRequestWrapper extends RepresentationModel { + private final CategoryEvent categoryRequest; + + @JsonCreator + public CategoryRequestWrapper(@JsonProperty("categoryRequest") CategoryEvent categoryRequest) { + this.categoryRequest = categoryRequest; + } + + public CategoryEvent getOpenmarketRequest() { + return categoryRequest; + } +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/wrapper/ProductRequestWrapper.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/wrapper/ProductRequestWrapper.java new file mode 100644 index 0000000..a5ecf2d --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/model/wrapper/ProductRequestWrapper.java @@ -0,0 +1,20 @@ +package com.sahydo.openmarketapp.domain.model.wrapper; + +import org.springframework.hateoas.RepresentationModel; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.sahydo.openmarketapp.domain.model.ProductEvent; + +public class ProductRequestWrapper extends RepresentationModel { + private final ProductEvent productRequest; + + @JsonCreator + public ProductRequestWrapper(@JsonProperty("productRequest") ProductEvent productRequest) { + this.productRequest = productRequest; + } + + public ProductEvent getOpenmarketRequest() { + return productRequest; + } +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/CategoryRequestImplService.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/CategoryRequestImplService.java new file mode 100644 index 0000000..66becb9 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/CategoryRequestImplService.java @@ -0,0 +1,67 @@ +package com.sahydo.openmarketapp.domain.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.sahydo.openmarketapp.access.dao.ICategoryRequestDAO; +import com.sahydo.openmarketapp.domain.model.CategoryEvent; +import com.sahydo.openmarketapp.presentation.rest.exception.OpenmarketErrorDomainException; +import com.sahydo.openmarketapp.presentation.rest.exception.OpenmarketRequestError; +import com.sahydo.openmarketapp.presentation.rest.exception.EnumErrorCode; +import com.sahydo.openmarketapp.presentation.rest.exception.ResourceNotFoundException; +import com.sahydo.openmarketapp.utilities.EmailTemplateUtil; + +@Service +public class CategoryRequestImplService implements ICategoryEventService { + + @Autowired + private ICategoryRequestDAO categoryRequestDAO; + @Autowired + private IEmailService emailService; + + @Override + @Transactional(readOnly = true) // To sync with db + public List findAll() { + return (List) categoryRequestDAO.findAll(); + } + + @Override + @Transactional(readOnly = true) // To sync with db + public CategoryEvent findById(Long id) throws ResourceNotFoundException { + CategoryEvent openmarketRequest = categoryRequestDAO.findById(id).orElse(null); + if (openmarketRequest == null) { + throw new ResourceNotFoundException(id); + } + return openmarketRequest; + } + + @Override + @Transactional + public CategoryEvent create(CategoryEvent openmarketRequest) throws OpenmarketErrorDomainException { + List errors = validateOpenmarketRequest(openmarketRequest); + if (!errors.isEmpty()) { + throw new OpenmarketErrorDomainException(errors); + } + CategoryEvent openmarketRequestSaved = categoryRequestDAO.save(openmarketRequest); + if (openmarketRequestSaved != null) { + emailService.sendSimpleEmail(openmarketRequest.getHolderEmail(), + EmailTemplateUtil.OPENMARKET_SUCCESSFULLY_CREATED_SUBJECT, + "The Openmarket request was created successfully. Please check the details below: \n" + + openmarketRequest.toString()); + } + return openmarketRequestSaved; + } + + private List validateOpenmarketRequest(final CategoryEvent openmarketRequest) { + List errors = new ArrayList<>(); + if (!openmarketRequest.getHolderEmail().contains("@")) { + errors.add(new OpenmarketRequestError(EnumErrorCode.INVALID_FIELD, "Invalid email", + "The email is invalid")); + } + return errors; + } +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/EmailImplService.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/EmailImplService.java new file mode 100644 index 0000000..b4c12ec --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/EmailImplService.java @@ -0,0 +1,45 @@ +package com.sahydo.openmarketapp.domain.service; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +import com.sahydo.openmarketapp.presentation.rest.exception.OpenmarketRequestError; +import com.sahydo.openmarketapp.utilities.EmailTemplateUtil; + +@Service +public class EmailImplService implements IEmailService { + + @Autowired + private JavaMailSender emailSender; + + @Override + public void sendSimpleEmail(final String to, final String subject, final String body) { + if (EmailTemplateUtil.IS_ENABLED_EMAILING) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom("noreply@bogus.com"); + message.setTo(to); + message.setSubject(subject); + message.setText(body); + emailSender.send(message); + System.out.println("Correo enviado correctamente a " + to); + } + } + + @Override + public void sendSimpleFailureEmail(String to, String subject, List errors) { + sendSimpleEmail(to, subject, getErrorMessageFromOpenmarketErrors(errors)); + } + + private String getErrorMessageFromOpenmarketErrors(List errors) { + String message = "The Openmarket Request was not processed due to the next problems: \n"; + List errorMessages = errors.stream().map(error -> "\n" + error.message.concat(" ")) + .collect(Collectors.toList()); + return message.concat(String.join(" ", errorMessages)); + } + +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/ICategoryEventService.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/ICategoryEventService.java new file mode 100644 index 0000000..3144944 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/ICategoryEventService.java @@ -0,0 +1,6 @@ +package com.sahydo.openmarketapp.domain.service; + +import com.sahydo.openmarketapp.domain.model.CategoryEvent; + +public interface ICategoryEventService extends IServiceRequestService { +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IEmailService.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IEmailService.java new file mode 100644 index 0000000..7c7cd28 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IEmailService.java @@ -0,0 +1,11 @@ +package com.sahydo.openmarketapp.domain.service; + +import java.util.List; + +import com.sahydo.openmarketapp.presentation.rest.exception.OpenmarketRequestError; + +public interface IEmailService { + public void sendSimpleEmail(String to, String subject, String body); + + public void sendSimpleFailureEmail(String to, String subject, List errors); +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IProductEventService.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IProductEventService.java new file mode 100644 index 0000000..f7c718e --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IProductEventService.java @@ -0,0 +1,6 @@ +package com.sahydo.openmarketapp.domain.service; + +import com.sahydo.openmarketapp.domain.model.ProductEvent; + +public interface IProductEventService extends IServiceRequestService { +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IServiceRequestService.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IServiceRequestService.java new file mode 100644 index 0000000..629a895 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/IServiceRequestService.java @@ -0,0 +1,15 @@ +package com.sahydo.openmarketapp.domain.service; + +import java.io.Serializable; +import java.util.List; + +import com.sahydo.openmarketapp.presentation.rest.exception.OpenmarketErrorDomainException; +import com.sahydo.openmarketapp.presentation.rest.exception.ResourceNotFoundException; + +public interface IServiceRequestService { + public List findAll(); + + public T findById(Long id) throws ResourceNotFoundException; + + public T create(T T) throws OpenmarketErrorDomainException; +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/ProductRequestImplService.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/ProductRequestImplService.java new file mode 100644 index 0000000..998367c --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/domain/service/ProductRequestImplService.java @@ -0,0 +1,67 @@ +package com.sahydo.openmarketapp.domain.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.sahydo.openmarketapp.access.dao.IProductRequestDAO; +import com.sahydo.openmarketapp.domain.model.ProductEvent; +import com.sahydo.openmarketapp.presentation.rest.exception.OpenmarketErrorDomainException; +import com.sahydo.openmarketapp.presentation.rest.exception.OpenmarketRequestError; +import com.sahydo.openmarketapp.presentation.rest.exception.EnumErrorCode; +import com.sahydo.openmarketapp.presentation.rest.exception.ResourceNotFoundException; +import com.sahydo.openmarketapp.utilities.EmailTemplateUtil; + +@Service +public class ProductRequestImplService implements IProductEventService { + + @Autowired + private IProductRequestDAO productRequestDAO; + @Autowired + private IEmailService emailService; + + @Override + @Transactional(readOnly = true) // To sync with db + public List findAll() { + return (List) productRequestDAO.findAll(); + } + + @Override + @Transactional(readOnly = true) // To sync with db + public ProductEvent findById(Long id) throws ResourceNotFoundException { + ProductEvent openmarketRequest = productRequestDAO.findById(id).orElse(null); + if (openmarketRequest == null) { + throw new ResourceNotFoundException(id); + } + return openmarketRequest; + } + + @Override + @Transactional + public ProductEvent create(ProductEvent openmarketRequest) throws OpenmarketErrorDomainException { + List errors = validateOpenmarketRequest(openmarketRequest); + if (!errors.isEmpty()) { + throw new OpenmarketErrorDomainException(errors); + } + ProductEvent openmarketRequestSaved = productRequestDAO.save(openmarketRequest); + if (openmarketRequestSaved != null) { + emailService.sendSimpleEmail(openmarketRequest.getHolderEmail(), + EmailTemplateUtil.OPENMARKET_SUCCESSFULLY_CREATED_SUBJECT, + "The Openmarket request was created successfully. Please check the details below: \n" + + openmarketRequest.toString()); + } + return openmarketRequestSaved; + } + + private List validateOpenmarketRequest(final ProductEvent openmarketRequest) { + List errors = new ArrayList<>(); + if (!openmarketRequest.getHolderEmail().contains("@")) { + errors.add(new OpenmarketRequestError(EnumErrorCode.INVALID_FIELD, "Invalid email", + "The email is invalid")); + } + return errors; + } +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/CategoryRequestController.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/CategoryRequestController.java new file mode 100644 index 0000000..60a55ad --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/CategoryRequestController.java @@ -0,0 +1,89 @@ +package com.sahydo.openmarketapp.presentation.rest; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.sahydo.openmarketapp.domain.service.ICategoryEventService; +import com.sahydo.openmarketapp.presentation.rest.exception.ResourceNotFoundException; +import com.sahydo.openmarketapp.domain.model.CategoryEvent; +import com.sahydo.openmarketapp.domain.model.wrapper.CategoryRequestWrapper; +import com.sahydo.openmarketapp.presentation.rest.exception.OpenmarketErrorDomainException; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; + +/** + * @author Santiago Hyun + */ + +@RestController +@RequestMapping("categoryRequests") +public class CategoryRequestController { + @Autowired + private ICategoryEventService categoryRequestService; + + /** + * + * @return list of Category Requests + */ + @RequestMapping(method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public HttpEntity> findAll() { + List categoryRequests = new ArrayList<>(); + categoryRequestService.findAll().stream().forEach(br -> { + CategoryRequestWrapper wrapper = new CategoryRequestWrapper(br); + try { + wrapper.add(linkTo(methodOn(CategoryRequestController.class).findById(br.getId())).withSelfRel()); + } catch (ResourceNotFoundException e) { + e.printStackTrace(); + } + categoryRequests.add(wrapper); + }); + return new ResponseEntity<>(categoryRequests, HttpStatus.OK); + } + + /** + * get a Category Request by Id + * + * @param id + * @return CategoryEvent JSON + * @throws Exception + */ + @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public HttpEntity findById(@PathVariable Long id) throws ResourceNotFoundException { + CategoryEvent categoryRequest = categoryRequestService.findById(id); + CategoryRequestWrapper wrapper = new CategoryRequestWrapper(categoryRequest); + wrapper.add(linkTo(methodOn(CategoryRequestController.class).findById(id)).withSelfRel()); + return new ResponseEntity<>(wrapper, HttpStatus.OK); + } + + /** + * Creates a CategoryEvent + * + * @param CategoryEvent JSON + * @return CategoryRequesto JSON + * @throws ResourceNotFoundException + */ + + @RequestMapping(method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public HttpEntity create(@RequestBody CategoryEvent categoryRequest) + throws OpenmarketErrorDomainException, ResourceNotFoundException { + CategoryEvent categoryRequestCreated = categoryRequestService.create(categoryRequest); + CategoryRequestWrapper wrapper = new CategoryRequestWrapper(categoryRequestCreated); + wrapper.add( + linkTo(methodOn(CategoryRequestController.class).findById(categoryRequestCreated.getId())) + .withSelfRel()); + return new ResponseEntity<>(wrapper, HttpStatus.OK); + } +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/ProductRequestController.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/ProductRequestController.java new file mode 100644 index 0000000..232835c --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/ProductRequestController.java @@ -0,0 +1,89 @@ +package com.sahydo.openmarketapp.presentation.rest; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.sahydo.openmarketapp.domain.service.IProductEventService; +import com.sahydo.openmarketapp.presentation.rest.exception.ResourceNotFoundException; +import com.sahydo.openmarketapp.domain.model.ProductEvent; +import com.sahydo.openmarketapp.domain.model.wrapper.ProductRequestWrapper; +import com.sahydo.openmarketapp.presentation.rest.exception.OpenmarketErrorDomainException; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; + +/** + * @author Santiago Hyun + */ + +@RestController +@RequestMapping("productRequests") +public class ProductRequestController { + @Autowired + private IProductEventService productRequestService; + + /** + * + * @return list of Product Requests + */ + @RequestMapping(method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public HttpEntity> findAll() { + List productRequests = new ArrayList<>(); + productRequestService.findAll().stream().forEach(br -> { + ProductRequestWrapper wrapper = new ProductRequestWrapper(br); + try { + wrapper.add(linkTo(methodOn(ProductRequestController.class).findById(br.getId())).withSelfRel()); + } catch (ResourceNotFoundException e) { + e.printStackTrace(); + } + productRequests.add(wrapper); + }); + return new ResponseEntity<>(productRequests, HttpStatus.OK); + } + + /** + * get a Product Request by Id + * + * @param id + * @return ProductEvent JSON + * @throws Exception + */ + @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public HttpEntity findById(@PathVariable Long id) throws ResourceNotFoundException { + ProductEvent openmarketRequest = productRequestService.findById(id); + ProductRequestWrapper wrapper = new ProductRequestWrapper(openmarketRequest); + wrapper.add(linkTo(methodOn(ProductRequestController.class).findById(id)).withSelfRel()); + return new ResponseEntity<>(wrapper, HttpStatus.OK); + } + + /** + * Creates a ProductEvent + * + * @param ProductEvent JSON + * @return ProductRequesto JSON + * @throws ResourceNotFoundException + */ + + @RequestMapping(method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public HttpEntity create(@RequestBody ProductEvent openmarketRequest) + throws OpenmarketErrorDomainException, ResourceNotFoundException { + ProductEvent openmarketRequestCreated = productRequestService.create(openmarketRequest); + ProductRequestWrapper wrapper = new ProductRequestWrapper(openmarketRequestCreated); + wrapper.add( + linkTo(methodOn(ProductRequestController.class).findById(openmarketRequestCreated.getId())) + .withSelfRel()); + return new ResponseEntity<>(wrapper, HttpStatus.OK); + } +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/EnumErrorCode.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/EnumErrorCode.java new file mode 100644 index 0000000..5d0ac03 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/EnumErrorCode.java @@ -0,0 +1,5 @@ +package com.sahydo.openmarketapp.presentation.rest.exception; + +public enum EnumErrorCode { + EMPTY_FIELD, INVALID_FIELD, NOT_FOUND; +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/ErrorsPayload.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/ErrorsPayload.java new file mode 100644 index 0000000..5b88792 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/ErrorsPayload.java @@ -0,0 +1,11 @@ +package com.sahydo.openmarketapp.presentation.rest.exception; + +import java.util.List; + +public class ErrorsPayload { + public final List errors; + + public ErrorsPayload(List applicationErrors) { + this.errors = applicationErrors; + } +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/GlobalDefaultExceptionHandler.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/GlobalDefaultExceptionHandler.java new file mode 100644 index 0000000..b93c88d --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/GlobalDefaultExceptionHandler.java @@ -0,0 +1,60 @@ +package com.sahydo.openmarketapp.presentation.rest.exception; + +import java.util.ArrayList; +import java.util.List; + +import javax.validation.ConstraintViolationException; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.sahydo.openmarketapp.domain.model.ProductEvent; + +@ControllerAdvice +public class GlobalDefaultExceptionHandler { + + @ExceptionHandler(ResourceNotFoundException.class) + @RequestMapping(produces = "application/json") + @ResponseBody + public ResponseEntity handleResourceNotFoundException(ResourceNotFoundException e) { + List openmarketErrors = new ArrayList<>(); + openmarketErrors.add( + new OpenmarketRequestError(EnumErrorCode.NOT_FOUND, ProductEvent.class.getSimpleName(), + e.getMessage())); + return new ResponseEntity<>(new ErrorsPayload(openmarketErrors), HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(OpenmarketErrorDomainException.class) + @RequestMapping(produces = "application/json") + @ResponseBody + public ResponseEntity handleOpenmarketErrorDomainException(OpenmarketErrorDomainException e) { + return new ResponseEntity<>(new ErrorsPayload(e.errors), HttpStatus.UNPROCESSABLE_ENTITY); + } + + @ExceptionHandler(ConstraintViolationException.class) + @RequestMapping(produces = "application/json") + @ResponseBody + public ResponseEntity handleConstrainViolationException(ConstraintViolationException error) { + List openmarketErrors = new ArrayList<>(); + error.getConstraintViolations().stream().forEach(violation -> { + openmarketErrors.add(new OpenmarketRequestError(EnumErrorCode.INVALID_FIELD, + violation.getPropertyPath().toString(), violation.getMessage())); + }); + return new ResponseEntity<>(new ErrorsPayload(openmarketErrors), HttpStatus.UNPROCESSABLE_ENTITY); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + @RequestMapping(produces = "application/json") + @ResponseBody + public ResponseEntity handleHttpMessageNotReadableException(HttpMessageNotReadableException error) { + List openmarketErrors = new ArrayList<>(); + openmarketErrors.add(new OpenmarketRequestError(EnumErrorCode.INVALID_FIELD, ProductEvent.class.getSimpleName(), + error.getMessage())); + return new ResponseEntity<>(new ErrorsPayload(openmarketErrors), HttpStatus.UNPROCESSABLE_ENTITY); + } +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/OpenmarketErrorDomainException.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/OpenmarketErrorDomainException.java new file mode 100644 index 0000000..0a20583 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/OpenmarketErrorDomainException.java @@ -0,0 +1,17 @@ +package com.sahydo.openmarketapp.presentation.rest.exception; + +import java.util.List; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class OpenmarketErrorDomainException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public final List errors; + +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/OpenmarketRequestError.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/OpenmarketRequestError.java new file mode 100644 index 0000000..f103bdf --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/OpenmarketRequestError.java @@ -0,0 +1,10 @@ +package com.sahydo.openmarketapp.presentation.rest.exception; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class OpenmarketRequestError { + public final EnumErrorCode code; + public final String field; + public final String message; +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/ResourceNotFoundException.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/ResourceNotFoundException.java new file mode 100644 index 0000000..671a65c --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/presentation/rest/exception/ResourceNotFoundException.java @@ -0,0 +1,15 @@ +package com.sahydo.openmarketapp.presentation.rest.exception; + +public class ResourceNotFoundException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + public Long id; + + public ResourceNotFoundException(Long id) { + super("There is no Resource with id: " + id); + } + +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/utilities/DateTimeUtil.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/utilities/DateTimeUtil.java new file mode 100644 index 0000000..07dfa61 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/utilities/DateTimeUtil.java @@ -0,0 +1,15 @@ +package com.sahydo.openmarketapp.utilities; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateTimeUtil { + public static int diffInDays(Date start, Date end) { + long time = end.getTime() - start.getTime(); + return (int) (time / (1000 * 60 * 60 * 24)) % 365; + } + + public static String dateFormatYYYYMMDD(Date date) { + return new SimpleDateFormat("yyyy-MM-dd").format(date); + } +} diff --git a/microservices/api/src/main/java/com/sahydo/openmarketapp/utilities/EmailTemplateUtil.java b/microservices/api/src/main/java/com/sahydo/openmarketapp/utilities/EmailTemplateUtil.java new file mode 100644 index 0000000..f37cb28 --- /dev/null +++ b/microservices/api/src/main/java/com/sahydo/openmarketapp/utilities/EmailTemplateUtil.java @@ -0,0 +1,14 @@ +package com.sahydo.openmarketapp.utilities; + +public class EmailTemplateUtil { + + private EmailTemplateUtil() { + + } + + public static final String OPENMARKET_SUCCESSFULLY_CREATED_SUBJECT = "Openmarket Request created successfully"; + public static final String OPENMARKET_FAILURE_CREATE_SUBJECT = "Problems With Openmarket"; + public static final boolean IS_ENABLED_EMAILING = System.getenv("IS_ENABLED_EMAILING") != null + && System.getenv("IS_ENABLED_EMAILING").equals("true"); + +} diff --git a/microservices/api/src/main/resources/application.properties b/microservices/api/src/main/resources/application.properties new file mode 100644 index 0000000..de4c38b --- /dev/null +++ b/microservices/api/src/main/resources/application.properties @@ -0,0 +1,18 @@ +server.port=8084 +#Remove of this file the .example extension and set the values in <> +#DATABASE setup +spring.jpa.hibernate.ddl-auto=update +spring.datasource.url=jdbc:mysql://${DATABASE_HOST:localhost}:${DATABASE_PORT:3307}/${DATABASE_NAME:openmarket_app_db} +spring.datasource.username=${DATABASE_USER:root} +spring.datasource.password=${DATABASE_PASSWORD:12345678} +spring.datasource.driver-class-name =com.mysql.cj.jdbc.Driver +#spring.jpa.show-sql: true + +#MAIL setup +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +#Need a configured gmail account. Please check https://support.google.com/accounts/answer/185833 +spring.mail.username=${MAIL_USERNAME:prestrepo@unicauca.edu.co} +spring.mail.password=${MAIL_PASSWORD:xxxxxxxxx} +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true diff --git a/microservices/api/src/test/java/com/sahydo/openmarketapp/BookingSystemApplicationTests.java b/microservices/api/src/test/java/com/sahydo/openmarketapp/BookingSystemApplicationTests.java new file mode 100644 index 0000000..369475a --- /dev/null +++ b/microservices/api/src/test/java/com/sahydo/openmarketapp/BookingSystemApplicationTests.java @@ -0,0 +1,13 @@ +package com.sahydo.openmarketapp; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class OpenmarketSystemApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/microservices/consumercategory/.gitignore b/microservices/consumercategory/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/microservices/consumercategory/.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/microservices/consumercategory/.mvn/wrapper/maven-wrapper.jar b/microservices/consumercategory/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 GIT binary patch literal 59925 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

dy!05UMhSKsK zV1FiJ5SlAhkpcl_H0wRzql?0Qp5wz72o2cMC@utM(|&o0ZO_JpXr+N7l~F?Ef_02md^m|Ly|(EN; z%;)3t6SWt{5hgzszZWS1v^AU?`~Rctor7%qx@EySW!tuG+qP}nwr$(CZQHi1PTA*F z*Vo_ezW4q*-hHnl_8%)^$Bx*s=9+Vi%$1qr5fK%c+Hm4kiE$B;kgV)wam25w$Y7#k5$> zyB^6k3i~L_6~PX554`c3Lxx;&_sT;I^U92G@fS6#(Xv!B%;H3+{e)1R6lyU)8AK1_ z?@>F5H=sXG=ep;kDRZO_ofS}`Jus*Qp3`_V4v~&b-RQ=t8AN5H5{@!_Il~0 zZd!-aH=h)(7CJ&tL%%{P{6d_g=5tsj%S3Z!QxjrLdjoKmNP-zSjdJ!?qL(UMq38ps zjKSz5gzwhDFA;5md5yYb>QN)U_@8Xpjl4yw5065)+#MSGp;yQ*{%mt>12;$~R{eVV>o|juO{Z^ z^o^m@DOBrE2mm1nLgBfA(Wi=X9R%(1UYZcZJ!3;*bR^smI~6lyn`O4BOwo-STsQcyodVA~leg9`{=l(qDl@DCM>s+w`%S_q*PIjYP ziuHHuj0VVW1%+TH*lx9#-$^q&l)G_ojju-w{# zVs{oOc>_fcS51xY+19tN`;V~R0wVyuxdkS|t zC}~Gtu-UyA{H5~6*ocUWM)RfQ076mL1r zFVWV%zx!_*zk`5&dFbdq4nbWxIwAu=`+$V-`m<*-Z*mE2X|>OCAJVV;wlq0E$hVe@&x7V(!xg1*;%`} zxxBu5;jmZEH*e!Rj=Mz|udBR8BR6LiGoLWb<1=<14it;Fuk$6=7YCR&;F+%r`{S6M zP92W>ECy`pZR$Q<6n8Zw1|uh*M=zK=QP0b38_aX#$gB^y>EahIiUzy^MP1ct%UhZX z>FFLVJ=H`FRSq!<_DtWyjLZ6t^Nf|?<69Aj$U0*lrAJG0{t;t8Y^SKLacoR%3EXw+ zDi5T^PkjmJp7@B|$lkEwHHaQ7BGc$})@qNRqk4JH!(bgPM!{Mb&Kz|UGk?QskODW5-NCJ3`Fbks<}%TsOB+e{Hn1i7BP z(XsKkfl`r0N)u1VqaPYGlDxR3>%y{&vYaQCnX8AAv8h8>a^4<#jAhtfa;TdoFlN=?Ac{@Cdxj{YI z!kxobbr?~GU8JKwH2Ywa(#i=Rzof$nu?4-zlN#QJflTO^QkyarxNI<~MY1}jy~Jz` zBRwV&0+G01D9biQ4PR*1NiSqTXZB~NdI6yVEU|AiWJYA>k9G=*`R^VFjr{jhqZ$&G za0#huq)Mhb&8oR!jrv%;xRe@b&PWBXh7ATurhUY7yobngzP;($8b5g z9U{5JMt%fMp(N6ZVGsYa2p(#ry;Y&;GG(DG((_GrS%r&waWuX94*RX8>&x|Lzv8WCaXaWo(3FK=U@G#S$8kCX_R6q|VO;WbeXk~x zmq?NS+S2WfO|{j{dKy5``SRA!r+%)`DCW{s?8uZJW{-4%x}KJzAtiyY6b#)!fe0kA z)=W5C>X6ZLRFH_-$)Z(B8Hr}FD#FLGum2gRluDsrJHf$do$r!ORQqrI6~=-H0vPiG zC2V88MIp?Xhc&UnIS(c)naRXTu-r!%x0J;3uWjp5K%!b_v$;;T0*{_2txs!*+BgP} z%eY2;N7AFz(g@fFy&(hWk`R9#fRZ&X598A7xjHyoDJ4!3CK{Grr4>0bTBw3ps{tN7KqVY^)~B5St2NQS9wH_Lc=s8$1H5J?52_$nh z+rnm{F~bVIsiCZ^Gy&eV*X9JTJZB^`|6F$9|Fq@ekZKP~h_BWGsow^hUpo~MCTrdk^1B;= zNXiYAZnUPm>}{vX*&Yb&{0FNvW!V)h-<{na1yT-|kAkG7xU7QA-NAc|e4Nf2`OWnV zxbr6@^wO^6xW+Xdu=Z{sdK+Qw3Dii+X&Y(VdCv>CFEIOt?MCM?9@CDUKm7+N>%!q z$WI;(L@2YJ&Qfwr7k@<77r}%_q3O8c#><<+(JFdeT2?e+nsP4h+`n(HuX8^8qLN88 zv^9`|ICnNwS^PYDf7ebCGG~QNosD6-%$5;6Yx$`PGlZVnxs6ntftJW^L?iy3KIBDW&1q;{OspV)`a4w`+K45XmW5g6HLPL(lu zM^>HAPux}=ZJ?|;f=zDh!2|)WLyu7pHcc)9vAr(R_-sI`3GRfExjVpYMgql~xox)Q z)W3=WFT93oMdC)bluYO{cphI8Hjl&)W$TKN(PAk2r&mB9-)@%@xbewYx!c z{}phewJ939{qT;q&KR_!>>XnVYPC^kRaX%+G_v;*kg4g0jdi&G2G5$4#bk+*0mK8` zie_>y1oDA_0hGE(n`I(s0k(P&;*KDaX278vofbbNMZ-&1MCmPD*6d6oN$VjMzpTd@C8e zg81s83_+Y#T;duYQ%tXE$RWVk=@P5Z1VY<1C?mU)7?G9IHYx#rHCx1Mhb!ajXBoJ-rANULXqSAu0Mn9s%@_;uy-AOG|5#jDZ3j5dR7|< zR_{f>x5E@uRa$=rDD-yel$t(bf5=#v9ZWObAu%fou?4KkV-kvjmRiGX7iDe(Q)_^=>m}`2$#Xi#5CpJTi#5EF1T1mmPB}c@A6ou~a`>sHSeM4gF(ksh|DObX#Ao1r$Jp3I3 z-#zhd+d&)DO54E0K@@kKgxRB5%x&3BZ$OrawIi6~b_kN~$5G(kH6b5BD&%g70UWu6 z-ub`EccvhA2YleM%U@;V)N{Ixrkd0bjN}m=kn%!g%wE&P@WcBs>5NJ~t}y$Ar7F1n_=iC*<|&`C=qG#+ z0|)?s_kRK(@&?Z40!~gQHirKa2ua%+8CVNj{J7LD3|*Wp?EV9bZ1_j%PH`5U;9>aTZzwPD=a zXur{4zSk&)HrOFOmSK8ZKMHdg*HQk|a($OZ(0puje1K8EZNjPavWjhh64i-B(p7Zf z2g`IQ_W)I`lGa!LCabrDUSVPmGZbVX*#xhnAH|koEn~hs`=w;zVM^IEU${9oXf4C9 zk#|zrR`2_TI+u08MszOoi%H;viD}|x@Ax-{F_aW3ZIQHw-pT;hgNi%weuhcB7xt*kubK4fep+r)eaJIl%p9|sqv{M(E4lgwXe=HL2nYvO$$HX>QpPxqUn}WG zs*l{rztHOO@k5#cP%_alezmlZW9HCcT_;auQpbtV(Kh6e(9wF`C;OM(L&uqUaFglN zk@mRfKGV716J9j|zU-6W(m9pmEF&sbiZMv*M3~8lC~<@%sH8mKCL5zS4h--)TNbi$ zGT~m~}sa$tL(& zG_GBAe(+OZUY}-iY-rcb4f^fNZt_IXS52F^MC6>C?-IuOUttpxwVQBy0~D@|I1g*pQ^8D9@mu?5(kge3_GjbOm2G+7-z zkx`X#L5jF0+(b=RSgOE*XGFk$mF562Yft^UFH0micC5KNH~tfuDq*ce5Q~fKPyieC z9su^F5Df-F2X&FrZ1?<8uQ5h`uh~m z=&m+g_sL;h^%^JcRk%COiklbyo`Co8z9C%hj$&e+^pKMm>7Jt({+@)$DJbC`QjMHZ zi%3X-hLW4Gca)8|Pf3A1t4Ud8Gcj`ZNDE=lz<+3#C9z0jMR_q934+6jFXzJ$uCq~+ za-#O3p1hSU;tiKizC8=Mh@y(Ne3L{f0B?%ewopC*gCiXqueXVpGg9HaGK>hK#}F8++%^d7M6b=5@V(e#PAgrUnD^4)b1JPZ-PGNWqckW?kadj9w8b7f zp6l)!4JIwHtcBOekEW-B`yJ(E6n$+g06FFIjgZzz&+`UpKdgY-=lxNe1BI|=Cg;T; z?FYQs{*)^&tV>xbx0m~jf7l5>`+q#>!*0u^UJNZmE(3w>j|yNHB$#6zkjE;_0pL0S ze2gb)=zGHVUt5ge;3k7XmZcc5;mh=#z-ZobkM!xX0De$bw@9s|&m~zN9 z!K5tX5=4qA2sK|$bdVMz5etUdXN!`}2PL8R7qLr)Si} z!IONdCg$e~UlJ3u{n50K+;kj7SP&tC(^xDUbl{fdvL#ilA93{7Vm|&0)1p+nx=!XmT2qv6B?FjPHZV*SamC-ro9lXMAbWtsPx?Xq1Kcc_^$@r-YuI4|#Q?})HOyhMfBUVTIsc4Su?*`>kGqVs(0tbI_r0@mbv4tR&NZCQd@%?W!R_Br)qtk^~)!$ zd{bZ$2k_tV&)c$dz%vTer6*=naysJcAnpE2vboBzhwzL3ZZg^xE_1)_2eUw2B&FcL zW(!+zg@=0oy{=sCi##j;)Rn!Ty7I5A;QytP@}FjBaRXc9p9bUK6(&VZ!%ayA`L8Y0 zHgiu1Y%~0(WC8`wPF)OYDg?-xhpK#kN37I*3t$V> zeFT`E`_n>;_dQuVYN1PBmZ_}9TfEcl#^=`Abh1!Ek&ykSp^2 zUtg|J2l-(Fu4-@Z^fZW1~i@QYwP9Q9$d-lN6U6i%K#778wN;pE7`?CIfN* z4j%4F^H^LF6Q70%gi@GEB7#Kar{F)1=Hjc!yt?q2&-sWb^&Mo@Ali3 zYsI8ugwjs$rA3@sca{d2=a5mZ6PM=U7R~l1{udpZzpk<&^i)W$IV*$FUzyJ>#@G4l zunDZP3O}4G8=e2)DEXo;q|ooRSY*pQ@?dPnSA%LBmzMuh zj6iCX{hWsksbMQPykb&WEA^2^)4$ly11z>xG12rAj}?8Ft!(tswaOoNlpt=|kqrTJ z&?vxxBG>4bNn(%_w*|gVh^|*LD_=TzvKLX^EG3#)_JHhIOGSwPo4|0o#`B(-!+g_f zebxHKe=60kQz4i3=g8Q=o!~GyJjpp(m|JFSl$~J?ocx92m&&RUW=F?w)i?X8sjbbg z0+7xvpM&&Mvk2s6TEQh%-l$+wW+-wwx(yPsAW>CS<4@5r)9$_e^l&p0?yxh8t`Ni| zvkg20%R$9KD0hWHDff&(!UL3EXA@7RAORZg2_v!tmF`q!lSi%o$>srm>6H|S)B^2X ztV|vT66Q&WzEYv3LCrtL@fFVn_1u!3AIwvi9c5g^-LY)$kEOwFcdT%;T!@=Lh3b{K zJ5DKC5TfipAQ;Xelrj5>A z=_T7N`9+b0vmdY_zM3SwtpmRY?wNX&N^VG?5}z__+A;qz)l|ZX+QaujvNXdiXZ(V? z{OmPo1P@Yd;$G3ic^NHAm|1j%cIXFahDM~236V%gF?}nu9!H?ApHB?XA?IZs*m$xN z6e^ufgCQ0+_=81#=-f_IGbvy4Xizg)_Q^<)baO)G5(DO zgxn}JpKET9(UqMupTD8jB3cp z4G`IGH%ByG7iZ-QD?Esze`e049rA`qU8-l!$qPyeHl#z_q%CNdv(L)XI;?Ng4p}qk zjkLr}p4PA1I;7{Kc1WJp_Y!Q55JqK#sB5nY)=dehb&d)~g=roafxSw>Sbm)`xVXcf zG#`10jAW<8I#Nd!Q<)M`*0YE;dZ$(eKex&V5$dNnGAi-clRskp_SX#aKy?8;Y^RA; z@xEcdlr!iVGK@89*}AMBb@T}NL#V3*a00ErFr0GKMbDa2oQ-DkTV{N0Y_X9!nY1oWN1B)$PK)1Hfas5LPvtlH8ZL@g6sQ;=~> z=vTK;Y5TAt=ya36;hG?pES_n__RRVv!qlpCcy$N%vN$cm%p@=41Lzl*;2C>KsLXaT zT7L{$DZI@k7u*!SE|y2=Df|?99>gyrLB^ur~Y)vi9TpSJl6Z57d+o)lQAdh`R5kMGB7)eE`*Q;2G zQEcRN!Q?$b+o zUoag8iRTMmKuJ)5s&zS~S*B1~zU7tUT|q&h!EInBeZf#vwR|05>zpU0zRe0VWg5C; z+*3eGa6)oAS)jk-xN&bD5&{yx=Oh{=T<=akX4F4Yue*V0VM zkH4;7TLKmx%@)s6c5z_Q&5qaRX;$2vIP-ud)H84PAd0uJX*ee_AkeYKVtI6CW@W(9 z8KHRBux28|zpfOJu7mRVm*s z%?_&|3rLG%MZsk-XuimeAl!(zkxHX`$uQhJ=7%bztEXtmw!ImA{G>b$_T&F%g zFsQ^s?i59_UX8n_!c>ZltM6ABcMHOtRyrRBB3#Yo+AYyiYjPIXgd#0RF$%&xX*?+- zsPtBuy)cPjVkYkf31o50Tp3zUe-dekc|5FYz`%%l5L^>Pje2fT{!AGEHxWG_Yi|{!_@x>cc6%5SD z$ZvA==C5j@X;L3MCV!XA?SG9M0(T#83W28(9aS(t{d&siNAR`PZa(ke>q+Bbo82ut zvU5xmnR~F1ffCpw7|Fg1Gx@$)QGYDzf$|nfH3sKP3=Huhz#4)dH-ay~7cR-ML4hxY zJC3AyNh<#3hBqDyFFY{D#*eE*cnh{slzoT{|2On)ATR!sO#t-^ABA9?$(s~V<1UDq zyo>|Hc*Nrxk#`IYFkXaDTnoHWAP3E#`a^&-`SJ1RcPRHkeTbBZ&q3G_0==kIKNsi8 zPK+SND@w;5@(Jm9!|;LDkth-G0@RZYW&YJ3k={qg)_?xtrkih&RnY!V zo$Y^|7$WW_MlSzvW>1PbggdqghA-L1jCJc$kjxUIfuHEPj zLAS_=)=>DNjluF!EIspf<>8IN^gzw?ak~<)+k{ykeXo%GE=68f$Z;ZaxUAiN%zGF_5d-JZ0I9JZ*6=&gi*5l3i_WA7VrU|K{v|a zF=S?&Yw?$7*XrNDug-5bH}qO#ji37gcoNsG74BAO>OHL zJ+$W5wVs^^UjrNk2QiwyJ(aXP&FiHZNvXoDgPCs;lE0r3q^E zb1QZFSr@``4tbojlnOSCOUjP5QW*?2!?w1>p3YwB&Mp*GO3M*qgz>{jv{ak$b7(E?tkY*+R+^&>> z2dO%o%W=L!QGyw(WuAnw#oO{!I(8KwC|wq_y)<9lMxDiZwL#OlUU_DnD8&!tX&a7f zewQGgB8{dwkjR8EC%AP&bY^iirN#jA47*}#6?~g6@a?%^7(){yv(mgF=P`2yXr$Ab zuYEY=Rw^DeYTFZ^Ywa=6!`PU?q?O*FI=gFl`bbPev2k8T+=C;_X>sLJQt7BpOATpg zrpfyxa?;Uc`KUT2B@@q5dI0rCDDr{Q8d~En$h%e_rtAvjTEMd-OH%Qc7)o~}(R!O` z(i0MG6N^6LsC174qc^gK-0ayYDy1n5!q9mg_|@<( zH^wGhrdBV;Qzf}LA3=l3S|l{2(ylqgc3&K7pj~tzGSA`-wO86b&05pv_SO)Zw_hfmjx}wah`^|Qo(J(X2h!rc zPxx05-j4zshLMr@l7%0`IwPtjmgCwA{Sxj^m0H$vopZOcn-(l18gE{v?!K>bbY!=G2sL;OsI!wlS zl`om0y?Z#6@8vtXFRh`e5wNSy>T)H41%)Nt*jt9t?c#B>nBknI{Kbhq*5+Q8Lxe_H!J*!N? zH;Gr-bx%ExZEmt^9#)xcGN#!|?Xz6|l^~v7U7wM4&5cAIxbMj53pOBXW2LxqE#=+s zUC(EG;8)Odp&Rd)Qg_wrCnDExg_o7dmilm!?}lv0f5NK>w#Db7WRQa5Z94pw011GV zyHnjESKowJ&H%GT#al{iWgq|S`7S)99~4MXM?gl`=`rD9WWj$*)*NbWq$x&Jdq^ z(Q<+*Sx9NqE8$^Fqc(bfoIHwRM8##C@jW61>q;vG-*gk8G>_$;P+4b&%lQGl^XQpt z@48~+y!wp4mqN@Q?HOZ!Yr_;kT-E1R!Dz4OldNG)t;&2^&}q?~dMa&r60E7E)}#>< zrV*SWbim~#un~*J_!+nsWF_-x*9gTk>Hl>g2f7!ZQCMExX9omA0+-Fd%?Ek`^u5Av zTse2a$3`W_+4p=xIbdWKo>d*OlH=zIocE<>kNpS;Lx`OQ&-Q1P$CASxn1-0~RGYd=l#b>XT!xg+7u%F$Q7jSakj)eTa>Ty2qji4Eb4HFzvHy#qP|SXp zeb#Lbt?Nt*I~QuZr{s3Gk%GGcNPV5a16K0EjBCtb^pLdk4E5uLHP+1tY@v3z5hntx9$Vv0Tj2xkovNOuQz_TE%+7VTio)we=x|p6Zw6woNPx zcG_Z2O%BbGxfe9ld2ol=fLGR4aFV*%y*3D#mSjOJI|7z5B4+&ACSoxT&RK_fuBkxk z1Z{D-MxPSpq+f$DN!oyle^-|TkMi;fqFJ1UGd5NFA{AM^B_NurnPV??jj4yDq`QF! zXQ%rlV=SedtGKM5GccN+LZ_zY*nRh^QhVnOGA2jgF~DjqY%>eUXu}5pt)p9N9V|0Q zXC@$-8kj_9y)dSR&f2Q-S$t*V60-4m5IfeHAp)(*?%V*RU3YRI+fVm;XbrN;Znfre zHV>~Kt<08qOPU*d|3s=CmW8uaSX^bMnclwZa0*-JYD_xdlH-9QSVqCTFRD6%n}VS4 zy>uY+r9H8?BwSa;PMf%#`x7lDq2Ra&?)MJ=q&X-Vdw3kLg=AF;bh`Ngu`{SU0AP{2FA1bXzI)&Qc+N zQe2V^EkBDVUja~}gLyF(bfSN%OWm}6u4HUH3r`v7TIiEzS4!DYc1O$+O(bDf_b(zmfoP2*iYBPA-5lKMee z{!TLNugW*re`hye;8u`de34Z~ks!!LT7(P~?WfwY)j%M(rRlsVfY75wv`_j8-f<~Zh@@_No5u3lgB08$gw3J7t6YYm|-P>#mI z?Ihgih8w9<&jhN0?+L@xpaZf^v}|(+(B!Te$gx^{k_-y^@xZ8pvz4Teo8$&XcRy}gCz)E#b#7b-MxVm-OaCXYoKRhcAIJfQDELSMoUPZ2A zGJT9WYcGs3O6S~oE52|3o?hBGjTo}Z^#p~Y8HA5Pg?)uzq1dK9(?}wqZwRa130=%H zYf~z=E0yYqfTG0fyWBEMhY>h2^w4T@H3nLOIgGoExay2GP9=7H+(sF!>QtGs1-g&W z_gbac+_K^zlCn7G0blgrvHCKoOxX2B-RbMlZrJ;wg{CYdkQ}uH=vCz{^XL9b5MT@I1LRLBCN2G_*J_s4ZGh zWx7MbR#kfA8X5^2SsOa1ssX$FKr+_smpYMtr_8IC^|BTXp$X~a|@aOR`r7XM(DK=Ni-`62A>;$AvH z9_f{d2&YCRYk$@WOzak*c~OoAFfe6f@DJQ(UOb0(1s-V6+8}t zM%Y6TDbM(n0`0~e(Z=fVgsQi^OTtAv{cQHYLACfn!I5^C`4kt?8a_m$6 zbcTozSL$v*0uQgb2#l)xk-#q3kt{M?g;oWD0s&KKtKIf|mIluc_x>!Nn=F(UZhmoC@MLVWfWf8%A{!LJ-a9ibm(5(&roPX(GX)q zd@M1x1j~Z)riLkJ6l^njEwFgGs7mySZY8C9vkvltS$4KH+PxmEb7GD8$Z)quJ$36>!5YC6H4?tWLx3jX zL_~2klDHUK>j@1}T+ZgC#@^9#==euU-lRuP-UC^5Cc+L8jCGOV7-{#UL(6{hSs1p> z-8|04uLdI$1?;BBEEg_BTk#KN4^e`X!u!4==E(^tnRt1KV|!i-9k}i*QR9@it-?e5<6jq(E{}G5amY*n+H0gn_Y9 z-8;^pTZ~?CK_9>Yi%5S(q=#!=vps#u3bpC*N25|FGH$TQ9Pd_4r2%$YW!S{i=_C!G zD_fX}hHLaDE%xg_fp|i?KbzndD++)5bCZZKr8}JL`2AxVDM>tTh|-T>%j~EB_}}&( z|K(H^a5QtVF|l}x|sSOHm@dqAK_|9T*4ARfIiVq!E1 z{?^1IHFL*xX$M4a3Mm5YU!EpeD1oBkARcKhJu}}&7N2i-A0U4zc4~oNFEZ@*1*d{J z{!TQ-;$6U&WxGgOjF^lV^S+fK(41yMfFZe${01$COSKm>OdY0Ko`nRwC?nIcv5sS48^fobUN+7gD3h<@?TK=U zsq2}1JqYJDkDjs^)6H3!Y^(ni&NTu{w6vfAOZuc(I-NvUIA5QH9(Sk7D2hx zNiT)h!1lkZYyV}v{?Q|*B<@K93LuZprFU9Oj(?x*`7jTy!&B9yOv zBC(n=8x!WoL6TsFoU<~Hlq~@JoFJC(_I;+4<3?2gkpWZU!T~EWMF7v*q|26`QcQ^K zyY7tY=WEzh-Beb}LTZdzTqsr?>f%%?W^OSKq2qcG1lkqAukEF_zkk$u>XCWe4? z#Ea%vy>ICg-GEoSljel7W)-xQqU;Q+>#pyscZDYnsvo{+1MT9<8T4`~uVdxf?M~|B zynet59NiL z!rIjSxz;b%7{vy1l_G16WSgRE^<nid77&vHB`Hc!j_1F`ZD`0gi18)_8?o51 zU@6a|ci)iO?`1pg1#z@MGaRt#+VAApkLK*L@84Osn8n1p&wayu_RhR=UwwK_{XRd- z@_u3Wn-N%#fS{lWoezfKS`U=q7T4pO{SIjeFQMNZYxLGubs&kZYA-$P^!^hNiAC_F z(&Wq`HKids+xS2b*p4AAYkL|*f4oYA(x!rpT&_C7K;2ZG?{}K&D<-FkT@)`3VJ0Xb zH#wfssnie>s1svHRy7r9dzwfw#yY({tYB*1nNx)vazVXK$6z6(v#cyYmxjT(-pz)Q zmT^!`Ze~41QiQ(6|xf}+@C5ZNKgKywZ9F6&s&=xLzP2GjAv3Y0oF|N9sQ z)#f|e$7y6jIc&Qc}%ut}8+Yq?|zk-iAB&`7zddtXt^a zODQ(DgQqHOTe)pS1jRV(Z4SSYxFFm9bj`YffOXR_nrFrf=Pmfr^F8?NXDAH)RY_IJ zia@*!T}8>IHGTVN@d71~NRP5^{UuSEQBA;iP@E>vHBrii=Mt#3LM<}6v(uCW8I>pj z)iuPfGO41XkYTVm86?P+ZI7a!bu#F#q8E#ld66=_3qe5(7rwYzkyP1Cj<^O27m+O1 zqSOMa#3!)|Oi}&%<#TTC!j#90$`EUJWnuAw(DgEXbdGZ}D3-~lWKfV3CT06jARCpc zgW3?!cGxC<4bPFx>G2K|pQw6%H=mDNJ9f0i7Z9 zM9Op2T#uZC_CRl%l}%9a`x8xq0TEG6nyJmw%8@N+>W!pE-tgq@Th2AO(m( z5h}V(JEs-EqPp`)cKevppHePn%`Qoa-TTm}v83nfYu{=X)eka!5~;S>wiZ9KJjMq6 z>Fgx8lpK|M8rEmK1%a_jTLUsb8vpPoSY+$7N+_;3vCrkzy8E~s*E6qfhheM@ zrP!Wm9FgoRV70zMFupOPdouaMx%rka;9iusBffkukbq&Oa!Av$T*C5wgjUDJqJ6aB z(?h;NzQ4!^wA4Jl_hYZYcSg~3H}db;N0wk864a3n*J6lB-nb)I+5y2n+93^b!`=_} zy?b!&O*YX7-^{Ztu`4-1**M4EM4h_wU2-D?C}Aqy5ML7Yl@D#`Ppq--or&5LPqq_} zTx|N&G1%{D- z63FD%(!Xv4BFxTlU%s)bFl{J%a)l zqbCh9*g7WHB#?5O@r&ddY*myj&i_IQQSRbI!%jx#TIh8Iq)wt}a5M>>xO${;MLFTF zQ_O(@DdX&)d|+07Gko>hSrJy|%;=1|&mC?0hPHtn%4a35agZa4ED#_egj-4`fBqo0R#9mQ#BIn&i-6N6{L`Zvuc zhVM*t=AS0*G3(^>#-9WE*H7jAAN6DZVp#r5)s#1Ibo$Ty%9LoC$U%Pi5WROaGDy=C zPt+z^E_YxBba`ZMfei{n!7?uADyKFLcYluL^~1#!m1QqvZ}0E6J}Q3>QHVrfykO_w zv$|82jDqR3+Dr8`t0^fspZL6W?}Nb;in4>0ln_bv#S{!mP!7LHENN-l=~@%6ujbu+43{~BuZ zw^SLl6$KJ<_cuxbNb7Q!O0hDnWC6M4;8A_GNy9bkmdF>;M}Dt+#2h+{u6VQ^>0eSK z?k25<;(Ths!zu0AKiM3QGv1%~7fk+3?IroYB0MoYk(mh#@FSK8vIjI`ov_bH&I$oz zrLZYtsUQX0EBOWR#C}5l3RW{%Bo}~%2(30eRFFehtEwIkdu=PDTFFsev{oQPGaF9N zLO7CGqMw|o4 zXEdacLL>~Z9Q8;+O$?#CmfUc5aG9?YnHuPISSR3nZ8JM_D8dyb$SQv2-HWX?N}@nm z^pSjPE?!b&xN4pT6Iqj~IYUn!w~x*r*YJ!DJC8qDd%4PPqge{1d$*@GPtr)Wz z>kkUX_B@U^7XN4)%$HV&YAuDsY&6oUGVU~47&0HNr6)8$M29v4AHrT6Y7amNwe@2$ zMSs9J#(B)Opvkmq-rs#zH^A-}z<5I6p~|}zU3FOP#3gE}fPLjmm(O>k5}KVb$R=n4 zvES$OqRV_LtbbnFs2e-~T>F$+Tee&KFz1vD>C`sQ)TI=mBR(H3_R%|oh4VtiF3Lw_ z7tdE0!H=H2f)&ytAwMlWbDnuG(ULf9m*DTI1h-oaT(SX8kWAje29U8iM_5m`S?wCh z|2)fTcQ|>_y8p(TEt&BeR`_UPS^SO_Aw+z!Pzmz)2I2q4*o0Z?4L!A|{tFwR-u=j9 zsk_AMkBW&!9LF;X`vOexf?OkPMS?qF1or}T8%dvO4jne0W%dkm317^C;}z8p2F%50 zC&$arDGBdTWteETu7-Ej;`Eo6}jy1~TUaAs~m zhhS2-ZEu)clw!Zg9(sfvs-2Us;-4ssADLua7E|t`zlU(bj*`I2HTml-oa)BD4e;6x z#Il6qrF;-Y&tW8D@woFayo)8iO4hl9<<`}vd|k|mufrz)`$@MDyYyXLUZ9H^p@Jxe zn3mtSIH_Iw3x1|2Uhj^WaR8u^ISw=>@4vIf@UM=kjX!9O{)a6V`2W#l{>NGNfA8Xd zH=IuY-n}iVHvby@n;Z4Nh6Epb#M;g4i74tF_sb-Rd>-;(kwu z!RK#BjQOW9?`I~}#+8PwCNmj9+V$-8Ece{>&Gqh|xAzMwe+X%;d4~ahM4=pFn5%J& z@T0^41a(ePmuQCKNZXc45sKg7Sq99%CmTnsy4$U_RC+C;tYjWEXHr!g4%MNwS8o=t zU5BBC4m*jkf0GUk%P;RA01A1p(jYj9Vw|c~O0{}Vr%@Vn#JfdxEAB5UcKs;NtiXs5`3}FZBK{*S)g3 z$55~%jX_?tZ2!@XL*pbtJ0W!BhNlhcAlYmd__dLYu$LT3VyZdB7?{G*%+mk){+zJ4 zs;d!SlV0vINdFQ8yIDmbS|~){ZQ+Xl-0nVjY{WBZH5Ok(qD#50@k&HaWJ=SGQjG>sw?0g%xYX zo)I%5ZHB10EwcdHota@yKcn98pHZ*azYhpLLnCWD!~gxero1VS zp@{gsIoVg3UI+zeB3s%p_gfSf;DeNK@ONMnGm*)fS&4SKAx4v=6GM980?4Bv)-VW8 z#%=F+UKG0m8qZe7ZTAh#?Cr)Tq8}KQ_&S>Q)0X>H>+#1=Ija73_V>pJg^y?j*~!oY z-dh3EgHGCh#cwnQaC#T22>X=76ohcssCz$4SzkX0OcV~A(0xas~l-q|+(dlYU+po{VjMHA~h+?A9sV>Gg8pemGtgwQ5AD<1!^m1fsM?$4U=Pdx_dA z1Vdd^{^<QaRq{WW`$q8N+3kYCzjK`3k>V=-aI z24Nj-l1^-9@jCMfs_jjagNd?f30jHf$A9_`|w#Lm3Kw0)GM{<}zxR z>)9>F0>Hl3fVi{#9s@Nu0wh9jAuXw^`{pc}oS@tT^KC?^x}q(lC%Kz#g8xDh&VExs zNwY#ntAS8{_V% z>+5d(Cat43U!n=EJ35}M^%!aT7r^byL#@M=>I%4i#Ns}GAERjzpA-XOl0L$U&V?$O zU5Et*b(n1e(Qj=l+Kt#miKG*{HUE^I6ZIRiZkqVvq{2)w$2r|dfN{q6-d5PiP=H>y zFfj3n#fJ%9Wti#CMh3gPv`;=Zu!_H}OdwcEN1rtFVw`_} z_Z7iZ!2v$7Z1VH$Qo_SQ#Tns=?5 z`x!jNy9?0?NhcNi)A88qo3M6Dd#sE$?1>im5Hw1V3NN-b%$fzwzRli)mN1NdKEb(pdIM^yv_VSLm-8J|0?3wwKx390yng>H+3*|GL-*W zhqW^PVcIsjKMvvlr>9Td{6EOHk^L&Om4yV2S>uv;W9x#II$Ugm-=BcL6@dv|(oORY zX7m_FEQ`+Ch_@gwICp#EKsW=&-ti&EPRU}DiodxpG8l}z?0>$@*Qfn^lwUA4vHp>T zn8Xuty_)qK^|cm#L>NdIiWn4-tCFP#ErT)SiO;BWj^5g|5=@2g>;78mCz@MVas?|7 zTw9y_YH6PE62ZarIw}?Se;E~U6>#}oDb;e5%H*HjJ*!+#%z=w@6J{Q%VSe+1aY$-A zYiu2F<=VJ^sE|Gv9({JrR4pe`8$PwHv2b13V1af%!1$s2UkY;kRS;<6g!xUC8O*#Q-fj;-J7t=$q+gn)jXnj( z1wxL)j~-PE{e9s9bfni~T8*~RgP&P!!_c?gcR8}vTUg>9en5>d&RK=wqPzDm#gp4$ zj01f?E#o{t{#5aQ|3r&h{ZwH5!#4lnpFjQM4u=2m&Px?_6-;NO@5vh4aaz$4;+Vfo zXzFr0t(35F%ut&_KV4xqqT+;eWs@}=fuc#Njz-9FE@W#<@0CnSrHbWCOXB6BNkoY5 zx5$>A@1ET6XYn+j+&CX^rNsROBZnuWN+;2(HE>lR0 zdt+vO8Q`bJK=B4C;yF_|RX7V=U2w9SiCA@8{v$N4F98y0ULq4>-vfwx=hNc^ke)jP z=JtUX3@51;5GL@pCPIo6e?R{P_1Z&Yh~!3;`{l=LI!TdT+GBjnhRsd0E4$?t(cF!z z4~#=v5NNe=^9uQHzBg*}*h}OJs4&Oz+O9l{@=ma&6>15fDnS3Lu zhNjlUH_tu4aG8~G#M(x%^W-&-9c^k#MVC8F+(@<=A-S%`Ub$W?Fc$Kt5+9$Idch*` z8DPZGrrDga&I@4J#R*`!JUMdw*O>xdJluM;2O(QyC6bm(|7=LXtOMpeK2{Oc%&@VGgIM}n=xPTsHZu*o|%=ydsHI*DGc2AD4b$rWMYr_F+cj(?lYu$Y(d0;`Gym zsVB+o4{0WaVAxWNLo&g-2maMO*qGgJH^Fz&7= z2fEolQG2QIcl}C3QYX&n7uJjBQw?>=S+N}$3TvDBB4GzLg zRLYKx^=)OTX4DgErJ$67t1~NTT)b{xDBJpm-PJp6oYIFy>k5yf4es3Dl0RBGlcl=6 zkeqZGj7n2lOVEiD7>~>izlNL*I0?~Dk3B&I=?k3@VF&JxNNflsY7~FfIS1h??ud;d z(DEysJz}!|k{hFP%wR_V1vv6eo}VD6bZprUiHm6Oc!Z({ZoD1T7?|r-)XyP$bG-Kk zs+K#Tcp+0iFn)Ojr~N=xynz_nO>QaMQGRLk!77)=oI))vu#!h&Wy>uG*Xlp#{1EDy z%3$r6jdxpHLNJIgSmO)!3NMHED&BdX_<))Ch(?8pE>b8Lyn%w;OM+3lR+y?QTQooRsb|E)Y+ibYPpR&p z6s+)b!X(VTwzS7+!HF5!N~m_e9HxfjR~m1(1NVhmD`i`y54ph*TuOHuB+7D#w|bn^rs6qM}j4>u88m-909 z8Qn378h$ehryt=81-d2(punML3ZG(*KwecJa-AGkfNPyvMS%^{9mNgCm4!IL&HC@J z^l77MMF&_St=`G-5)v585Jn?7Ln~EA!8Fe_82Ch>P0PpQ+VT)sB9MB@HR@Z3(I;CA zJo(00bBCDqE0P=Q-p@S%iEzyp(jhvEEnkvBeitFmh~)w7kJK)2IQLuSThcG;t;19m zA}y3r+ik(BUg}RFoeS0@+Aw!O=T#}{7vd=KmTSobahGQvS@-iPF`2(zEWZ|rcL;+h z*A_P95X#6hgKb=iO8R&>Lx(@?U7Hnbcz{}VWQ+Y_<#T}WigYMJ>43m!22#ZMp5gld zvjS`{o;AuM{G5Q_d%Q8HaIyEgX^dy2Nw)g^$op4#@1uRb@iKc^`0oDIN}!Mz`O)-4 zeusYO!vEkuT+-Cu{)g`VLl%DQ1^)|Es7&0Jo|i!!?smr5TtY%458>ez*n}wn6hK@k z`Jf#NB}A3*Xpcyjt>2`!1o+JMh!McM?KR%_f7^?f=04Td*%F0@2j|n!kd%~Ws5j%c1tuc1<14SI~GT{=5FRz6U0JD0S?LmuiOd&*a4Hl2GA3j*mk~0 zHG{zh;!{+DZUTEyhhE~-I~nx~s|gCSu*A?HC1m3($CYe+6H9wDyGls11or9(nytJ| zd*-n%2D@K`5fS*rJ)?+*sq?mMo6t0*6fGywY7RRNIp4Ub#|f4Kahsq^&@5tt_sEw0 z6$tBs!r=*u#H5mic33oSM;v_oggvkemK}+&k^{?7?z2fqgf*5IzCiS_fY*Gr3UPfh4gBdXY(XjrTV_9xzp6snGzFWJz6*U5Ae z>b#^$8`}Oa>Yx%)Z5Ua^{d@1j`9<3&2(qX3VKiS|pK-r78?u0jI73d-73h_vE*v9^nb#_S=Y|+zY*z1#s8FFs5YJ2SHfgyTzIL#sp<+tP{L67dQd6i78rY* zPo1dBFRd8bfj;rLUm!egc@bm@LV0>{3_0s5RelFi_9kbtHD7z!KV_t9cYA;Qp^bbc zltWd_-A&ujR6b=W(!+E`0+JwY$>sB{$|=DQjq@`FVnLG&nzyoVm#wvk&sDJ%kUz$< zsz`N9uTKBzKyxY92j4VNeFI0ST2*<$kTnW%H&05Zz(!w3IP3>SMCedaI4A zV!|4#j{auL*KY|)(UQMQZG@D-G_i}_&nIGbPs1fosoM8gw&|v0gvu#GWiJny6dkAA z-tutWs3nWft)s%3*w5>H2Uz2q{mj;TB{`%`((Z0bgJ@|&bigU0=wieD!l+jHeA2opi z+<@NBOcX&dBF*y`WU)wDjBvt|L{|-1lJPd|sI&$C8(Rp_U|c3sZXHuWY9QX6;iwQ@ zLl)3S<^&wxggq*BjIn5v)~&}bg&vOc?VbThy}Qj`JF9KRFi;(X#(;=Vy)XB6dBV3J zDevR#SQo(;_9_)=xm+BwUe=4x19DusZ;98PG=+T`ysxWBjg|D)oYj_G%rpHZl7LV) zX$v2yquc{&c9dXA4Uk6IXmP8L=$*(MyP&AihZ^D6zu3_R{e=R?eo&(G zgA&1i|9A5rl>F<&q)_1>d>FMGiksGIAa&&UH3jzB36t8@&K8KuOPGl~Sdzxq8MLok zG>?S8p?u(Vy!;k|@2}?>b17=?6)Ue>Yv6hw&-f2<^6QYo2k0O#M4vuP>vh?m3~FAs zWF|jlFeAtn3PM((0JAqP$ndl)Z#OhZ5y~7=^E}9~1p_iy!7Z70a`oMBSE#o}pjLJh zVTz*5IIgH$C%LtC9E*RfOV079G@4(p_z1lzvA&$?%4XRKRqv;AP-^Pnu?;u+((h8i zL2LgIFjx6Cw&tN3x_U7nKUtE$c!a$9$#6D#qZGn;&uoa&U&%^Lp(&%yiJeB8xx|}Y z`tgF8XP6d)@q^wa%SeIAAnL0Rk7uuKv@%S~4y(V+fD5CQP@ZZivy)%ess1v}K?`t@ zQuF)fi}JY6u72#6vftxICFm+nwzg$GCg1zMT?(U0_l)Pc5!=B4LxEJS4ns<{gO;!< zXgw`8Hc(F_hbG98bMbG9=a+QL9r8@r^6nI{s-;H15v2MGagO#T9zUH9Ae$D7YdLjA z+b+6rUT1u5x61&npD`pu?-5155E}FMJ^B~@Z|iSJ|IA;1n~6ymKz||ax)GgDo`@H! z=P1HkG53^qWlx#xF?6NhQERNoVoC3Pkt;yj{nM9isXV40D1&?jp+)C!d0N7Z~W~jmsBwN~D`fatRBJZO#*%k>!yjFS^0uKVbnUJd2Ryq$#3wPIxJfZVqJ{k&L&9 zXGCBQb4AEn#6de{voh66ZgSnUtK&f&3VPU`{pLb@%fxrO3nm!q)B}6PdXBGvSNwRb znYu@N!ldSa(*GSjg59@YnmN^50&QLU~Q;g};bg&FW1uN-D6+(tiSj13|*jaU7szS?JO%dg{la; zsYTbJ>S51)l`=Ja293O0qU*grE{>~Vl~KEju8(CD)=RK6c8wXv=Ry{0eQY>gXHbMs zf(9?Q^CXoZo16h3k5t4ol0WgU@(59J#$rXL#!T$oiR2;)m5l~P=ou9rBG zKW3L*?Z8_lpgc$u*MB}N{M3p2H4S>dtnu8Y?ig969?)uZXiMBkgy{rwyvHX{IwQ*1 zAaq*bEdCiNur{67aksM~O|G6rDQ9Zva~!a|*~U!cX7%1NuGu&KR{sIq?_r_$D%$FK zxv_K6f~%Io%g_V7`)TPMKhqWVq~k!XKec!HEiArL`92$v=|=Fy{>{a`u^4b%_X}@F zaX=)3VSRhobHA_OLU51xa|m;}5)1(E>KAu5Af;kUL_1Q|j#ePnvNgw%f9VT`kTto~ zH}bUvD8g--TZr)D%6`~)z-4bH@U}GFb+C$o1;du}!_&pT=wTNZRcmcOcPPeBVAB6U zApYkL{b%<4&!DbQ;Zh1g7M80S$3itpF5HI{9ABip!2*Jmd?dIe6pq(l?`GSuohd_}1NBcI-LaLWPNMI*u862C=;tK_$ z(n&p`Ly#LKfE1kWXOo8=oF9Zma{O61Y#!*hdweURwIrF`@}}l=L)N;UYbO*a0={5B zQUPPZEY(0o5Osk`nMW4tB5m+6q$f&l_QhIa+@Wd8uwM`_ByCMc5C*DD%?Pb~C@-qq zcUh(7rHYZwlq0;NNurHgAibV_8IBFj&GvdPGrx4aFyXuJ79qf40_xr5Z*&bu?vUHi zrL{iT&VA80Zh;VY{H%tC6_8BZ({o_1Zv)FXq{4b}9w7xB9s!AIEI+J~1?*I0z!gqC z3xG=tIMJp6tvi@N)02M3zh-%m@oA)pc$rU1H2dNhDf8U~Nl`etmlVKWe5;&7d?}X) z#txXgpFv;o;ZgP|?+G}GT#aCqPZCeLfh~{RR&(0C1`nBj>JD@+Yd*Zipb_W7Gf&dR z5V2ZWykWs2WOT2WZg=R5kzfX%oX!y=y@3yCsa3&v#Q~(KRS0=IQG@~}1gL_Hi9MPT zOb$ZvS{D{a8pi$b?0yjmst@Cz0w#;kwov4k0bZp8{{js0aEg`EA7HHgs5Ad#3jY5h z$|y+wcqmZ4jM^{z+5*F5kf?I-8xU8MX!ONG3S{RC{6wKbw}R+RQPww&oWsAMXvhap zt+d>3e}@taRsYzaJdD+4Db3PcR$O_GT)VSUS82Aly#Lhr7-D^DHL6>UFAa!(Z`tDH2S}%#z)&5j#_v zI%kw=H*yBO2=zB(wjZ=7X^wI{0z0=}w?GQ@HU*|v+fE|{v@1JogpFc!`~(7k&3Q|dsgmZW#r!!e8PcYLjUy34;4uRDf z9#U%h>|eU(4V1H2NwYq^1oLj0j2<77JiF#IyodH-sB`399Jg_m`T>J$i9NBqF_T2| zyC&(TTyrJmb{i;KT(J-dQ+S^>oT@Y3lhjgdc2vlbcOEcq*0q?A*6wQ_9vQ>{0LuDb zZRZ6M1wCSOOxa5#T1c;C9jdqIy%R@%1LB=aqoVR=;61$~LOOqq4|2q|NfP$om`cza zxN$MGnK9`qf0*4Mo_0+=CIO(it+Jy|&3OL}#D@u}0H~9Qi!g9G0v+R!Lxh||kCi%P z(<{KR{57SQLKrXLIm6Z6l& zc$4!0Kzl;r(d}r&AQ6n@8xKsH{QdVC#Q%mnNLtVTh4tKLwY8B;`=gfQktp{QX3*lp z`jUi_(Lx+oeZBQoN2=!c z*Zn<;PjN}Bi2kG?u(|4nb8Qp|G&Vaa0zF69U4C+aLaW{18t48hLP};2qUR{TriE(( z_nufef{Tz|-WBOp)YCQ zAo-a9Tr1n4nZc&V?(4X#(kb*jw}?4Yd6IXU`Uo~-tv&3WlZt7X=AE&j>pXna8_WF7 zu%l%hY6M+wzY%r-KGIFb{7Rh~U65B(_(#e9GL)8hnJqlywnCmU+XCwELaE~6}7dR^0< zmG6o(Pe~FJK>Sp-LmmQ_Y{Ny|<%<-BV3k!?K4k7SP4Ui}8v#G&m)pT5%^uHxV*AOf5Z3mFX_%v@} zNJoU0h@y`^L0CQPfmGf{+kDXi6rb#B zHBK+?u?~L}H9l@Q&SWpRuHhg?M142jRAWZ!52aHNiFbvJ8aIyf!pst`fjGf5-6-f= zwb!bz9W=``d@FkoH4BPMZw#@XZv2wK9l1@uAviWs!4QCw$(cAyCaF|bC^_yq$P%7Z zu{nCX$L?(D3Z0;9JzjM5)QOA}SWlpp#I+9B9jRNo7%=6RC*+7oc@0!e*%D|r3Xd&G zl(~xANHEg(s8pe8%^PLPo!Pq5z$A2(dTpf|bb^>)2{CN|a^v@|NwKqqt4y zZJw|xD>_7omTcgs+u=xRHk>B!XurguZl!#dFd1?Y8D;e#LZ6?H0EVS0ayB!QtN-g$ zcH%6hKcDnOkn3A`eE6n7uz(m=Q__Lq7zgQdsbNhgsPy3#m~(CooW9}SsSp8C3pFuJO|^k466PtsDJwZU4jVD^=Zf6c$sz zJx3=tMkj&d{`&C7jN}vI;f;uc?!x`X7yFG4w_mUx-5YG#Gg~Rqd!M6RXb^Pvi z%t2y}>Hezt%l@$N_n%u|v#*jgp3)OuAYCVJJ)n-Lh+21Y{5( z{EQ?{{yV5!#4u$K;;=zlSwb&nd8J2pr6J!ak^wTk~#7Pug_Ji~W zzIeweDy5|82Dy0Q5*14Ejdd$Dj$?r03lnnPl=5km%95RA6a~DGO6YZEuqdOgUaFQO zu4U~)q1@XvD5O}+Z-ug-R`dp$p%jSwk9xHvD07!%0Tc#7cqp%hs;f4&p-QVcZpkl( z`ElaX+Gb+m8b%|Bzs)6CF9b07oG6b5{^&0|4*JL1*mI&oIx`Bew_lWCMGHW+^3k^T zMzNXq(UD+64Ee8TSm5)lC^r`p9Ug|pAbz()b%^tO2IYYLF!PBtzZWsd% zvISKmColu+(}g)1pXXz_g*7c$hjGX{Ga7|Zq2>!uK?&*K9$hJ&Et&?ekLm>0lfgUI z4MCYovgLTSV>!|vG=YIL0FMldJtyfX3?Oyt8JihgBD<$+&SSv@nW0}+4f^>V=?Jex zISZFs+aFnEzB3pEbC_uWhcEv`H8VLSZ#J!#o;EbI?WSGIwwI5GE;R)DF@be11NTRj zkL(pD$XEpP#a>4CVoAC8AxU(M|H*%J8Pc*TD%d;?W4CO2VlbT3e26X=rIpJMW)||t zBtD;=S4a_foJ;IY*+jQH0n*l_#f+dqI!IR5z`tP>Si>@8Uo<S{B0)7%2v-7I!k$kBpHTmCx3?f$ z-V45|wQlS}4y_x{$ax0I*8%XXm3rf9hzemc%s^*5MWkUflo)UxE7I_{PCY`gk8D7? zq}n;5q%8X6nvMkAp|ztEy>0Vq?p3_-m<;NH90_JLIdb`iwJGs})O^2~OaVug9$s;( z1TZ#2rV}R?B2&11e18F2sxI5*ZBPkV_iN@8bnk)$Oa^XTk>TskAA@lF)Y$Wlk=8bD z^~8Br&7r7Oww1+Qove3QT|**)gcG2hqNcwNmx zdKav4mfpGzC$czs#!CmON)5DFpNkY2Zp|nDF;s7?)6KX+izo--brmr3100TkLCV3NKFgNP zzRDHL-TM{8UGWvFl$e9gDvqs1tm7e8r(%k}m`Y@=_?SSB!g#1F`AJPqV30|!=_t#h z(Fz>96BCh@xDW?bmtWDKMo`x_sQAIHQw8-0=%M6^dS$u~RhUPwsr4pG9c@snMx#!v zz4g;^nRb;#+41L~7pu1BqmOog{Kai+aTtfhd#kjHA~ZLN2kB_bi;KzHjR#|?NgMbq zDtE4{hNCD4;Yl8%E#gLcPNNlK;#P_4h`pCd8+gw2kPiuIy;x?#P+wJDc1lF@JeRB@ z$Q|W*vmy&|?Fno9LHPW%3srylO;$JUqKUMV+^Jr}>;^sS*5lp}0mQKrIH+7jfcj1_ zg+s$)`O(~+Z5M1?oCRX%$?t%xb;lIl73z~;%t!lwX8%D0z6e`q4aN9(@%@&dO|W@V z;++@g`9#rU`e;?9(L$G*XN(8Bx}*DJ_pXYD$X;RIbq8Rr%D=?B$lobn(>RSrmZ>`M z-l<&a!zIsh8VZC13ys|@+*k?NH}m`AtVbM^IEkd?ryM$Cw+$2q#>N(Yi)YDlurNR8 z>WtKfeX;c>G{i;QZ0iQAs5v{=VT)>lsdThblcv*gG3QgFQq=PcL_cL3UQ$N(Nxf4R z4mK|YaaoT7B+@rRIk94fCa+#z8pbv>GA{?k6IfD9Qd$Y`8?O7`P8u?l8Bd@O1+~5F zk3b}KkS^EVpdSt0anCSL5RrJwt8hsKk+@l)dZiqBrNB~tHz-%_@?V2tbD~Rua0hn; zWoW$_b;r;ONq=)Qf5hY79~#b-t;BQ{x$wsnqi}_51Z!v z?L4$6bsRH{)NG@|>9RUTPPU;ONhxDMcV4ew6>^FOq?dPAiRxB-ce;+K97R*jDvO87 z%8ORzfSUXc=Fjj9(@u|Z<>=g^{8`_qMa2JjSc)TIdA9;7Ovs|WIF^2?5?@bHmEE9n z?$-A4c@Mu-|KO#O;O7Z`a9q zxJ`0HDXm>7us3bPC>`CLNegu8cx_I)SX5V?5VP5TcLnIIvESG{2TtKQ!ND(1UekCl zc7Z~|Rf=E8iPbjA*?%a-$`REL@!^e6s)e9S6@+6`78Q&|uy3@IdM-hfL5b}12!>@7 zfi4+{dXzwG`c-9RA($`Q=dT2GyitLcY8XS@vZwkO3Ci+XqErPHx&*hRQ>k!PAe-D( zKu_wUU(Mob>8;nnjzNB<#*tzzfAQ<1dwkKY{0Grhe`2(zv-PHPL9cVv!zUYJW6qGB=2E|tUuu!j*P^h z6A5wz`(>$mvRL93>J%R=#xIxH;;J2358v*)8^Nzz=BoGRGwaZ{3P8dA#muN~;kYDc z>n7*>Wq6krKp{owp7p!m9-g#sJ3KjP8~sZMC@ntYOMBxNs?=;(gUT<86<6XlZGIJq zmjh$mh%uR~bHRQ7BgV^SsjIB;v!HL`s&hF=eEGq3m?O6obVrt*UTHzU@Z4X z-?+ybh4+k#yoVF~sH@?!)5R-q4Q|Rswd5kTiVN*bX#f!fWUUvZ%G_8Wh_-8~Krz1T{UZn5L6|icUfS5@Q;jk& zVuJ-%WbUU5U_BeB_uF?JDo7x^y#3+W2V|U%!@mnHH_HruYy(upytxuSII3PphBQALx?9`yvjWq z!{rDyhWNr%9n&I}DeE;wT&`j5^IrP1xa2A;y)KY>>7rzO`p2Zq`2~9mCr27&C9Y}$ zfx-Fm65aMd-EO3PxIP63dL05*oaG(80iFDGhV@zm4jY1XbsMVt3-+Lk$CYS|8+hS& z8-%Yo2Jc~sPn4sx_K6vo)bL^3@`#>GdT8enLM_X2n`ng{EjEy6QHHDJ@!K4W-u}5j z;R82L;^tjjS9s~0wa*aDf%rR1PNM34(^t5xCC6U85Qv z#9;JkXR1$G`yyCjQMyIG)@UwUJ-!4f);oc9t_(w1yln2mwLz7>DA6+c{VHy#uD;PW zN?W=wE0W_bC`8(N-?(lFJxtjI;7k!>)4VR^AiV>FUDtB2%X2l;BD&j^t*Qr5y0^;) zw?b0Lo~#FTBRnG3aNY;OfGPz$bxA(;DSs7~`8HJMf(s=V$pp@Z>o_eid+dOnJS&Ua za40~9C)`k?Zi>!KS8xnaf9n^g-+oHVESv4eYS(du>_~|A515P|J4yDM=;2 zM0UyQN$}xOR(jHhN`2J1+j$tsogdDId=a1G34kCCB(G4k&=$@;>O>I|B>>^{_48Sc zF7goM;qdlV<~?UOte=}I&Ji_tE;=J>U=Zsh&qu-Rdjs0a+UHRgr^ak6plCe6KMeF@ zJU>)>K~p3`ao6e%LWVNsOi6dIjRmGE6I-(kifp$A3{Sw{=m9-@#~)7C{Vyvh&i?kDsRp06ZX^m-c+W=jeJ^p~r` z&+tq(N2?f3FuG>)h|bl(t=@I?$kxS)Nd|=ilsIL(qm|b|;aqq@BJM+w07*Q$e{p1b zO-~@UruWqZ<2gtf-?x_M^b)WpXI+Vm9hQZ_$sO<6#&`h%{5IL4!UqK9F4uw1q`lGK z{0=2%_apif(a-9CV}ppmK!6k0&h0_%`)R_3$Lf)y<^B~YGbDr6N0;I?p&eL8ihQ+5`uJtvS zwQtSfbOCxj}B3QIBrNu;DxC)>e6{U)~!hCzoqNp zny3{~n|&&G;_;E;K01dODI8 zgce24dlcM~M_7Q@}Ut2iC8q15dzD=iGf1Qb}_RWK_mU~xGb!Gi?!VX_-6|Lq=cFf7%4eVe=NU9K=Wtel9tQbDhyk7@)G zaj0%HnuKM}X@kYq@wq8P8UR1P)|Y09o!s#I`tXB|@NbghgAV!lkM0-Gs6jjMIJD5~ zLTaM>2S^zW_=`bgY{)EZmpg5NLtngzEc@%fOLn^h?{04}l=FyNQF^+-l}ln;N$hmK zs2B#P%)WyHu$muQ{niPwIQuM9iJKo*_bCE-xZ`Z`Ay@{x264);+4~-3-OIP`T-_`# zcPeW@wg{)zN6*M}nuJ;(iPbyb|6*;C%?G9x{IRt_{!DECkKr)?_lU;ef7!wRXIhh~ z{OXLMjPxZGE}TT-R6%H#QB;~Xm}EFe9!XYu$?iDUVr#}hM9pkPMw>)@R}d$J6`8?0 zlQf6iR@+cvy2>IC8e=EIH=_Fr1?>&keJd>^B{lK96=5)r-aH_DJkfsL)$Vn@#gXs5 z^)|2l3$yQ#bdR)*R1ofOEmCKVLP9=hd%Cg0imbqfWFZuEnWf4A+bwIgp6Fm8DZ5NW z9#*z_|FNv%tp!F_|2^DKvo?fmnI~PCrHkyKxU54iYVWw-r`#WH1%;I6#AaySpFu+JAajI9B6z9S6suF{--a*iU!GEB`hCyV+7663v!t`g(2DAf^( zvqL8QNtR_6sWrH?nM7C`d^aC+_^@#|yt$va@g@GW)5eal`&80|=ud zy3H!oR{ftWnPfWzqfu6(PngIVY4=rTa-mUM)x;s0BB)^ecXT%Ht3tf}4*m0dr!KVu zHuSYNA8)lLcAv_i3|cY6Gmlf87vpW zgQK60L2h^GY9g%N=dM-xTG!K_Ac~xyX35Q)Ff>57LNZBXOgcjz2f@}X4z`BsMOa+#jN$U=Mv3JwNnzIQSVcM;*Z3^E zA{w3pwPu#}T&w5q>C*~S!>Ck;QfkE4_@~-}UTIWF({*R?NVbKF#Tt%?4oqa2m1%() zy5ShK6#7M)xe0fFu-=Hz<HZzOA9QOVm*w#3~(}3Db$((Bg$sXXoT3D=1ov zkfK!s{bCbgA!eie60>QMBl$du2R;Ll3Orz#P0szlxIga=FiAe;RxOO3j-ZZT+Q5*? z6Q|eE7B>era5Jggs7a`%P6Eqn0q!c6Z}Qx?#9q-qP&^E*n=zQ71Rd7O)>QQ;5D{>< z2$yN_=V^VeVH*_*rA`uoo|=OY-_oF8)MjR)Bm6AOLGqg_X~2FldHi{{#Wi`MrnVzD zalyDY`H#%&obRVPCEA+Q3Z{==JPNl2U5QKkReQteUVho+E$bNh{-J=04tckZ#4b={ z#YfY19!wIu2|?Mr#~!MdwAhG$=D?u3d+3Y#ql3UC%v@ma(Y->Q6+guK5nSZ@t8GPl zx0v*OK4X_58bPD7r_r&0b8Ke7bAga^g~lBc+6|!@rJbWB4|#ay?>4(A_g~*E1n;i@ zK}pYZg7p5CMF#s2%bg+NMygbkP)>)A8rmWDUoh6^L%h% zUUA?NX=0>Bf2xpSkG+4hsathn7-sQHVo1_lFx>~p=JvevkF4kt|1(jzakgQep^wom zfv;MAa8fkl6)X+?yXVr&KOyuO2y@d*%*(WiWs2?0ULdr`zIB!l;Q2S1<20 z7k5(g7f7pd_44zx-869ZHB4^e`7ds-q;y|P;N;>sldO2o=P!Jawe8~XL`#|I-*kidTo?f;>AJ5z^yPW zL_Yy?tCFf_94%n=(yi!hm6D8JwG0Jd^AsX>tTdbR>88;CQdLJ z+Iljw44H!snRV~hZ+`*L@|C{R2I#7>_C4}O(DEM*Z}R&T2-zmMU=mc?Isr*%;l2Z6E@GdQXQ zE6yFGUdVB+48dw^#eF9P@tRto9xXw7caarv>W81sy`xkBCuxLSS zJYB2+XzL$#8wSySDztc86VU-1jzEqUjNycoV#A3LHku%J`m6DjMA&sBA%70|xj?F> z$%deE3^iWo4K}dQJT1D^^_tdz*`(?FuPq%TL5j8}E2Sgk6A=q77Ds1ZK30w{YP>p& z#8Vq#UY6HzAXjm1xJI4Cl-el^%?p2>fy%Q1LhYK1u%WXGg+sMSOM7{D<9fHu zb+yr%#^ebn7uVIY#S~TK9&<jqK}aJc*IBTk3GesKj0%hEbwuH<+{l)@|rc5 z-GAQ-{>shxYk_GNTO?bgUxJQ-v*(hd_CtaB7b_}5`75XJCbf7RdWO2IB<%VdjUhYJ z7abavE%-q)IMZ(_rXmIk8F0$b2D^fJ^0L!SFQ5mNFGF1!vnRa4I-tx|iXn0K<@piu zn!I_Zc>>#8+J`5P%s$me=Di=Bw0FgqGs=|<>MNzw1bHV!z{tO=ts#3LXvR1i7b-bB z(+XTuNJdAmk#H8ahCAUo5Qv$Z{fbN`t@EL+^l`ZQC3gjy8wnWDjeoZ~-X)RmQva6+ zAGHTbjm(R?DsQ^~dbshIIZMyjaTi`&a1+4*v%>4I+w4}F5KMetKAu0j2ezypAqt?~ zIT!PzHOjTgtiStX=)^XLORSQ-T8qwJbKZV^5`a2_Gx?9e%J=f;XO4t{e|#d~(b1GJ z^$Gx@Zl~deLFp61-Us0Gwc!6HhMq<4J6Dn~itURCUOqntcF|)BJI97<8wc2{_enZy zpQYA?u{$78y*U+Vo3?EV&0iyA3X^e@^)cYW-}n9(1BqMq&0Wxs1(oS1R!Zdmh#os@ zGedoc|34|qg>mCjeSZ;yrfpDU|J?f7%CZ25%mj+lgz{;?5%t#KjMYM#a!k_dxKL=O zw%h=CknWQy=-0?1w6l62Uw>z^%}<=K-$VSu?AJn;lNsw#0&Zfci4WRjOh7A;3M6@8 z^LHs+(~mJ31E3#i4h&vKXpTNhdd9K~voy6W9!>;Z%1xc&r!$%{6E{rXI9`I4OqQNy zxJG*RRQSJ2I}>;)w>OSYhR9M~LZos{lo*6aQd!12G`6~;m}DQuPLfa|WlLRKT+1|B zveXroREliLTFIIgd*oJ1uD}18D_+jkpnH6Ltk3UzmiN5pJ?FgVd8qGL{!Dwzg4I zc39+X9C0Lx{^I$>^PQTBw{Rf3>3_1Om{>t(y9z0b^~)7bDnHXYu{`Eble#U_&d!&& zqO0muWxsKCv7awPsWYwfe3b6hW)i9BW@9*n&ud8*nVdYs9=}KKc5lSZ*Y`aF(3%ap zE0P%VUey^Lu(i4%-Ej2%ie^l4si4mG?ef)m+S?0RB6Dg+JSu{nl}^7YYktIO@2mXg zk6v{~eslFzn0gh)_}|ncga~)ueQfGhocpp+;sA$J2xw~&(AF9YwKW`wbJkP_az%>tbe^WB+J|Mg2}58P`%3hV|#z$|=ikYS{X?2i_aoWVRqrw4GpRmSYS!x-AdZqF1dN@&?yW(6tB{}(slgRUw^dojogkv5-xylMbrrR#(P?LBG6U_1d zQ-8r#_esbnGGsqz-4h|7i~gBpB{xT3sAEf?O&#b5@0H&NPIZ((W9#CKl(AZR>XME` zPb()$5P(&J=uEVS-MZpoOfkqk;1$&rj&6sb^2G1b7ka?Ij}Axx}kXn%#&Ka~=( zBEvbvGPh3#IS#_E#a-6As2n2Z8TwkqN*zO|#2W&)1eLqCc(ck-Ndj;4+eDMHIV!@E z2`}z$+Q+u8`;uvWxbY`D(P8UE-9Rw>pa4WEPe**>A*Ffc}-k zi2sj41}83Yj_aGWadB=UoS))DMxUQ;iFq7o#;?R<_pkho;(Z-2L8j8P^u^D%f+dPG;UpB}sTa&=$IoCtP3saye==&j8<*KzwMwDHF+b<+pKzqR{Y_P<(F0mwn zrcl;zL6KVauEe4gHDhPT>Z@l>wLeSVa>1q*r+G8fesLU+(e^7VMd_Za%hk|*$~GF3 zn(%p#^~OgrCASlWg73E2-_vMibv(SI?cLZI?rTqZtAZ%clOC0It!$JlW0yQ1n#S!g z*z@YiP5%vnB#(n^Cz#oLcZFs+q^eM3S-;B$08#&rD;RZ<<^bHMtZmD^iqw zuBB65e^pB8LmvG%aninJoT`EGDyKd=Wa&3AYvQlr4>f1xEy1lR(5T+zoBBF2uU+0g zDv*2a$^5ln%`9J`F_)uF_lEA&znh=2`?0e2I!uhX68b>eF0xOMaUf^1X~ue9sF|S;^NedDo+GnDO%C+Gy1zg=|O+5EmS8KfwBxOGp^YhWZl9LB+ zoWXCn6}9=cTl!D|ka`B=OG1C=u5GOp{kS!4e_KL!?fWQ3@Ge#H@5XwH z8|@}}^H&;Lh*`Eq-rHN*GBln$7*!&cCq~X4tGQ10-EhUmc2~V$442}#p4}EhN{}hO zt)h1`@j%<93zx6DSiUeHVsA)enh?3KU(twm7ct2hzoFi8Fhz4PBbR4oFYZ&Q$;dT> z!C3D0%&p~^eRAO~HLXDdSN+63B{Q}9X>L4NT6^*ZUtz>@ANBO)j_s3mRYP4t;v;y1 z1J$k76io@2(v=)lQ}ui_yf*ydMmBj?=0@)9wY8RMTQft)j}b1B_xu07p-@NTt1O1- zrP&glb2U2-`-Q`(;a+19I#@FcwNEcG3AfmuF+c=pxVoPID8#uB=m8}g~n(O(fV>{k-yrT z%?ghWQ)IKh$vXwJZ@YAD40G=ap`+1KK4p)Br_1Woavo@T^m<>PC&B#hU!|J&ey|k_ z4nD3pDDgS3(P11-Y$uQNhZVz5N6F>F!h6BZllEk!_MdK|&aPx|cXhY3a?=stT8Y=e zON`*J*XWAt)HGrxwZ*q+Vqa@ZR!L$}q20V!284MwiP%v31Gsxj)?B>8!)?>u^OApn zubibAoVP(51dG%rOn3B)1%o>rsY(~gcHxBV%zHNcGJAG5LXzusqp zf6xIB1mL$bi4w3Gd_OZ<=ql@JspAZdBy`p3fx$rYJ<-5uph=7HP0s?jFr8%~{M}+| zNTO>9R$pfs>diHr8rccBgeCIxUk5pYDmyHW0xgInO29$zSUV$u*HXpl8RB4To$Jl) z{=g^)d?NLZLQw)fbI!8X+h+vqVdLNM)J_c802p356&!dPP6 zCE7UwrwB-(Cm67|{rYWDP!Y8AfYQ_I;43A7XB{1Ynw2%tgXFFTJT;NX#G{D6V^}|d zVDJD7^jm?x;T-)4a6Qv{?DzgRb=^((gMaJ8lLIg#^ggES;cg28O4wNB&wi4wpM0>1vR)_@;4cOr@Ob#+|3e&Q7EJv(^^|?+hTO*&u!_h2Ss`y zx5A)}f$&VC1c<8AQN@#OY^LLn!S!0&Q*9~*T1_5YgpxCYw2a=t(UH`pO*9TnO)F@Z z{`~n3`;;u525tv@p!e>cBQ9@1N1Q-(w^ep?vvNE_t6@CZl1Ngs1HH`dhzAnP1TKgR z&x+=ipcT78VZ`UK6Yo4@10Zu1dFQ^1lLKX#%I7Y+9FjbP)?{2X?wBENh6hH0t!iov~!_g0%`C9z|%z*OpA9f0PuiVfdgO zf~Mpy6+QnL1HT-G5DZEdApC1jdVT`D&y5iJDway1HzLD3f(U2xlZ7~o-yeiq2;Q4Q zs9aAMpu!K)v!10Ec)Wr4NDwHhZq{nR)NJ^N3n_D#JihOkz~zHi5)l;c*?&PH>xu*& VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N literal 0 HcmV?d00001 diff --git a/microservices/consumercategory/.mvn/wrapper/maven-wrapper.properties b/microservices/consumercategory/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..ca5ab4b --- /dev/null +++ b/microservices/consumercategory/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# 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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/microservices/consumercategory/Dockerfile b/microservices/consumercategory/Dockerfile new file mode 100644 index 0000000..8a4ce77 --- /dev/null +++ b/microservices/consumercategory/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:11-jdk-slim +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/microservices/consumercategory/mvnw b/microservices/consumercategory/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/microservices/consumercategory/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/microservices/consumercategory/mvnw.cmd b/microservices/consumercategory/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/microservices/consumercategory/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/microservices/consumercategory/pom.xml b/microservices/consumercategory/pom.xml new file mode 100644 index 0000000..4eec3ce --- /dev/null +++ b/microservices/consumercategory/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.13 + + + com.unicauca + consumercategory + 0.0.1-SNAPSHOT + consumercategory + Demo project for Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-amqp + + + com.google.code.gson + gson + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.h2database + h2 + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.amqp + spring-rabbit-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/ConsumercategoryApplication.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/ConsumercategoryApplication.java new file mode 100644 index 0000000..9a1ca03 --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/ConsumercategoryApplication.java @@ -0,0 +1,13 @@ +package com.unicauca.consumercategory; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ConsumercategoryApplication { + + public static void main(String[] args) { + SpringApplication.run(ConsumercategoryApplication.class, args); + } + +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/access/repository/ICategoryEventRepository.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/access/repository/ICategoryEventRepository.java new file mode 100644 index 0000000..1892a8f --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/access/repository/ICategoryEventRepository.java @@ -0,0 +1,9 @@ +package com.unicauca.consumercategory.access.repository; + +import org.springframework.data.repository.CrudRepository; + +import com.unicauca.consumercategory.domain.entity.CategoryEvent; + +public interface ICategoryEventRepository extends CrudRepository { + +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/config/RabbitMQConfig.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/config/RabbitMQConfig.java new file mode 100644 index 0000000..3542c46 --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/config/RabbitMQConfig.java @@ -0,0 +1,46 @@ +package com.unicauca.consumercategory.config; + +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.FanoutExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.amqp.support.converter.SimpleMessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitMQConfig { + + public static final String CATEGORY_EVENTS_EXCHANGE = "category-events-exchange"; + public static final String DB_LOG_QUEUE = "category-database-log-queue"; + + @Bean + public FanoutExchange category_events_exchange() { + return new FanoutExchange(CATEGORY_EVENTS_EXCHANGE); + } + + @Bean + public Queue db_log_queue() { + return new Queue(DB_LOG_QUEUE); + } + + @Bean + public Binding binding2(Queue db_log_queue, FanoutExchange category_events_exchange) { + return BindingBuilder.bind(db_log_queue).to(category_events_exchange); + } + + @Bean + public MessageConverter messageConverter() { + return new SimpleMessageConverter(); + } + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { + RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); + rabbitTemplate.setMessageConverter(messageConverter()); + return rabbitTemplate; + } +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/entity/CategoryEvent.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/entity/CategoryEvent.java new file mode 100644 index 0000000..c667e77 --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/entity/CategoryEvent.java @@ -0,0 +1,39 @@ +package com.unicauca.consumercategory.domain.entity; + +import java.io.Serializable; + +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.validation.constraints.NotNull; + +import lombok.Data; + +@Entity +@Table(name = "categories") +@Data // Generare constructor, getters and setters and ToString methods +public class CategoryEvent implements Serializable { + private static final long serialVersionUID = 1L; + + @Id // This makes the id as primary key + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name") + @NotNull(message = "El nombre es obligatorio") + private String name; + + @Column(name = "description") + private String description; + + @Column(name = "action") + @NotNull(message = "La accion es obligatoria") + private String action; + + @Column(name = "holderEmail") + @NotNull(message = "El correo es obligatorio") + private String holderEmail; +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/CategoryEventServiceImpl.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/CategoryEventServiceImpl.java new file mode 100644 index 0000000..d4e3a48 --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/CategoryEventServiceImpl.java @@ -0,0 +1,88 @@ +package com.unicauca.consumercategory.domain.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.unicauca.consumercategory.access.repository.ICategoryEventRepository; +import com.unicauca.consumercategory.domain.entity.CategoryEvent; + +@Service // Para que sea un componente de Spring +public class CategoryEventServiceImpl implements ICategoryEventService { + @Autowired // Inyecta una dependencia + private ICategoryEventRepository repository; + + /** + * Busca todos los evento de categoryos + * + * @return Lista de evento de categoryos + */ + @Override + @Transactional(readOnly = true) + public List findAll() { + return (List) repository.findAll(); + } + + /** + * Busca un evento de categoryo por su id + * + * @param id id del evento de categoryo + * @return evento de categoryo + */ + @Override + @Transactional + public CategoryEvent find(Long id) { + CategoryEvent category = repository.findById(id).orElse(null); + return category; + } + + /** + * Crea un evento de categoryo + * + * @param category evento de categoryo a crear + * @return evento de categoryo creado + */ + @Override + @Transactional + public CategoryEvent create(CategoryEvent category) { + + // Save the category + CategoryEvent savedCategory = repository.save(category); + // Send the event message + return savedCategory; + + } + + /** + * Actualiza un evento de categoryo + * + * @param id id del evento de categoryo + * @param category evento de categoryo a actualizar + * @return evento de categoryo actualizado + */ + @Override + @Transactional + public CategoryEvent update(Long id, CategoryEvent category) { + CategoryEvent categoryUpdate = this.find(id); + categoryUpdate.setName(category.getName()); + categoryUpdate.setDescription(category.getDescription()); + // Save the category + CategoryEvent updateCategory = repository.save(categoryUpdate); + // Send the event message + return updateCategory; + } + + /** + * Elimina un evento de categoryo + * + * @param id id del evento de categoryo + */ + @Override + @Transactional + public void delete(Long id) { + + repository.deleteById(id); + } +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/CategoryRequestConsumerImplService.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/CategoryRequestConsumerImplService.java new file mode 100644 index 0000000..b7505c1 --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/CategoryRequestConsumerImplService.java @@ -0,0 +1,36 @@ +package com.unicauca.consumercategory.domain.service; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.JsonObject; +import com.unicauca.consumercategory.domain.entity.CategoryEvent; +import com.unicauca.consumercategory.utilities.CategoryRequestsConstants; + +@Service +public class CategoryRequestConsumerImplService implements ICategoryRequestConsumerService { + + @Override + public void sendCategoryRequest(CategoryEvent category) { + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + JsonObject json = new JsonObject(); + json.addProperty("name", category.getName()); + json.addProperty("description", category.getDescription()); + json.addProperty("action", category.getAction()); + json.addProperty("holderEmail", category.getHolderEmail() != null ? category.getHolderEmail() : ""); + HttpEntity entity = new HttpEntity(json.toString(), headers); + + // send request and parse result + ResponseEntity response = restTemplate.exchange(CategoryRequestsConstants.OPENMARKET_API_URL, + HttpMethod.POST, entity, String.class); + System.out.println(response); + } + +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/ICategoryEventService.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/ICategoryEventService.java new file mode 100644 index 0000000..69ac484 --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/ICategoryEventService.java @@ -0,0 +1,6 @@ +package com.unicauca.consumercategory.domain.service; + +import com.unicauca.consumercategory.domain.entity.CategoryEvent; + +public interface ICategoryEventService extends IService { +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/ICategoryRequestConsumerService.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/ICategoryRequestConsumerService.java new file mode 100644 index 0000000..0e4ad42 --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/ICategoryRequestConsumerService.java @@ -0,0 +1,7 @@ +package com.unicauca.consumercategory.domain.service; + +import com.unicauca.consumercategory.domain.entity.CategoryEvent; + +public interface ICategoryRequestConsumerService { + public void sendCategoryRequest(CategoryEvent category); +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/IService.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/IService.java new file mode 100644 index 0000000..cc4da2c --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/IService.java @@ -0,0 +1,16 @@ +package com.unicauca.consumercategory.domain.service; + +import java.io.Serializable; +import java.util.List; + +public interface IService { + public List findAll(); + + public T find(Long id); + + public T create(T object); + + public T update(Long id, T object); + + public void delete(Long id); +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/RabbitMQConsumer.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/RabbitMQConsumer.java new file mode 100644 index 0000000..a455345 --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/domain/service/RabbitMQConsumer.java @@ -0,0 +1,43 @@ +package com.unicauca.consumercategory.domain.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpClientErrorException; + +import com.unicauca.consumercategory.config.RabbitMQConfig; +import com.unicauca.consumercategory.domain.entity.CategoryEvent; + +import org.springframework.amqp.AmqpRejectAndDontRequeueException; +import org.springframework.amqp.rabbit.annotation.RabbitListener; + +@Component +public class RabbitMQConsumer { + @Autowired + ICategoryEventService categoryLogService; + + @Autowired + private ICategoryRequestConsumerService categoryServiceConsumer; + + @RabbitListener(queues = RabbitMQConfig.DB_LOG_QUEUE) + public void consumeMessageFromQueue(String message) { + System.out.println("Message recieved from queue : " + message); + CategoryEvent category = new CategoryEvent(); + String[] parts = message.split(","); + if (parts.length == 5) { + try { + category.setId(Long.parseLong(parts[0])); + category.setName(parts[1]); + category.setDescription(parts[2]); + category.setAction(parts[3]); + category.setHolderEmail(parts[4]); + categoryLogService.create(category); + categoryServiceConsumer.sendCategoryRequest(category); + } catch (HttpClientErrorException e) { + System.err.println(e); + throw new AmqpRejectAndDontRequeueException(e); + } catch (Exception e) { + throw new AmqpRejectAndDontRequeueException(e); + } + } + } +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/presentation/rest/CategorysController.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/presentation/rest/CategorysController.java new file mode 100644 index 0000000..d2b047d --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/presentation/rest/CategorysController.java @@ -0,0 +1,84 @@ +package com.unicauca.consumercategory.presentation.rest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import com.unicauca.consumercategory.domain.service.ICategoryEventService; +import com.unicauca.consumercategory.domain.entity.CategoryEvent; + +@RestController +@RequestMapping("categorylogs") +public class CategorysController { + @Autowired + private ICategoryEventService categoryService; + + /** + * Busca todos los categoryos + * + * @return Lista de categoryos + */ + @RequestMapping(method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public List findAll() { + return (List) categoryService.findAll(); + } + + /** + * Busca un categoryo por su id + * + * @param id id del categoryo + * @return categoryo + */ + @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public CategoryEvent findById(@PathVariable Long id) { + return categoryService.find(id); + } + + /** + * Crea un categoryo + * + * @param category categoryo a crear + * @return categoryo creado + */ + @RequestMapping(method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public CategoryEvent create(@RequestBody CategoryEvent category) { + return categoryService.create(category); + } + + /** + * Actualiza un categoryo + * + * @param category categoryo a actualizar + * @param id id del categoryo a actualizar + * @return categoryo eliminado + */ + + @RequestMapping(value = "{id}", method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public CategoryEvent update(@RequestBody CategoryEvent category, @PathVariable Long id) { + return categoryService.update(id, category); + } + + /** + * Elimina un categoryo + * + * @param id id del categoryo a eliminar + */ + @RequestMapping(value = "{id}", method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + public void delete(@PathVariable Long id) { + categoryService.delete(id); + } +} diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/utilities/CategoryRequestsConstants.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/utilities/CategoryRequestsConstants.java new file mode 100644 index 0000000..fa3fcca --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/utilities/CategoryRequestsConstants.java @@ -0,0 +1,13 @@ +package com.unicauca.consumercategory.utilities; + +public class CategoryRequestsConstants { + public static final String DIRECT_EXCHANGE_NAME = "categoryrequest-direct-exchange"; + public static final String DEAD_LETTER_EXCHANGE_NAME = "deadLetterExchange"; + public static final String DEAD_LETTER_ROUTING_KEY_NAME = "deadLetter"; + public static final String QUEUE_NAME = "openmarketrequest"; + public static final String OPENMARKET_REQUEST_ENDPOINT = "/categoryRequests"; + public static final String OPENMARKET_API_URL = (System.getenv("OPENMARKET_API_URL") != null + ? System.getenv("OPENMARKET_API_URL") + : "http://localhost:8084") + OPENMARKET_REQUEST_ENDPOINT; + +} \ No newline at end of file diff --git a/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/utilities/DateTimeUtil.java b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/utilities/DateTimeUtil.java new file mode 100644 index 0000000..4ebdb7d --- /dev/null +++ b/microservices/consumercategory/src/main/java/com/unicauca/consumercategory/utilities/DateTimeUtil.java @@ -0,0 +1,15 @@ +package com.unicauca.consumercategory.utilities; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateTimeUtil { + public static int diffInDays(Date start, Date end) { + long time = end.getTime() - start.getTime(); + return (int) (time / (1000 * 60 * 60 * 24)) % 365; + } + + public static String dateFormatYYYYMMDD(Date date) { + return new SimpleDateFormat("yyyy-MM-dd").format(date); + } +} diff --git a/microservices/consumercategory/src/main/resources/application.properties b/microservices/consumercategory/src/main/resources/application.properties new file mode 100644 index 0000000..45c0edf --- /dev/null +++ b/microservices/consumercategory/src/main/resources/application.properties @@ -0,0 +1,4 @@ +spring.h2.console.enabled=true +server.port=8083 +spring.rabbitmq.host:${RABBITMQ_HOST:localhost} +spring.rabbitmq.port:${RABBITMQ_PORT:5672} \ No newline at end of file diff --git a/microservices/consumercategory/src/main/resources/import.sql b/microservices/consumercategory/src/main/resources/import.sql new file mode 100644 index 0000000..e69de29 diff --git a/microservices/consumercategory/src/test/java/com/unicauca/consumercategory/ConsumercategoryApplicationTests.java b/microservices/consumercategory/src/test/java/com/unicauca/consumercategory/ConsumercategoryApplicationTests.java new file mode 100644 index 0000000..a764b57 --- /dev/null +++ b/microservices/consumercategory/src/test/java/com/unicauca/consumercategory/ConsumercategoryApplicationTests.java @@ -0,0 +1,13 @@ +package com.unicauca.consumercategory; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ConsumercategoryApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/microservices/consumerproduct/.gitignore b/microservices/consumerproduct/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/microservices/consumerproduct/.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/microservices/consumerproduct/.mvn/wrapper/maven-wrapper.jar b/microservices/consumerproduct/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 GIT binary patch literal 59925 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

dy!05UMhSKsK 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 VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N literal 0 HcmV?d00001 diff --git a/microservices/consumerproduct/.mvn/wrapper/maven-wrapper.properties b/microservices/consumerproduct/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..ca5ab4b --- /dev/null +++ b/microservices/consumerproduct/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# 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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/microservices/consumerproduct/Dockerfile b/microservices/consumerproduct/Dockerfile new file mode 100644 index 0000000..8a4ce77 --- /dev/null +++ b/microservices/consumerproduct/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:11-jdk-slim +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/microservices/consumerproduct/mvnw b/microservices/consumerproduct/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/microservices/consumerproduct/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/microservices/consumerproduct/mvnw.cmd b/microservices/consumerproduct/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/microservices/consumerproduct/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/microservices/consumerproduct/pom.xml b/microservices/consumerproduct/pom.xml new file mode 100644 index 0000000..6b5c679 --- /dev/null +++ b/microservices/consumerproduct/pom.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.13 + + + com.unicauca + consumerproduct + 0.0.1-SNAPSHOT + consumerproduct + Demo project for Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-amqp + + + com.google.code.gson + gson + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.h2database + h2 + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.amqp + spring-rabbit-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/ConsumerProductApplication.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/ConsumerProductApplication.java new file mode 100644 index 0000000..e821cde --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/ConsumerProductApplication.java @@ -0,0 +1,13 @@ +package com.unicauca.consumerproduct; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ConsumerProductApplication { + + public static void main(String[] args) { + SpringApplication.run(ConsumerProductApplication.class, args); + } + +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/access/repository/IProductEventRepository.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/access/repository/IProductEventRepository.java new file mode 100644 index 0000000..7a7cc94 --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/access/repository/IProductEventRepository.java @@ -0,0 +1,9 @@ +package com.unicauca.consumerproduct.access.repository; + +import org.springframework.data.repository.CrudRepository; + +import com.unicauca.consumerproduct.domain.entity.ProductEvent; + +public interface IProductEventRepository extends CrudRepository { + +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/config/RabbitMQConfig.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/config/RabbitMQConfig.java new file mode 100644 index 0000000..896259d --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/config/RabbitMQConfig.java @@ -0,0 +1,46 @@ +package com.unicauca.consumerproduct.config; + +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.FanoutExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.amqp.support.converter.SimpleMessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitMQConfig { + + public static final String PRODUCT_EVENTS_EXCHANGE = "product-events-exchange"; + public static final String DB_LOG_QUEUE = "database-log-queue"; + + @Bean + public FanoutExchange product_events_exchange() { + return new FanoutExchange(PRODUCT_EVENTS_EXCHANGE); + } + + @Bean + public Queue db_log_queue() { + return new Queue(DB_LOG_QUEUE); + } + + @Bean + public Binding binding2(Queue db_log_queue, FanoutExchange product_events_exchange) { + return BindingBuilder.bind(db_log_queue).to(product_events_exchange); + } + + @Bean + public MessageConverter messageConverter() { + return new SimpleMessageConverter(); + } + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { + RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); + rabbitTemplate.setMessageConverter(messageConverter()); + return rabbitTemplate; + } +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/entity/ProductEvent.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/entity/ProductEvent.java new file mode 100644 index 0000000..f9f0e4c --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/entity/ProductEvent.java @@ -0,0 +1,41 @@ +package com.unicauca.consumerproduct.domain.entity; + +import java.io.Serializable; +import java.util.Date; + +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.validation.constraints.NotNull; + +import lombok.Data; + +@Entity +@Table(name = "products") +@Data // Generare constructor, getters and setters and ToString methods +public class ProductEvent implements Serializable { + private static final long serialVersionUID = 1L; + + @Id // This makes the id as primary key + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name") + @NotNull(message = "El nombre es obligatorio") + private String name; + + @Column(name = "price") + @NotNull(message = "El precio es obligatorio") + private Double price; + + @Column(name = "action") + @NotNull(message = "La accion es obligatoria") + private String action; + + @Column(name = "holderEmail") + @NotNull(message = "El correo es obligatorio") + private String holderEmail; +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IProductEventService.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IProductEventService.java new file mode 100644 index 0000000..9e84377 --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IProductEventService.java @@ -0,0 +1,6 @@ +package com.unicauca.consumerproduct.domain.service; + +import com.unicauca.consumerproduct.domain.entity.ProductEvent; + +public interface IProductEventService extends IService { +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IProductRequestConsumerService.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IProductRequestConsumerService.java new file mode 100644 index 0000000..725e732 --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IProductRequestConsumerService.java @@ -0,0 +1,7 @@ +package com.unicauca.consumerproduct.domain.service; + +import com.unicauca.consumerproduct.domain.entity.ProductEvent; + +public interface IProductRequestConsumerService { + public void sendProductRequest(ProductEvent product); +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IService.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IService.java new file mode 100644 index 0000000..2465503 --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/IService.java @@ -0,0 +1,16 @@ +package com.unicauca.consumerproduct.domain.service; + +import java.io.Serializable; +import java.util.List; + +public interface IService { + public List findAll(); + + public T find(Long id); + + public T create(T object); + + public T update(Long id, T object); + + public void delete(Long id); +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/ProductEventServiceImpl.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/ProductEventServiceImpl.java new file mode 100644 index 0000000..2394ff9 --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/ProductEventServiceImpl.java @@ -0,0 +1,88 @@ +package com.unicauca.consumerproduct.domain.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.unicauca.consumerproduct.access.repository.IProductEventRepository; +import com.unicauca.consumerproduct.domain.entity.ProductEvent; + +@Service // Para que sea un componente de Spring +public class ProductEventServiceImpl implements IProductEventService { + @Autowired // Inyecta una dependencia + private IProductEventRepository repository; + + /** + * Busca todos los evento de productos + * + * @return Lista de evento de productos + */ + @Override + @Transactional(readOnly = true) + public List findAll() { + return (List) repository.findAll(); + } + + /** + * Busca un evento de producto por su id + * + * @param id id del evento de producto + * @return evento de producto + */ + @Override + @Transactional + public ProductEvent find(Long id) { + ProductEvent product = repository.findById(id).orElse(null); + return product; + } + + /** + * Crea un evento de producto + * + * @param product evento de producto a crear + * @return evento de producto creado + */ + @Override + @Transactional + public ProductEvent create(ProductEvent product) { + + // Save the product + ProductEvent savedProduct = repository.save(product); + // Send the event message + return savedProduct; + + } + + /** + * Actualiza un evento de producto + * + * @param id id del evento de producto + * @param product evento de producto a actualizar + * @return evento de producto actualizado + */ + @Override + @Transactional + public ProductEvent update(Long id, ProductEvent product) { + ProductEvent productUpdate = this.find(id); + productUpdate.setName(product.getName()); + productUpdate.setPrice(product.getPrice()); + // Save the product + ProductEvent updateProduct = repository.save(productUpdate); + // Send the event message + return updateProduct; + } + + /** + * Elimina un evento de producto + * + * @param id id del evento de producto + */ + @Override + @Transactional + public void delete(Long id) { + + repository.deleteById(id); + } +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/ProductRequestConsumerImplService.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/ProductRequestConsumerImplService.java new file mode 100644 index 0000000..e037a57 --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/ProductRequestConsumerImplService.java @@ -0,0 +1,36 @@ +package com.unicauca.consumerproduct.domain.service; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.JsonObject; +import com.unicauca.consumerproduct.domain.entity.ProductEvent; +import com.unicauca.consumerproduct.utilities.ProductRequestsConstants; + +@Service +public class ProductRequestConsumerImplService implements IProductRequestConsumerService { + + @Override + public void sendProductRequest(ProductEvent product) { + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + JsonObject json = new JsonObject(); + json.addProperty("name", product.getName()); + json.addProperty("price", product.getPrice()); + json.addProperty("action", product.getAction()); + json.addProperty("holderEmail", product.getHolderEmail() != null ? product.getHolderEmail() : ""); + HttpEntity entity = new HttpEntity(json.toString(), headers); + + // send request and parse result + ResponseEntity response = restTemplate.exchange(ProductRequestsConstants.OPENMARKET_API_URL, + HttpMethod.POST, entity, String.class); + System.out.println(response); + } + +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/RabbitMQConsumer.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/RabbitMQConsumer.java new file mode 100644 index 0000000..df51a1a --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/domain/service/RabbitMQConsumer.java @@ -0,0 +1,43 @@ +package com.unicauca.consumerproduct.domain.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpClientErrorException; + +import com.unicauca.consumerproduct.config.RabbitMQConfig; +import com.unicauca.consumerproduct.domain.entity.ProductEvent; + +import org.springframework.amqp.AmqpRejectAndDontRequeueException; +import org.springframework.amqp.rabbit.annotation.RabbitListener; + +@Component +public class RabbitMQConsumer { + @Autowired + IProductEventService productLogService; + + @Autowired + private IProductRequestConsumerService productServiceConsumer; + + @RabbitListener(queues = RabbitMQConfig.DB_LOG_QUEUE) + public void consumeMessageFromQueue(String message) { + System.out.println("Message recieved from queue : " + message); + ProductEvent product = new ProductEvent(); + String[] parts = message.split(","); + if (parts.length == 5) { + try { + product.setId(Long.parseLong(parts[0])); + product.setName(parts[1]); + product.setPrice(Double.parseDouble(parts[2])); + product.setAction(parts[3]); + product.setHolderEmail(parts[4]); + productLogService.create(product); + productServiceConsumer.sendProductRequest(product); + } catch (HttpClientErrorException e) { + System.err.println(e); + throw new AmqpRejectAndDontRequeueException(e); + } catch (Exception e) { + throw new AmqpRejectAndDontRequeueException(e); + } + } + } +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/presentation/rest/ProductsController.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/presentation/rest/ProductsController.java new file mode 100644 index 0000000..4ccd16f --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/presentation/rest/ProductsController.java @@ -0,0 +1,84 @@ +package com.unicauca.consumerproduct.presentation.rest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import com.unicauca.consumerproduct.domain.service.IProductEventService; +import com.unicauca.consumerproduct.domain.entity.ProductEvent; + +@RestController +@RequestMapping("productlogs") +public class ProductsController { + @Autowired + private IProductEventService productService; + + /** + * Busca todos los productos + * + * @return Lista de productos + */ + @RequestMapping(method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public List findAll() { + return (List) productService.findAll(); + } + + /** + * Busca un producto por su id + * + * @param id id del producto + * @return producto + */ + @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public ProductEvent findById(@PathVariable Long id) { + return productService.find(id); + } + + /** + * Crea un producto + * + * @param product producto a crear + * @return producto creado + */ + @RequestMapping(method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public ProductEvent create(@RequestBody ProductEvent product) { + return productService.create(product); + } + + /** + * Actualiza un producto + * + * @param product producto a actualizar + * @param id id del producto a actualizar + * @return producto eliminado + */ + + @RequestMapping(value = "{id}", method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public ProductEvent update(@RequestBody ProductEvent product, @PathVariable Long id) { + return productService.update(id, product); + } + + /** + * Elimina un producto + * + * @param id id del producto a eliminar + */ + @RequestMapping(value = "{id}", method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + public void delete(@PathVariable Long id) { + productService.delete(id); + } +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/utilities/DateTimeUtil.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/utilities/DateTimeUtil.java new file mode 100644 index 0000000..51b9ab9 --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/utilities/DateTimeUtil.java @@ -0,0 +1,15 @@ +package com.unicauca.consumerproduct.utilities; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateTimeUtil { + public static int diffInDays(Date start, Date end) { + long time = end.getTime() - start.getTime(); + return (int) (time / (1000 * 60 * 60 * 24)) % 365; + } + + public static String dateFormatYYYYMMDD(Date date) { + return new SimpleDateFormat("yyyy-MM-dd").format(date); + } +} diff --git a/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/utilities/ProductRequestsConstants.java b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/utilities/ProductRequestsConstants.java new file mode 100644 index 0000000..cb92ca7 --- /dev/null +++ b/microservices/consumerproduct/src/main/java/com/unicauca/consumerproduct/utilities/ProductRequestsConstants.java @@ -0,0 +1,13 @@ +package com.unicauca.consumerproduct.utilities; + +public class ProductRequestsConstants { + public static final String DIRECT_EXCHANGE_NAME = "productrequest-direct-exchange"; + public static final String DEAD_LETTER_EXCHANGE_NAME = "deadLetterExchange"; + public static final String DEAD_LETTER_ROUTING_KEY_NAME = "deadLetter"; + public static final String QUEUE_NAME = "openmarketrequest"; + public static final String OPENMARKET_REQUEST_ENDPOINT = "/productRequests"; + public static final String OPENMARKET_API_URL = (System.getenv("OPENMARKET_API_URL") != null + ? System.getenv("OPENMARKET_API_URL") + : "http://localhost:8084") + OPENMARKET_REQUEST_ENDPOINT; + +} \ No newline at end of file diff --git a/microservices/consumerproduct/src/main/resources/application.properties b/microservices/consumerproduct/src/main/resources/application.properties new file mode 100644 index 0000000..f0825c8 --- /dev/null +++ b/microservices/consumerproduct/src/main/resources/application.properties @@ -0,0 +1,4 @@ +spring.h2.console.enabled=true +server.port=8081 +spring.rabbitmq.host:${RABBITMQ_HOST:localhost} +spring.rabbitmq.port:${RABBITMQ_PORT:5672} \ No newline at end of file diff --git a/microservices/consumerproduct/src/main/resources/import.sql b/microservices/consumerproduct/src/main/resources/import.sql new file mode 100644 index 0000000..e69de29 diff --git a/microservices/consumerproduct/src/test/java/com/unicauca/consumerproduct/ConsumerproductApplicationTests.java b/microservices/consumerproduct/src/test/java/com/unicauca/consumerproduct/ConsumerproductApplicationTests.java new file mode 100644 index 0000000..81b71fb --- /dev/null +++ b/microservices/consumerproduct/src/test/java/com/unicauca/consumerproduct/ConsumerproductApplicationTests.java @@ -0,0 +1,13 @@ +package com.unicauca.consumerproduct; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class consumerproductApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/microservices/deploy.sh b/microservices/deploy.sh new file mode 100644 index 0000000..48f0d9f --- /dev/null +++ b/microservices/deploy.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +echo "Deteniendo y eliminando los contenedores y volúmenes..." +docker-compose down -v + +echo "Ejecutando el contenedor de MySQL..." +# Verificar si el contenedor ya existe +if docker inspect openmarket_app_db_container >/dev/null 2>&1; then + echo "El contenedor openmarket_app_db_container ya está creado. Saltando la ejecución de 'docker run'." +else + echo "Ejecutando el contenedor de MySQL..." + docker run --rm --name openmarket_app_db_container -e MYSQL_ROOT_PASSWORD=12345678 -e MYSQL_DATABASE=openmarket_app_db -d -p 3307:3306 mysql +fi + +echo "Compilando y empaquetando el proyecto consumerproduct..." +mvn clean package -f consumerproduct/pom.xml + +echo "Compilando y empaquetando el proyecto consumercategory..." +mvn clean package -f consumercategory/pom.xml + +echo "Compilando y empaquetando el proyecto producerproduct..." +mvn clean package -f producerproduct/pom.xml + +echo "Compilando y empaquetando el proyecto producercategory..." +mvn clean package -f producercategory/pom.xml + +echo "Compilando y empaquetando el proyecto api..." +mvn clean package -f api/pom.xml + +echo "Creando y ejecutando los servicios definidos en docker-compose.yml..." +docker-compose up --build -d diff --git a/microservices/docker-compose.yml b/microservices/docker-compose.yml new file mode 100644 index 0000000..87e86e6 --- /dev/null +++ b/microservices/docker-compose.yml @@ -0,0 +1,76 @@ +version: "3.9" +services: + rabbitmq: + container_name: rabbitmq-openmarket + restart: always + image: rabbitmq:management + ports: + - "5672:5672" + - "15672:15672" + volumes: + - queue-volume:/var/lib/rabbitmq + mysql-db: + image: mysql + container_name: openmarket-app-db-container + restart: always + env_file: + - ./env/database.env + volumes: + - data-volume:/var/lib/mysql + api: + build: ./api + container_name: openmarket-app-api-container + restart: always + env_file: + - ./env/api.env + depends_on: + - mysql-db + ports: + - "8084:8084" + producerproduct: + build: ./producerproduct + container_name: openmarket-app-producerproduct-container + restart: always + env_file: + - ./env/producerproduct.env + depends_on: + - rabbitmq + ports: + - "8080:8080" + producercategory: + build: ./producercategory + container_name: openmarket-app-producercategory-container + restart: always + env_file: + - ./env/producercategory.env + depends_on: + - rabbitmq + ports: + - "8082:8082" + consumerproduct: + build: ./consumerproduct + container_name: openmarket-app-consumerproduct-container + restart: always + env_file: + - ./env/consumerproduct.env + depends_on: + - rabbitmq + - api + - producerproduct + ports: + - "8081:8081" + consumercategory: + build: ./consumercategory + container_name: openmarket-app-consumercategory-container + restart: always + env_file: + - ./env/consumercategory.env + depends_on: + - rabbitmq + - api + - producercategory + ports: + - "8083:8083" +volumes: + data-volume: + queue-volume: diff --git a/microservices/docs/categoryhttp.png b/microservices/docs/categoryhttp.png new file mode 100644 index 0000000000000000000000000000000000000000..142edd7f814aa4858e93c02edfd3af2caf01ac08 GIT binary patch literal 61205 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

t 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 literal 0 HcmV?d00001 diff --git a/microservices/docs/emailcategory.png b/microservices/docs/emailcategory.png new file mode 100644 index 0000000000000000000000000000000000000000..b49813e771dbf73f5b25badcee67c296235eec60 GIT binary patch literal 22790 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 literal 0 HcmV?d00001 diff --git a/microservices/docs/producthttp.png b/microservices/docs/producthttp.png new file mode 100644 index 0000000000000000000000000000000000000000..51eb52d19d84cba33438bc85807441225fc3ca14 GIT binary patch literal 49565 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 G_ul|MZA~Ts literal 0 HcmV?d00001 diff --git a/microservices/producercategory/.gitignore b/microservices/producercategory/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/microservices/producercategory/.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/microservices/producercategory/.mvn/wrapper/maven-wrapper.jar b/microservices/producercategory/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 GIT binary patch literal 59925 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

dy!05UMhSKsK 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 VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N literal 0 HcmV?d00001 diff --git a/microservices/producercategory/.mvn/wrapper/maven-wrapper.properties b/microservices/producercategory/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..ca5ab4b --- /dev/null +++ b/microservices/producercategory/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# 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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/microservices/producercategory/Dockerfile b/microservices/producercategory/Dockerfile new file mode 100644 index 0000000..8a4ce77 --- /dev/null +++ b/microservices/producercategory/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:11-jdk-slim +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/microservices/producercategory/mvnw b/microservices/producercategory/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/microservices/producercategory/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/microservices/producercategory/mvnw.cmd b/microservices/producercategory/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/microservices/producercategory/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/microservices/producercategory/pom.xml b/microservices/producercategory/pom.xml new file mode 100644 index 0000000..38d2b54 --- /dev/null +++ b/microservices/producercategory/pom.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.13 + + + com.unicauca + producercategory + 0.0.1-SNAPSHOT + producercategory + Demo project for Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.h2database + h2 + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.amqp + spring-rabbit-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/microservices/producercategory/src/main/java/com/unicauca/producercategory/ProducerCategoryApplication.java b/microservices/producercategory/src/main/java/com/unicauca/producercategory/ProducerCategoryApplication.java new file mode 100644 index 0000000..36859ee --- /dev/null +++ b/microservices/producercategory/src/main/java/com/unicauca/producercategory/ProducerCategoryApplication.java @@ -0,0 +1,13 @@ +package com.unicauca.producercategory; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProducerCategoryApplication { + + public static void main(String[] args) { + SpringApplication.run(ProducerCategoryApplication.class, args); + } + +} diff --git a/microservices/producercategory/src/main/java/com/unicauca/producercategory/access/repository/ICategoryRepository.java b/microservices/producercategory/src/main/java/com/unicauca/producercategory/access/repository/ICategoryRepository.java new file mode 100644 index 0000000..a23dc63 --- /dev/null +++ b/microservices/producercategory/src/main/java/com/unicauca/producercategory/access/repository/ICategoryRepository.java @@ -0,0 +1,9 @@ +package com.unicauca.producercategory.access.repository; + +import org.springframework.data.repository.CrudRepository; + +import com.unicauca.producercategory.domain.entity.Category; + +public interface ICategoryRepository extends CrudRepository { + +} diff --git a/microservices/producercategory/src/main/java/com/unicauca/producercategory/config/RabbitMQConfig.java b/microservices/producercategory/src/main/java/com/unicauca/producercategory/config/RabbitMQConfig.java new file mode 100644 index 0000000..af22792 --- /dev/null +++ b/microservices/producercategory/src/main/java/com/unicauca/producercategory/config/RabbitMQConfig.java @@ -0,0 +1,32 @@ +package com.unicauca.producercategory.config; + +import org.springframework.amqp.core.FanoutExchange; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.amqp.support.converter.SimpleMessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitMQConfig { + + public static final String CATEGORY_EVENTS_EXCHANGE = "category-events-exchange"; + + @Bean + public FanoutExchange category_events_exchange() { + return new FanoutExchange(CATEGORY_EVENTS_EXCHANGE); + } + + @Bean + public MessageConverter messageConverter() { + return new SimpleMessageConverter(); + } + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { + RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); + rabbitTemplate.setMessageConverter(messageConverter()); + return rabbitTemplate; + } +} diff --git a/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/entity/Category.java b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/entity/Category.java new file mode 100644 index 0000000..12d2ab0 --- /dev/null +++ b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/entity/Category.java @@ -0,0 +1,40 @@ +package com.unicauca.producercategory.domain.entity; + +import java.io.Serializable; +import java.util.Date; + +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 javax.validation.constraints.NotNull; + +import lombok.Data; + +@Entity +@Table(name = "categories") +@Data +public class Category implements Serializable { + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name") + @NotNull(message = "El nombre es obligatorio") + private String name; + + @Column(name = "description") + private String description; + + @Column(name = "created_at") + @Temporal(TemporalType.DATE) + private Date createdAt; + + @Column(name = "holderEmail") + private String holderEmail; +} diff --git a/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/CategoryServiceImpl.java b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/CategoryServiceImpl.java new file mode 100644 index 0000000..952907d --- /dev/null +++ b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/CategoryServiceImpl.java @@ -0,0 +1,92 @@ +package com.unicauca.producercategory.domain.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.unicauca.producercategory.access.repository.ICategoryRepository; +import com.unicauca.producercategory.domain.entity.Category; + +@Service // Para que sea un componente de Spring +public class CategoryServiceImpl implements ICategoryService { + @Autowired // Inyecta una dependencia + private ICategoryRepository repository; + + @Autowired + private RabbitMQProducer rabbitMQProducer; + + /** + * Busca todas las categorias + * + * @return Lista de categorias + */ + @Override + @Transactional(readOnly = true) + public List findAll() { + return (List) repository.findAll(); + } + + /** + * Busca una categoria por su id + * + * @param id id de la categoria + * @return categoria + */ + @Override + @Transactional + public Category find(Long id) { + Category category = repository.findById(id).orElse(null); + return category; + } + + /** + * Crea una categoria + * + * @param category categoria a crear + * @return categoria creada + */ + @Override + @Transactional + public Category create(Category category) { + // Save the category + Category savedCategory = repository.save(category); + // Send the event message + rabbitMQProducer.send(savedCategory, "create"); + return savedCategory; + } + + /** + * Actualiza una categoria + * + * @param id id de la categoria + * @param category categoria a actualizar + * @return categoria actualizada + */ + @Override + @Transactional + public Category update(Long id, Category category) { + Category categoryUpdate = this.find(id); + categoryUpdate.setName(category.getName()); + categoryUpdate.setDescription(category.getDescription()); + Category updateCategory = repository.save(categoryUpdate); + rabbitMQProducer.send(updateCategory, "update"); + return repository.save(categoryUpdate); + } + + /** + * Elimina una categoria + * + * @param id id de la categoria + */ + @Override + @Transactional + public void delete(Long id) { + Category categoryDelete = this.find(id); + if (categoryDelete != null) { + rabbitMQProducer.send(categoryDelete, "delete"); + } + repository.deleteById(id); + } +} diff --git a/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/ICategoryService.java b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/ICategoryService.java new file mode 100644 index 0000000..4f3ba39 --- /dev/null +++ b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/ICategoryService.java @@ -0,0 +1,6 @@ +package com.unicauca.producercategory.domain.service; + +import com.unicauca.producercategory.domain.entity.Category; + +public interface ICategoryService extends IService { +} diff --git a/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/IService.java b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/IService.java new file mode 100644 index 0000000..0503b56 --- /dev/null +++ b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/IService.java @@ -0,0 +1,16 @@ +package com.unicauca.producercategory.domain.service; + +import java.io.Serializable; +import java.util.List; + +public interface IService { + public List findAll(); + + public T find(Long id); + + public T create(T object); + + public T update(Long id, T object); + + public void delete(Long id); +} diff --git a/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/RabbitMQProducer.java b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/RabbitMQProducer.java new file mode 100644 index 0000000..3c6f8e3 --- /dev/null +++ b/microservices/producercategory/src/main/java/com/unicauca/producercategory/domain/service/RabbitMQProducer.java @@ -0,0 +1,22 @@ +package com.unicauca.producercategory.domain.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.unicauca.producercategory.config.RabbitMQConfig; +import com.unicauca.producercategory.domain.entity.Category; + +import org.springframework.amqp.core.AmqpTemplate; + +@Service +public class RabbitMQProducer { + @Autowired + private AmqpTemplate rabbitTemplate; + + public void send(Category category, String action) { + String message = category.getId() + "," + category.getName() + "," + category.getDescription() + "," + action + + "," + + category.getHolderEmail(); + rabbitTemplate.convertAndSend(RabbitMQConfig.CATEGORY_EVENTS_EXCHANGE, "", message); + } +} diff --git a/microservices/producercategory/src/main/java/com/unicauca/producercategory/presentation/rest/CategoriesController.java b/microservices/producercategory/src/main/java/com/unicauca/producercategory/presentation/rest/CategoriesController.java new file mode 100644 index 0000000..730d6d4 --- /dev/null +++ b/microservices/producercategory/src/main/java/com/unicauca/producercategory/presentation/rest/CategoriesController.java @@ -0,0 +1,84 @@ +package com.unicauca.producercategory.presentation.rest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import com.unicauca.producercategory.domain.service.ICategoryService; +import com.unicauca.producercategory.domain.entity.Category; + +@RestController +@RequestMapping("categories") +public class CategoriesController { + @Autowired + private ICategoryService categoryService; + + /** + * Busca todas las categorias + * + * @return Lista de categorias + */ + @RequestMapping(method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public List findAll() { + return (List) categoryService.findAll(); + } + + /** + * Busca un categoria por su id + * + * @param id id del categoria + * @return categoria + */ + @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public Category findById(@PathVariable Long id) { + return categoryService.find(id); + } + + /** + * Crea un categoria + * + * @param category categoria a crear + * @return categoria creada + */ + @RequestMapping(method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public Category create(@RequestBody Category category) { + return categoryService.create(category); + } + + /** + * Actualiza un categoria + * + * @param category categoria a actualizar + * @param id id del categoria a actualizar + * @return categoria eliminada + */ + + @RequestMapping(value = "{id}", method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public Category update(@RequestBody Category category, @PathVariable Long id) { + return categoryService.update(id, category); + } + + /** + * Elimina un categoria + * + * @param id id del categoria a eliminar + */ + @RequestMapping(value = "{id}", method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + public void delete(@PathVariable Long id) { + categoryService.delete(id); + } +} diff --git a/microservices/producercategory/src/main/resources/application.properties b/microservices/producercategory/src/main/resources/application.properties new file mode 100644 index 0000000..c03a3d3 --- /dev/null +++ b/microservices/producercategory/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=8082 +spring.rabbitmq.host:${RABBITMQ_HOST:localhost} +spring.rabbitmq.port:${RABBITMQ_PORT:5672} \ No newline at end of file diff --git a/microservices/producercategory/src/main/resources/import.sql b/microservices/producercategory/src/main/resources/import.sql new file mode 100644 index 0000000..7df1f1b --- /dev/null +++ b/microservices/producercategory/src/main/resources/import.sql @@ -0,0 +1,4 @@ +insert into categories(name) values ('Fruits'); +insert into categories(name) values ('Vegetables'); +insert into categories(name) values ('Meat'); +insert into categories(name) values ('Fish'); diff --git a/microservices/producercategory/src/test/java/com/unicauca/producercategory/ProducerCategoryApplicationTests.java b/microservices/producercategory/src/test/java/com/unicauca/producercategory/ProducerCategoryApplicationTests.java new file mode 100644 index 0000000..4bb28fa --- /dev/null +++ b/microservices/producercategory/src/test/java/com/unicauca/producercategory/ProducerCategoryApplicationTests.java @@ -0,0 +1,13 @@ +package com.unicauca.producercategory; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ProducerCategoryApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/microservices/producerproduct/.gitignore b/microservices/producerproduct/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/microservices/producerproduct/.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/microservices/producerproduct/.mvn/wrapper/maven-wrapper.jar b/microservices/producerproduct/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 GIT binary patch literal 59925 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

dy!05UMhSKsK zV1FiJ5SlAhkpcl_H0wRzql?0Qp5wz72o2cMC@utM(|&o0ZO_JpXr+N7l~F?Ef_02md^m|Ly|(EN; z%;)3t6SWt{5hgzszZWS1v^AU?`~Rctor7%qx@EySW!tuG+qP}nwr$(CZQHi1PTA*F z*Vo_ezW4q*-hHnl_8%)^$Bx*s=9+Vi%$1qr5fK%c+Hm4kiE$B;kgV)wam25w$Y7#k5$> zyB^6k3i~L_6~PX554`c3Lxx;&_sT;I^U92G@fS6#(Xv!B%;H3+{e)1R6lyU)8AK1_ z?@>F5H=sXG=ep;kDRZO_ofS}`Jus*Qp3`_V4v~&b-RQ=t8AN5H5{@!_Il~0 zZd!-aH=h)(7CJ&tL%%{P{6d_g=5tsj%S3Z!QxjrLdjoKmNP-zSjdJ!?qL(UMq38ps zjKSz5gzwhDFA;5md5yYb>QN)U_@8Xpjl4yw5065)+#MSGp;yQ*{%mt>12;$~R{eVV>o|juO{Z^ z^o^m@DOBrE2mm1nLgBfA(Wi=X9R%(1UYZcZJ!3;*bR^smI~6lyn`O4BOwo-STsQcyodVA~leg9`{=l(qDl@DCM>s+w`%S_q*PIjYP ziuHHuj0VVW1%+TH*lx9#-$^q&l)G_ojju-w{# zVs{oOc>_fcS51xY+19tN`;V~R0wVyuxdkS|t zC}~Gtu-UyA{H5~6*ocUWM)RfQ076mL1r zFVWV%zx!_*zk`5&dFbdq4nbWxIwAu=`+$V-`m<*-Z*mE2X|>OCAJVV;wlq0E$hVe@&x7V(!xg1*;%`} zxxBu5;jmZEH*e!Rj=Mz|udBR8BR6LiGoLWb<1=<14it;Fuk$6=7YCR&;F+%r`{S6M zP92W>ECy`pZR$Q<6n8Zw1|uh*M=zK=QP0b38_aX#$gB^y>EahIiUzy^MP1ct%UhZX z>FFLVJ=H`FRSq!<_DtWyjLZ6t^Nf|?<69Aj$U0*lrAJG0{t;t8Y^SKLacoR%3EXw+ zDi5T^PkjmJp7@B|$lkEwHHaQ7BGc$})@qNRqk4JH!(bgPM!{Mb&Kz|UGk?QskODW5-NCJ3`Fbks<}%TsOB+e{Hn1i7BP z(XsKkfl`r0N)u1VqaPYGlDxR3>%y{&vYaQCnX8AAv8h8>a^4<#jAhtfa;TdoFlN=?Ac{@Cdxj{YI z!kxobbr?~GU8JKwH2Ywa(#i=Rzof$nu?4-zlN#QJflTO^QkyarxNI<~MY1}jy~Jz` zBRwV&0+G01D9biQ4PR*1NiSqTXZB~NdI6yVEU|AiWJYA>k9G=*`R^VFjr{jhqZ$&G za0#huq)Mhb&8oR!jrv%;xRe@b&PWBXh7ATurhUY7yobngzP;($8b5g z9U{5JMt%fMp(N6ZVGsYa2p(#ry;Y&;GG(DG((_GrS%r&waWuX94*RX8>&x|Lzv8WCaXaWo(3FK=U@G#S$8kCX_R6q|VO;WbeXk~x zmq?NS+S2WfO|{j{dKy5``SRA!r+%)`DCW{s?8uZJW{-4%x}KJzAtiyY6b#)!fe0kA z)=W5C>X6ZLRFH_-$)Z(B8Hr}FD#FLGum2gRluDsrJHf$do$r!ORQqrI6~=-H0vPiG zC2V88MIp?Xhc&UnIS(c)naRXTu-r!%x0J;3uWjp5K%!b_v$;;T0*{_2txs!*+BgP} z%eY2;N7AFz(g@fFy&(hWk`R9#fRZ&X598A7xjHyoDJ4!3CK{Grr4>0bTBw3ps{tN7KqVY^)~B5St2NQS9wH_Lc=s8$1H5J?52_$nh z+rnm{F~bVIsiCZ^Gy&eV*X9JTJZB^`|6F$9|Fq@ekZKP~h_BWGsow^hUpo~MCTrdk^1B;= zNXiYAZnUPm>}{vX*&Yb&{0FNvW!V)h-<{na1yT-|kAkG7xU7QA-NAc|e4Nf2`OWnV zxbr6@^wO^6xW+Xdu=Z{sdK+Qw3Dii+X&Y(VdCv>CFEIOt?MCM?9@CDUKm7+N>%!q z$WI;(L@2YJ&Qfwr7k@<77r}%_q3O8c#><<+(JFdeT2?e+nsP4h+`n(HuX8^8qLN88 zv^9`|ICnNwS^PYDf7ebCGG~QNosD6-%$5;6Yx$`PGlZVnxs6ntftJW^L?iy3KIBDW&1q;{OspV)`a4w`+K45XmW5g6HLPL(lu zM^>HAPux}=ZJ?|;f=zDh!2|)WLyu7pHcc)9vAr(R_-sI`3GRfExjVpYMgql~xox)Q z)W3=WFT93oMdC)bluYO{cphI8Hjl&)W$TKN(PAk2r&mB9-)@%@xbewYx!c z{}phewJ939{qT;q&KR_!>>XnVYPC^kRaX%+G_v;*kg4g0jdi&G2G5$4#bk+*0mK8` zie_>y1oDA_0hGE(n`I(s0k(P&;*KDaX278vofbbNMZ-&1MCmPD*6d6oN$VjMzpTd@C8e zg81s83_+Y#T;duYQ%tXE$RWVk=@P5Z1VY<1C?mU)7?G9IHYx#rHCx1Mhb!ajXBoJ-rANULXqSAu0Mn9s%@_;uy-AOG|5#jDZ3j5dR7|< zR_{f>x5E@uRa$=rDD-yel$t(bf5=#v9ZWObAu%fou?4KkV-kvjmRiGX7iDe(Q)_^=>m}`2$#Xi#5CpJTi#5EF1T1mmPB}c@A6ou~a`>sHSeM4gF(ksh|DObX#Ao1r$Jp3I3 z-#zhd+d&)DO54E0K@@kKgxRB5%x&3BZ$OrawIi6~b_kN~$5G(kH6b5BD&%g70UWu6 z-ub`EccvhA2YleM%U@;V)N{Ixrkd0bjN}m=kn%!g%wE&P@WcBs>5NJ~t}y$Ar7F1n_=iC*<|&`C=qG#+ z0|)?s_kRK(@&?Z40!~gQHirKa2ua%+8CVNj{J7LD3|*Wp?EV9bZ1_j%PH`5U;9>aTZzwPD=a zXur{4zSk&)HrOFOmSK8ZKMHdg*HQk|a($OZ(0puje1K8EZNjPavWjhh64i-B(p7Zf z2g`IQ_W)I`lGa!LCabrDUSVPmGZbVX*#xhnAH|koEn~hs`=w;zVM^IEU${9oXf4C9 zk#|zrR`2_TI+u08MszOoi%H;viD}|x@Ax-{F_aW3ZIQHw-pT;hgNi%weuhcB7xt*kubK4fep+r)eaJIl%p9|sqv{M(E4lgwXe=HL2nYvO$$HX>QpPxqUn}WG zs*l{rztHOO@k5#cP%_alezmlZW9HCcT_;auQpbtV(Kh6e(9wF`C;OM(L&uqUaFglN zk@mRfKGV716J9j|zU-6W(m9pmEF&sbiZMv*M3~8lC~<@%sH8mKCL5zS4h--)TNbi$ zGT~m~}sa$tL(& zG_GBAe(+OZUY}-iY-rcb4f^fNZt_IXS52F^MC6>C?-IuOUttpxwVQBy0~D@|I1g*pQ^8D9@mu?5(kge3_GjbOm2G+7-z zkx`X#L5jF0+(b=RSgOE*XGFk$mF562Yft^UFH0micC5KNH~tfuDq*ce5Q~fKPyieC z9su^F5Df-F2X&FrZ1?<8uQ5h`uh~m z=&m+g_sL;h^%^JcRk%COiklbyo`Co8z9C%hj$&e+^pKMm>7Jt({+@)$DJbC`QjMHZ zi%3X-hLW4Gca)8|Pf3A1t4Ud8Gcj`ZNDE=lz<+3#C9z0jMR_q934+6jFXzJ$uCq~+ za-#O3p1hSU;tiKizC8=Mh@y(Ne3L{f0B?%ewopC*gCiXqueXVpGg9HaGK>hK#}F8++%^d7M6b=5@V(e#PAgrUnD^4)b1JPZ-PGNWqckW?kadj9w8b7f zp6l)!4JIwHtcBOekEW-B`yJ(E6n$+g06FFIjgZzz&+`UpKdgY-=lxNe1BI|=Cg;T; z?FYQs{*)^&tV>xbx0m~jf7l5>`+q#>!*0u^UJNZmE(3w>j|yNHB$#6zkjE;_0pL0S ze2gb)=zGHVUt5ge;3k7XmZcc5;mh=#z-ZobkM!xX0De$bw@9s|&m~zN9 z!K5tX5=4qA2sK|$bdVMz5etUdXN!`}2PL8R7qLr)Si} z!IONdCg$e~UlJ3u{n50K+;kj7SP&tC(^xDUbl{fdvL#ilA93{7Vm|&0)1p+nx=!XmT2qv6B?FjPHZV*SamC-ro9lXMAbWtsPx?Xq1Kcc_^$@r-YuI4|#Q?})HOyhMfBUVTIsc4Su?*`>kGqVs(0tbI_r0@mbv4tR&NZCQd@%?W!R_Br)qtk^~)!$ zd{bZ$2k_tV&)c$dz%vTer6*=naysJcAnpE2vboBzhwzL3ZZg^xE_1)_2eUw2B&FcL zW(!+zg@=0oy{=sCi##j;)Rn!Ty7I5A;QytP@}FjBaRXc9p9bUK6(&VZ!%ayA`L8Y0 zHgiu1Y%~0(WC8`wPF)OYDg?-xhpK#kN37I*3t$V> zeFT`E`_n>;_dQuVYN1PBmZ_}9TfEcl#^=`Abh1!Ek&ykSp^2 zUtg|J2l-(Fu4-@Z^fZW1~i@QYwP9Q9$d-lN6U6i%K#778wN;pE7`?CIfN* z4j%4F^H^LF6Q70%gi@GEB7#Kar{F)1=Hjc!yt?q2&-sWb^&Mo@Ali3 zYsI8ugwjs$rA3@sca{d2=a5mZ6PM=U7R~l1{udpZzpk<&^i)W$IV*$FUzyJ>#@G4l zunDZP3O}4G8=e2)DEXo;q|ooRSY*pQ@?dPnSA%LBmzMuh zj6iCX{hWsksbMQPykb&WEA^2^)4$ly11z>xG12rAj}?8Ft!(tswaOoNlpt=|kqrTJ z&?vxxBG>4bNn(%_w*|gVh^|*LD_=TzvKLX^EG3#)_JHhIOGSwPo4|0o#`B(-!+g_f zebxHKe=60kQz4i3=g8Q=o!~GyJjpp(m|JFSl$~J?ocx92m&&RUW=F?w)i?X8sjbbg z0+7xvpM&&Mvk2s6TEQh%-l$+wW+-wwx(yPsAW>CS<4@5r)9$_e^l&p0?yxh8t`Ni| zvkg20%R$9KD0hWHDff&(!UL3EXA@7RAORZg2_v!tmF`q!lSi%o$>srm>6H|S)B^2X ztV|vT66Q&WzEYv3LCrtL@fFVn_1u!3AIwvi9c5g^-LY)$kEOwFcdT%;T!@=Lh3b{K zJ5DKC5TfipAQ;Xelrj5>A z=_T7N`9+b0vmdY_zM3SwtpmRY?wNX&N^VG?5}z__+A;qz)l|ZX+QaujvNXdiXZ(V? z{OmPo1P@Yd;$G3ic^NHAm|1j%cIXFahDM~236V%gF?}nu9!H?ApHB?XA?IZs*m$xN z6e^ufgCQ0+_=81#=-f_IGbvy4Xizg)_Q^<)baO)G5(DO zgxn}JpKET9(UqMupTD8jB3cp z4G`IGH%ByG7iZ-QD?Esze`e049rA`qU8-l!$qPyeHl#z_q%CNdv(L)XI;?Ng4p}qk zjkLr}p4PA1I;7{Kc1WJp_Y!Q55JqK#sB5nY)=dehb&d)~g=roafxSw>Sbm)`xVXcf zG#`10jAW<8I#Nd!Q<)M`*0YE;dZ$(eKex&V5$dNnGAi-clRskp_SX#aKy?8;Y^RA; z@xEcdlr!iVGK@89*}AMBb@T}NL#V3*a00ErFr0GKMbDa2oQ-DkTV{N0Y_X9!nY1oWN1B)$PK)1Hfas5LPvtlH8ZL@g6sQ;=~> z=vTK;Y5TAt=ya36;hG?pES_n__RRVv!qlpCcy$N%vN$cm%p@=41Lzl*;2C>KsLXaT zT7L{$DZI@k7u*!SE|y2=Df|?99>gyrLB^ur~Y)vi9TpSJl6Z57d+o)lQAdh`R5kMGB7)eE`*Q;2G zQEcRN!Q?$b+o zUoag8iRTMmKuJ)5s&zS~S*B1~zU7tUT|q&h!EInBeZf#vwR|05>zpU0zRe0VWg5C; z+*3eGa6)oAS)jk-xN&bD5&{yx=Oh{=T<=akX4F4Yue*V0VM zkH4;7TLKmx%@)s6c5z_Q&5qaRX;$2vIP-ud)H84PAd0uJX*ee_AkeYKVtI6CW@W(9 z8KHRBux28|zpfOJu7mRVm*s z%?_&|3rLG%MZsk-XuimeAl!(zkxHX`$uQhJ=7%bztEXtmw!ImA{G>b$_T&F%g zFsQ^s?i59_UX8n_!c>ZltM6ABcMHOtRyrRBB3#Yo+AYyiYjPIXgd#0RF$%&xX*?+- zsPtBuy)cPjVkYkf31o50Tp3zUe-dekc|5FYz`%%l5L^>Pje2fT{!AGEHxWG_Yi|{!_@x>cc6%5SD z$ZvA==C5j@X;L3MCV!XA?SG9M0(T#83W28(9aS(t{d&siNAR`PZa(ke>q+Bbo82ut zvU5xmnR~F1ffCpw7|Fg1Gx@$)QGYDzf$|nfH3sKP3=Huhz#4)dH-ay~7cR-ML4hxY zJC3AyNh<#3hBqDyFFY{D#*eE*cnh{slzoT{|2On)ATR!sO#t-^ABA9?$(s~V<1UDq zyo>|Hc*Nrxk#`IYFkXaDTnoHWAP3E#`a^&-`SJ1RcPRHkeTbBZ&q3G_0==kIKNsi8 zPK+SND@w;5@(Jm9!|;LDkth-G0@RZYW&YJ3k={qg)_?xtrkih&RnY!V zo$Y^|7$WW_MlSzvW>1PbggdqghA-L1jCJc$kjxUIfuHEPj zLAS_=)=>DNjluF!EIspf<>8IN^gzw?ak~<)+k{ykeXo%GE=68f$Z;ZaxUAiN%zGF_5d-JZ0I9JZ*6=&gi*5l3i_WA7VrU|K{v|a zF=S?&Yw?$7*XrNDug-5bH}qO#ji37gcoNsG74BAO>OHL zJ+$W5wVs^^UjrNk2QiwyJ(aXP&FiHZNvXoDgPCs;lE0r3q^E zb1QZFSr@``4tbojlnOSCOUjP5QW*?2!?w1>p3YwB&Mp*GO3M*qgz>{jv{ak$b7(E?tkY*+R+^&>> z2dO%o%W=L!QGyw(WuAnw#oO{!I(8KwC|wq_y)<9lMxDiZwL#OlUU_DnD8&!tX&a7f zewQGgB8{dwkjR8EC%AP&bY^iirN#jA47*}#6?~g6@a?%^7(){yv(mgF=P`2yXr$Ab zuYEY=Rw^DeYTFZ^Ywa=6!`PU?q?O*FI=gFl`bbPev2k8T+=C;_X>sLJQt7BpOATpg zrpfyxa?;Uc`KUT2B@@q5dI0rCDDr{Q8d~En$h%e_rtAvjTEMd-OH%Qc7)o~}(R!O` z(i0MG6N^6LsC174qc^gK-0ayYDy1n5!q9mg_|@<( zH^wGhrdBV;Qzf}LA3=l3S|l{2(ylqgc3&K7pj~tzGSA`-wO86b&05pv_SO)Zw_hfmjx}wah`^|Qo(J(X2h!rc zPxx05-j4zshLMr@l7%0`IwPtjmgCwA{Sxj^m0H$vopZOcn-(l18gE{v?!K>bbY!=G2sL;OsI!wlS zl`om0y?Z#6@8vtXFRh`e5wNSy>T)H41%)Nt*jt9t?c#B>nBknI{Kbhq*5+Q8Lxe_H!J*!N? zH;Gr-bx%ExZEmt^9#)xcGN#!|?Xz6|l^~v7U7wM4&5cAIxbMj53pOBXW2LxqE#=+s zUC(EG;8)Odp&Rd)Qg_wrCnDExg_o7dmilm!?}lv0f5NK>w#Db7WRQa5Z94pw011GV zyHnjESKowJ&H%GT#al{iWgq|S`7S)99~4MXM?gl`=`rD9WWj$*)*NbWq$x&Jdq^ z(Q<+*Sx9NqE8$^Fqc(bfoIHwRM8##C@jW61>q;vG-*gk8G>_$;P+4b&%lQGl^XQpt z@48~+y!wp4mqN@Q?HOZ!Yr_;kT-E1R!Dz4OldNG)t;&2^&}q?~dMa&r60E7E)}#>< zrV*SWbim~#un~*J_!+nsWF_-x*9gTk>Hl>g2f7!ZQCMExX9omA0+-Fd%?Ek`^u5Av zTse2a$3`W_+4p=xIbdWKo>d*OlH=zIocE<>kNpS;Lx`OQ&-Q1P$CASxn1-0~RGYd=l#b>XT!xg+7u%F$Q7jSakj)eTa>Ty2qji4Eb4HFzvHy#qP|SXp zeb#Lbt?Nt*I~QuZr{s3Gk%GGcNPV5a16K0EjBCtb^pLdk4E5uLHP+1tY@v3z5hntx9$Vv0Tj2xkovNOuQz_TE%+7VTio)we=x|p6Zw6woNPx zcG_Z2O%BbGxfe9ld2ol=fLGR4aFV*%y*3D#mSjOJI|7z5B4+&ACSoxT&RK_fuBkxk z1Z{D-MxPSpq+f$DN!oyle^-|TkMi;fqFJ1UGd5NFA{AM^B_NurnPV??jj4yDq`QF! zXQ%rlV=SedtGKM5GccN+LZ_zY*nRh^QhVnOGA2jgF~DjqY%>eUXu}5pt)p9N9V|0Q zXC@$-8kj_9y)dSR&f2Q-S$t*V60-4m5IfeHAp)(*?%V*RU3YRI+fVm;XbrN;Znfre zHV>~Kt<08qOPU*d|3s=CmW8uaSX^bMnclwZa0*-JYD_xdlH-9QSVqCTFRD6%n}VS4 zy>uY+r9H8?BwSa;PMf%#`x7lDq2Ra&?)MJ=q&X-Vdw3kLg=AF;bh`Ngu`{SU0AP{2FA1bXzI)&Qc+N zQe2V^EkBDVUja~}gLyF(bfSN%OWm}6u4HUH3r`v7TIiEzS4!DYc1O$+O(bDf_b(zmfoP2*iYBPA-5lKMee z{!TLNugW*re`hye;8u`de34Z~ks!!LT7(P~?WfwY)j%M(rRlsVfY75wv`_j8-f<~Zh@@_No5u3lgB08$gw3J7t6YYm|-P>#mI z?Ihgih8w9<&jhN0?+L@xpaZf^v}|(+(B!Te$gx^{k_-y^@xZ8pvz4Teo8$&XcRy}gCz)E#b#7b-MxVm-OaCXYoKRhcAIJfQDELSMoUPZ2A zGJT9WYcGs3O6S~oE52|3o?hBGjTo}Z^#p~Y8HA5Pg?)uzq1dK9(?}wqZwRa130=%H zYf~z=E0yYqfTG0fyWBEMhY>h2^w4T@H3nLOIgGoExay2GP9=7H+(sF!>QtGs1-g&W z_gbac+_K^zlCn7G0blgrvHCKoOxX2B-RbMlZrJ;wg{CYdkQ}uH=vCz{^XL9b5MT@I1LRLBCN2G_*J_s4ZGh zWx7MbR#kfA8X5^2SsOa1ssX$FKr+_smpYMtr_8IC^|BTXp$X~a|@aOR`r7XM(DK=Ni-`62A>;$AvH z9_f{d2&YCRYk$@WOzak*c~OoAFfe6f@DJQ(UOb0(1s-V6+8}t zM%Y6TDbM(n0`0~e(Z=fVgsQi^OTtAv{cQHYLACfn!I5^C`4kt?8a_m$6 zbcTozSL$v*0uQgb2#l)xk-#q3kt{M?g;oWD0s&KKtKIf|mIluc_x>!Nn=F(UZhmoC@MLVWfWf8%A{!LJ-a9ibm(5(&roPX(GX)q zd@M1x1j~Z)riLkJ6l^njEwFgGs7mySZY8C9vkvltS$4KH+PxmEb7GD8$Z)quJ$36>!5YC6H4?tWLx3jX zL_~2klDHUK>j@1}T+ZgC#@^9#==euU-lRuP-UC^5Cc+L8jCGOV7-{#UL(6{hSs1p> z-8|04uLdI$1?;BBEEg_BTk#KN4^e`X!u!4==E(^tnRt1KV|!i-9k}i*QR9@it-?e5<6jq(E{}G5amY*n+H0gn_Y9 z-8;^pTZ~?CK_9>Yi%5S(q=#!=vps#u3bpC*N25|FGH$TQ9Pd_4r2%$YW!S{i=_C!G zD_fX}hHLaDE%xg_fp|i?KbzndD++)5bCZZKr8}JL`2AxVDM>tTh|-T>%j~EB_}}&( z|K(H^a5QtVF|l}x|sSOHm@dqAK_|9T*4ARfIiVq!E1 z{?^1IHFL*xX$M4a3Mm5YU!EpeD1oBkARcKhJu}}&7N2i-A0U4zc4~oNFEZ@*1*d{J z{!TQ-;$6U&WxGgOjF^lV^S+fK(41yMfFZe${01$COSKm>OdY0Ko`nRwC?nIcv5sS48^fobUN+7gD3h<@?TK=U zsq2}1JqYJDkDjs^)6H3!Y^(ni&NTu{w6vfAOZuc(I-NvUIA5QH9(Sk7D2hx zNiT)h!1lkZYyV}v{?Q|*B<@K93LuZprFU9Oj(?x*`7jTy!&B9yOv zBC(n=8x!WoL6TsFoU<~Hlq~@JoFJC(_I;+4<3?2gkpWZU!T~EWMF7v*q|26`QcQ^K zyY7tY=WEzh-Beb}LTZdzTqsr?>f%%?W^OSKq2qcG1lkqAukEF_zkk$u>XCWe4? z#Ea%vy>ICg-GEoSljel7W)-xQqU;Q+>#pyscZDYnsvo{+1MT9<8T4`~uVdxf?M~|B zynet59NiL z!rIjSxz;b%7{vy1l_G16WSgRE^<nid77&vHB`Hc!j_1F`ZD`0gi18)_8?o51 zU@6a|ci)iO?`1pg1#z@MGaRt#+VAApkLK*L@84Osn8n1p&wayu_RhR=UwwK_{XRd- z@_u3Wn-N%#fS{lWoezfKS`U=q7T4pO{SIjeFQMNZYxLGubs&kZYA-$P^!^hNiAC_F z(&Wq`HKids+xS2b*p4AAYkL|*f4oYA(x!rpT&_C7K;2ZG?{}K&D<-FkT@)`3VJ0Xb zH#wfssnie>s1svHRy7r9dzwfw#yY({tYB*1nNx)vazVXK$6z6(v#cyYmxjT(-pz)Q zmT^!`Ze~41QiQ(6|xf}+@C5ZNKgKywZ9F6&s&=xLzP2GjAv3Y0oF|N9sQ z)#f|e$7y6jIc&Qc}%ut}8+Yq?|zk-iAB&`7zddtXt^a zODQ(DgQqHOTe)pS1jRV(Z4SSYxFFm9bj`YffOXR_nrFrf=Pmfr^F8?NXDAH)RY_IJ zia@*!T}8>IHGTVN@d71~NRP5^{UuSEQBA;iP@E>vHBrii=Mt#3LM<}6v(uCW8I>pj z)iuPfGO41XkYTVm86?P+ZI7a!bu#F#q8E#ld66=_3qe5(7rwYzkyP1Cj<^O27m+O1 zqSOMa#3!)|Oi}&%<#TTC!j#90$`EUJWnuAw(DgEXbdGZ}D3-~lWKfV3CT06jARCpc zgW3?!cGxC<4bPFx>G2K|pQw6%H=mDNJ9f0i7Z9 zM9Op2T#uZC_CRl%l}%9a`x8xq0TEG6nyJmw%8@N+>W!pE-tgq@Th2AO(m( z5h}V(JEs-EqPp`)cKevppHePn%`Qoa-TTm}v83nfYu{=X)eka!5~;S>wiZ9KJjMq6 z>Fgx8lpK|M8rEmK1%a_jTLUsb8vpPoSY+$7N+_;3vCrkzy8E~s*E6qfhheM@ zrP!Wm9FgoRV70zMFupOPdouaMx%rka;9iusBffkukbq&Oa!Av$T*C5wgjUDJqJ6aB z(?h;NzQ4!^wA4Jl_hYZYcSg~3H}db;N0wk864a3n*J6lB-nb)I+5y2n+93^b!`=_} zy?b!&O*YX7-^{Ztu`4-1**M4EM4h_wU2-D?C}Aqy5ML7Yl@D#`Ppq--or&5LPqq_} zTx|N&G1%{D- z63FD%(!Xv4BFxTlU%s)bFl{J%a)l zqbCh9*g7WHB#?5O@r&ddY*myj&i_IQQSRbI!%jx#TIh8Iq)wt}a5M>>xO${;MLFTF zQ_O(@DdX&)d|+07Gko>hSrJy|%;=1|&mC?0hPHtn%4a35agZa4ED#_egj-4`fBqo0R#9mQ#BIn&i-6N6{L`Zvuc zhVM*t=AS0*G3(^>#-9WE*H7jAAN6DZVp#r5)s#1Ibo$Ty%9LoC$U%Pi5WROaGDy=C zPt+z^E_YxBba`ZMfei{n!7?uADyKFLcYluL^~1#!m1QqvZ}0E6J}Q3>QHVrfykO_w zv$|82jDqR3+Dr8`t0^fspZL6W?}Nb;in4>0ln_bv#S{!mP!7LHENN-l=~@%6ujbu+43{~BuZ zw^SLl6$KJ<_cuxbNb7Q!O0hDnWC6M4;8A_GNy9bkmdF>;M}Dt+#2h+{u6VQ^>0eSK z?k25<;(Ths!zu0AKiM3QGv1%~7fk+3?IroYB0MoYk(mh#@FSK8vIjI`ov_bH&I$oz zrLZYtsUQX0EBOWR#C}5l3RW{%Bo}~%2(30eRFFehtEwIkdu=PDTFFsev{oQPGaF9N zLO7CGqMw|o4 zXEdacLL>~Z9Q8;+O$?#CmfUc5aG9?YnHuPISSR3nZ8JM_D8dyb$SQv2-HWX?N}@nm z^pSjPE?!b&xN4pT6Iqj~IYUn!w~x*r*YJ!DJC8qDd%4PPqge{1d$*@GPtr)Wz z>kkUX_B@U^7XN4)%$HV&YAuDsY&6oUGVU~47&0HNr6)8$M29v4AHrT6Y7amNwe@2$ zMSs9J#(B)Opvkmq-rs#zH^A-}z<5I6p~|}zU3FOP#3gE}fPLjmm(O>k5}KVb$R=n4 zvES$OqRV_LtbbnFs2e-~T>F$+Tee&KFz1vD>C`sQ)TI=mBR(H3_R%|oh4VtiF3Lw_ z7tdE0!H=H2f)&ytAwMlWbDnuG(ULf9m*DTI1h-oaT(SX8kWAje29U8iM_5m`S?wCh z|2)fTcQ|>_y8p(TEt&BeR`_UPS^SO_Aw+z!Pzmz)2I2q4*o0Z?4L!A|{tFwR-u=j9 zsk_AMkBW&!9LF;X`vOexf?OkPMS?qF1or}T8%dvO4jne0W%dkm317^C;}z8p2F%50 zC&$arDGBdTWteETu7-Ej;`Eo6}jy1~TUaAs~m zhhS2-ZEu)clw!Zg9(sfvs-2Us;-4ssADLua7E|t`zlU(bj*`I2HTml-oa)BD4e;6x z#Il6qrF;-Y&tW8D@woFayo)8iO4hl9<<`}vd|k|mufrz)`$@MDyYyXLUZ9H^p@Jxe zn3mtSIH_Iw3x1|2Uhj^WaR8u^ISw=>@4vIf@UM=kjX!9O{)a6V`2W#l{>NGNfA8Xd zH=IuY-n}iVHvby@n;Z4Nh6Epb#M;g4i74tF_sb-Rd>-;(kwu z!RK#BjQOW9?`I~}#+8PwCNmj9+V$-8Ece{>&Gqh|xAzMwe+X%;d4~ahM4=pFn5%J& z@T0^41a(ePmuQCKNZXc45sKg7Sq99%CmTnsy4$U_RC+C;tYjWEXHr!g4%MNwS8o=t zU5BBC4m*jkf0GUk%P;RA01A1p(jYj9Vw|c~O0{}Vr%@Vn#JfdxEAB5UcKs;NtiXs5`3}FZBK{*S)g3 z$55~%jX_?tZ2!@XL*pbtJ0W!BhNlhcAlYmd__dLYu$LT3VyZdB7?{G*%+mk){+zJ4 zs;d!SlV0vINdFQ8yIDmbS|~){ZQ+Xl-0nVjY{WBZH5Ok(qD#50@k&HaWJ=SGQjG>sw?0g%xYX zo)I%5ZHB10EwcdHota@yKcn98pHZ*azYhpLLnCWD!~gxero1VS zp@{gsIoVg3UI+zeB3s%p_gfSf;DeNK@ONMnGm*)fS&4SKAx4v=6GM980?4Bv)-VW8 z#%=F+UKG0m8qZe7ZTAh#?Cr)Tq8}KQ_&S>Q)0X>H>+#1=Ija73_V>pJg^y?j*~!oY z-dh3EgHGCh#cwnQaC#T22>X=76ohcssCz$4SzkX0OcV~A(0xas~l-q|+(dlYU+po{VjMHA~h+?A9sV>Gg8pemGtgwQ5AD<1!^m1fsM?$4U=Pdx_dA z1Vdd^{^<QaRq{WW`$q8N+3kYCzjK`3k>V=-aI z24Nj-l1^-9@jCMfs_jjagNd?f30jHf$A9_`|w#Lm3Kw0)GM{<}zxR z>)9>F0>Hl3fVi{#9s@Nu0wh9jAuXw^`{pc}oS@tT^KC?^x}q(lC%Kz#g8xDh&VExs zNwY#ntAS8{_V% z>+5d(Cat43U!n=EJ35}M^%!aT7r^byL#@M=>I%4i#Ns}GAERjzpA-XOl0L$U&V?$O zU5Et*b(n1e(Qj=l+Kt#miKG*{HUE^I6ZIRiZkqVvq{2)w$2r|dfN{q6-d5PiP=H>y zFfj3n#fJ%9Wti#CMh3gPv`;=Zu!_H}OdwcEN1rtFVw`_} z_Z7iZ!2v$7Z1VH$Qo_SQ#Tns=?5 z`x!jNy9?0?NhcNi)A88qo3M6Dd#sE$?1>im5Hw1V3NN-b%$fzwzRli)mN1NdKEb(pdIM^yv_VSLm-8J|0?3wwKx390yng>H+3*|GL-*W zhqW^PVcIsjKMvvlr>9Td{6EOHk^L&Om4yV2S>uv;W9x#II$Ugm-=BcL6@dv|(oORY zX7m_FEQ`+Ch_@gwICp#EKsW=&-ti&EPRU}DiodxpG8l}z?0>$@*Qfn^lwUA4vHp>T zn8Xuty_)qK^|cm#L>NdIiWn4-tCFP#ErT)SiO;BWj^5g|5=@2g>;78mCz@MVas?|7 zTw9y_YH6PE62ZarIw}?Se;E~U6>#}oDb;e5%H*HjJ*!+#%z=w@6J{Q%VSe+1aY$-A zYiu2F<=VJ^sE|Gv9({JrR4pe`8$PwHv2b13V1af%!1$s2UkY;kRS;<6g!xUC8O*#Q-fj;-J7t=$q+gn)jXnj( z1wxL)j~-PE{e9s9bfni~T8*~RgP&P!!_c?gcR8}vTUg>9en5>d&RK=wqPzDm#gp4$ zj01f?E#o{t{#5aQ|3r&h{ZwH5!#4lnpFjQM4u=2m&Px?_6-;NO@5vh4aaz$4;+Vfo zXzFr0t(35F%ut&_KV4xqqT+;eWs@}=fuc#Njz-9FE@W#<@0CnSrHbWCOXB6BNkoY5 zx5$>A@1ET6XYn+j+&CX^rNsROBZnuWN+;2(HE>lR0 zdt+vO8Q`bJK=B4C;yF_|RX7V=U2w9SiCA@8{v$N4F98y0ULq4>-vfwx=hNc^ke)jP z=JtUX3@51;5GL@pCPIo6e?R{P_1Z&Yh~!3;`{l=LI!TdT+GBjnhRsd0E4$?t(cF!z z4~#=v5NNe=^9uQHzBg*}*h}OJs4&Oz+O9l{@=ma&6>15fDnS3Lu zhNjlUH_tu4aG8~G#M(x%^W-&-9c^k#MVC8F+(@<=A-S%`Ub$W?Fc$Kt5+9$Idch*` z8DPZGrrDga&I@4J#R*`!JUMdw*O>xdJluM;2O(QyC6bm(|7=LXtOMpeK2{Oc%&@VGgIM}n=xPTsHZu*o|%=ydsHI*DGc2AD4b$rWMYr_F+cj(?lYu$Y(d0;`Gym zsVB+o4{0WaVAxWNLo&g-2maMO*qGgJH^Fz&7= z2fEolQG2QIcl}C3QYX&n7uJjBQw?>=S+N}$3TvDBB4GzLg zRLYKx^=)OTX4DgErJ$67t1~NTT)b{xDBJpm-PJp6oYIFy>k5yf4es3Dl0RBGlcl=6 zkeqZGj7n2lOVEiD7>~>izlNL*I0?~Dk3B&I=?k3@VF&JxNNflsY7~FfIS1h??ud;d z(DEysJz}!|k{hFP%wR_V1vv6eo}VD6bZprUiHm6Oc!Z({ZoD1T7?|r-)XyP$bG-Kk zs+K#Tcp+0iFn)Ojr~N=xynz_nO>QaMQGRLk!77)=oI))vu#!h&Wy>uG*Xlp#{1EDy z%3$r6jdxpHLNJIgSmO)!3NMHED&BdX_<))Ch(?8pE>b8Lyn%w;OM+3lR+y?QTQooRsb|E)Y+ibYPpR&p z6s+)b!X(VTwzS7+!HF5!N~m_e9HxfjR~m1(1NVhmD`i`y54ph*TuOHuB+7D#w|bn^rs6qM}j4>u88m-909 z8Qn378h$ehryt=81-d2(punML3ZG(*KwecJa-AGkfNPyvMS%^{9mNgCm4!IL&HC@J z^l77MMF&_St=`G-5)v585Jn?7Ln~EA!8Fe_82Ch>P0PpQ+VT)sB9MB@HR@Z3(I;CA zJo(00bBCDqE0P=Q-p@S%iEzyp(jhvEEnkvBeitFmh~)w7kJK)2IQLuSThcG;t;19m zA}y3r+ik(BUg}RFoeS0@+Aw!O=T#}{7vd=KmTSobahGQvS@-iPF`2(zEWZ|rcL;+h z*A_P95X#6hgKb=iO8R&>Lx(@?U7Hnbcz{}VWQ+Y_<#T}WigYMJ>43m!22#ZMp5gld zvjS`{o;AuM{G5Q_d%Q8HaIyEgX^dy2Nw)g^$op4#@1uRb@iKc^`0oDIN}!Mz`O)-4 zeusYO!vEkuT+-Cu{)g`VLl%DQ1^)|Es7&0Jo|i!!?smr5TtY%458>ez*n}wn6hK@k z`Jf#NB}A3*Xpcyjt>2`!1o+JMh!McM?KR%_f7^?f=04Td*%F0@2j|n!kd%~Ws5j%c1tuc1<14SI~GT{=5FRz6U0JD0S?LmuiOd&*a4Hl2GA3j*mk~0 zHG{zh;!{+DZUTEyhhE~-I~nx~s|gCSu*A?HC1m3($CYe+6H9wDyGls11or9(nytJ| zd*-n%2D@K`5fS*rJ)?+*sq?mMo6t0*6fGywY7RRNIp4Ub#|f4Kahsq^&@5tt_sEw0 z6$tBs!r=*u#H5mic33oSM;v_oggvkemK}+&k^{?7?z2fqgf*5IzCiS_fY*Gr3UPfh4gBdXY(XjrTV_9xzp6snGzFWJz6*U5Ae z>b#^$8`}Oa>Yx%)Z5Ua^{d@1j`9<3&2(qX3VKiS|pK-r78?u0jI73d-73h_vE*v9^nb#_S=Y|+zY*z1#s8FFs5YJ2SHfgyTzIL#sp<+tP{L67dQd6i78rY* zPo1dBFRd8bfj;rLUm!egc@bm@LV0>{3_0s5RelFi_9kbtHD7z!KV_t9cYA;Qp^bbc zltWd_-A&ujR6b=W(!+E`0+JwY$>sB{$|=DQjq@`FVnLG&nzyoVm#wvk&sDJ%kUz$< zsz`N9uTKBzKyxY92j4VNeFI0ST2*<$kTnW%H&05Zz(!w3IP3>SMCedaI4A zV!|4#j{auL*KY|)(UQMQZG@D-G_i}_&nIGbPs1fosoM8gw&|v0gvu#GWiJny6dkAA z-tutWs3nWft)s%3*w5>H2Uz2q{mj;TB{`%`((Z0bgJ@|&bigU0=wieD!l+jHeA2opi z+<@NBOcX&dBF*y`WU)wDjBvt|L{|-1lJPd|sI&$C8(Rp_U|c3sZXHuWY9QX6;iwQ@ zLl)3S<^&wxggq*BjIn5v)~&}bg&vOc?VbThy}Qj`JF9KRFi;(X#(;=Vy)XB6dBV3J zDevR#SQo(;_9_)=xm+BwUe=4x19DusZ;98PG=+T`ysxWBjg|D)oYj_G%rpHZl7LV) zX$v2yquc{&c9dXA4Uk6IXmP8L=$*(MyP&AihZ^D6zu3_R{e=R?eo&(G zgA&1i|9A5rl>F<&q)_1>d>FMGiksGIAa&&UH3jzB36t8@&K8KuOPGl~Sdzxq8MLok zG>?S8p?u(Vy!;k|@2}?>b17=?6)Ue>Yv6hw&-f2<^6QYo2k0O#M4vuP>vh?m3~FAs zWF|jlFeAtn3PM((0JAqP$ndl)Z#OhZ5y~7=^E}9~1p_iy!7Z70a`oMBSE#o}pjLJh zVTz*5IIgH$C%LtC9E*RfOV079G@4(p_z1lzvA&$?%4XRKRqv;AP-^Pnu?;u+((h8i zL2LgIFjx6Cw&tN3x_U7nKUtE$c!a$9$#6D#qZGn;&uoa&U&%^Lp(&%yiJeB8xx|}Y z`tgF8XP6d)@q^wa%SeIAAnL0Rk7uuKv@%S~4y(V+fD5CQP@ZZivy)%ess1v}K?`t@ zQuF)fi}JY6u72#6vftxICFm+nwzg$GCg1zMT?(U0_l)Pc5!=B4LxEJS4ns<{gO;!< zXgw`8Hc(F_hbG98bMbG9=a+QL9r8@r^6nI{s-;H15v2MGagO#T9zUH9Ae$D7YdLjA z+b+6rUT1u5x61&npD`pu?-5155E}FMJ^B~@Z|iSJ|IA;1n~6ymKz||ax)GgDo`@H! z=P1HkG53^qWlx#xF?6NhQERNoVoC3Pkt;yj{nM9isXV40D1&?jp+)C!d0N7Z~W~jmsBwN~D`fatRBJZO#*%k>!yjFS^0uKVbnUJd2Ryq$#3wPIxJfZVqJ{k&L&9 zXGCBQb4AEn#6de{voh66ZgSnUtK&f&3VPU`{pLb@%fxrO3nm!q)B}6PdXBGvSNwRb znYu@N!ldSa(*GSjg59@YnmN^50&QLU~Q;g};bg&FW1uN-D6+(tiSj13|*jaU7szS?JO%dg{la; zsYTbJ>S51)l`=Ja293O0qU*grE{>~Vl~KEju8(CD)=RK6c8wXv=Ry{0eQY>gXHbMs zf(9?Q^CXoZo16h3k5t4ol0WgU@(59J#$rXL#!T$oiR2;)m5l~P=ou9rBG zKW3L*?Z8_lpgc$u*MB}N{M3p2H4S>dtnu8Y?ig969?)uZXiMBkgy{rwyvHX{IwQ*1 zAaq*bEdCiNur{67aksM~O|G6rDQ9Zva~!a|*~U!cX7%1NuGu&KR{sIq?_r_$D%$FK zxv_K6f~%Io%g_V7`)TPMKhqWVq~k!XKec!HEiArL`92$v=|=Fy{>{a`u^4b%_X}@F zaX=)3VSRhobHA_OLU51xa|m;}5)1(E>KAu5Af;kUL_1Q|j#ePnvNgw%f9VT`kTto~ zH}bUvD8g--TZr)D%6`~)z-4bH@U}GFb+C$o1;du}!_&pT=wTNZRcmcOcPPeBVAB6U zApYkL{b%<4&!DbQ;Zh1g7M80S$3itpF5HI{9ABip!2*Jmd?dIe6pq(l?`GSuohd_}1NBcI-LaLWPNMI*u862C=;tK_$ z(n&p`Ly#LKfE1kWXOo8=oF9Zma{O61Y#!*hdweURwIrF`@}}l=L)N;UYbO*a0={5B zQUPPZEY(0o5Osk`nMW4tB5m+6q$f&l_QhIa+@Wd8uwM`_ByCMc5C*DD%?Pb~C@-qq zcUh(7rHYZwlq0;NNurHgAibV_8IBFj&GvdPGrx4aFyXuJ79qf40_xr5Z*&bu?vUHi zrL{iT&VA80Zh;VY{H%tC6_8BZ({o_1Zv)FXq{4b}9w7xB9s!AIEI+J~1?*I0z!gqC z3xG=tIMJp6tvi@N)02M3zh-%m@oA)pc$rU1H2dNhDf8U~Nl`etmlVKWe5;&7d?}X) z#txXgpFv;o;ZgP|?+G}GT#aCqPZCeLfh~{RR&(0C1`nBj>JD@+Yd*Zipb_W7Gf&dR z5V2ZWykWs2WOT2WZg=R5kzfX%oX!y=y@3yCsa3&v#Q~(KRS0=IQG@~}1gL_Hi9MPT zOb$ZvS{D{a8pi$b?0yjmst@Cz0w#;kwov4k0bZp8{{js0aEg`EA7HHgs5Ad#3jY5h z$|y+wcqmZ4jM^{z+5*F5kf?I-8xU8MX!ONG3S{RC{6wKbw}R+RQPww&oWsAMXvhap zt+d>3e}@taRsYzaJdD+4Db3PcR$O_GT)VSUS82Aly#Lhr7-D^DHL6>UFAa!(Z`tDH2S}%#z)&5j#_v zI%kw=H*yBO2=zB(wjZ=7X^wI{0z0=}w?GQ@HU*|v+fE|{v@1JogpFc!`~(7k&3Q|dsgmZW#r!!e8PcYLjUy34;4uRDf z9#U%h>|eU(4V1H2NwYq^1oLj0j2<77JiF#IyodH-sB`399Jg_m`T>J$i9NBqF_T2| zyC&(TTyrJmb{i;KT(J-dQ+S^>oT@Y3lhjgdc2vlbcOEcq*0q?A*6wQ_9vQ>{0LuDb zZRZ6M1wCSOOxa5#T1c;C9jdqIy%R@%1LB=aqoVR=;61$~LOOqq4|2q|NfP$om`cza zxN$MGnK9`qf0*4Mo_0+=CIO(it+Jy|&3OL}#D@u}0H~9Qi!g9G0v+R!Lxh||kCi%P z(<{KR{57SQLKrXLIm6Z6l& zc$4!0Kzl;r(d}r&AQ6n@8xKsH{QdVC#Q%mnNLtVTh4tKLwY8B;`=gfQktp{QX3*lp z`jUi_(Lx+oeZBQoN2=!c z*Zn<;PjN}Bi2kG?u(|4nb8Qp|G&Vaa0zF69U4C+aLaW{18t48hLP};2qUR{TriE(( z_nufef{Tz|-WBOp)YCQ zAo-a9Tr1n4nZc&V?(4X#(kb*jw}?4Yd6IXU`Uo~-tv&3WlZt7X=AE&j>pXna8_WF7 zu%l%hY6M+wzY%r-KGIFb{7Rh~U65B(_(#e9GL)8hnJqlywnCmU+XCwELaE~6}7dR^0< zmG6o(Pe~FJK>Sp-LmmQ_Y{Ny|<%<-BV3k!?K4k7SP4Ui}8v#G&m)pT5%^uHxV*AOf5Z3mFX_%v@} zNJoU0h@y`^L0CQPfmGf{+kDXi6rb#B zHBK+?u?~L}H9l@Q&SWpRuHhg?M142jRAWZ!52aHNiFbvJ8aIyf!pst`fjGf5-6-f= zwb!bz9W=``d@FkoH4BPMZw#@XZv2wK9l1@uAviWs!4QCw$(cAyCaF|bC^_yq$P%7Z zu{nCX$L?(D3Z0;9JzjM5)QOA}SWlpp#I+9B9jRNo7%=6RC*+7oc@0!e*%D|r3Xd&G zl(~xANHEg(s8pe8%^PLPo!Pq5z$A2(dTpf|bb^>)2{CN|a^v@|NwKqqt4y zZJw|xD>_7omTcgs+u=xRHk>B!XurguZl!#dFd1?Y8D;e#LZ6?H0EVS0ayB!QtN-g$ zcH%6hKcDnOkn3A`eE6n7uz(m=Q__Lq7zgQdsbNhgsPy3#m~(CooW9}SsSp8C3pFuJO|^k466PtsDJwZU4jVD^=Zf6c$sz zJx3=tMkj&d{`&C7jN}vI;f;uc?!x`X7yFG4w_mUx-5YG#Gg~Rqd!M6RXb^Pvi z%t2y}>Hezt%l@$N_n%u|v#*jgp3)OuAYCVJJ)n-Lh+21Y{5( z{EQ?{{yV5!#4u$K;;=zlSwb&nd8J2pr6J!ak^wTk~#7Pug_Ji~W zzIeweDy5|82Dy0Q5*14Ejdd$Dj$?r03lnnPl=5km%95RA6a~DGO6YZEuqdOgUaFQO zu4U~)q1@XvD5O}+Z-ug-R`dp$p%jSwk9xHvD07!%0Tc#7cqp%hs;f4&p-QVcZpkl( z`ElaX+Gb+m8b%|Bzs)6CF9b07oG6b5{^&0|4*JL1*mI&oIx`Bew_lWCMGHW+^3k^T zMzNXq(UD+64Ee8TSm5)lC^r`p9Ug|pAbz()b%^tO2IYYLF!PBtzZWsd% zvISKmColu+(}g)1pXXz_g*7c$hjGX{Ga7|Zq2>!uK?&*K9$hJ&Et&?ekLm>0lfgUI z4MCYovgLTSV>!|vG=YIL0FMldJtyfX3?Oyt8JihgBD<$+&SSv@nW0}+4f^>V=?Jex zISZFs+aFnEzB3pEbC_uWhcEv`H8VLSZ#J!#o;EbI?WSGIwwI5GE;R)DF@be11NTRj zkL(pD$XEpP#a>4CVoAC8AxU(M|H*%J8Pc*TD%d;?W4CO2VlbT3e26X=rIpJMW)||t zBtD;=S4a_foJ;IY*+jQH0n*l_#f+dqI!IR5z`tP>Si>@8Uo<S{B0)7%2v-7I!k$kBpHTmCx3?f$ z-V45|wQlS}4y_x{$ax0I*8%XXm3rf9hzemc%s^*5MWkUflo)UxE7I_{PCY`gk8D7? zq}n;5q%8X6nvMkAp|ztEy>0Vq?p3_-m<;NH90_JLIdb`iwJGs})O^2~OaVug9$s;( z1TZ#2rV}R?B2&11e18F2sxI5*ZBPkV_iN@8bnk)$Oa^XTk>TskAA@lF)Y$Wlk=8bD z^~8Br&7r7Oww1+Qove3QT|**)gcG2hqNcwNmx zdKav4mfpGzC$czs#!CmON)5DFpNkY2Zp|nDF;s7?)6KX+izo--brmr3100TkLCV3NKFgNP zzRDHL-TM{8UGWvFl$e9gDvqs1tm7e8r(%k}m`Y@=_?SSB!g#1F`AJPqV30|!=_t#h z(Fz>96BCh@xDW?bmtWDKMo`x_sQAIHQw8-0=%M6^dS$u~RhUPwsr4pG9c@snMx#!v zz4g;^nRb;#+41L~7pu1BqmOog{Kai+aTtfhd#kjHA~ZLN2kB_bi;KzHjR#|?NgMbq zDtE4{hNCD4;Yl8%E#gLcPNNlK;#P_4h`pCd8+gw2kPiuIy;x?#P+wJDc1lF@JeRB@ z$Q|W*vmy&|?Fno9LHPW%3srylO;$JUqKUMV+^Jr}>;^sS*5lp}0mQKrIH+7jfcj1_ zg+s$)`O(~+Z5M1?oCRX%$?t%xb;lIl73z~;%t!lwX8%D0z6e`q4aN9(@%@&dO|W@V z;++@g`9#rU`e;?9(L$G*XN(8Bx}*DJ_pXYD$X;RIbq8Rr%D=?B$lobn(>RSrmZ>`M z-l<&a!zIsh8VZC13ys|@+*k?NH}m`AtVbM^IEkd?ryM$Cw+$2q#>N(Yi)YDlurNR8 z>WtKfeX;c>G{i;QZ0iQAs5v{=VT)>lsdThblcv*gG3QgFQq=PcL_cL3UQ$N(Nxf4R z4mK|YaaoT7B+@rRIk94fCa+#z8pbv>GA{?k6IfD9Qd$Y`8?O7`P8u?l8Bd@O1+~5F zk3b}KkS^EVpdSt0anCSL5RrJwt8hsKk+@l)dZiqBrNB~tHz-%_@?V2tbD~Rua0hn; zWoW$_b;r;ONq=)Qf5hY79~#b-t;BQ{x$wsnqi}_51Z!v z?L4$6bsRH{)NG@|>9RUTPPU;ONhxDMcV4ew6>^FOq?dPAiRxB-ce;+K97R*jDvO87 z%8ORzfSUXc=Fjj9(@u|Z<>=g^{8`_qMa2JjSc)TIdA9;7Ovs|WIF^2?5?@bHmEE9n z?$-A4c@Mu-|KO#O;O7Z`a9q zxJ`0HDXm>7us3bPC>`CLNegu8cx_I)SX5V?5VP5TcLnIIvESG{2TtKQ!ND(1UekCl zc7Z~|Rf=E8iPbjA*?%a-$`REL@!^e6s)e9S6@+6`78Q&|uy3@IdM-hfL5b}12!>@7 zfi4+{dXzwG`c-9RA($`Q=dT2GyitLcY8XS@vZwkO3Ci+XqErPHx&*hRQ>k!PAe-D( zKu_wUU(Mob>8;nnjzNB<#*tzzfAQ<1dwkKY{0Grhe`2(zv-PHPL9cVv!zUYJW6qGB=2E|tUuu!j*P^h z6A5wz`(>$mvRL93>J%R=#xIxH;;J2358v*)8^Nzz=BoGRGwaZ{3P8dA#muN~;kYDc z>n7*>Wq6krKp{owp7p!m9-g#sJ3KjP8~sZMC@ntYOMBxNs?=;(gUT<86<6XlZGIJq zmjh$mh%uR~bHRQ7BgV^SsjIB;v!HL`s&hF=eEGq3m?O6obVrt*UTHzU@Z4X z-?+ybh4+k#yoVF~sH@?!)5R-q4Q|Rswd5kTiVN*bX#f!fWUUvZ%G_8Wh_-8~Krz1T{UZn5L6|icUfS5@Q;jk& zVuJ-%WbUU5U_BeB_uF?JDo7x^y#3+W2V|U%!@mnHH_HruYy(upytxuSII3PphBQALx?9`yvjWq z!{rDyhWNr%9n&I}DeE;wT&`j5^IrP1xa2A;y)KY>>7rzO`p2Zq`2~9mCr27&C9Y}$ zfx-Fm65aMd-EO3PxIP63dL05*oaG(80iFDGhV@zm4jY1XbsMVt3-+Lk$CYS|8+hS& z8-%Yo2Jc~sPn4sx_K6vo)bL^3@`#>GdT8enLM_X2n`ng{EjEy6QHHDJ@!K4W-u}5j z;R82L;^tjjS9s~0wa*aDf%rR1PNM34(^t5xCC6U85Qv z#9;JkXR1$G`yyCjQMyIG)@UwUJ-!4f);oc9t_(w1yln2mwLz7>DA6+c{VHy#uD;PW zN?W=wE0W_bC`8(N-?(lFJxtjI;7k!>)4VR^AiV>FUDtB2%X2l;BD&j^t*Qr5y0^;) zw?b0Lo~#FTBRnG3aNY;OfGPz$bxA(;DSs7~`8HJMf(s=V$pp@Z>o_eid+dOnJS&Ua za40~9C)`k?Zi>!KS8xnaf9n^g-+oHVESv4eYS(du>_~|A515P|J4yDM=;2 zM0UyQN$}xOR(jHhN`2J1+j$tsogdDId=a1G34kCCB(G4k&=$@;>O>I|B>>^{_48Sc zF7goM;qdlV<~?UOte=}I&Ji_tE;=J>U=Zsh&qu-Rdjs0a+UHRgr^ak6plCe6KMeF@ zJU>)>K~p3`ao6e%LWVNsOi6dIjRmGE6I-(kifp$A3{Sw{=m9-@#~)7C{Vyvh&i?kDsRp06ZX^m-c+W=jeJ^p~r` z&+tq(N2?f3FuG>)h|bl(t=@I?$kxS)Nd|=ilsIL(qm|b|;aqq@BJM+w07*Q$e{p1b zO-~@UruWqZ<2gtf-?x_M^b)WpXI+Vm9hQZ_$sO<6#&`h%{5IL4!UqK9F4uw1q`lGK z{0=2%_apif(a-9CV}ppmK!6k0&h0_%`)R_3$Lf)y<^B~YGbDr6N0;I?p&eL8ihQ+5`uJtvS zwQtSfbOCxj}B3QIBrNu;DxC)>e6{U)~!hCzoqNp zny3{~n|&&G;_;E;K01dODI8 zgce24dlcM~M_7Q@}Ut2iC8q15dzD=iGf1Qb}_RWK_mU~xGb!Gi?!VX_-6|Lq=cFf7%4eVe=NU9K=Wtel9tQbDhyk7@)G zaj0%HnuKM}X@kYq@wq8P8UR1P)|Y09o!s#I`tXB|@NbghgAV!lkM0-Gs6jjMIJD5~ zLTaM>2S^zW_=`bgY{)EZmpg5NLtngzEc@%fOLn^h?{04}l=FyNQF^+-l}ln;N$hmK zs2B#P%)WyHu$muQ{niPwIQuM9iJKo*_bCE-xZ`Z`Ay@{x264);+4~-3-OIP`T-_`# zcPeW@wg{)zN6*M}nuJ;(iPbyb|6*;C%?G9x{IRt_{!DECkKr)?_lU;ef7!wRXIhh~ z{OXLMjPxZGE}TT-R6%H#QB;~Xm}EFe9!XYu$?iDUVr#}hM9pkPMw>)@R}d$J6`8?0 zlQf6iR@+cvy2>IC8e=EIH=_Fr1?>&keJd>^B{lK96=5)r-aH_DJkfsL)$Vn@#gXs5 z^)|2l3$yQ#bdR)*R1ofOEmCKVLP9=hd%Cg0imbqfWFZuEnWf4A+bwIgp6Fm8DZ5NW z9#*z_|FNv%tp!F_|2^DKvo?fmnI~PCrHkyKxU54iYVWw-r`#WH1%;I6#AaySpFu+JAajI9B6z9S6suF{--a*iU!GEB`hCyV+7663v!t`g(2DAf^( zvqL8QNtR_6sWrH?nM7C`d^aC+_^@#|yt$va@g@GW)5eal`&80|=ud zy3H!oR{ftWnPfWzqfu6(PngIVY4=rTa-mUM)x;s0BB)^ecXT%Ht3tf}4*m0dr!KVu zHuSYNA8)lLcAv_i3|cY6Gmlf87vpW zgQK60L2h^GY9g%N=dM-xTG!K_Ac~xyX35Q)Ff>57LNZBXOgcjz2f@}X4z`BsMOa+#jN$U=Mv3JwNnzIQSVcM;*Z3^E zA{w3pwPu#}T&w5q>C*~S!>Ck;QfkE4_@~-}UTIWF({*R?NVbKF#Tt%?4oqa2m1%() zy5ShK6#7M)xe0fFu-=Hz<HZzOA9QOVm*w#3~(}3Db$((Bg$sXXoT3D=1ov zkfK!s{bCbgA!eie60>QMBl$du2R;Ll3Orz#P0szlxIga=FiAe;RxOO3j-ZZT+Q5*? z6Q|eE7B>era5Jggs7a`%P6Eqn0q!c6Z}Qx?#9q-qP&^E*n=zQ71Rd7O)>QQ;5D{>< z2$yN_=V^VeVH*_*rA`uoo|=OY-_oF8)MjR)Bm6AOLGqg_X~2FldHi{{#Wi`MrnVzD zalyDY`H#%&obRVPCEA+Q3Z{==JPNl2U5QKkReQteUVho+E$bNh{-J=04tckZ#4b={ z#YfY19!wIu2|?Mr#~!MdwAhG$=D?u3d+3Y#ql3UC%v@ma(Y->Q6+guK5nSZ@t8GPl zx0v*OK4X_58bPD7r_r&0b8Ke7bAga^g~lBc+6|!@rJbWB4|#ay?>4(A_g~*E1n;i@ zK}pYZg7p5CMF#s2%bg+NMygbkP)>)A8rmWDUoh6^L%h% zUUA?NX=0>Bf2xpSkG+4hsathn7-sQHVo1_lFx>~p=JvevkF4kt|1(jzakgQep^wom zfv;MAa8fkl6)X+?yXVr&KOyuO2y@d*%*(WiWs2?0ULdr`zIB!l;Q2S1<20 z7k5(g7f7pd_44zx-869ZHB4^e`7ds-q;y|P;N;>sldO2o=P!Jawe8~XL`#|I-*kidTo?f;>AJ5z^yPW zL_Yy?tCFf_94%n=(yi!hm6D8JwG0Jd^AsX>tTdbR>88;CQdLJ z+Iljw44H!snRV~hZ+`*L@|C{R2I#7>_C4}O(DEM*Z}R&T2-zmMU=mc?Isr*%;l2Z6E@GdQXQ zE6yFGUdVB+48dw^#eF9P@tRto9xXw7caarv>W81sy`xkBCuxLSS zJYB2+XzL$#8wSySDztc86VU-1jzEqUjNycoV#A3LHku%J`m6DjMA&sBA%70|xj?F> z$%deE3^iWo4K}dQJT1D^^_tdz*`(?FuPq%TL5j8}E2Sgk6A=q77Ds1ZK30w{YP>p& z#8Vq#UY6HzAXjm1xJI4Cl-el^%?p2>fy%Q1LhYK1u%WXGg+sMSOM7{D<9fHu zb+yr%#^ebn7uVIY#S~TK9&<jqK}aJc*IBTk3GesKj0%hEbwuH<+{l)@|rc5 z-GAQ-{>shxYk_GNTO?bgUxJQ-v*(hd_CtaB7b_}5`75XJCbf7RdWO2IB<%VdjUhYJ z7abavE%-q)IMZ(_rXmIk8F0$b2D^fJ^0L!SFQ5mNFGF1!vnRa4I-tx|iXn0K<@piu zn!I_Zc>>#8+J`5P%s$me=Di=Bw0FgqGs=|<>MNzw1bHV!z{tO=ts#3LXvR1i7b-bB z(+XTuNJdAmk#H8ahCAUo5Qv$Z{fbN`t@EL+^l`ZQC3gjy8wnWDjeoZ~-X)RmQva6+ zAGHTbjm(R?DsQ^~dbshIIZMyjaTi`&a1+4*v%>4I+w4}F5KMetKAu0j2ezypAqt?~ zIT!PzHOjTgtiStX=)^XLORSQ-T8qwJbKZV^5`a2_Gx?9e%J=f;XO4t{e|#d~(b1GJ z^$Gx@Zl~deLFp61-Us0Gwc!6HhMq<4J6Dn~itURCUOqntcF|)BJI97<8wc2{_enZy zpQYA?u{$78y*U+Vo3?EV&0iyA3X^e@^)cYW-}n9(1BqMq&0Wxs1(oS1R!Zdmh#os@ zGedoc|34|qg>mCjeSZ;yrfpDU|J?f7%CZ25%mj+lgz{;?5%t#KjMYM#a!k_dxKL=O zw%h=CknWQy=-0?1w6l62Uw>z^%}<=K-$VSu?AJn;lNsw#0&Zfci4WRjOh7A;3M6@8 z^LHs+(~mJ31E3#i4h&vKXpTNhdd9K~voy6W9!>;Z%1xc&r!$%{6E{rXI9`I4OqQNy zxJG*RRQSJ2I}>;)w>OSYhR9M~LZos{lo*6aQd!12G`6~;m}DQuPLfa|WlLRKT+1|B zveXroREliLTFIIgd*oJ1uD}18D_+jkpnH6Ltk3UzmiN5pJ?FgVd8qGL{!Dwzg4I zc39+X9C0Lx{^I$>^PQTBw{Rf3>3_1Om{>t(y9z0b^~)7bDnHXYu{`Eble#U_&d!&& zqO0muWxsKCv7awPsWYwfe3b6hW)i9BW@9*n&ud8*nVdYs9=}KKc5lSZ*Y`aF(3%ap zE0P%VUey^Lu(i4%-Ej2%ie^l4si4mG?ef)m+S?0RB6Dg+JSu{nl}^7YYktIO@2mXg zk6v{~eslFzn0gh)_}|ncga~)ueQfGhocpp+;sA$J2xw~&(AF9YwKW`wbJkP_az%>tbe^WB+J|Mg2}58P`%3hV|#z$|=ikYS{X?2i_aoWVRqrw4GpRmSYS!x-AdZqF1dN@&?yW(6tB{}(slgRUw^dojogkv5-xylMbrrR#(P?LBG6U_1d zQ-8r#_esbnGGsqz-4h|7i~gBpB{xT3sAEf?O&#b5@0H&NPIZ((W9#CKl(AZR>XME` zPb()$5P(&J=uEVS-MZpoOfkqk;1$&rj&6sb^2G1b7ka?Ij}Axx}kXn%#&Ka~=( zBEvbvGPh3#IS#_E#a-6As2n2Z8TwkqN*zO|#2W&)1eLqCc(ck-Ndj;4+eDMHIV!@E z2`}z$+Q+u8`;uvWxbY`D(P8UE-9Rw>pa4WEPe**>A*Ffc}-k zi2sj41}83Yj_aGWadB=UoS))DMxUQ;iFq7o#;?R<_pkho;(Z-2L8j8P^u^D%f+dPG;UpB}sTa&=$IoCtP3saye==&j8<*KzwMwDHF+b<+pKzqR{Y_P<(F0mwn zrcl;zL6KVauEe4gHDhPT>Z@l>wLeSVa>1q*r+G8fesLU+(e^7VMd_Za%hk|*$~GF3 zn(%p#^~OgrCASlWg73E2-_vMibv(SI?cLZI?rTqZtAZ%clOC0It!$JlW0yQ1n#S!g z*z@YiP5%vnB#(n^Cz#oLcZFs+q^eM3S-;B$08#&rD;RZ<<^bHMtZmD^iqw zuBB65e^pB8LmvG%aninJoT`EGDyKd=Wa&3AYvQlr4>f1xEy1lR(5T+zoBBF2uU+0g zDv*2a$^5ln%`9J`F_)uF_lEA&znh=2`?0e2I!uhX68b>eF0xOMaUf^1X~ue9sF|S;^NedDo+GnDO%C+Gy1zg=|O+5EmS8KfwBxOGp^YhWZl9LB+ zoWXCn6}9=cTl!D|ka`B=OG1C=u5GOp{kS!4e_KL!?fWQ3@Ge#H@5XwH z8|@}}^H&;Lh*`Eq-rHN*GBln$7*!&cCq~X4tGQ10-EhUmc2~V$442}#p4}EhN{}hO zt)h1`@j%<93zx6DSiUeHVsA)enh?3KU(twm7ct2hzoFi8Fhz4PBbR4oFYZ&Q$;dT> z!C3D0%&p~^eRAO~HLXDdSN+63B{Q}9X>L4NT6^*ZUtz>@ANBO)j_s3mRYP4t;v;y1 z1J$k76io@2(v=)lQ}ui_yf*ydMmBj?=0@)9wY8RMTQft)j}b1B_xu07p-@NTt1O1- zrP&glb2U2-`-Q`(;a+19I#@FcwNEcG3AfmuF+c=pxVoPID8#uB=m8}g~n(O(fV>{k-yrT z%?ghWQ)IKh$vXwJZ@YAD40G=ap`+1KK4p)Br_1Woavo@T^m<>PC&B#hU!|J&ey|k_ z4nD3pDDgS3(P11-Y$uQNhZVz5N6F>F!h6BZllEk!_MdK|&aPx|cXhY3a?=stT8Y=e zON`*J*XWAt)HGrxwZ*q+Vqa@ZR!L$}q20V!284MwiP%v31Gsxj)?B>8!)?>u^OApn zubibAoVP(51dG%rOn3B)1%o>rsY(~gcHxBV%zHNcGJAG5LXzusqp zf6xIB1mL$bi4w3Gd_OZ<=ql@JspAZdBy`p3fx$rYJ<-5uph=7HP0s?jFr8%~{M}+| zNTO>9R$pfs>diHr8rccBgeCIxUk5pYDmyHW0xgInO29$zSUV$u*HXpl8RB4To$Jl) z{=g^)d?NLZLQw)fbI!8X+h+vqVdLNM)J_c802p356&!dPP6 zCE7UwrwB-(Cm67|{rYWDP!Y8AfYQ_I;43A7XB{1Ynw2%tgXFFTJT;NX#G{D6V^}|d zVDJD7^jm?x;T-)4a6Qv{?DzgRb=^((gMaJ8lLIg#^ggES;cg28O4wNB&wi4wpM0>1vR)_@;4cOr@Ob#+|3e&Q7EJv(^^|?+hTO*&u!_h2Ss`y zx5A)}f$&VC1c<8AQN@#OY^LLn!S!0&Q*9~*T1_5YgpxCYw2a=t(UH`pO*9TnO)F@Z z{`~n3`;;u525tv@p!e>cBQ9@1N1Q-(w^ep?vvNE_t6@CZl1Ngs1HH`dhzAnP1TKgR z&x+=ipcT78VZ`UK6Yo4@10Zu1dFQ^1lLKX#%I7Y+9FjbP)?{2X?wBENh6hH0t!iov~!_g0%`C9z|%z*OpA9f0PuiVfdgO zf~Mpy6+QnL1HT-G5DZEdApC1jdVT`D&y5iJDway1HzLD3f(U2xlZ7~o-yeiq2;Q4Q zs9aAMpu!K)v!10Ec)Wr4NDwHhZq{nR)NJ^N3n_D#JihOkz~zHi5)l;c*?&PH>xu*& VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N literal 0 HcmV?d00001 diff --git a/microservices/producerproduct/.mvn/wrapper/maven-wrapper.properties b/microservices/producerproduct/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..ca5ab4b --- /dev/null +++ b/microservices/producerproduct/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# 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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/microservices/producerproduct/Dockerfile b/microservices/producerproduct/Dockerfile new file mode 100644 index 0000000..8a4ce77 --- /dev/null +++ b/microservices/producerproduct/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:11-jdk-slim +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/microservices/producerproduct/mvnw b/microservices/producerproduct/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/microservices/producerproduct/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/microservices/producerproduct/mvnw.cmd b/microservices/producerproduct/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/microservices/producerproduct/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/microservices/producerproduct/pom.xml b/microservices/producerproduct/pom.xml new file mode 100644 index 0000000..83b4d6c --- /dev/null +++ b/microservices/producerproduct/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.13 + + + com.unicauca + producerproduct + 0.0.1-SNAPSHOT + producerproduct + Demo project for Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-amqp + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.h2database + h2 + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.amqp + spring-rabbit-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/ProducerProductApplication.java b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/ProducerProductApplication.java new file mode 100644 index 0000000..5b28d79 --- /dev/null +++ b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/ProducerProductApplication.java @@ -0,0 +1,13 @@ +package com.unicauca.producerproduct; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProducerProductApplication { + + public static void main(String[] args) { + SpringApplication.run(ProducerProductApplication.class, args); + } + +} diff --git a/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/access/repository/IProductRepository.java b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/access/repository/IProductRepository.java new file mode 100644 index 0000000..f413771 --- /dev/null +++ b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/access/repository/IProductRepository.java @@ -0,0 +1,9 @@ +package com.unicauca.producerproduct.access.repository; + +import org.springframework.data.repository.CrudRepository; + +import com.unicauca.producerproduct.domain.entity.Product; + +public interface IProductRepository extends CrudRepository { + +} diff --git a/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/config/RabbitMQConfig.java b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/config/RabbitMQConfig.java new file mode 100644 index 0000000..ea0c075 --- /dev/null +++ b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/config/RabbitMQConfig.java @@ -0,0 +1,32 @@ +package com.unicauca.producerproduct.config; + +import org.springframework.amqp.core.FanoutExchange; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.amqp.support.converter.SimpleMessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitMQConfig { + + public static final String PRODUCT_EVENTS_EXCHANGE = "product-events-exchange"; + + @Bean + public FanoutExchange product_events_exchange() { + return new FanoutExchange(PRODUCT_EVENTS_EXCHANGE); + } + + @Bean + public MessageConverter messageConverter() { + return new SimpleMessageConverter(); + } + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { + RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); + rabbitTemplate.setMessageConverter(messageConverter()); + return rabbitTemplate; + } +} diff --git a/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/entity/Product.java b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/entity/Product.java new file mode 100644 index 0000000..1982df1 --- /dev/null +++ b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/entity/Product.java @@ -0,0 +1,45 @@ +package com.unicauca.producerproduct.domain.entity; + +import java.io.Serializable; +import java.util.Date; + +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 javax.validation.constraints.NotNull; + +import lombok.Data; + +@Entity +@Table(name = "products") +@Data // Generare constructor, getters and setters and ToString methods +public class Product implements Serializable { + private static final long serialVersionUID = 1L; + + @Id // This makes the id as primary key + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name") + @NotNull(message = "El nombre es obligatorio") + private String name; + + @Column(name = "description") + private String description; + + @Column(name = "price") + @NotNull(message = "El precio es obligatorio") + private Double price; + + @Column(name = "created_at") + @Temporal(TemporalType.DATE) + private Date createdAt; + + @Column(name = "holderEmail") + private String holderEmail; +} diff --git a/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/IProductService.java b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/IProductService.java new file mode 100644 index 0000000..5544601 --- /dev/null +++ b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/IProductService.java @@ -0,0 +1,6 @@ +package com.unicauca.producerproduct.domain.service; + +import com.unicauca.producerproduct.domain.entity.Product; + +public interface IProductService extends IService { +} diff --git a/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/IService.java b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/IService.java new file mode 100644 index 0000000..33f86f9 --- /dev/null +++ b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/IService.java @@ -0,0 +1,16 @@ +package com.unicauca.producerproduct.domain.service; + +import java.io.Serializable; +import java.util.List; + +public interface IService { + public List findAll(); + + public T find(Long id); + + public T create(T object); + + public T update(Long id, T object); + + public void delete(Long id); +} diff --git a/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/ProductServiceImpl.java b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/ProductServiceImpl.java new file mode 100644 index 0000000..19c6a09 --- /dev/null +++ b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/ProductServiceImpl.java @@ -0,0 +1,97 @@ +package com.unicauca.producerproduct.domain.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.unicauca.producerproduct.access.repository.IProductRepository; +import com.unicauca.producerproduct.domain.entity.Product; + +@Service // Para que sea un componente de Spring +public class ProductServiceImpl implements IProductService { + @Autowired // Inyecta una dependencia + private IProductRepository repository; + + @Autowired + private RabbitMQProducer rabbitMQProducer; + + /** + * Busca todos los productos + * + * @return Lista de productos + */ + @Override + @Transactional(readOnly = true) + public List findAll() { + return (List) repository.findAll(); + } + + /** + * Busca un producto por su id + * + * @param id id del producto + * @return producto + */ + @Override + @Transactional + public Product find(Long id) { + Product product = repository.findById(id).orElse(null); + return product; + } + + /** + * Crea un producto + * + * @param product producto a crear + * @return producto creado + */ + @Override + @Transactional + public Product create(Product product) { + + // Save the product + Product savedProduct = repository.save(product); + // Send the event message + rabbitMQProducer.send(savedProduct, "create"); + return savedProduct; + + } + + /** + * Actualiza un producto + * + * @param id id del producto + * @param product producto a actualizar + * @return producto actualizado + */ + @Override + @Transactional + public Product update(Long id, Product product) { + Product productUpdate = this.find(id); + productUpdate.setName(product.getName()); + productUpdate.setDescription(product.getDescription()); + productUpdate.setPrice(product.getPrice()); + // Save the product + Product updateProduct = repository.save(productUpdate); + // Send the event message + rabbitMQProducer.send(updateProduct, "update"); + return updateProduct; + } + + /** + * Elimina un producto + * + * @param id id del producto + */ + @Override + @Transactional + public void delete(Long id) { + Product productDelete = this.find(id); + if (productDelete != null) { + rabbitMQProducer.send(productDelete, "delete"); + } + repository.deleteById(id); + } +} diff --git a/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/RabbitMQProducer.java b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/RabbitMQProducer.java new file mode 100644 index 0000000..342491d --- /dev/null +++ b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/domain/service/RabbitMQProducer.java @@ -0,0 +1,21 @@ +package com.unicauca.producerproduct.domain.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.unicauca.producerproduct.config.RabbitMQConfig; +import com.unicauca.producerproduct.domain.entity.Product; + +import org.springframework.amqp.core.AmqpTemplate; + +@Service +public class RabbitMQProducer { + @Autowired + private AmqpTemplate rabbitTemplate; + + public void send(Product product, String action) { + String message = product.getId() + "," + product.getName() + "," + product.getPrice() + "," + action + "," + + product.getHolderEmail(); + rabbitTemplate.convertAndSend(RabbitMQConfig.PRODUCT_EVENTS_EXCHANGE, "", message); + } +} diff --git a/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/presentation/rest/ProductsController.java b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/presentation/rest/ProductsController.java new file mode 100644 index 0000000..adc5e60 --- /dev/null +++ b/microservices/producerproduct/src/main/java/com/unicauca/producerproduct/presentation/rest/ProductsController.java @@ -0,0 +1,84 @@ +package com.unicauca.producerproduct.presentation.rest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import com.unicauca.producerproduct.domain.entity.Product; +import com.unicauca.producerproduct.domain.service.IProductService; + +import java.util.List; + +@RestController +@RequestMapping("products") +public class ProductsController { + @Autowired + private IProductService productService; + + /** + * Busca todos los productos + * + * @return Lista de productos + */ + @RequestMapping(method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public List findAll() { + return (List) productService.findAll(); + } + + /** + * Busca un producto por su id + * + * @param id id del producto + * @return producto + */ + @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public Product findById(@PathVariable Long id) { + return productService.find(id); + } + + /** + * Crea un producto + * + * @param product producto a crear + * @return producto creado + */ + @RequestMapping(method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public Product create(@RequestBody Product product) { + return productService.create(product); + } + + /** + * Actualiza un producto + * + * @param product producto a actualizar + * @param id id del producto a actualizar + * @return producto eliminado + */ + + @RequestMapping(value = "{id}", method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public Product update(@RequestBody Product product, @PathVariable Long id) { + return productService.update(id, product); + } + + /** + * Elimina un producto + * + * @param id id del producto a eliminar + */ + @RequestMapping(value = "{id}", method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + public void delete(@PathVariable Long id) { + productService.delete(id); + } +} diff --git a/microservices/producerproduct/src/main/resources/application.properties b/microservices/producerproduct/src/main/resources/application.properties new file mode 100644 index 0000000..f13fb6a --- /dev/null +++ b/microservices/producerproduct/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=8080 +spring.rabbitmq.host:${RABBITMQ_HOST:localhost} +spring.rabbitmq.port:${RABBITMQ_PORT:5672} \ No newline at end of file diff --git a/microservices/producerproduct/src/main/resources/import.sql b/microservices/producerproduct/src/main/resources/import.sql new file mode 100644 index 0000000..bda5c2d --- /dev/null +++ b/microservices/producerproduct/src/main/resources/import.sql @@ -0,0 +1,4 @@ +insert into products(name, price, created_at) values ('Apple', 0.60, now()); +insert into products(name, price, created_at) values ('Orange', 0.25, now()); +insert into products(name, price, created_at) values ('Banana', 0.20, now()); +insert into products(name, price, created_at) values ('Papaya', 0.50, now()); diff --git a/microservices/producerproduct/src/test/java/com/unicauca/ProducerProduct/ProducerProductApplicationTests.java b/microservices/producerproduct/src/test/java/com/unicauca/ProducerProduct/ProducerProductApplicationTests.java new file mode 100644 index 0000000..3b1f6c7 --- /dev/null +++ b/microservices/producerproduct/src/test/java/com/unicauca/ProducerProduct/ProducerProductApplicationTests.java @@ -0,0 +1,13 @@ +package com.unicauca.ProducerProduct; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ProducerProductApplicationTests { + + @Test + void contextLoads() { + } + +}