From a70f684190ca60aedd59a7db3ca77fc5d8f3515b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Barrera=20Gracia?= Date: Sun, 9 Nov 2025 12:44:54 -0500 Subject: [PATCH 1/5] Making it compile --- .gitattributes | 28 +- .../workflows/api-gateway-pipeline-dev-pr.yml | 42 +- .../api-gateway-pipeline-dev-push.yml | 66 +- .../api-gateway-pipeline-prod-pr.yml | 42 +- .../api-gateway-pipeline-prod-push.yml | 66 +- .../api-gateway-pipeline-stage-pr.yml | 42 +- .../api-gateway-pipeline-stage-push.yml | 66 +- .../cloud-config-pipeline-dev-pr.yml | 42 +- .../cloud-config-pipeline-dev-push.yml | 66 +- .../cloud-config-pipeline-prod-pr.yml | 42 +- .../cloud-config-pipeline-prod-push.yml | 66 +- .../cloud-config-pipeline-stage-pr.yml | 42 +- .../cloud-config-pipeline-stage-push.yml | 66 +- .../favourite-service-pipeline-dev-pr.yml | 42 +- .../favourite-service-pipeline-dev-push.yml | 66 +- .../favourite-service-pipeline-prod-pr.yml | 42 +- .../favourite-service-pipeline-prod-push.yml | 66 +- .../favourite-service-pipeline-stage-pr.yml | 42 +- .../favourite-service-pipeline-stage-push.yml | 66 +- .../order-service-pipeline-dev-pr.yml | 42 +- .../order-service-pipeline-dev-push.yml | 66 +- .../order-service-pipeline-prod-pr.yml | 42 +- .../order-service-pipeline-prod-push.yml | 66 +- .../order-service-pipeline-stage-pr.yml | 42 +- .../order-service-pipeline-stage-push.yml | 66 +- .../payment-service-pipeline-dev-pr.yml | 42 +- .../payment-service-pipeline-dev-push.yml | 66 +- .../payment-service-pipeline-prod-pr.yml | 42 +- .../payment-service-pipeline-prod-push.yml | 66 +- .../payment-service-pipeline-stage-pr.yml | 42 +- .../payment-service-pipeline-stage-push.yml | 66 +- .../product-service-pipeline-dev-pr.yml | 42 +- .../product-service-pipeline-dev-push.yml | 66 +- .../product-service-pipeline-prod-pr.yml | 42 +- .../product-service-pipeline-prod-push.yml | 66 +- .../product-service-pipeline-stage-pr.yml | 42 +- .../product-service-pipeline-stage-push.yml | 66 +- .../proxy-client-pipeline-dev-pr.yml | 42 +- .../proxy-client-pipeline-dev-push.yml | 66 +- .../proxy-client-pipeline-prod-pr.yml | 42 +- .../proxy-client-pipeline-prod-push.yml | 66 +- .../proxy-client-pipeline-stage-pr.yml | 42 +- .../proxy-client-pipeline-stage-push.yml | 66 +- .../service-discovery-pipeline-dev-pr.yml | 42 +- .../service-discovery-pipeline-dev-push.yml | 66 +- .../service-discovery-pipeline-prod-pr.yml | 42 +- .../service-discovery-pipeline-prod-push.yml | 66 +- .../service-discovery-pipeline-stage-pr.yml | 42 +- .../service-discovery-pipeline-stage-push.yml | 66 +- .../shipping-service-pipeline-dev-pr.yml | 42 +- .../shipping-service-pipeline-dev-push.yml | 66 +- .../shipping-service-pipeline-prod-pr.yml | 42 +- .../shipping-service-pipeline-prod-push.yml | 66 +- .../shipping-service-pipeline-stage-pr.yml | 42 +- .../shipping-service-pipeline-stage-push.yml | 66 +- .../user-service-pipeline-dev-pr.yml | 42 +- .../user-service-pipeline-dev-push.yml | 66 +- .../user-service-pipeline-prod-pr.yml | 42 +- .../user-service-pipeline-prod-push.yml | 66 +- .../user-service-pipeline-stage-pr.yml | 42 +- .../user-service-pipeline-stage-push.yml | 66 +- .gitignore | 66 +- .mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .mvn/wrapper/maven-wrapper.properties | 4 +- README.md | 1242 ++++++++--------- api-gateway/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- api-gateway/Dockerfile | 24 +- api-gateway/compose.yml | 24 +- api-gateway/mvnw | 620 ++++---- api-gateway/mvnw.cmd | 364 ++--- api-gateway/pom.xml | 186 +-- .../selimhorri/app/ApiGatewayApplication.java | 50 +- .../src/main/resources/application-dev.yml | 56 +- .../src/main/resources/application-prod.yml | 56 +- .../src/main/resources/application-stage.yml | 56 +- .../src/main/resources/application.yml | 190 +-- .../app/ApiGatewayApplicationTests.java | 34 +- azure-pipelines.yml | 44 +- cloud-config/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- cloud-config/Dockerfile | 22 +- cloud-config/compose.yml | 24 +- cloud-config/mvnw | 620 ++++---- cloud-config/mvnw.cmd | 364 ++--- cloud-config/pom.xml | 144 +- .../app/CloudConfigApplication.java | 50 +- .../src/main/resources/application.yml | 98 +- .../app/CloudConfigApplicationTests.java | 32 +- compose.yml | 190 ++- core.yml | 35 + favourite-service/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- favourite-service/Dockerfile | 24 +- favourite-service/compose.yml | 24 +- favourite-service/mvnw | 620 ++++---- favourite-service/mvnw.cmd | 364 ++--- favourite-service/pom.xml | 240 ++-- .../app/FavouriteServiceApplication.java | 46 +- .../app/config/client/ClientConfig.java | 58 +- .../app/config/mapper/MapperConfig.java | 62 +- .../selimhorri/app/constant/AppConstant.java | 96 +- .../app/domain/AbstractMappedEntity.java | 96 +- .../com/selimhorri/app/domain/Favourite.java | 134 +- .../selimhorri/app/domain/id/FavouriteId.java | 104 +- .../com/selimhorri/app/dto/FavouriteDto.java | 130 +- .../com/selimhorri/app/dto/ProductDto.java | 82 +- .../java/com/selimhorri/app/dto/UserDto.java | 82 +- .../collection/DtoCollectionResponse.java | 56 +- .../app/exception/ApiExceptionHandler.java | 144 +- .../app/exception/payload/ExceptionMsg.java | 96 +- .../wrapper/FavouriteNotFoundException.java | 70 +- .../app/helper/FavouriteMappingHelper.java | 92 +- .../app/repository/FavouriteRepository.java | 24 +- .../app/resource/FavouriteResource.java | 226 +-- .../app/service/FavouriteService.java | 32 +- .../service/impl/FavouriteServiceImpl.java | 198 +-- .../src/main/resources/application-dev.yml | 94 +- .../src/main/resources/application-prod.yml | 86 +- .../src/main/resources/application-stage.yml | 86 +- .../src/main/resources/application.yml | 92 +- .../migration/V1__create_favourites_table.sql | 20 +- .../migration/V2__insert_favourites_table.sql | 14 +- .../app/FavouriteServiceApplicationTests.java | 34 +- mvnw | 620 ++++---- mvnw.cmd | 364 ++--- order-service/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- order-service/Dockerfile | 24 +- order-service/compose.yml | 24 +- order-service/mvnw | 620 ++++---- order-service/mvnw.cmd | 364 ++--- order-service/pom.xml | 238 ++-- .../app/OrderServiceApplication.java | 70 +- .../app/config/client/ClientConfig.java | 58 +- .../app/config/mapper/MapperConfig.java | 62 +- .../selimhorri/app/constant/AppConstant.java | 96 +- .../app/domain/AbstractMappedEntity.java | 96 +- .../java/com/selimhorri/app/domain/Cart.java | 114 +- .../java/com/selimhorri/app/domain/Order.java | 150 +- .../java/com/selimhorri/app/dto/CartDto.java | 86 +- .../java/com/selimhorri/app/dto/OrderDto.java | 112 +- .../java/com/selimhorri/app/dto/UserDto.java | 84 +- .../collection/DtoCollectionResponse.java | 56 +- .../app/exception/ApiExceptionHandler.java | 150 +- .../app/exception/payload/ExceptionMsg.java | 96 +- .../wrapper/CartNotFoundException.java | 72 +- .../wrapper/OrderNotFoundException.java | 72 +- .../app/helper/CartMappingHelper.java | 78 +- .../app/helper/OrderMappingHelper.java | 96 +- .../app/repository/CartRepository.java | 22 +- .../app/repository/OrderRepository.java | 22 +- .../selimhorri/app/resource/CartResource.java | 192 +-- .../app/resource/OrderResource.java | 192 +-- .../selimhorri/app/service/CartService.java | 32 +- .../selimhorri/app/service/OrderService.java | 32 +- .../app/service/impl/CartServiceImpl.java | 198 +-- .../app/service/impl/OrderServiceImpl.java | 170 +-- .../src/main/resources/application-dev.yml | 94 +- .../src/main/resources/application-prod.yml | 86 +- .../src/main/resources/application-stage.yml | 86 +- .../src/main/resources/application.yml | 97 +- .../db/migration/V1__create_carts_table.sql | 16 +- .../db/migration/V2__insert_carts_table.sql | 16 +- .../db/migration/V3__create_orders_table.sql | 22 +- .../db/migration/V4__insert_orders_table.sql | 16 +- .../V5__create_orders_cart_id_fk.sql | 6 +- .../app/OrderServiceApplicationTests.java | 32 +- payment-service/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- payment-service/Dockerfile | 24 +- payment-service/compose.yml | 24 +- payment-service/mvnw | 620 ++++---- payment-service/mvnw.cmd | 364 ++--- payment-service/pom.xml | 230 +-- .../app/PaymentServiceApplication.java | 70 +- .../app/config/client/ClientConfig.java | 58 +- .../app/config/mapper/MapperConfig.java | 62 +- .../selimhorri/app/constant/AppConstant.java | 96 +- .../app/domain/AbstractMappedEntity.java | 96 +- .../com/selimhorri/app/domain/Payment.java | 112 +- .../selimhorri/app/domain/PaymentStatus.java | 32 +- .../java/com/selimhorri/app/dto/OrderDto.java | 98 +- .../com/selimhorri/app/dto/PaymentDto.java | 82 +- .../collection/DtoCollectionResponse.java | 56 +- .../app/exception/ApiExceptionHandler.java | 146 +- .../app/exception/payload/ExceptionMsg.java | 96 +- .../wrapper/PaymentNotFoundException.java | 70 +- .../app/helper/PaymentMappingHelper.java | 84 +- .../app/repository/PaymentRepository.java | 22 +- .../app/resource/PaymentResource.java | 168 +-- .../app/service/PaymentService.java | 30 +- .../app/service/impl/PaymentServiceImpl.java | 180 +-- .../src/main/resources/application-dev.yml | 94 +- .../src/main/resources/application-prod.yml | 86 +- .../src/main/resources/application-stage.yml | 86 +- .../src/main/resources/application.yml | 109 +- .../migration/V1__create_payments_table.sql | 20 +- .../migration/V2__insert_payments_table.sql | 16 +- .../app/PaymentServiceApplicationTests.java | 32 +- pom.xml | 258 ++-- product-service/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- product-service/Dockerfile | 24 +- product-service/compose.yml | 24 +- product-service/mvnw | 620 ++++---- product-service/mvnw.cmd | 364 ++--- product-service/pom.xml | 238 ++-- .../app/ProductServiceApplication.java | 46 +- .../app/config/client/ClientConfig.java | 58 +- .../app/config/mapper/MapperConfig.java | 62 +- .../selimhorri/app/constant/AppConstant.java | 96 +- .../app/domain/AbstractMappedEntity.java | 96 +- .../com/selimhorri/app/domain/Category.java | 140 +- .../com/selimhorri/app/domain/Product.java | 132 +- .../com/selimhorri/app/dto/CategoryDto.java | 94 +- .../com/selimhorri/app/dto/ProductDto.java | 84 +- .../collection/DtoCollectionResponse.java | 56 +- .../app/exception/ApiExceptionHandler.java | 148 +- .../app/exception/payload/ExceptionMsg.java | 96 +- .../wrapper/CategoryNotFoundException.java | 70 +- .../wrapper/ProductNotFoundException.java | 70 +- .../app/helper/CategoryMappingHelper.java | 116 +- .../app/helper/ProductMappingHelper.java | 112 +- .../app/repository/CategoryRepository.java | 22 +- .../app/repository/ProductRepository.java | 22 +- .../app/resource/CategoryResource.java | 192 +-- .../app/resource/ProductResource.java | 192 +-- .../app/service/CategoryService.java | 32 +- .../app/service/ProductService.java | 32 +- .../app/service/impl/CategoryServiceImpl.java | 166 +-- .../app/service/impl/ProductServiceImpl.java | 168 +-- .../src/main/resources/application-dev.yml | 94 +- .../src/main/resources/application-prod.yml | 86 +- .../src/main/resources/application-stage.yml | 86 +- .../src/main/resources/application.yml | 90 +- .../migration/V1__create_categories_table.sql | 20 +- .../migration/V2__insert_categories_table.sql | 14 +- .../migration/V3__create_products_table.sql | 26 +- .../migration/V4__insert_products_table.sql | 16 +- ...reate_categories_parent_category_id_fk.sql | 6 +- .../V6__create_products_category_id_fk.sql | 6 +- .../app/ProductServiceApplicationTests.java | 32 +- proxy-client/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- proxy-client/Dockerfile | 24 +- proxy-client/compose.yml | 24 +- proxy-client/mvnw | 620 ++++---- proxy-client/mvnw.cmd | 364 ++--- proxy-client/pom.xml | 234 ++-- .../app/ProxyClientApplication.java | 58 +- .../controller/AuthenticationController.java | 112 +- .../model/request/AuthenticationRequest.java | 74 +- .../response/AuthenticationResponse.java | 58 +- .../auth/service/AuthenticationService.java | 22 +- .../impl/AuthenticationServiceImpl.java | 122 +- .../service/impl/UserDetailsServiceImpl.java | 84 +- .../controller/FavouriteController.java | 164 +-- .../favourite/model/FavouriteDto.java | 130 +- .../business/favourite/model/FavouriteId.java | 104 +- .../business/favourite/model/ProductDto.java | 82 +- .../app/business/favourite/model/UserDto.java | 82 +- ...FavouriteServiceCollectionDtoResponse.java | 44 +- .../service/FavouriteClientService.java | 142 +- .../order/controller/CartController.java | 156 +-- .../order/controller/OrderController.java | 156 +-- .../app/business/order/model/CartDto.java | 86 +- .../app/business/order/model/OrderDto.java | 112 +- .../app/business/order/model/UserDto.java | 84 +- ...CartOrderServiceDtoCollectionResponse.java | 44 +- ...rderOrderServiceDtoCollectionResponse.java | 44 +- .../order/service/CartClientService.java | 130 +- .../order/service/OrderClientService.java | 130 +- .../controller/OrderItemController.java | 164 +-- .../business/orderItem/model/OrderDto.java | 110 +- .../orderItem/model/OrderItemDto.java | 88 +- .../business/orderItem/model/OrderItemId.java | 58 +- .../business/orderItem/model/ProductDto.java | 82 +- ...OrderItemServiceDtoCollectionResponse.java | 44 +- .../service/OrderItemClientService.java | 138 +- .../payment/controller/PaymentController.java | 126 +- .../app/business/payment/model/OrderDto.java | 98 +- .../business/payment/model/PaymentDto.java | 80 +- .../business/payment/model/PaymentStatus.java | 32 +- ...ntPaymentServiceDtoCollectionResponse.java | 44 +- .../payment/service/PaymentClientService.java | 112 +- .../controller/CategoryController.java | 138 +- .../product/controller/ProductController.java | 138 +- .../business/product/model/CategoryDto.java | 94 +- .../business/product/model/ProductDto.java | 84 +- ...ryProductServiceCollectionDtoResponse.java | 44 +- ...ctProductServiceCollectionDtoResponse.java | 44 +- .../service/CategoryClientService.java | 130 +- .../product/service/ProductClientService.java | 130 +- .../user/controller/AddressController.java | 136 +- .../user/controller/CredentialController.java | 146 +- .../user/controller/UserController.java | 146 +- .../VerificationTokenController.java | 136 +- .../app/business/user/model/AddressDto.java | 88 +- .../business/user/model/CredentialDto.java | 86 +- .../user/model/RoleBasedAuthority.java | 30 +- .../business/user/model/UserDetailsImpl.java | 130 +- .../app/business/user/model/UserDto.java | 88 +- .../user/model/VerificationTokenDto.java | 90 +- ...dressUserServiceCollectionDtoResponse.java | 44 +- ...ntialUserServiceCollectionDtoResponse.java | 44 +- .../UserUserServiceCollectionDtoResponse.java | 44 +- ...UserTokenServiceCollectionDtoResponse.java | 44 +- .../user/service/AddressClientService.java | 128 +- .../user/service/CredentialClientService.java | 140 +- .../user/service/UserClientService.java | 140 +- .../VerificationTokenClientService.java | 128 +- .../app/config/encoder/EncoderConfig.java | 52 +- .../app/config/filter/JwtRequestFilter.java | 152 +- .../app/config/template/TemplateConfig.java | 58 +- .../selimhorri/app/constant/AppConstant.java | 96 +- .../app/exception/ApiExceptionHandler.java | 202 +-- .../app/exception/payload/ExceptionMsg.java | 100 +- .../wrapper/CredentialNotFoundException.java | 70 +- .../wrapper/FavouriteNotFoundException.java | 70 +- ...galAuthenticationCredentialsException.java | 70 +- .../wrapper/UserObjectNotFoundException.java | 70 +- .../VerificationTokenNotFoundException.java | 70 +- .../app/jwt/service/JwtService.java | 56 +- .../app/jwt/service/impl/JwtServiceImpl.java | 130 +- .../com/selimhorri/app/jwt/util/JwtUtil.java | 36 +- .../app/jwt/util/impl/JwtUtilImpl.java | 164 +-- .../app/security/SecurityConfig.java | 166 +-- .../src/main/resources/application-dev.yml | 50 +- .../src/main/resources/application-prod.yml | 56 +- .../src/main/resources/application-stage.yml | 56 +- .../src/main/resources/application.yml | 90 +- .../app/ProxyClientApplicationTests.java | 20 +- service-discovery/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- service-discovery/Dockerfile | 24 +- service-discovery/compose.yml | 24 +- service-discovery/mvnw | 620 ++++---- service-discovery/mvnw.cmd | 364 ++--- service-discovery/pom.xml | 112 +- .../app/ServiceDiscoveryApplication.java | 48 +- .../src/main/resources/application-dev.yml | 60 +- .../src/main/resources/application-prod.yml | 56 +- .../src/main/resources/application-stage.yml | 56 +- .../src/main/resources/application.yml | 78 +- .../app/ServiceDiscoveryApplicationTests.java | 32 +- shipping-service/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- shipping-service/Dockerfile | 24 +- shipping-service/compose.yml | 24 +- shipping-service/mvnw | 620 ++++---- shipping-service/mvnw.cmd | 364 ++--- shipping-service/pom.xml | 240 ++-- .../app/ShippingServiceApplication.java | 70 +- .../app/config/client/ClientConfig.java | 58 +- .../app/config/mapper/MapperConfig.java | 62 +- .../selimhorri/app/constant/AppConstant.java | 96 +- .../app/domain/AbstractMappedEntity.java | 96 +- .../com/selimhorri/app/domain/OrderItem.java | 104 +- .../selimhorri/app/domain/id/OrderItemId.java | 58 +- .../java/com/selimhorri/app/dto/OrderDto.java | 110 +- .../com/selimhorri/app/dto/OrderItemDto.java | 88 +- .../com/selimhorri/app/dto/ProductDto.java | 82 +- .../collection/DtoCollectionResponse.java | 56 +- .../app/exception/ApiExceptionHandler.java | 142 +- .../app/exception/payload/ExceptionMsg.java | 96 +- .../wrapper/OrderItemNotFoundException.java | 70 +- .../app/helper/OrderItemMappingHelper.java | 92 +- .../app/repository/OrderItemRepository.java | 24 +- .../app/resource/OrderItemResource.java | 210 +-- .../app/service/OrderItemService.java | 32 +- .../service/impl/OrderItemServiceImpl.java | 192 +-- .../src/main/resources/application-dev.yml | 94 +- .../src/main/resources/application-prod.yml | 86 +- .../src/main/resources/application-stage.yml | 86 +- .../src/main/resources/application.yml | 90 +- .../V1__create_order_items_table.sql | 20 +- .../V2__insert_order_items_table.sql | 16 +- .../app/ShippingServiceApplicationTests.java | 32 +- ...ceMicroserviceBackendApplicationTests.java | 20 +- user-service/.gitignore | 66 +- .../.mvn/wrapper/MavenWrapperDownloader.java | 234 ++-- .../.mvn/wrapper/maven-wrapper.properties | 4 +- user-service/Dockerfile | 24 +- user-service/compose.yml | 24 +- user-service/mvnw | 620 ++++---- user-service/mvnw.cmd | 364 ++--- user-service/pom.xml | 236 ++-- .../app/UserServiceApplication.java | 46 +- .../app/config/client/ClientConfig.java | 58 +- .../app/config/mapper/MapperConfig.java | 62 +- .../selimhorri/app/constant/AppConstant.java | 96 +- .../app/domain/AbstractMappedEntity.java | 96 +- .../com/selimhorri/app/domain/Address.java | 116 +- .../com/selimhorri/app/domain/Credential.java | 162 +-- .../app/domain/RoleBasedAuthority.java | 30 +- .../java/com/selimhorri/app/domain/User.java | 146 +- .../app/domain/VerificationToken.java | 130 +- .../com/selimhorri/app/dto/AddressDto.java | 88 +- .../com/selimhorri/app/dto/CredentialDto.java | 114 +- .../java/com/selimhorri/app/dto/UserDto.java | 104 +- .../app/dto/VerificationTokenDto.java | 100 +- .../collection/DtoCollectionResponse.java | 56 +- .../app/exception/ApiExceptionHandler.java | 156 +-- .../app/exception/payload/ExceptionMsg.java | 94 +- .../wrapper/AddressNotFoundException.java | 50 +- .../wrapper/CredentialNotFoundException.java | 70 +- .../wrapper/UserObjectNotFoundException.java | 70 +- .../VerificationTokenNotFoundException.java | 70 +- .../app/helper/AddressMappingHelper.java | 116 +- .../app/helper/CredentialMappingHelper.java | 124 +- .../app/helper/UserMappingHelper.java | 124 +- .../VerificationTokenMappingHelper.java | 112 +- .../app/repository/AddressRepository.java | 22 +- .../app/repository/CredentialRepository.java | 26 +- .../app/repository/UserRepository.java | 26 +- .../VerificationTokenRepository.java | 22 +- .../app/resource/AddressResource.java | 190 +-- .../app/resource/CredentialResource.java | 214 +-- .../selimhorri/app/resource/UserResource.java | 206 +-- .../resource/VerificationTokenResource.java | 194 +-- .../app/service/AddressService.java | 32 +- .../app/service/CredentialService.java | 54 +- .../selimhorri/app/service/UserService.java | 54 +- .../app/service/VerificationTokenService.java | 52 +- .../app/service/impl/AddressServiceImpl.java | 164 +-- .../service/impl/CredentialServiceImpl.java | 178 +-- .../app/service/impl/UserServiceImpl.java | 178 +-- .../impl/VerificationTokenServiceImpl.java | 170 +-- .../src/main/resources/application-dev.yml | 94 +- .../src/main/resources/application-prod.yml | 86 +- .../src/main/resources/application-stage.yml | 86 +- .../src/main/resources/application.yml | 90 +- .../V10__create_credentials_user_id_fk.sql | 6 +- ...e_verification_tokens_credential_id_fk.sql | 6 +- .../db/migration/V1__create_users_table.sql | 28 +- .../db/migration/V2__insert_users_table.sql | 18 +- .../db/migration/V3__create_address_table.sql | 24 +- .../db/migration/V4__insert_address_table.sql | 22 +- .../V5__create_credentials_table.sql | 30 +- .../V6__insert_credentials_table.sql | 16 +- .../V7__create_verification_tokens_table.sql | 20 +- .../V8__insert_verification_tokens_table.sql | 16 +- .../V9__create_address_user_id_fk.sql | 6 +- .../app/UserServiceApplicationTests.java | 32 +- 454 files changed, 23753 insertions(+), 23646 deletions(-) create mode 100644 core.yml diff --git a/.gitattributes b/.gitattributes index 5ddd2a511..ca02a0960 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,14 +1,14 @@ - -*.sql linguist-detectable=true -*.sql linguist-language=sql -*.yml linguist-detectable=true -*.yml linguist-language=yml -*.yaml linguist-detectable=true -*.yaml linguist-language=yaml -*.json linguist-detectable=true -*.json linguist-language=json -*.xml linguist-detectable=true -*.xml linguist-language=xml - - - + +*.sql linguist-detectable=true +*.sql linguist-language=sql +*.yml linguist-detectable=true +*.yml linguist-language=yml +*.yaml linguist-detectable=true +*.yaml linguist-language=yaml +*.json linguist-detectable=true +*.json linguist-language=json +*.xml linguist-detectable=true +*.xml linguist-language=xml + + + diff --git a/.github/workflows/api-gateway-pipeline-dev-pr.yml b/.github/workflows/api-gateway-pipeline-dev-pr.yml index 80e0836c5..cae993db3 100644 --- a/.github/workflows/api-gateway-pipeline-dev-pr.yml +++ b/.github/workflows/api-gateway-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Develop, on PR Java CI/CD of api-gateway, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Develop, on PR Java CI/CD of api-gateway, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/api-gateway-pipeline-dev-push.yml b/.github/workflows/api-gateway-pipeline-dev-push.yml index 7650bf445..404872f72 100644 --- a/.github/workflows/api-gateway-pipeline-dev-push.yml +++ b/.github/workflows/api-gateway-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Develop, on PUSH Java CI/CD of api-gateway-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for api-gateway-ecommerce-boot Microservice - run: docker build -f api-gateway/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push api-gateway-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Develop, on PUSH Java CI/CD of api-gateway-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for api-gateway-ecommerce-boot Microservice + run: docker build -f api-gateway/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push api-gateway-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/api-gateway-pipeline-prod-pr.yml b/.github/workflows/api-gateway-pipeline-prod-pr.yml index 97b059d5f..b89621f02 100644 --- a/.github/workflows/api-gateway-pipeline-prod-pr.yml +++ b/.github/workflows/api-gateway-pipeline-prod-pr.yml @@ -1,21 +1,21 @@ - -name: Prod, on PR Java CI/CD of api-gateway, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Prod, on PR Java CI/CD of api-gateway, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/api-gateway-pipeline-prod-push.yml b/.github/workflows/api-gateway-pipeline-prod-push.yml index f5a06db5d..ece9afeca 100644 --- a/.github/workflows/api-gateway-pipeline-prod-push.yml +++ b/.github/workflows/api-gateway-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of api-gateway-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for api-gateway-ecommerce-boot Microservice - run: docker build -f api-gateway/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push api-gateway-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Prod, on PUSH Java CI/CD of api-gateway-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for api-gateway-ecommerce-boot Microservice + run: docker build -f api-gateway/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push api-gateway-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/api-gateway-pipeline-stage-pr.yml b/.github/workflows/api-gateway-pipeline-stage-pr.yml index ca12270d8..0a1cda487 100644 --- a/.github/workflows/api-gateway-pipeline-stage-pr.yml +++ b/.github/workflows/api-gateway-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of api-gateway, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of api-gateway, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/api-gateway-pipeline-stage-push.yml b/.github/workflows/api-gateway-pipeline-stage-push.yml index 5fed6b320..9a9374e43 100644 --- a/.github/workflows/api-gateway-pipeline-stage-push.yml +++ b/.github/workflows/api-gateway-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Stage, on PUSH Java CI/CD of api-gateway-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for api-gateway-ecommerce-boot Microservice - run: docker build -f api-gateway/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push api-gateway-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Stage, on PUSH Java CI/CD of api-gateway-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for api-gateway-ecommerce-boot Microservice + run: docker build -f api-gateway/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push api-gateway-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/api-gateway-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.github/workflows/cloud-config-pipeline-dev-pr.yml b/.github/workflows/cloud-config-pipeline-dev-pr.yml index ce6e97bc0..f3b47e4b4 100644 --- a/.github/workflows/cloud-config-pipeline-dev-pr.yml +++ b/.github/workflows/cloud-config-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of cloud-gateway, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of cloud-gateway, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/cloud-config-pipeline-dev-push.yml b/.github/workflows/cloud-config-pipeline-dev-push.yml index 242318ae2..89cd5c502 100644 --- a/.github/workflows/cloud-config-pipeline-dev-push.yml +++ b/.github/workflows/cloud-config-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of cloud-config-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for cloud-config-ecommerce-boot Microservice - run: docker build -f cloud-config/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push cloud-config-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Prod, on PUSH Java CI/CD of cloud-config-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for cloud-config-ecommerce-boot Microservice + run: docker build -f cloud-config/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push cloud-config-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/cloud-config-pipeline-prod-pr.yml b/.github/workflows/cloud-config-pipeline-prod-pr.yml index db0e6313e..457af1d1f 100644 --- a/.github/workflows/cloud-config-pipeline-prod-pr.yml +++ b/.github/workflows/cloud-config-pipeline-prod-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of cloud-gateway, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of cloud-gateway, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/cloud-config-pipeline-prod-push.yml b/.github/workflows/cloud-config-pipeline-prod-push.yml index 2869ddf96..224e45c26 100644 --- a/.github/workflows/cloud-config-pipeline-prod-push.yml +++ b/.github/workflows/cloud-config-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of cloud-config-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for cloud-config-ecommerce-boot Microservice - run: docker build -f cloud-config/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push cloud-config-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Prod, on PUSH Java CI/CD of cloud-config-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for cloud-config-ecommerce-boot Microservice + run: docker build -f cloud-config/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push cloud-config-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/cloud-config-pipeline-stage-pr.yml b/.github/workflows/cloud-config-pipeline-stage-pr.yml index f448bb16d..d146c6f57 100644 --- a/.github/workflows/cloud-config-pipeline-stage-pr.yml +++ b/.github/workflows/cloud-config-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of cloud-gateway, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of cloud-gateway, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/cloud-config-pipeline-stage-push.yml b/.github/workflows/cloud-config-pipeline-stage-push.yml index 962bb4a8a..4894d6708 100644 --- a/.github/workflows/cloud-config-pipeline-stage-push.yml +++ b/.github/workflows/cloud-config-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of cloud-config-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for cloud-config-ecommerce-boot Microservice - run: docker build -f cloud-config/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push cloud-config-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Prod, on PUSH Java CI/CD of cloud-config-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for cloud-config-ecommerce-boot Microservice + run: docker build -f cloud-config/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push cloud-config-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/cloud-config-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.github/workflows/favourite-service-pipeline-dev-pr.yml b/.github/workflows/favourite-service-pipeline-dev-pr.yml index d075c7092..8bee8debf 100644 --- a/.github/workflows/favourite-service-pipeline-dev-pr.yml +++ b/.github/workflows/favourite-service-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of favourite-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of favourite-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/favourite-service-pipeline-dev-push.yml b/.github/workflows/favourite-service-pipeline-dev-push.yml index e40742278..4204e06e6 100644 --- a/.github/workflows/favourite-service-pipeline-dev-push.yml +++ b/.github/workflows/favourite-service-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of favourite-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for favourite-service-ecommerce-boot Microservice - run: docker build -f favourite-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push favourite-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Prod, on PUSH Java CI/CD of favourite-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for favourite-service-ecommerce-boot Microservice + run: docker build -f favourite-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push favourite-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/favourite-service-pipeline-prod-pr.yml b/.github/workflows/favourite-service-pipeline-prod-pr.yml index d650ed18c..96d0f26ec 100644 --- a/.github/workflows/favourite-service-pipeline-prod-pr.yml +++ b/.github/workflows/favourite-service-pipeline-prod-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of favourite-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of favourite-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/favourite-service-pipeline-prod-push.yml b/.github/workflows/favourite-service-pipeline-prod-push.yml index 9402e25a0..64c3edf72 100644 --- a/.github/workflows/favourite-service-pipeline-prod-push.yml +++ b/.github/workflows/favourite-service-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of favourite-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for favourite-service-ecommerce-boot Microservice - run: docker build -f favourite-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push favourite-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Prod, on PUSH Java CI/CD of favourite-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for favourite-service-ecommerce-boot Microservice + run: docker build -f favourite-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push favourite-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/favourite-service-pipeline-stage-pr.yml b/.github/workflows/favourite-service-pipeline-stage-pr.yml index cb9a5090d..aa647791e 100644 --- a/.github/workflows/favourite-service-pipeline-stage-pr.yml +++ b/.github/workflows/favourite-service-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of favourite-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of favourite-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/favourite-service-pipeline-stage-push.yml b/.github/workflows/favourite-service-pipeline-stage-push.yml index 072304cc9..f64264f56 100644 --- a/.github/workflows/favourite-service-pipeline-stage-push.yml +++ b/.github/workflows/favourite-service-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of favourite-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for favourite-service-ecommerce-boot Microservice - run: docker build -f favourite-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push favourite-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Prod, on PUSH Java CI/CD of favourite-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for favourite-service-ecommerce-boot Microservice + run: docker build -f favourite-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push favourite-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/favourite-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.github/workflows/order-service-pipeline-dev-pr.yml b/.github/workflows/order-service-pipeline-dev-pr.yml index 82ab25df6..5eb1ef542 100644 --- a/.github/workflows/order-service-pipeline-dev-pr.yml +++ b/.github/workflows/order-service-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of order-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of order-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/order-service-pipeline-dev-push.yml b/.github/workflows/order-service-pipeline-dev-push.yml index d7731fec4..42161e4e5 100644 --- a/.github/workflows/order-service-pipeline-dev-push.yml +++ b/.github/workflows/order-service-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of order-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for order-service-ecommerce-boot Microservice - run: docker build -f order-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push order-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Prod, on PUSH Java CI/CD of order-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for order-service-ecommerce-boot Microservice + run: docker build -f order-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push order-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/order-service-pipeline-prod-pr.yml b/.github/workflows/order-service-pipeline-prod-pr.yml index a86b3ff57..988ee43c1 100644 --- a/.github/workflows/order-service-pipeline-prod-pr.yml +++ b/.github/workflows/order-service-pipeline-prod-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of order-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of order-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/order-service-pipeline-prod-push.yml b/.github/workflows/order-service-pipeline-prod-push.yml index 855ec8ea8..c88ee94f8 100644 --- a/.github/workflows/order-service-pipeline-prod-push.yml +++ b/.github/workflows/order-service-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of order-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for order-service-ecommerce-boot Microservice - run: docker build -f order-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push order-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Prod, on PUSH Java CI/CD of order-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for order-service-ecommerce-boot Microservice + run: docker build -f order-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push order-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/order-service-pipeline-stage-pr.yml b/.github/workflows/order-service-pipeline-stage-pr.yml index 46ef07c6a..b6059cbba 100644 --- a/.github/workflows/order-service-pipeline-stage-pr.yml +++ b/.github/workflows/order-service-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of order-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of order-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/order-service-pipeline-stage-push.yml b/.github/workflows/order-service-pipeline-stage-push.yml index 34d3ef1a8..78d3a4939 100644 --- a/.github/workflows/order-service-pipeline-stage-push.yml +++ b/.github/workflows/order-service-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of order-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for order-service-ecommerce-boot Microservice - run: docker build -f order-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push order-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Prod, on PUSH Java CI/CD of order-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for order-service-ecommerce-boot Microservice + run: docker build -f order-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push order-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/order-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.github/workflows/payment-service-pipeline-dev-pr.yml b/.github/workflows/payment-service-pipeline-dev-pr.yml index 49242655b..9aa975107 100644 --- a/.github/workflows/payment-service-pipeline-dev-pr.yml +++ b/.github/workflows/payment-service-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of payment-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of payment-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/payment-service-pipeline-dev-push.yml b/.github/workflows/payment-service-pipeline-dev-push.yml index 6800aec86..237a34140 100644 --- a/.github/workflows/payment-service-pipeline-dev-push.yml +++ b/.github/workflows/payment-service-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of payment-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for payment-service-ecommerce-boot Microservice - run: docker build -f payment-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push payment-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Prod, on PUSH Java CI/CD of payment-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for payment-service-ecommerce-boot Microservice + run: docker build -f payment-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push payment-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/payment-service-pipeline-prod-pr.yml b/.github/workflows/payment-service-pipeline-prod-pr.yml index e9ea6f92d..5a28db29d 100644 --- a/.github/workflows/payment-service-pipeline-prod-pr.yml +++ b/.github/workflows/payment-service-pipeline-prod-pr.yml @@ -1,22 +1,22 @@ - -name: Stage, on PR Java CI/CD of payment-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of payment-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + \ No newline at end of file diff --git a/.github/workflows/payment-service-pipeline-prod-push.yml b/.github/workflows/payment-service-pipeline-prod-push.yml index 5f6456ffa..cc9243cf5 100644 --- a/.github/workflows/payment-service-pipeline-prod-push.yml +++ b/.github/workflows/payment-service-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of payment-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for payment-service-ecommerce-boot Microservice - run: docker build -f payment-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push payment-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Prod, on PUSH Java CI/CD of payment-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for payment-service-ecommerce-boot Microservice + run: docker build -f payment-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push payment-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/payment-service-pipeline-stage-pr.yml b/.github/workflows/payment-service-pipeline-stage-pr.yml index 3b9e3ade3..a87333029 100644 --- a/.github/workflows/payment-service-pipeline-stage-pr.yml +++ b/.github/workflows/payment-service-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of payment-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of payment-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/payment-service-pipeline-stage-push.yml b/.github/workflows/payment-service-pipeline-stage-push.yml index b966416e0..74880bd45 100644 --- a/.github/workflows/payment-service-pipeline-stage-push.yml +++ b/.github/workflows/payment-service-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of payment-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for payment-service-ecommerce-boot Microservice - run: docker build -f payment-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push payment-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Prod, on PUSH Java CI/CD of payment-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for payment-service-ecommerce-boot Microservice + run: docker build -f payment-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push payment-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/payment-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.github/workflows/product-service-pipeline-dev-pr.yml b/.github/workflows/product-service-pipeline-dev-pr.yml index 27abf9d42..67e230402 100644 --- a/.github/workflows/product-service-pipeline-dev-pr.yml +++ b/.github/workflows/product-service-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of product-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of product-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/product-service-pipeline-dev-push.yml b/.github/workflows/product-service-pipeline-dev-push.yml index 33b639efa..5a3ba19bd 100644 --- a/.github/workflows/product-service-pipeline-dev-push.yml +++ b/.github/workflows/product-service-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of product-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for product-service-ecommerce-boot Microservice - run: docker build -f product-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push product-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Prod, on PUSH Java CI/CD of product-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for product-service-ecommerce-boot Microservice + run: docker build -f product-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push product-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/product-service-pipeline-prod-pr.yml b/.github/workflows/product-service-pipeline-prod-pr.yml index 0715d8c69..8ba90d3c6 100644 --- a/.github/workflows/product-service-pipeline-prod-pr.yml +++ b/.github/workflows/product-service-pipeline-prod-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of product-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of product-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/product-service-pipeline-prod-push.yml b/.github/workflows/product-service-pipeline-prod-push.yml index 2f21434ec..027be1234 100644 --- a/.github/workflows/product-service-pipeline-prod-push.yml +++ b/.github/workflows/product-service-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of product-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for product-service-ecommerce-boot Microservice - run: docker build -f product-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push product-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Prod, on PUSH Java CI/CD of product-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for product-service-ecommerce-boot Microservice + run: docker build -f product-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push product-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/product-service-pipeline-stage-pr.yml b/.github/workflows/product-service-pipeline-stage-pr.yml index 95e6e7036..561de34dc 100644 --- a/.github/workflows/product-service-pipeline-stage-pr.yml +++ b/.github/workflows/product-service-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of product-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of product-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/product-service-pipeline-stage-push.yml b/.github/workflows/product-service-pipeline-stage-push.yml index 9d2f31c03..999a7ca15 100644 --- a/.github/workflows/product-service-pipeline-stage-push.yml +++ b/.github/workflows/product-service-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of product-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for product-service-ecommerce-boot Microservice - run: docker build -f product-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push product-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Prod, on PUSH Java CI/CD of product-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for product-service-ecommerce-boot Microservice + run: docker build -f product-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push product-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/product-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.github/workflows/proxy-client-pipeline-dev-pr.yml b/.github/workflows/proxy-client-pipeline-dev-pr.yml index 432181a62..0f6661dc3 100644 --- a/.github/workflows/proxy-client-pipeline-dev-pr.yml +++ b/.github/workflows/proxy-client-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Develop, on PR Java CI/CD of proxy-client, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Develop, on PR Java CI/CD of proxy-client, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/proxy-client-pipeline-dev-push.yml b/.github/workflows/proxy-client-pipeline-dev-push.yml index 3ccf5b788..a348d9bab 100644 --- a/.github/workflows/proxy-client-pipeline-dev-push.yml +++ b/.github/workflows/proxy-client-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Develop, on PUSH Java CI/CD of proxy-client-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for proxy-client-ecommerce-boot Microservice - run: docker build -f proxy-client/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push proxy-client-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Develop, on PUSH Java CI/CD of proxy-client-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for proxy-client-ecommerce-boot Microservice + run: docker build -f proxy-client/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push proxy-client-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/proxy-client-pipeline-prod-pr.yml b/.github/workflows/proxy-client-pipeline-prod-pr.yml index a427fc571..fcb3bfe5e 100644 --- a/.github/workflows/proxy-client-pipeline-prod-pr.yml +++ b/.github/workflows/proxy-client-pipeline-prod-pr.yml @@ -1,21 +1,21 @@ - -name: Develop, on PR Java CI/CD of proxy-client, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Develop, on PR Java CI/CD of proxy-client, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/proxy-client-pipeline-prod-push.yml b/.github/workflows/proxy-client-pipeline-prod-push.yml index 21667eb9d..bfc2bf3fe 100644 --- a/.github/workflows/proxy-client-pipeline-prod-push.yml +++ b/.github/workflows/proxy-client-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Develop, on PUSH Java CI/CD of proxy-client-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for proxy-client-ecommerce-boot Microservice - run: docker build -f proxy-client/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push proxy-client-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Develop, on PUSH Java CI/CD of proxy-client-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for proxy-client-ecommerce-boot Microservice + run: docker build -f proxy-client/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push proxy-client-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/proxy-client-pipeline-stage-pr.yml b/.github/workflows/proxy-client-pipeline-stage-pr.yml index a942ad7fc..30fe4a44a 100644 --- a/.github/workflows/proxy-client-pipeline-stage-pr.yml +++ b/.github/workflows/proxy-client-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Develop, on PR Java CI/CD of proxy-client, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Develop, on PR Java CI/CD of proxy-client, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/proxy-client-pipeline-stage-push.yml b/.github/workflows/proxy-client-pipeline-stage-push.yml index 5bd23a72f..b4da58da8 100644 --- a/.github/workflows/proxy-client-pipeline-stage-push.yml +++ b/.github/workflows/proxy-client-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Develop, on PUSH Java CI/CD of proxy-client-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for proxy-client-ecommerce-boot Microservice - run: docker build -f proxy-client/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push proxy-client-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Develop, on PUSH Java CI/CD of proxy-client-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for proxy-client-ecommerce-boot Microservice + run: docker build -f proxy-client/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push proxy-client-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/proxy-client-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.github/workflows/service-discovery-pipeline-dev-pr.yml b/.github/workflows/service-discovery-pipeline-dev-pr.yml index c2ea3c005..eb0cfa114 100644 --- a/.github/workflows/service-discovery-pipeline-dev-pr.yml +++ b/.github/workflows/service-discovery-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Develop, on PR Java CI/CD of service-discovery, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Develop, on PR Java CI/CD of service-discovery, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/service-discovery-pipeline-dev-push.yml b/.github/workflows/service-discovery-pipeline-dev-push.yml index ff37dad98..ac7ef13a2 100644 --- a/.github/workflows/service-discovery-pipeline-dev-push.yml +++ b/.github/workflows/service-discovery-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Develop, on PUSH Java CI/CD of service-discovery-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for service-discovery-ecommerce-boot Microservice - run: docker build -f service-discovery/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push service-discovery-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Develop, on PUSH Java CI/CD of service-discovery-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for service-discovery-ecommerce-boot Microservice + run: docker build -f service-discovery/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push service-discovery-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/service-discovery-pipeline-prod-pr.yml b/.github/workflows/service-discovery-pipeline-prod-pr.yml index d98d1493f..3db38fda4 100644 --- a/.github/workflows/service-discovery-pipeline-prod-pr.yml +++ b/.github/workflows/service-discovery-pipeline-prod-pr.yml @@ -1,21 +1,21 @@ - -name: Prod, on PR Java CI/CD of service-discovery, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Prod, on PR Java CI/CD of service-discovery, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/service-discovery-pipeline-prod-push.yml b/.github/workflows/service-discovery-pipeline-prod-push.yml index c80f9b275..038f0832b 100644 --- a/.github/workflows/service-discovery-pipeline-prod-push.yml +++ b/.github/workflows/service-discovery-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Prod, on PUSH Java CI/CD of service-discovery-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for service-discovery-ecommerce-boot Microservice - run: docker build -f service-discovery/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push service-discovery-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Prod, on PUSH Java CI/CD of service-discovery-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for service-discovery-ecommerce-boot Microservice + run: docker build -f service-discovery/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push service-discovery-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/service-discovery-pipeline-stage-pr.yml b/.github/workflows/service-discovery-pipeline-stage-pr.yml index 3b2f70c7c..29c303a90 100644 --- a/.github/workflows/service-discovery-pipeline-stage-pr.yml +++ b/.github/workflows/service-discovery-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of service-discovery, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of service-discovery, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/service-discovery-pipeline-stage-push.yml b/.github/workflows/service-discovery-pipeline-stage-push.yml index e490365ce..cfb8195cb 100644 --- a/.github/workflows/service-discovery-pipeline-stage-push.yml +++ b/.github/workflows/service-discovery-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Stage, on PUSH Java CI/CD of service-discovery-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for service-discovery-ecommerce-boot Microservice - run: docker build -f service-discovery/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push service-discovery-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Stage, on PUSH Java CI/CD of service-discovery-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for service-discovery-ecommerce-boot Microservice + run: docker build -f service-discovery/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push service-discovery-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/service-discovery-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.github/workflows/shipping-service-pipeline-dev-pr.yml b/.github/workflows/shipping-service-pipeline-dev-pr.yml index 9cd3ec44a..beeb66bb8 100644 --- a/.github/workflows/shipping-service-pipeline-dev-pr.yml +++ b/.github/workflows/shipping-service-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of shipping-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of shipping-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/shipping-service-pipeline-dev-push.yml b/.github/workflows/shipping-service-pipeline-dev-push.yml index 5dc801ff5..902f62633 100644 --- a/.github/workflows/shipping-service-pipeline-dev-push.yml +++ b/.github/workflows/shipping-service-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Stage, on PUSH Java CI/CD of shipping-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for shipping-service-ecommerce-boot Microservice - run: docker build -f shipping-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push shipping-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Stage, on PUSH Java CI/CD of shipping-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for shipping-service-ecommerce-boot Microservice + run: docker build -f shipping-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push shipping-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/shipping-service-pipeline-prod-pr.yml b/.github/workflows/shipping-service-pipeline-prod-pr.yml index 7c22bae52..a3c57d0be 100644 --- a/.github/workflows/shipping-service-pipeline-prod-pr.yml +++ b/.github/workflows/shipping-service-pipeline-prod-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of shipping-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of shipping-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/shipping-service-pipeline-prod-push.yml b/.github/workflows/shipping-service-pipeline-prod-push.yml index 3e07b4f28..a2b70ffbb 100644 --- a/.github/workflows/shipping-service-pipeline-prod-push.yml +++ b/.github/workflows/shipping-service-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Stage, on PUSH Java CI/CD of shipping-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for shipping-service-ecommerce-boot Microservice - run: docker build -f shipping-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push shipping-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Stage, on PUSH Java CI/CD of shipping-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for shipping-service-ecommerce-boot Microservice + run: docker build -f shipping-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push shipping-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/shipping-service-pipeline-stage-pr.yml b/.github/workflows/shipping-service-pipeline-stage-pr.yml index 2447a0b9a..5663bb9aa 100644 --- a/.github/workflows/shipping-service-pipeline-stage-pr.yml +++ b/.github/workflows/shipping-service-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of shipping-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of shipping-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/shipping-service-pipeline-stage-push.yml b/.github/workflows/shipping-service-pipeline-stage-push.yml index 6c4ec225c..57f03f1ac 100644 --- a/.github/workflows/shipping-service-pipeline-stage-push.yml +++ b/.github/workflows/shipping-service-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Stage, on PUSH Java CI/CD of shipping-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for shipping-service-ecommerce-boot Microservice - run: docker build -f shipping-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push shipping-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Stage, on PUSH Java CI/CD of shipping-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for shipping-service-ecommerce-boot Microservice + run: docker build -f shipping-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push shipping-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/shipping-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.github/workflows/user-service-pipeline-dev-pr.yml b/.github/workflows/user-service-pipeline-dev-pr.yml index d271f8642..282f80301 100644 --- a/.github/workflows/user-service-pipeline-dev-pr.yml +++ b/.github/workflows/user-service-pipeline-dev-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of user-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ develop ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of user-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/user-service-pipeline-dev-push.yml b/.github/workflows/user-service-pipeline-dev-push.yml index b27c71bd2..0d7c49b85 100644 --- a/.github/workflows/user-service-pipeline-dev-push.yml +++ b/.github/workflows/user-service-pipeline-dev-push.yml @@ -1,33 +1,33 @@ - -name: Stage, on PUSH Java CI/CD of user-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ develop ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for user-service-ecommerce-boot Microservice - run: docker build -f user-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . - - name: Push user-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev - - + +name: Stage, on PUSH Java CI/CD of user-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ develop ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for user-service-ecommerce-boot Microservice + run: docker build -f user-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev . + - name: Push user-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}dev + + diff --git a/.github/workflows/user-service-pipeline-prod-pr.yml b/.github/workflows/user-service-pipeline-prod-pr.yml index a048fe1ed..cb46d131a 100644 --- a/.github/workflows/user-service-pipeline-prod-pr.yml +++ b/.github/workflows/user-service-pipeline-prod-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of user-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of user-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/user-service-pipeline-prod-push.yml b/.github/workflows/user-service-pipeline-prod-push.yml index ae58b153c..74faf6749 100644 --- a/.github/workflows/user-service-pipeline-prod-push.yml +++ b/.github/workflows/user-service-pipeline-prod-push.yml @@ -1,33 +1,33 @@ - -name: Stage, on PUSH Java CI/CD of user-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ master ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for user-service-ecommerce-boot Microservice - run: docker build -f user-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . - - name: Push user-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} - - + +name: Stage, on PUSH Java CI/CD of user-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ master ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for user-service-ecommerce-boot Microservice + run: docker build -f user-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} . + - name: Push user-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }} + + diff --git a/.github/workflows/user-service-pipeline-stage-pr.yml b/.github/workflows/user-service-pipeline-stage-pr.yml index f11ce58df..d36625a22 100644 --- a/.github/workflows/user-service-pipeline-stage-pr.yml +++ b/.github/workflows/user-service-pipeline-stage-pr.yml @@ -1,21 +1,21 @@ - -name: Stage, on PR Java CI/CD of user-service, ecommerce-microservice-backend app - -on: - pull_request: - branches: [ stage ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - + +name: Stage, on PR Java CI/CD of user-service, ecommerce-microservice-backend app + +on: + pull_request: + branches: [ stage ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + + diff --git a/.github/workflows/user-service-pipeline-stage-push.yml b/.github/workflows/user-service-pipeline-stage-push.yml index 132f33fcc..dfba7e905 100644 --- a/.github/workflows/user-service-pipeline-stage-push.yml +++ b/.github/workflows/user-service-pipeline-stage-push.yml @@ -1,33 +1,33 @@ - -name: Stage, on PUSH Java CI/CD of user-service-ecommerce-boot, ecommerce-microservice-backend app - -on: - push: - branches: [ stage ] - -jobs: - build_push: - #needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Build with Maven - run: mvn -B package --file pom.xml - - name: Setup env variables for Docker - run: echo Setup env variables for Docker - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker Login - run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - name: Build Docker image for user-service-ecommerce-boot Microservice - run: docker build -f user-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . - - name: Push user-service-ecommerce-boot image - run: docker push ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage - - + +name: Stage, on PUSH Java CI/CD of user-service-ecommerce-boot, ecommerce-microservice-backend app + +on: + push: + branches: [ stage ] + +jobs: + build_push: + #needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Setup env variables for Docker + run: echo Setup env variables for Docker + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Docker Login + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Build Docker image for user-service-ecommerce-boot Microservice + run: docker build -f user-service/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage . + - name: Push user-service-ecommerce-boot image + run: docker push ${{ secrets.DOCKER_USERNAME }}/user-service-ecommerce-boot:${{ secrets.PROJECT_VERSION }}stage + + diff --git a/.gitignore b/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +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/ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.3/apache-maven-3.8.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/README.md b/README.md index 1d4a67936..bbb5346d2 100644 --- a/README.md +++ b/README.md @@ -1,621 +1,621 @@ -# e-Commerce-boot μServices - -## Important Note: This project's new milestone is to move The whole system to work on Kubernetes, so stay tuned. - - -## Introduction -- This project is a development of a small set of **Spring Boot** and **Cloud** based Microservices projects that implement cloud-native intuitive, Reactive Programming, Event-driven, Microservices design patterns, and coding best practices. -- The project follows **CloudNative** recommendations and The [**twelve-factor app**](https://12factor.net/) methodology for building *software-as-a-service apps* to show how μServices should be developed and deployed. -- This project uses cutting edge technologies like Docker, Kubernetes, Elasticsearch Stack for - logging and monitoring, Java SE 11, H2, and MySQL databases, all components developed with TDD in mind, covering integration & performance testing, and many more. - - This project is going to be developed as stages, and all such stage steps are documented under - the project **e-Commerce-boot μServices** **README** file . ---- -## Getting started -### System components Structure -Let's explain first the system structure to understand its components: -``` -ecommerce-microservice-backend-app [μService] --> Parent folder. -|- docs --> All docs and diagrams. -|- k8s --> All **Kubernetes** config files. - |- proxy-client --> Authentication & Authorization µService, exposing all - |- api-gateway --> API Gateway server - |- service-discovery --> Service Registery server - |- cloud-config --> Centralized Configuration server - |- user-service --> Manage app users (customers & admins) as well as their credentials - |- product-service --> Manage app products and their respective categories - |- favourite-service --> Manage app users' favourite products added to their own favourite list - |- order-service --> Manage app orders based on carts - |- shipping-service --> Manage app order-shipping products - |- payment-service --> Manage app order payments -|- compose.yml --> contains all services landscape with Kafka -|- run-em-all.sh --> Run all microservices in separate mode. -|- setup.sh --> Install all shared POMs and shared libraries. -|- stop-em-all.sh --> Stop all services runs in standalone mode. -|- test-em-all.sh --> This will start all docker compose landscape and test them, then shutdown docker compose containers with test finishes (use switch start stop) -``` -Now, as we have learned about different system components, then let's start. - -### System Boundary *Architecture* - μServices Landscape - -![System Boundary](app-architecture.drawio.png) - -### Required software - -The following are the initially required software pieces: - -1. **Java 11**: JDK 11 LTS can be downloaded and installed from https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html - -1. **Git**: it can be downloaded and installed from https://git-scm.com/downloads - -1. **Maven**: Apache Maven is a software project management and comprehension tool, it can be downloaded from here https://maven.apache.org/download.cgi - -1. **curl**: this command-line tool for testing HTTP-based APIs can be downloaded and installed from https://curl.haxx.se/download.html - -1. **jq**: This command-line JSON processor can be downloaded and installed from https://stedolan.github.io/jq/download/ - -1. **Spring Boot Initializer**: This *Initializer* generates *spring* boot project with just what you need to start quickly! Start from here https://start.spring.io/ - -1. **Docker**: The fastest way to containerize applications on your desktop, and you can download it from here [https://www.docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop) - -1. **Kubernetes**: We can install **minikube** for testing puposes https://minikube.sigs.k8s.io/docs/start/ - - > For each future stage, I will list the newly required software. - -Follow the installation guide for each software website link and check your software versions from the command line to verify that they are all installed correctly. - -## Using an IDE - -I recommend that you work with your Java code using an IDE that supports the development of Spring Boot applications such as Spring Tool Suite or IntelliJ IDEA Ultimate Edition. So you can use the Spring Boot Dashboard to run the services, run each microservice test case, and many more. - -All that you want to do is just fire up your IDE **->** open or import the parent folder `ecommerce-microservice-backend-app`, and everything will be ready for you. - -## Data Model -### Entity-Relationship-Diagram -![System Boundary](ecommerce-ERD.drawio.png) - -## Playing With e-Commerce-boot Project - -### Cloning It - -The first thing to do is to open **git bash** command line, and then simply you can clone the project under any of your favorite places as the following: - -```bash -> git clone https://github.com/SelimHorri/ecommerce-microservice-backend-app.git -``` - -### Build & Test Them In Isolation - -To build and run the test cases for each service & shared modules in the project, we need to do the following: - -#### Build & Test µServices -Now it is the time to build our **10 microservices** and run each service integration test in - isolation by running the following commands: - -```bash -selim@:~/ecommerce-microservice-backend-app$ ./mvnw clean package -``` - -All build commands and test suite for each microservice should run successfully, and the final output should be like this: - -```bash ----------------< com.selimhorri.app:ecommerce-microservice-backend >----------- -[INFO] ------------------------------------------------------------------------ -[INFO] Reactor Summary for ecommerce-microservice-backend 0.1.0: -[INFO] -[INFO] ecommerce-microservice-backend ..................... SUCCESS [ 0.548 s] -[INFO] service-discovery .................................. SUCCESS [ 3.126 s] -[INFO] cloud-config ....................................... SUCCESS [ 1.595 s] -[INFO] api-gateway ........................................ SUCCESS [ 1.697 s] -[INFO] proxy-client ....................................... SUCCESS [ 3.632 s] -[INFO] user-service ....................................... SUCCESS [ 2.546 s] -[INFO] product-service .................................... SUCCESS [ 2.214 s] -[INFO] favourite-service .................................. SUCCESS [ 2.072 s] -[INFO] order-service ...................................... SUCCESS [ 2.241 s] -[INFO] shipping-service ................................... SUCCESS [ 2.197 s] -[INFO] payment-service .................................... SUCCESS [ 2.006 s] -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 24.156 s -[INFO] Finished at: 2021-12-29T19:52:57+01:00 -[INFO] ------------------------------------------------------------------------ -``` - -### Running Them All -Now it's the time to run all of our Microservices, and it's straightforward just run the following `docker-compose` commands: - -```bash -selim@:~/ecommerce-microservice-backend-app$ docker-compose -f compose.yml up -``` - -All the **services**, **databases**, and **messaging service** will run in parallel in detach mode (option `-d`), and command output will print to the console the following: - -```bash -Creating network "ecommerce-microservice-backend-app_default" with the default driver -Creating ecommerce-microservice-backend-app_api-gateway-container_1 ... done -Creating ecommerce-microservice-backend-app_favourite-service-container_1 ... done -Creating ecommerce-microservice-backend-app_service-discovery-container_1 ... done -Creating ecommerce-microservice-backend-app_shipping-service-container_1 ... done -Creating ecommerce-microservice-backend-app_order-service-container_1 ... done -Creating ecommerce-microservice-backend-app_user-service-container_1 ... done -Creating ecommerce-microservice-backend-app_payment-service-container_1 ... done -Creating ecommerce-microservice-backend-app_product-service-container_1 ... done -Creating ecommerce-microservice-backend-app_proxy-client-container_1 ... done -Creating ecommerce-microservice-backend-app_zipkin-container_1 ... done -Creating ecommerce-microservice-backend-app_cloud-config-container_1 ... done -``` -### Access proxy-client APIs -You can manually test `proxy-client` APIs throughout its **Swagger** interface at the following - URL [https://localhost:8900/swagger-ui.html](https://localhost:8900/swagger-ui.html). -### Access Service Discovery Server (Eureka) -If you would like to access the Eureka service discovery point to this URL [http://localhosts:8761/eureka](https://localhost:8761/eureka) to see all the services registered inside it. - -### Access user-service APIs - URL [https://localhost:8700/swagger-ui.html](https://localhost:8700/swagger-ui.html). - - -The **API Gateway** and **Store Service** both act as a *resource server*. - -#### Check all **Spring Boot Actuator** exposed metrics http://localhost:8080/app/actuator/metrics: - -```bash -{ - "names": [ - "http.server.requests", - "jvm.buffer.count", - "jvm.buffer.memory.used", - "jvm.buffer.total.capacity", - "jvm.classes.loaded", - "jvm.classes.unloaded", - "jvm.gc.live.data.size", - "jvm.gc.max.data.size", - "jvm.gc.memory.allocated", - "jvm.gc.memory.promoted", - "jvm.gc.pause", - "jvm.memory.committed", - "jvm.memory.max", - "jvm.memory.used", - "jvm.threads.daemon", - "jvm.threads.live", - "jvm.threads.peak", - "jvm.threads.states", - "logback.events", - "process.cpu.usage", - "process.files.max", - "process.files.open", - "process.start.time", - "process.uptime", - "resilience4j.circuitbreaker.buffered.calls", - "resilience4j.circuitbreaker.calls", - "resilience4j.circuitbreaker.failure.rate", - "resilience4j.circuitbreaker.not.permitted.calls", - "resilience4j.circuitbreaker.slow.call.rate", - "resilience4j.circuitbreaker.slow.calls", - "resilience4j.circuitbreaker.state", - "system.cpu.count", - "system.cpu.usage", - "system.load.average.1m", - "tomcat.sessions.active.current", - "tomcat.sessions.active.max", - "tomcat.sessions.alive.max", - "tomcat.sessions.created", - "tomcat.sessions.expired", - "tomcat.sessions.rejected", - "zipkin.reporter.messages", - "zipkin.reporter.messages.dropped", - "zipkin.reporter.messages.total", - "zipkin.reporter.queue.bytes", - "zipkin.reporter.queue.spans", - "zipkin.reporter.spans", - "zipkin.reporter.spans.dropped", - "zipkin.reporter.spans.total" - ] -} -``` - -#### Prometheus exposed metrics at http://localhost:8080/app/actuator/prometheus - -```bash -# HELP resilience4j_circuitbreaker_not_permitted_calls_total Total number of not permitted calls -# TYPE resilience4j_circuitbreaker_not_permitted_calls_total counter -resilience4j_circuitbreaker_not_permitted_calls_total{kind="not_permitted",name="proxyService",} 0.0 -# HELP jvm_gc_live_data_size_bytes Size of long-lived heap memory pool after reclamation -# TYPE jvm_gc_live_data_size_bytes gauge -jvm_gc_live_data_size_bytes 3721880.0 -# HELP jvm_gc_pause_seconds Time spent in GC pause -# TYPE jvm_gc_pause_seconds summary -jvm_gc_pause_seconds_count{action="end of minor GC",cause="Metadata GC Threshold",} 1.0 -jvm_gc_pause_seconds_sum{action="end of minor GC",cause="Metadata GC Threshold",} 0.071 -jvm_gc_pause_seconds_count{action="end of minor GC",cause="G1 Evacuation Pause",} 6.0 -jvm_gc_pause_seconds_sum{action="end of minor GC",cause="G1 Evacuation Pause",} 0.551 -# HELP jvm_gc_pause_seconds_max Time spent in GC pause -# TYPE jvm_gc_pause_seconds_max gauge -jvm_gc_pause_seconds_max{action="end of minor GC",cause="Metadata GC Threshold",} 0.071 -jvm_gc_pause_seconds_max{action="end of minor GC",cause="G1 Evacuation Pause",} 0.136 -# HELP system_cpu_usage The "recent cpu usage" for the whole system -# TYPE system_cpu_usage gauge -system_cpu_usage 0.4069206655413552 -# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool -# TYPE jvm_buffer_total_capacity_bytes gauge -jvm_buffer_total_capacity_bytes{id="mapped",} 0.0 -jvm_buffer_total_capacity_bytes{id="direct",} 24576.0 -# HELP zipkin_reporter_spans_dropped_total Spans dropped (failed to report) -# TYPE zipkin_reporter_spans_dropped_total counter -zipkin_reporter_spans_dropped_total 4.0 -# HELP zipkin_reporter_spans_bytes_total Total bytes of encoded spans reported -# TYPE zipkin_reporter_spans_bytes_total counter -zipkin_reporter_spans_bytes_total 1681.0 -# HELP tomcat_sessions_active_current_sessions -# TYPE tomcat_sessions_active_current_sessions gauge -tomcat_sessions_active_current_sessions 0.0 -# HELP jvm_classes_loaded_classes The number of classes that are currently loaded in the Java virtual machine -# TYPE jvm_classes_loaded_classes gauge -jvm_classes_loaded_classes 13714.0 -# HELP process_files_open_files The open file descriptor count -# TYPE process_files_open_files gauge -process_files_open_files 17.0 -# HELP resilience4j_circuitbreaker_slow_call_rate The slow call of the circuit breaker -# TYPE resilience4j_circuitbreaker_slow_call_rate gauge -resilience4j_circuitbreaker_slow_call_rate{name="proxyService",} -1.0 -# HELP system_cpu_count The number of processors available to the Java virtual machine -# TYPE system_cpu_count gauge -system_cpu_count 8.0 -# HELP jvm_threads_daemon_threads The current number of live daemon threads -# TYPE jvm_threads_daemon_threads gauge -jvm_threads_daemon_threads 21.0 -# HELP zipkin_reporter_messages_total Messages reported (or attempted to be reported) -# TYPE zipkin_reporter_messages_total counter -zipkin_reporter_messages_total 2.0 -# HELP zipkin_reporter_messages_dropped_total -# TYPE zipkin_reporter_messages_dropped_total counter -zipkin_reporter_messages_dropped_total{cause="ResourceAccessException",} 2.0 -# HELP zipkin_reporter_messages_bytes_total Total bytes of messages reported -# TYPE zipkin_reporter_messages_bytes_total counter -zipkin_reporter_messages_bytes_total 1368.0 -# HELP http_server_requests_seconds -# TYPE http_server_requests_seconds summary -http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 1.0 -http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 1.339804427 -http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 1.0 -http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.053689381 -# HELP http_server_requests_seconds_max -# TYPE http_server_requests_seconds_max gauge -http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 1.339804427 -http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.053689381 -# HELP resilience4j_circuitbreaker_slow_calls The number of slow successful which were slower than a certain threshold -# TYPE resilience4j_circuitbreaker_slow_calls gauge -resilience4j_circuitbreaker_slow_calls{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_slow_calls{kind="failed",name="proxyService",} 0.0 -# HELP jvm_classes_unloaded_classes_total The total number of classes unloaded since the Java virtual machine has started execution -# TYPE jvm_classes_unloaded_classes_total counter -jvm_classes_unloaded_classes_total 0.0 -# HELP process_files_max_files The maximum file descriptor count -# TYPE process_files_max_files gauge -process_files_max_files 1048576.0 -# HELP resilience4j_circuitbreaker_calls_seconds Total number of successful calls -# TYPE resilience4j_circuitbreaker_calls_seconds summary -resilience4j_circuitbreaker_calls_seconds_count{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_sum{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_count{kind="failed",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_sum{kind="failed",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_count{kind="ignored",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_sum{kind="ignored",name="proxyService",} 0.0 -# HELP resilience4j_circuitbreaker_calls_seconds_max Total number of successful calls -# TYPE resilience4j_circuitbreaker_calls_seconds_max gauge -resilience4j_circuitbreaker_calls_seconds_max{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_max{kind="failed",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_max{kind="ignored",name="proxyService",} 0.0 -# HELP zipkin_reporter_spans_total Spans reported -# TYPE zipkin_reporter_spans_total counter -zipkin_reporter_spans_total 5.0 -# HELP zipkin_reporter_queue_bytes Total size of all encoded spans queued for reporting -# TYPE zipkin_reporter_queue_bytes gauge -zipkin_reporter_queue_bytes 0.0 -# HELP tomcat_sessions_expired_sessions_total -# TYPE tomcat_sessions_expired_sessions_total counter -tomcat_sessions_expired_sessions_total 0.0 -# HELP tomcat_sessions_alive_max_seconds -# TYPE tomcat_sessions_alive_max_seconds gauge -tomcat_sessions_alive_max_seconds 0.0 -# HELP process_uptime_seconds The uptime of the Java virtual machine -# TYPE process_uptime_seconds gauge -process_uptime_seconds 224.402 -# HELP tomcat_sessions_active_max_sessions -# TYPE tomcat_sessions_active_max_sessions gauge -tomcat_sessions_active_max_sessions 0.0 -# HELP process_cpu_usage The "recent cpu usage" for the Java Virtual Machine process -# TYPE process_cpu_usage gauge -process_cpu_usage 5.625879043600563E-4 -# HELP jvm_gc_memory_promoted_bytes_total Count of positive increases in the size of the old generation memory pool before GC to after GC -# TYPE jvm_gc_memory_promoted_bytes_total counter -jvm_gc_memory_promoted_bytes_total 1.7851088E7 -# HELP logback_events_total Number of error level events that made it to the logs -# TYPE logback_events_total counter -logback_events_total{level="warn",} 5.0 -logback_events_total{level="debug",} 79.0 -logback_events_total{level="error",} 0.0 -logback_events_total{level="trace",} 0.0 -logback_events_total{level="info",} 60.0 -# HELP tomcat_sessions_created_sessions_total -# TYPE tomcat_sessions_created_sessions_total counter -tomcat_sessions_created_sessions_total 0.0 -# HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads -# TYPE jvm_threads_live_threads gauge -jvm_threads_live_threads 25.0 -# HELP jvm_threads_states_threads The current number of threads having NEW state -# TYPE jvm_threads_states_threads gauge -jvm_threads_states_threads{state="runnable",} 6.0 -jvm_threads_states_threads{state="blocked",} 0.0 -jvm_threads_states_threads{state="waiting",} 8.0 -jvm_threads_states_threads{state="timed-waiting",} 11.0 -jvm_threads_states_threads{state="new",} 0.0 -jvm_threads_states_threads{state="terminated",} 0.0 -# HELP tomcat_sessions_rejected_sessions_total -# TYPE tomcat_sessions_rejected_sessions_total counter -tomcat_sessions_rejected_sessions_total 0.0 -# HELP process_start_time_seconds Start time of the process since unix epoch. -# TYPE process_start_time_seconds gauge -process_start_time_seconds 1.64088634006E9 -# HELP resilience4j_circuitbreaker_buffered_calls The number of buffered failed calls stored in the ring buffer -# TYPE resilience4j_circuitbreaker_buffered_calls gauge -resilience4j_circuitbreaker_buffered_calls{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_buffered_calls{kind="failed",name="proxyService",} 0.0 -# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management -# TYPE jvm_memory_max_bytes gauge -jvm_memory_max_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.22908672E8 -jvm_memory_max_bytes{area="heap",id="G1 Survivor Space",} -1.0 -jvm_memory_max_bytes{area="heap",id="G1 Old Gen",} 5.182062592E9 -jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0 -jvm_memory_max_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 5836800.0 -jvm_memory_max_bytes{area="heap",id="G1 Eden Space",} -1.0 -jvm_memory_max_bytes{area="nonheap",id="Compressed Class Space",} 1.073741824E9 -jvm_memory_max_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 1.22912768E8 -# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use -# TYPE jvm_memory_committed_bytes gauge -jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.6646144E7 -jvm_memory_committed_bytes{area="heap",id="G1 Survivor Space",} 2.4117248E7 -jvm_memory_committed_bytes{area="heap",id="G1 Old Gen",} 1.7301504E8 -jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 7.6857344E7 -jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 2555904.0 -jvm_memory_committed_bytes{area="heap",id="G1 Eden Space",} 2.71581184E8 -jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 1.0354688E7 -jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 6619136.0 -# HELP jvm_memory_used_bytes The amount of used memory -# TYPE jvm_memory_used_bytes gauge -jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.6585088E7 -jvm_memory_used_bytes{area="heap",id="G1 Survivor Space",} 2.4117248E7 -jvm_memory_used_bytes{area="heap",id="G1 Old Gen",} 2.0524392E7 -jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 7.4384552E7 -jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 1261696.0 -jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 2.5165824E7 -jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 9365664.0 -jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 6604416.0 -# HELP system_load_average_1m The sum of the number of runnable entities queued to available processors and the number of runnable entities running on the available processors averaged over a period of time -# TYPE system_load_average_1m gauge -system_load_average_1m 8.68 -# HELP resilience4j_circuitbreaker_state The states of the circuit breaker -# TYPE resilience4j_circuitbreaker_state gauge -resilience4j_circuitbreaker_state{name="proxyService",state="forced_open",} 0.0 -resilience4j_circuitbreaker_state{name="proxyService",state="closed",} 1.0 -resilience4j_circuitbreaker_state{name="proxyService",state="disabled",} 0.0 -resilience4j_circuitbreaker_state{name="proxyService",state="open",} 0.0 -resilience4j_circuitbreaker_state{name="proxyService",state="half_open",} 0.0 -resilience4j_circuitbreaker_state{name="proxyService",state="metrics_only",} 0.0 -# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool -# TYPE jvm_buffer_memory_used_bytes gauge -jvm_buffer_memory_used_bytes{id="mapped",} 0.0 -jvm_buffer_memory_used_bytes{id="direct",} 24576.0 -# HELP resilience4j_circuitbreaker_failure_rate The failure rate of the circuit breaker -# TYPE resilience4j_circuitbreaker_failure_rate gauge -resilience4j_circuitbreaker_failure_rate{name="proxyService",} -1.0 -# HELP zipkin_reporter_queue_spans Spans queued for reporting -# TYPE zipkin_reporter_queue_spans gauge -zipkin_reporter_queue_spans 0.0 -# HELP jvm_gc_memory_allocated_bytes_total Incremented for an increase in the size of the (young) heap memory pool after one GC to before the next -# TYPE jvm_gc_memory_allocated_bytes_total counter -jvm_gc_memory_allocated_bytes_total 1.402994688E9 -# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool -# TYPE jvm_buffer_count_buffers gauge -jvm_buffer_count_buffers{id="mapped",} 0.0 -jvm_buffer_count_buffers{id="direct",} 3.0 -# HELP jvm_threads_peak_threads The peak live thread count since the Java virtual machine started or peak was reset -# TYPE jvm_threads_peak_threads gauge -jvm_threads_peak_threads 25.0 -# HELP jvm_gc_max_data_size_bytes Max size of long-lived heap memory pool -# TYPE jvm_gc_max_data_size_bytes gauge -jvm_gc_max_data_size_bytes 5.182062592E9 -``` - -#### Check All Services Health -From ecommerce front Service proxy we can check all the core services health when you have all the - microservices up and running using Docker Compose, -```bash -selim@:~/ecommerce-microservice-backend-app$ curl -k https://localhost:8443/actuator/health -s | jq .components."\"Core Microservices\"" -``` -This will result in the following response: -```json -{ - "status": "UP", - "components": { - "circuitBreakers": { - "status": "UP", - "details": { - "proxyService": { - "status": "UP", - "details": { - "failureRate": "-1.0%", - "failureRateThreshold": "50.0%", - "slowCallRate": "-1.0%", - "slowCallRateThreshold": "100.0%", - "bufferedCalls": 0, - "slowCalls": 0, - "slowFailedCalls": 0, - "failedCalls": 0, - "notPermittedCalls": 0, - "state": "CLOSED" - } - } - } - }, - "clientConfigServer": { - "status": "UNKNOWN", - "details": { - "error": "no property sources located" - } - }, - "discoveryComposite": { - "status": "UP", - "components": { - "discoveryClient": { - "status": "UP", - "details": { - "services": [ - "proxy-client", - "api-gateway", - "cloud-config", - "product-service", - "user-service", - "favourite-service", - "order-service", - "payment-service", - "shipping-service" - ] - } - }, - "eureka": { - "description": "Remote status from Eureka server", - "status": "UP", - "details": { - "applications": { - "FAVOURITE-SERVICE": 1, - "PROXY-CLIENT": 1, - "API-GATEWAY": 1, - "PAYMENT-SERVICE": 1, - "ORDER-SERVICE": 1, - "CLOUD-CONFIG": 1, - "PRODUCT-SERVICE": 1, - "SHIPPING-SERVICE": 1, - "USER-SERVICE": 1 - } - } - } - } - }, - "diskSpace": { - "status": "UP", - "details": { - "total": 981889826816, - "free": 325116776448, - "threshold": 10485760, - "exists": true - } - }, - "ping": { - "status": "UP" - }, - "refreshScope": { - "status": "UP" - } - } -} -``` -### Testing Them All -Now it's time to test all the application functionality as one part. To do so just run - the following automation test script: - -```bash -selim@:~/ecommerce-microservice-backend-app$ ./test-em-all.sh start -``` -> You can use `stop` switch with `start`, that will ->1. start docker, ->2. run the tests, ->3. stop the docker instances. - -The result will look like this: - -```bash -Starting 'ecommerce-microservice-backend-app' for [Blackbox] testing... - -Start Tests: Tue, May 31, 2020 2:09:36 AM -HOST=localhost -PORT=8080 -Restarting the test environment... -$ docker-compose -p -f compose.yml down --remove-orphans -$ docker-compose -p -f compose.yml up -d -Wait for: curl -k https://localhost:8080/actuator/health... , retry #1 , retry #2, {"status":"UP"} DONE, continues... -Test OK (HTTP Code: 200) -... -Test OK (actual value: 1) -Test OK (actual value: 3) -Test OK (actual value: 3) -Test OK (HTTP Code: 404, {"httpStatus":"NOT_FOUND","message":"No product found for productId: 13","path":"/app/api/products/20","time":"2020-04-12@12:34:25.144+0000"}) -... -Test OK (actual value: 3) -Test OK (actual value: 0) -Test OK (HTTP Code: 422, {"httpStatus":"UNPROCESSABLE_ENTITY","message":"Invalid productId: -1","path":"/app/api/products/-1","time":"2020-04-12@12:34:26.243+0000"}) -Test OK (actual value: "Invalid productId: -1") -Test OK (HTTP Code: 400, {"timestamp":"2020-04-12T12:34:26.471+00:00","path":"/app/api/products/invalidProductId","status":400,"error":"Bad Request","message":"Type mismatch.","requestId":"044dcdf2-13"}) -Test OK (actual value: "Type mismatch.") -Test OK (HTTP Code: 401, ) -Test OK (HTTP Code: 200) -Test OK (HTTP Code: 403, ) -Start Circuit Breaker tests! -Test OK (actual value: CLOSED) -Test OK (HTTP Code: 500, {"timestamp":"2020-05-26T00:09:48.784+00:00","path":"/app/api/products/2","status":500,"error":"Internal Server Error","message":"Did not observe any item or terminal signal within 2000ms in 'onErrorResume' (and no fallback has been configured)","requestId":"4aa9f5e8-119"}) -... -Test OK (actual value: Did not observe any item or terminal signal within 2000ms) -Test OK (HTTP Code: 200) -Test OK (actual value: Fallback product2) -Test OK (HTTP Code: 200) -Test OK (actual value: Fallback product2) -Test OK (HTTP Code: 404, {"httpStatus":"NOT_FOUND","message":"Product Id: 14 not found in fallback cache!","path":"/app/api/products/14","timestamp":"2020-05-26@00:09:53.998+0000"}) -... -Test OK (actual value: product name C) -Test OK (actual value: CLOSED) -Test OK (actual value: CLOSED_TO_OPEN) -Test OK (actual value: OPEN_TO_HALF_OPEN) -Test OK (actual value: HALF_OPEN_TO_CLOSED) -End, all tests OK: Tue, May 31, 2020 2:10:09 AM -``` -### Tracking the services with Zipkin -Now, you can now track Microservices interactions throughout Zipkin UI from the following link: -[http://localhost:9411/zipkin/](http://localhost:9411/zipkin/) -![Zipkin UI](zipkin-dash.png) - -### Closing The Story - -Finally, to close the story, we need to shut down Microservices manually service by service, hahaha just kidding, run the following command to shut them all: - -```bash -selim@:~/ecommerce-microservice-backend-app$ docker-compose -f compose.yml down --remove-orphans -``` - And you should see output like the following: - -```bash -Removing ecommerce-microservice-backend-app_payment-service-container_1 ... done -Removing ecommerce-microservice-backend-app_zipkin-container_1 ... done -Removing ecommerce-microservice-backend-app_service-discovery-container_1 ... done -Removing ecommerce-microservice-backend-app_product-service-container_1 ... done -Removing ecommerce-microservice-backend-app_cloud-config-container_1 ... done -Removing ecommerce-microservice-backend-app_proxy-client-container_1 ... done -Removing ecommerce-microservice-backend-app_order-service-container_1 ... done -Removing ecommerce-microservice-backend-app_user-service-container_1 ... done -Removing ecommerce-microservice-backend-app_shipping-service-container_1 ... done -Removing ecommerce-microservice-backend-app_api-gateway-container_1 ... done -Removing ecommerce-microservice-backend-app_favourite-service-container_1 ... done -Removing network ecommerce-microservice-backend-app_default -``` -### The End -In the end, I hope you enjoyed the application and find it useful, as I did when I was developing it. -If you would like to enhance, please: -- **Open PRs**, -- Give **feedback**, -- Add **new suggestions**, and -- Finally, give it a 🌟. - -*Happy Coding ...* 🙂 +# e-Commerce-boot μServices + +## Important Note: This project's new milestone is to move The whole system to work on Kubernetes, so stay tuned. + + +## Introduction +- This project is a development of a small set of **Spring Boot** and **Cloud** based Microservices projects that implement cloud-native intuitive, Reactive Programming, Event-driven, Microservices design patterns, and coding best practices. +- The project follows **CloudNative** recommendations and The [**twelve-factor app**](https://12factor.net/) methodology for building *software-as-a-service apps* to show how μServices should be developed and deployed. +- This project uses cutting edge technologies like Docker, Kubernetes, Elasticsearch Stack for + logging and monitoring, Java SE 11, H2, and MySQL databases, all components developed with TDD in mind, covering integration & performance testing, and many more. + - This project is going to be developed as stages, and all such stage steps are documented under + the project **e-Commerce-boot μServices** **README** file . +--- +## Getting started +### System components Structure +Let's explain first the system structure to understand its components: +``` +ecommerce-microservice-backend-app [μService] --> Parent folder. +|- docs --> All docs and diagrams. +|- k8s --> All **Kubernetes** config files. + |- proxy-client --> Authentication & Authorization µService, exposing all + |- api-gateway --> API Gateway server + |- service-discovery --> Service Registery server + |- cloud-config --> Centralized Configuration server + |- user-service --> Manage app users (customers & admins) as well as their credentials + |- product-service --> Manage app products and their respective categories + |- favourite-service --> Manage app users' favourite products added to their own favourite list + |- order-service --> Manage app orders based on carts + |- shipping-service --> Manage app order-shipping products + |- payment-service --> Manage app order payments +|- compose.yml --> contains all services landscape with Kafka +|- run-em-all.sh --> Run all microservices in separate mode. +|- setup.sh --> Install all shared POMs and shared libraries. +|- stop-em-all.sh --> Stop all services runs in standalone mode. +|- test-em-all.sh --> This will start all docker compose landscape and test them, then shutdown docker compose containers with test finishes (use switch start stop) +``` +Now, as we have learned about different system components, then let's start. + +### System Boundary *Architecture* - μServices Landscape + +![System Boundary](app-architecture.drawio.png) + +### Required software + +The following are the initially required software pieces: + +1. **Java 11**: JDK 11 LTS can be downloaded and installed from https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html + +1. **Git**: it can be downloaded and installed from https://git-scm.com/downloads + +1. **Maven**: Apache Maven is a software project management and comprehension tool, it can be downloaded from here https://maven.apache.org/download.cgi + +1. **curl**: this command-line tool for testing HTTP-based APIs can be downloaded and installed from https://curl.haxx.se/download.html + +1. **jq**: This command-line JSON processor can be downloaded and installed from https://stedolan.github.io/jq/download/ + +1. **Spring Boot Initializer**: This *Initializer* generates *spring* boot project with just what you need to start quickly! Start from here https://start.spring.io/ + +1. **Docker**: The fastest way to containerize applications on your desktop, and you can download it from here [https://www.docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop) + +1. **Kubernetes**: We can install **minikube** for testing puposes https://minikube.sigs.k8s.io/docs/start/ + + > For each future stage, I will list the newly required software. + +Follow the installation guide for each software website link and check your software versions from the command line to verify that they are all installed correctly. + +## Using an IDE + +I recommend that you work with your Java code using an IDE that supports the development of Spring Boot applications such as Spring Tool Suite or IntelliJ IDEA Ultimate Edition. So you can use the Spring Boot Dashboard to run the services, run each microservice test case, and many more. + +All that you want to do is just fire up your IDE **->** open or import the parent folder `ecommerce-microservice-backend-app`, and everything will be ready for you. + +## Data Model +### Entity-Relationship-Diagram +![System Boundary](ecommerce-ERD.drawio.png) + +## Playing With e-Commerce-boot Project + +### Cloning It + +The first thing to do is to open **git bash** command line, and then simply you can clone the project under any of your favorite places as the following: + +```bash +> git clone https://github.com/SelimHorri/ecommerce-microservice-backend-app.git +``` + +### Build & Test Them In Isolation + +To build and run the test cases for each service & shared modules in the project, we need to do the following: + +#### Build & Test µServices +Now it is the time to build our **10 microservices** and run each service integration test in + isolation by running the following commands: + +```bash +selim@:~/ecommerce-microservice-backend-app$ ./mvnw clean package +``` + +All build commands and test suite for each microservice should run successfully, and the final output should be like this: + +```bash +---------------< com.selimhorri.app:ecommerce-microservice-backend >----------- +[INFO] ------------------------------------------------------------------------ +[INFO] Reactor Summary for ecommerce-microservice-backend 0.1.0: +[INFO] +[INFO] ecommerce-microservice-backend ..................... SUCCESS [ 0.548 s] +[INFO] service-discovery .................................. SUCCESS [ 3.126 s] +[INFO] cloud-config ....................................... SUCCESS [ 1.595 s] +[INFO] api-gateway ........................................ SUCCESS [ 1.697 s] +[INFO] proxy-client ....................................... SUCCESS [ 3.632 s] +[INFO] user-service ....................................... SUCCESS [ 2.546 s] +[INFO] product-service .................................... SUCCESS [ 2.214 s] +[INFO] favourite-service .................................. SUCCESS [ 2.072 s] +[INFO] order-service ...................................... SUCCESS [ 2.241 s] +[INFO] shipping-service ................................... SUCCESS [ 2.197 s] +[INFO] payment-service .................................... SUCCESS [ 2.006 s] +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESS +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 24.156 s +[INFO] Finished at: 2021-12-29T19:52:57+01:00 +[INFO] ------------------------------------------------------------------------ +``` + +### Running Them All +Now it's the time to run all of our Microservices, and it's straightforward just run the following `docker-compose` commands: + +```bash +selim@:~/ecommerce-microservice-backend-app$ docker-compose -f compose.yml up +``` + +All the **services**, **databases**, and **messaging service** will run in parallel in detach mode (option `-d`), and command output will print to the console the following: + +```bash +Creating network "ecommerce-microservice-backend-app_default" with the default driver +Creating ecommerce-microservice-backend-app_api-gateway-container_1 ... done +Creating ecommerce-microservice-backend-app_favourite-service-container_1 ... done +Creating ecommerce-microservice-backend-app_service-discovery-container_1 ... done +Creating ecommerce-microservice-backend-app_shipping-service-container_1 ... done +Creating ecommerce-microservice-backend-app_order-service-container_1 ... done +Creating ecommerce-microservice-backend-app_user-service-container_1 ... done +Creating ecommerce-microservice-backend-app_payment-service-container_1 ... done +Creating ecommerce-microservice-backend-app_product-service-container_1 ... done +Creating ecommerce-microservice-backend-app_proxy-client-container_1 ... done +Creating ecommerce-microservice-backend-app_zipkin-container_1 ... done +Creating ecommerce-microservice-backend-app_cloud-config-container_1 ... done +``` +### Access proxy-client APIs +You can manually test `proxy-client` APIs throughout its **Swagger** interface at the following + URL [https://localhost:8900/swagger-ui.html](https://localhost:8900/swagger-ui.html). +### Access Service Discovery Server (Eureka) +If you would like to access the Eureka service discovery point to this URL [http://localhosts:8761/eureka](https://localhost:8761/eureka) to see all the services registered inside it. + +### Access user-service APIs + URL [https://localhost:8700/swagger-ui.html](https://localhost:8700/swagger-ui.html). + + +The **API Gateway** and **Store Service** both act as a *resource server*. + +#### Check all **Spring Boot Actuator** exposed metrics http://localhost:8080/app/actuator/metrics: + +```bash +{ + "names": [ + "http.server.requests", + "jvm.buffer.count", + "jvm.buffer.memory.used", + "jvm.buffer.total.capacity", + "jvm.classes.loaded", + "jvm.classes.unloaded", + "jvm.gc.live.data.size", + "jvm.gc.max.data.size", + "jvm.gc.memory.allocated", + "jvm.gc.memory.promoted", + "jvm.gc.pause", + "jvm.memory.committed", + "jvm.memory.max", + "jvm.memory.used", + "jvm.threads.daemon", + "jvm.threads.live", + "jvm.threads.peak", + "jvm.threads.states", + "logback.events", + "process.cpu.usage", + "process.files.max", + "process.files.open", + "process.start.time", + "process.uptime", + "resilience4j.circuitbreaker.buffered.calls", + "resilience4j.circuitbreaker.calls", + "resilience4j.circuitbreaker.failure.rate", + "resilience4j.circuitbreaker.not.permitted.calls", + "resilience4j.circuitbreaker.slow.call.rate", + "resilience4j.circuitbreaker.slow.calls", + "resilience4j.circuitbreaker.state", + "system.cpu.count", + "system.cpu.usage", + "system.load.average.1m", + "tomcat.sessions.active.current", + "tomcat.sessions.active.max", + "tomcat.sessions.alive.max", + "tomcat.sessions.created", + "tomcat.sessions.expired", + "tomcat.sessions.rejected", + "zipkin.reporter.messages", + "zipkin.reporter.messages.dropped", + "zipkin.reporter.messages.total", + "zipkin.reporter.queue.bytes", + "zipkin.reporter.queue.spans", + "zipkin.reporter.spans", + "zipkin.reporter.spans.dropped", + "zipkin.reporter.spans.total" + ] +} +``` + +#### Prometheus exposed metrics at http://localhost:8080/app/actuator/prometheus + +```bash +# HELP resilience4j_circuitbreaker_not_permitted_calls_total Total number of not permitted calls +# TYPE resilience4j_circuitbreaker_not_permitted_calls_total counter +resilience4j_circuitbreaker_not_permitted_calls_total{kind="not_permitted",name="proxyService",} 0.0 +# HELP jvm_gc_live_data_size_bytes Size of long-lived heap memory pool after reclamation +# TYPE jvm_gc_live_data_size_bytes gauge +jvm_gc_live_data_size_bytes 3721880.0 +# HELP jvm_gc_pause_seconds Time spent in GC pause +# TYPE jvm_gc_pause_seconds summary +jvm_gc_pause_seconds_count{action="end of minor GC",cause="Metadata GC Threshold",} 1.0 +jvm_gc_pause_seconds_sum{action="end of minor GC",cause="Metadata GC Threshold",} 0.071 +jvm_gc_pause_seconds_count{action="end of minor GC",cause="G1 Evacuation Pause",} 6.0 +jvm_gc_pause_seconds_sum{action="end of minor GC",cause="G1 Evacuation Pause",} 0.551 +# HELP jvm_gc_pause_seconds_max Time spent in GC pause +# TYPE jvm_gc_pause_seconds_max gauge +jvm_gc_pause_seconds_max{action="end of minor GC",cause="Metadata GC Threshold",} 0.071 +jvm_gc_pause_seconds_max{action="end of minor GC",cause="G1 Evacuation Pause",} 0.136 +# HELP system_cpu_usage The "recent cpu usage" for the whole system +# TYPE system_cpu_usage gauge +system_cpu_usage 0.4069206655413552 +# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool +# TYPE jvm_buffer_total_capacity_bytes gauge +jvm_buffer_total_capacity_bytes{id="mapped",} 0.0 +jvm_buffer_total_capacity_bytes{id="direct",} 24576.0 +# HELP zipkin_reporter_spans_dropped_total Spans dropped (failed to report) +# TYPE zipkin_reporter_spans_dropped_total counter +zipkin_reporter_spans_dropped_total 4.0 +# HELP zipkin_reporter_spans_bytes_total Total bytes of encoded spans reported +# TYPE zipkin_reporter_spans_bytes_total counter +zipkin_reporter_spans_bytes_total 1681.0 +# HELP tomcat_sessions_active_current_sessions +# TYPE tomcat_sessions_active_current_sessions gauge +tomcat_sessions_active_current_sessions 0.0 +# HELP jvm_classes_loaded_classes The number of classes that are currently loaded in the Java virtual machine +# TYPE jvm_classes_loaded_classes gauge +jvm_classes_loaded_classes 13714.0 +# HELP process_files_open_files The open file descriptor count +# TYPE process_files_open_files gauge +process_files_open_files 17.0 +# HELP resilience4j_circuitbreaker_slow_call_rate The slow call of the circuit breaker +# TYPE resilience4j_circuitbreaker_slow_call_rate gauge +resilience4j_circuitbreaker_slow_call_rate{name="proxyService",} -1.0 +# HELP system_cpu_count The number of processors available to the Java virtual machine +# TYPE system_cpu_count gauge +system_cpu_count 8.0 +# HELP jvm_threads_daemon_threads The current number of live daemon threads +# TYPE jvm_threads_daemon_threads gauge +jvm_threads_daemon_threads 21.0 +# HELP zipkin_reporter_messages_total Messages reported (or attempted to be reported) +# TYPE zipkin_reporter_messages_total counter +zipkin_reporter_messages_total 2.0 +# HELP zipkin_reporter_messages_dropped_total +# TYPE zipkin_reporter_messages_dropped_total counter +zipkin_reporter_messages_dropped_total{cause="ResourceAccessException",} 2.0 +# HELP zipkin_reporter_messages_bytes_total Total bytes of messages reported +# TYPE zipkin_reporter_messages_bytes_total counter +zipkin_reporter_messages_bytes_total 1368.0 +# HELP http_server_requests_seconds +# TYPE http_server_requests_seconds summary +http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 1.0 +http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 1.339804427 +http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 1.0 +http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.053689381 +# HELP http_server_requests_seconds_max +# TYPE http_server_requests_seconds_max gauge +http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 1.339804427 +http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.053689381 +# HELP resilience4j_circuitbreaker_slow_calls The number of slow successful which were slower than a certain threshold +# TYPE resilience4j_circuitbreaker_slow_calls gauge +resilience4j_circuitbreaker_slow_calls{kind="successful",name="proxyService",} 0.0 +resilience4j_circuitbreaker_slow_calls{kind="failed",name="proxyService",} 0.0 +# HELP jvm_classes_unloaded_classes_total The total number of classes unloaded since the Java virtual machine has started execution +# TYPE jvm_classes_unloaded_classes_total counter +jvm_classes_unloaded_classes_total 0.0 +# HELP process_files_max_files The maximum file descriptor count +# TYPE process_files_max_files gauge +process_files_max_files 1048576.0 +# HELP resilience4j_circuitbreaker_calls_seconds Total number of successful calls +# TYPE resilience4j_circuitbreaker_calls_seconds summary +resilience4j_circuitbreaker_calls_seconds_count{kind="successful",name="proxyService",} 0.0 +resilience4j_circuitbreaker_calls_seconds_sum{kind="successful",name="proxyService",} 0.0 +resilience4j_circuitbreaker_calls_seconds_count{kind="failed",name="proxyService",} 0.0 +resilience4j_circuitbreaker_calls_seconds_sum{kind="failed",name="proxyService",} 0.0 +resilience4j_circuitbreaker_calls_seconds_count{kind="ignored",name="proxyService",} 0.0 +resilience4j_circuitbreaker_calls_seconds_sum{kind="ignored",name="proxyService",} 0.0 +# HELP resilience4j_circuitbreaker_calls_seconds_max Total number of successful calls +# TYPE resilience4j_circuitbreaker_calls_seconds_max gauge +resilience4j_circuitbreaker_calls_seconds_max{kind="successful",name="proxyService",} 0.0 +resilience4j_circuitbreaker_calls_seconds_max{kind="failed",name="proxyService",} 0.0 +resilience4j_circuitbreaker_calls_seconds_max{kind="ignored",name="proxyService",} 0.0 +# HELP zipkin_reporter_spans_total Spans reported +# TYPE zipkin_reporter_spans_total counter +zipkin_reporter_spans_total 5.0 +# HELP zipkin_reporter_queue_bytes Total size of all encoded spans queued for reporting +# TYPE zipkin_reporter_queue_bytes gauge +zipkin_reporter_queue_bytes 0.0 +# HELP tomcat_sessions_expired_sessions_total +# TYPE tomcat_sessions_expired_sessions_total counter +tomcat_sessions_expired_sessions_total 0.0 +# HELP tomcat_sessions_alive_max_seconds +# TYPE tomcat_sessions_alive_max_seconds gauge +tomcat_sessions_alive_max_seconds 0.0 +# HELP process_uptime_seconds The uptime of the Java virtual machine +# TYPE process_uptime_seconds gauge +process_uptime_seconds 224.402 +# HELP tomcat_sessions_active_max_sessions +# TYPE tomcat_sessions_active_max_sessions gauge +tomcat_sessions_active_max_sessions 0.0 +# HELP process_cpu_usage The "recent cpu usage" for the Java Virtual Machine process +# TYPE process_cpu_usage gauge +process_cpu_usage 5.625879043600563E-4 +# HELP jvm_gc_memory_promoted_bytes_total Count of positive increases in the size of the old generation memory pool before GC to after GC +# TYPE jvm_gc_memory_promoted_bytes_total counter +jvm_gc_memory_promoted_bytes_total 1.7851088E7 +# HELP logback_events_total Number of error level events that made it to the logs +# TYPE logback_events_total counter +logback_events_total{level="warn",} 5.0 +logback_events_total{level="debug",} 79.0 +logback_events_total{level="error",} 0.0 +logback_events_total{level="trace",} 0.0 +logback_events_total{level="info",} 60.0 +# HELP tomcat_sessions_created_sessions_total +# TYPE tomcat_sessions_created_sessions_total counter +tomcat_sessions_created_sessions_total 0.0 +# HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads +# TYPE jvm_threads_live_threads gauge +jvm_threads_live_threads 25.0 +# HELP jvm_threads_states_threads The current number of threads having NEW state +# TYPE jvm_threads_states_threads gauge +jvm_threads_states_threads{state="runnable",} 6.0 +jvm_threads_states_threads{state="blocked",} 0.0 +jvm_threads_states_threads{state="waiting",} 8.0 +jvm_threads_states_threads{state="timed-waiting",} 11.0 +jvm_threads_states_threads{state="new",} 0.0 +jvm_threads_states_threads{state="terminated",} 0.0 +# HELP tomcat_sessions_rejected_sessions_total +# TYPE tomcat_sessions_rejected_sessions_total counter +tomcat_sessions_rejected_sessions_total 0.0 +# HELP process_start_time_seconds Start time of the process since unix epoch. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.64088634006E9 +# HELP resilience4j_circuitbreaker_buffered_calls The number of buffered failed calls stored in the ring buffer +# TYPE resilience4j_circuitbreaker_buffered_calls gauge +resilience4j_circuitbreaker_buffered_calls{kind="successful",name="proxyService",} 0.0 +resilience4j_circuitbreaker_buffered_calls{kind="failed",name="proxyService",} 0.0 +# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management +# TYPE jvm_memory_max_bytes gauge +jvm_memory_max_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.22908672E8 +jvm_memory_max_bytes{area="heap",id="G1 Survivor Space",} -1.0 +jvm_memory_max_bytes{area="heap",id="G1 Old Gen",} 5.182062592E9 +jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0 +jvm_memory_max_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 5836800.0 +jvm_memory_max_bytes{area="heap",id="G1 Eden Space",} -1.0 +jvm_memory_max_bytes{area="nonheap",id="Compressed Class Space",} 1.073741824E9 +jvm_memory_max_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 1.22912768E8 +# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use +# TYPE jvm_memory_committed_bytes gauge +jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.6646144E7 +jvm_memory_committed_bytes{area="heap",id="G1 Survivor Space",} 2.4117248E7 +jvm_memory_committed_bytes{area="heap",id="G1 Old Gen",} 1.7301504E8 +jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 7.6857344E7 +jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 2555904.0 +jvm_memory_committed_bytes{area="heap",id="G1 Eden Space",} 2.71581184E8 +jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 1.0354688E7 +jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 6619136.0 +# HELP jvm_memory_used_bytes The amount of used memory +# TYPE jvm_memory_used_bytes gauge +jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.6585088E7 +jvm_memory_used_bytes{area="heap",id="G1 Survivor Space",} 2.4117248E7 +jvm_memory_used_bytes{area="heap",id="G1 Old Gen",} 2.0524392E7 +jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 7.4384552E7 +jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 1261696.0 +jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 2.5165824E7 +jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 9365664.0 +jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 6604416.0 +# HELP system_load_average_1m The sum of the number of runnable entities queued to available processors and the number of runnable entities running on the available processors averaged over a period of time +# TYPE system_load_average_1m gauge +system_load_average_1m 8.68 +# HELP resilience4j_circuitbreaker_state The states of the circuit breaker +# TYPE resilience4j_circuitbreaker_state gauge +resilience4j_circuitbreaker_state{name="proxyService",state="forced_open",} 0.0 +resilience4j_circuitbreaker_state{name="proxyService",state="closed",} 1.0 +resilience4j_circuitbreaker_state{name="proxyService",state="disabled",} 0.0 +resilience4j_circuitbreaker_state{name="proxyService",state="open",} 0.0 +resilience4j_circuitbreaker_state{name="proxyService",state="half_open",} 0.0 +resilience4j_circuitbreaker_state{name="proxyService",state="metrics_only",} 0.0 +# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool +# TYPE jvm_buffer_memory_used_bytes gauge +jvm_buffer_memory_used_bytes{id="mapped",} 0.0 +jvm_buffer_memory_used_bytes{id="direct",} 24576.0 +# HELP resilience4j_circuitbreaker_failure_rate The failure rate of the circuit breaker +# TYPE resilience4j_circuitbreaker_failure_rate gauge +resilience4j_circuitbreaker_failure_rate{name="proxyService",} -1.0 +# HELP zipkin_reporter_queue_spans Spans queued for reporting +# TYPE zipkin_reporter_queue_spans gauge +zipkin_reporter_queue_spans 0.0 +# HELP jvm_gc_memory_allocated_bytes_total Incremented for an increase in the size of the (young) heap memory pool after one GC to before the next +# TYPE jvm_gc_memory_allocated_bytes_total counter +jvm_gc_memory_allocated_bytes_total 1.402994688E9 +# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool +# TYPE jvm_buffer_count_buffers gauge +jvm_buffer_count_buffers{id="mapped",} 0.0 +jvm_buffer_count_buffers{id="direct",} 3.0 +# HELP jvm_threads_peak_threads The peak live thread count since the Java virtual machine started or peak was reset +# TYPE jvm_threads_peak_threads gauge +jvm_threads_peak_threads 25.0 +# HELP jvm_gc_max_data_size_bytes Max size of long-lived heap memory pool +# TYPE jvm_gc_max_data_size_bytes gauge +jvm_gc_max_data_size_bytes 5.182062592E9 +``` + +#### Check All Services Health +From ecommerce front Service proxy we can check all the core services health when you have all the + microservices up and running using Docker Compose, +```bash +selim@:~/ecommerce-microservice-backend-app$ curl -k https://localhost:8443/actuator/health -s | jq .components."\"Core Microservices\"" +``` +This will result in the following response: +```json +{ + "status": "UP", + "components": { + "circuitBreakers": { + "status": "UP", + "details": { + "proxyService": { + "status": "UP", + "details": { + "failureRate": "-1.0%", + "failureRateThreshold": "50.0%", + "slowCallRate": "-1.0%", + "slowCallRateThreshold": "100.0%", + "bufferedCalls": 0, + "slowCalls": 0, + "slowFailedCalls": 0, + "failedCalls": 0, + "notPermittedCalls": 0, + "state": "CLOSED" + } + } + } + }, + "clientConfigServer": { + "status": "UNKNOWN", + "details": { + "error": "no property sources located" + } + }, + "discoveryComposite": { + "status": "UP", + "components": { + "discoveryClient": { + "status": "UP", + "details": { + "services": [ + "proxy-client", + "api-gateway", + "cloud-config", + "product-service", + "user-service", + "favourite-service", + "order-service", + "payment-service", + "shipping-service" + ] + } + }, + "eureka": { + "description": "Remote status from Eureka server", + "status": "UP", + "details": { + "applications": { + "FAVOURITE-SERVICE": 1, + "PROXY-CLIENT": 1, + "API-GATEWAY": 1, + "PAYMENT-SERVICE": 1, + "ORDER-SERVICE": 1, + "CLOUD-CONFIG": 1, + "PRODUCT-SERVICE": 1, + "SHIPPING-SERVICE": 1, + "USER-SERVICE": 1 + } + } + } + } + }, + "diskSpace": { + "status": "UP", + "details": { + "total": 981889826816, + "free": 325116776448, + "threshold": 10485760, + "exists": true + } + }, + "ping": { + "status": "UP" + }, + "refreshScope": { + "status": "UP" + } + } +} +``` +### Testing Them All +Now it's time to test all the application functionality as one part. To do so just run + the following automation test script: + +```bash +selim@:~/ecommerce-microservice-backend-app$ ./test-em-all.sh start +``` +> You can use `stop` switch with `start`, that will +>1. start docker, +>2. run the tests, +>3. stop the docker instances. + +The result will look like this: + +```bash +Starting 'ecommerce-microservice-backend-app' for [Blackbox] testing... + +Start Tests: Tue, May 31, 2020 2:09:36 AM +HOST=localhost +PORT=8080 +Restarting the test environment... +$ docker-compose -p -f compose.yml down --remove-orphans +$ docker-compose -p -f compose.yml up -d +Wait for: curl -k https://localhost:8080/actuator/health... , retry #1 , retry #2, {"status":"UP"} DONE, continues... +Test OK (HTTP Code: 200) +... +Test OK (actual value: 1) +Test OK (actual value: 3) +Test OK (actual value: 3) +Test OK (HTTP Code: 404, {"httpStatus":"NOT_FOUND","message":"No product found for productId: 13","path":"/app/api/products/20","time":"2020-04-12@12:34:25.144+0000"}) +... +Test OK (actual value: 3) +Test OK (actual value: 0) +Test OK (HTTP Code: 422, {"httpStatus":"UNPROCESSABLE_ENTITY","message":"Invalid productId: -1","path":"/app/api/products/-1","time":"2020-04-12@12:34:26.243+0000"}) +Test OK (actual value: "Invalid productId: -1") +Test OK (HTTP Code: 400, {"timestamp":"2020-04-12T12:34:26.471+00:00","path":"/app/api/products/invalidProductId","status":400,"error":"Bad Request","message":"Type mismatch.","requestId":"044dcdf2-13"}) +Test OK (actual value: "Type mismatch.") +Test OK (HTTP Code: 401, ) +Test OK (HTTP Code: 200) +Test OK (HTTP Code: 403, ) +Start Circuit Breaker tests! +Test OK (actual value: CLOSED) +Test OK (HTTP Code: 500, {"timestamp":"2020-05-26T00:09:48.784+00:00","path":"/app/api/products/2","status":500,"error":"Internal Server Error","message":"Did not observe any item or terminal signal within 2000ms in 'onErrorResume' (and no fallback has been configured)","requestId":"4aa9f5e8-119"}) +... +Test OK (actual value: Did not observe any item or terminal signal within 2000ms) +Test OK (HTTP Code: 200) +Test OK (actual value: Fallback product2) +Test OK (HTTP Code: 200) +Test OK (actual value: Fallback product2) +Test OK (HTTP Code: 404, {"httpStatus":"NOT_FOUND","message":"Product Id: 14 not found in fallback cache!","path":"/app/api/products/14","timestamp":"2020-05-26@00:09:53.998+0000"}) +... +Test OK (actual value: product name C) +Test OK (actual value: CLOSED) +Test OK (actual value: CLOSED_TO_OPEN) +Test OK (actual value: OPEN_TO_HALF_OPEN) +Test OK (actual value: HALF_OPEN_TO_CLOSED) +End, all tests OK: Tue, May 31, 2020 2:10:09 AM +``` +### Tracking the services with Zipkin +Now, you can now track Microservices interactions throughout Zipkin UI from the following link: +[http://localhost:9411/zipkin/](http://localhost:9411/zipkin/) +![Zipkin UI](zipkin-dash.png) + +### Closing The Story + +Finally, to close the story, we need to shut down Microservices manually service by service, hahaha just kidding, run the following command to shut them all: + +```bash +selim@:~/ecommerce-microservice-backend-app$ docker-compose -f compose.yml down --remove-orphans +``` + And you should see output like the following: + +```bash +Removing ecommerce-microservice-backend-app_payment-service-container_1 ... done +Removing ecommerce-microservice-backend-app_zipkin-container_1 ... done +Removing ecommerce-microservice-backend-app_service-discovery-container_1 ... done +Removing ecommerce-microservice-backend-app_product-service-container_1 ... done +Removing ecommerce-microservice-backend-app_cloud-config-container_1 ... done +Removing ecommerce-microservice-backend-app_proxy-client-container_1 ... done +Removing ecommerce-microservice-backend-app_order-service-container_1 ... done +Removing ecommerce-microservice-backend-app_user-service-container_1 ... done +Removing ecommerce-microservice-backend-app_shipping-service-container_1 ... done +Removing ecommerce-microservice-backend-app_api-gateway-container_1 ... done +Removing ecommerce-microservice-backend-app_favourite-service-container_1 ... done +Removing network ecommerce-microservice-backend-app_default +``` +### The End +In the end, I hope you enjoyed the application and find it useful, as I did when I was developing it. +If you would like to enhance, please: +- **Open PRs**, +- Give **feedback**, +- Add **new suggestions**, and +- Finally, give it a 🌟. + +*Happy Coding ...* 🙂 diff --git a/api-gateway/.gitignore b/api-gateway/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/api-gateway/.gitignore +++ b/api-gateway/.gitignore @@ -1,33 +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/ +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/api-gateway/.mvn/wrapper/MavenWrapperDownloader.java b/api-gateway/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/api-gateway/.mvn/wrapper/MavenWrapperDownloader.java +++ b/api-gateway/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/api-gateway/.mvn/wrapper/maven-wrapper.properties b/api-gateway/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/api-gateway/.mvn/wrapper/maven-wrapper.properties +++ b/api-gateway/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/api-gateway/Dockerfile b/api-gateway/Dockerfile index e0c700df9..76b4a0ed1 100644 --- a/api-gateway/Dockerfile +++ b/api-gateway/Dockerfile @@ -1,12 +1,12 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY api-gateway/ . -ADD api-gateway/target/api-gateway-v${PROJECT_VERSION}.jar api-gateway.jar -EXPOSE 8080 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "api-gateway.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +ENV SPRING_PROFILES_ACTIVE dev +COPY api-gateway/ . +ADD api-gateway/target/api-gateway-v${PROJECT_VERSION}.jar api-gateway.jar +EXPOSE 8080 +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "api-gateway.jar"] + + diff --git a/api-gateway/compose.yml b/api-gateway/compose.yml index 56a28e0a3..69734befc 100644 --- a/api-gateway/compose.yml +++ b/api-gateway/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - api-gateway-container: - image: selimhorri/api-gateway-ecommerce-boot:0.1.0 - ports: - - 8080:8080 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + api-gateway-container: + image: selimhorri/api-gateway-ecommerce-boot:0.1.0 + ports: + - 8080:8080 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/api-gateway/mvnw b/api-gateway/mvnw index a16b5431b..4c1c42714 100755 --- a/api-gateway/mvnw +++ b/api-gateway/mvnw @@ -1,310 +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 "$@" +#!/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/api-gateway/mvnw.cmd b/api-gateway/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/api-gateway/mvnw.cmd +++ b/api-gateway/mvnw.cmd @@ -1,182 +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% +@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/api-gateway/pom.xml b/api-gateway/pom.xml index d25eb1984..cfd395d28 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -1,93 +1,93 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - api-gateway - api-gateway - Spring Boot microservice! - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.cloud - spring-cloud-starter-gateway - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - org.projectlombok - lombok - true - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + api-gateway + api-gateway + Spring Boot microservice! + jar + + + 11 + 2020.0.4 + 1.16.0 + + + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.cloud + spring-cloud-starter + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.cloud + spring-cloud-starter-gateway + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.projectlombok + lombok + true + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + ${project.artifactId}-v${project.version} + + + + + + + + diff --git a/api-gateway/src/main/java/com/selimhorri/app/ApiGatewayApplication.java b/api-gateway/src/main/java/com/selimhorri/app/ApiGatewayApplication.java index 83ead8d95..cecbca6fe 100644 --- a/api-gateway/src/main/java/com/selimhorri/app/ApiGatewayApplication.java +++ b/api-gateway/src/main/java/com/selimhorri/app/ApiGatewayApplication.java @@ -1,25 +1,25 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -public class ApiGatewayApplication { - - public static void main(String[] args) { - SpringApplication.run(ApiGatewayApplication.class, args); - } - - - -} - - - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; + +@SpringBootApplication +@EnableEurekaClient +public class ApiGatewayApplication { + + public static void main(String[] args) { + SpringApplication.run(ApiGatewayApplication.class, args); + } + + + +} + + + + + + + + diff --git a/api-gateway/src/main/resources/application-dev.yml b/api-gateway/src/main/resources/application-dev.yml index 484fde398..37c01f410 100644 --- a/api-gateway/src/main/resources/application-dev.yml +++ b/api-gateway/src/main/resources/application-dev.yml @@ -1,28 +1,28 @@ - -server: - port: 8080 - error: - whitelabel: - enabled: false - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8080 + error: + whitelabel: + enabled: false + +management: + endpoints: + web: + exposure: + include: "*" + +logging: + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/api-gateway/src/main/resources/application-prod.yml b/api-gateway/src/main/resources/application-prod.yml index 0b6a1ab78..026bc31f5 100644 --- a/api-gateway/src/main/resources/application-prod.yml +++ b/api-gateway/src/main/resources/application-prod.yml @@ -1,28 +1,28 @@ - -server: - port: 8080 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - + +server: + port: 8080 + +management: + endpoints: + web: + exposure: + include: "*" + +logging: + file: + name: src/main/resources/script/prod_log.log + clean-history-on-start: false + level: + org: + hibernate: + SQL: INFO + springframework: + web: INFO + data: INFO + boot: + autoconfigure: + data: + rest: INFO + jpa: INFO + orm: INFO + diff --git a/api-gateway/src/main/resources/application-stage.yml b/api-gateway/src/main/resources/application-stage.yml index ae9fc7536..7e74ec0bd 100644 --- a/api-gateway/src/main/resources/application-stage.yml +++ b/api-gateway/src/main/resources/application-stage.yml @@ -1,28 +1,28 @@ - -server: - port: 8080 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8080 + +management: + endpoints: + web: + exposure: + include: "*" + +logging: + file: + name: src/main/resources/script/stage_log.log + clean-history-on-start: true + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/api-gateway/src/main/resources/application.yml b/api-gateway/src/main/resources/application.yml index dd013a72d..bb925016b 100644 --- a/api-gateway/src/main/resources/application.yml +++ b/api-gateway/src/main/resources/application.yml @@ -1,95 +1,95 @@ - -server: - servlet: - context-path: / - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: API-GATEWAY - profiles: - active: - - dev - cloud: - gateway: - default-filters: - - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - globalcors: - add-to-simple-url-handler-mapping: true - cors-configurations: - '[/**]': - allowed-origins: "${CLIENT_HOST:http://localhost:4200}" - allowed-headers: "*" - exposed-headers: "*" - allow-credentials: true - allowed-methods: - - GET - - POST - - PUT - - DELETE - - PATCH - - OPTIONS - routes: - - id: ORDER-SERVICE - uri: lb://ORDER-SERVICE - predicates: - - Path=/order-service/** - - id: PAYMENT-SERVICE - uri: lb://PAYMENT-SERVICE - predicates: - - Path=/payment-service/** - - id: PRODUCT-SERVICE - uri: lb://PRODUCT-SERVICE - predicates: - - Path=/product-service/** - - id: SHIPPING-SERVICE - uri: lb://SHIPPING-SERVICE - predicates: - - Path=/shipping-service/** - - id: USER-SERVICE - uri: lb://USER-SERVICE - predicates: - - Path=/user-service/** - - id: FAVOURITE-SERVICE - uri: lb://FAVOURITE-SERVICE - predicates: - - Path=/favourite-service/** - - id: PROXY-CLIENT - uri: lb://PROXY-CLIENT - predicates: - - Path=/app/** - -resilience4j: - circuitbreaker: - instances: - apiGateway: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - - - + +server: + servlet: + context-path: / + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + config: + import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} + application: + name: API-GATEWAY + profiles: + active: + - dev + cloud: + gateway: + default-filters: + - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE + globalcors: + add-to-simple-url-handler-mapping: true + cors-configurations: + '[/**]': + allowed-origins: "${CLIENT_HOST:http://localhost:4200}" + allowed-headers: "*" + exposed-headers: "*" + allow-credentials: true + allowed-methods: + - GET + - POST + - PUT + - DELETE + - PATCH + - OPTIONS + routes: + - id: ORDER-SERVICE + uri: lb://ORDER-SERVICE + predicates: + - Path=/order-service/** + - id: PAYMENT-SERVICE + uri: lb://PAYMENT-SERVICE + predicates: + - Path=/payment-service/** + - id: PRODUCT-SERVICE + uri: lb://PRODUCT-SERVICE + predicates: + - Path=/product-service/** + - id: SHIPPING-SERVICE + uri: lb://SHIPPING-SERVICE + predicates: + - Path=/shipping-service/** + - id: USER-SERVICE + uri: lb://USER-SERVICE + predicates: + - Path=/user-service/** + - id: FAVOURITE-SERVICE + uri: lb://FAVOURITE-SERVICE + predicates: + - Path=/favourite-service/** + - id: PROXY-CLIENT + uri: lb://PROXY-CLIENT + predicates: + - Path=/app/** + +resilience4j: + circuitbreaker: + instances: + apiGateway: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + + + + + + + + + + diff --git a/api-gateway/src/test/java/com/selimhorri/app/ApiGatewayApplicationTests.java b/api-gateway/src/test/java/com/selimhorri/app/ApiGatewayApplicationTests.java index 15c7492c0..b25fc9c25 100644 --- a/api-gateway/src/test/java/com/selimhorri/app/ApiGatewayApplicationTests.java +++ b/api-gateway/src/test/java/com/selimhorri/app/ApiGatewayApplicationTests.java @@ -1,17 +1,17 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ApiGatewayApplicationTests { - - - -} - - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ApiGatewayApplicationTests { + + + +} + + + + + + + diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0b342ca01..19bbe1bb8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,22 +1,22 @@ - -trigger: -- develop -- stage -- master - -pool: - vmImage: ubuntu-latest - -steps: -- task: Maven@3 - inputs: - mavenPomFile: 'pom.xml' - mavenOptions: '-Xmx3072m' - javaHomeOption: 'JDKVersion' - jdkVersionOption: '11' - jdkArchitectureOption: 'x64' - publishJUnitResults: true - testResultsFiles: '**/surefire-reports/TEST-*.xml' - goals: 'package' - - + +trigger: +- develop +- stage +- master + +pool: + vmImage: ubuntu-latest + +steps: +- task: Maven@3 + inputs: + mavenPomFile: 'pom.xml' + mavenOptions: '-Xmx3072m' + javaHomeOption: 'JDKVersion' + jdkVersionOption: '11' + jdkArchitectureOption: 'x64' + publishJUnitResults: true + testResultsFiles: '**/surefire-reports/TEST-*.xml' + goals: 'package' + + diff --git a/cloud-config/.gitignore b/cloud-config/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/cloud-config/.gitignore +++ b/cloud-config/.gitignore @@ -1,33 +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/ +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/cloud-config/.mvn/wrapper/MavenWrapperDownloader.java b/cloud-config/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/cloud-config/.mvn/wrapper/MavenWrapperDownloader.java +++ b/cloud-config/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/cloud-config/.mvn/wrapper/maven-wrapper.properties b/cloud-config/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/cloud-config/.mvn/wrapper/maven-wrapper.properties +++ b/cloud-config/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/cloud-config/Dockerfile b/cloud-config/Dockerfile index cd5b044ee..8d8aa3e4e 100644 --- a/cloud-config/Dockerfile +++ b/cloud-config/Dockerfile @@ -1,11 +1,11 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -COPY cloud-config/ . -ADD cloud-config/target/cloud-config-v${PROJECT_VERSION}.jar cloud-config.jar -EXPOSE 9296 -ENTRYPOINT ["java", "-jar", "cloud-config.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +COPY cloud-config/ . +ADD cloud-config/target/cloud-config-v${PROJECT_VERSION}.jar cloud-config.jar +EXPOSE 9296 +ENTRYPOINT ["java", "-jar", "cloud-config.jar"] + + diff --git a/cloud-config/compose.yml b/cloud-config/compose.yml index 2ebe9109c..139a9d028 100644 --- a/cloud-config/compose.yml +++ b/cloud-config/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - cloud-config-container: - image: selimhorri/cloud-config-ecommerce-boot:0.1.0 - ports: - - 9296:9296 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + cloud-config-container: + image: selimhorri/cloud-config-ecommerce-boot:0.1.0 + ports: + - 9296:9296 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/cloud-config/mvnw b/cloud-config/mvnw index a16b5431b..4c1c42714 100755 --- a/cloud-config/mvnw +++ b/cloud-config/mvnw @@ -1,310 +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 "$@" +#!/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/cloud-config/mvnw.cmd b/cloud-config/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/cloud-config/mvnw.cmd +++ b/cloud-config/mvnw.cmd @@ -1,182 +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% +@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/cloud-config/pom.xml b/cloud-config/pom.xml index 578a73cce..498bd493c 100644 --- a/cloud-config/pom.xml +++ b/cloud-config/pom.xml @@ -1,72 +1,72 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - cloud-config - cloud-config - Spring Boot microservice! - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - org.springframework.cloud - spring-cloud-config-server - - - org.springframework.cloud - spring-cloud-starter - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - ${project.artifactId}-v${project.version} - - - - - - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + cloud-config + cloud-config + Spring Boot microservice! + jar + + + 11 + 2020.0.4 + 1.16.0 + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.cloud + spring-cloud-config-server + + + org.springframework.cloud + spring-cloud-starter + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + ${project.artifactId}-v${project.version} + + + + + + + + diff --git a/cloud-config/src/main/java/com/selimhorri/app/CloudConfigApplication.java b/cloud-config/src/main/java/com/selimhorri/app/CloudConfigApplication.java index 61df095ac..79ea2e42d 100644 --- a/cloud-config/src/main/java/com/selimhorri/app/CloudConfigApplication.java +++ b/cloud-config/src/main/java/com/selimhorri/app/CloudConfigApplication.java @@ -1,25 +1,25 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.config.server.EnableConfigServer; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -@EnableConfigServer -public class CloudConfigApplication { - - public static void main(String[] args) { - SpringApplication.run(CloudConfigApplication.class, args); - } - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.config.server.EnableConfigServer; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; + +@SpringBootApplication +@EnableEurekaClient +@EnableConfigServer +public class CloudConfigApplication { + + public static void main(String[] args) { + SpringApplication.run(CloudConfigApplication.class, args); + } + + + +} + + + + + + diff --git a/cloud-config/src/main/resources/application.yml b/cloud-config/src/main/resources/application.yml index 6ac6f81e6..e87eca664 100644 --- a/cloud-config/src/main/resources/application.yml +++ b/cloud-config/src/main/resources/application.yml @@ -1,49 +1,49 @@ - -server: - port: 9296 - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - application: - name: CLOUD-CONFIG - cloud: - config: - server: - git: - uri: https://github.com/SelimHorri/cloud-config-server - clone-on-start: true - -resilience4j: - circuitbreaker: - instances: - cloudConfig: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - endpoints: - web: - exposure: - include: "*" - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - + +server: + port: 9296 + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + application: + name: CLOUD-CONFIG + cloud: + config: + server: + git: + uri: https://github.com/SelimHorri/cloud-config-server + clone-on-start: true + +resilience4j: + circuitbreaker: + instances: + cloudConfig: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + endpoints: + web: + exposure: + include: "*" + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + + + + + + + + diff --git a/cloud-config/src/test/java/com/selimhorri/app/CloudConfigApplicationTests.java b/cloud-config/src/test/java/com/selimhorri/app/CloudConfigApplicationTests.java index 8b7a99062..eb1b9195a 100644 --- a/cloud-config/src/test/java/com/selimhorri/app/CloudConfigApplicationTests.java +++ b/cloud-config/src/test/java/com/selimhorri/app/CloudConfigApplicationTests.java @@ -1,16 +1,16 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class CloudConfigApplicationTests { - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CloudConfigApplicationTests { + + + +} + + + + + + diff --git a/compose.yml b/compose.yml index 2d6442c32..1dc07dadd 100644 --- a/compose.yml +++ b/compose.yml @@ -1,70 +1,120 @@ - -version: '3' -services: - zipkin-container: - image: openzipkin/zipkin - ports: - - 9411:9411 - service-discovery-container: - image: selimhorri/service-discovery-ecommerce-boot:0.1.0 - ports: - - 8761:8761 - environment: - - SPRING_PROFILES_ACTIVE=dev - cloud-config-container: - image: selimhorri/cloud-config-ecommerce-boot:0.1.0 - ports: - - 9296:9296 - environment: - - SPRING_PROFILES_ACTIVE=dev - api-gateway-container: - image: selimhorri/api-gateway-ecommerce-boot:0.1.0 - ports: - - 8080:8080 - environment: - - SPRING_PROFILES_ACTIVE=dev - proxy-client-container: - image: selimhorri/proxy-client-ecommerce-boot:0.1.0 - ports: - - 8900:8900 - environment: - - SPRING_PROFILES_ACTIVE=dev - order-service-container: - image: selimhorri/order-service-ecommerce-boot:0.1.0 - ports: - - 8300:8300 - environment: - - SPRING_PROFILES_ACTIVE=dev - payment-service-container: - image: selimhorri/payment-service-ecommerce-boot:0.1.0 - ports: - - 8400:8400 - environment: - - SPRING_PROFILES_ACTIVE=dev - product-service-container: - image: selimhorri/product-service-ecommerce-boot:0.1.0 - ports: - - 8500:8500 - environment: - - SPRING_PROFILES_ACTIVE=dev - shipping-service-container: - image: selimhorri/shipping-service-ecommerce-boot:0.1.0 - ports: - - 8600:8600 - environment: - - SPRING_PROFILES_ACTIVE=dev - user-service-container: - image: selimhorri/user-service-ecommerce-boot:0.1.0 - ports: - - 8700:8700 - environment: - - SPRING_PROFILES_ACTIVE=dev - favourite-service-container: - image: selimhorri/favourite-service-ecommerce-boot:0.1.0 - ports: - - 8800:8800 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - +version: '3' +services: + api-gateway-container: + image: selimhorri/api-gateway-ecommerce-boot:0.1.0 + ports: + - 8080:8080 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 + - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ + - EUREKA_CLIENT_REGION=default + - EUREKA_CLIENT_AVAILABILITYZONES_DEFAULT=myzone + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ + - EUREKA_INSTANCE_HOSTNAME=api-gateway-container + - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false + + proxy-client-container: + image: selimhorri/proxy-client-ecommerce-boot:0.1.0 + ports: + - 8900:8900 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 + - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ + - EUREKA_INSTANCE_HOSTNAME=proxy-client-container + - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false + + order-service-container: + image: selimhorri/order-service-ecommerce-boot:0.1.0 + ports: + - 8300:8300 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 + - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ + - EUREKA_INSTANCE_HOSTNAME=order-service-container + - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false + + payment-service-container: + image: selimhorri/payment-service-ecommerce-boot:0.1.0 + ports: + - 8400:8400 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 + - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ + - EUREKA_INSTANCE_HOSTNAME=payment-service-container + - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false + + product-service-container: + image: selimhorri/product-service-ecommerce-boot:0.1.0 + ports: + - 8500:8500 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 + - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ + - EUREKA_INSTANCE_HOSTNAME=product-service-container + - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false + + shipping-service-container: + image: selimhorri/shipping-service-ecommerce-boot:0.1.0 + ports: + - 8600:8600 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 + - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ + - EUREKA_INSTANCE_HOSTNAME=shipping-service-container + - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false + + user-service-container: + image: selimhorri/user-service-ecommerce-boot:0.1.0 + ports: + - 8700:8700 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 + - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ + - EUREKA_INSTANCE_HOSTNAME=user-service-container + - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false + + favourite-service-container: + image: selimhorri/favourite-service-ecommerce-boot:0.1.0 + ports: + - 8800:8800 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 + - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ + - EUREKA_INSTANCE_HOSTNAME=favourite-service-container + - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false + +networks: + microservices_network: + external: true + name: microservices_network diff --git a/core.yml b/core.yml new file mode 100644 index 000000000..23dc6c5be --- /dev/null +++ b/core.yml @@ -0,0 +1,35 @@ +version: '3' +services: + zipkin-container: + image: openzipkin/zipkin + ports: + - 9411:9411 + networks: + - microservices_network + service-discovery-container: + image: selimhorri/service-discovery-ecommerce-boot:0.1.0 + ports: + - 8761:8761 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 + - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ + cloud-config-container: + image: selimhorri/cloud-config-ecommerce-boot:0.1.0 + ports: + - 9296:9296 + networks: + - microservices_network + environment: + - SPRING_PROFILES_ACTIVE=dev + - SPRING_ZIPKIN_BASE-URL=http://zipkin-container:9411 + - EUREKA_CLIENT_REGION=default + - EUREKA_CLIENT_AVAILABILITYZONES_DEFAULT=myzone + - EUREKA_CLIENT_SERVICEURL_MYZONE=http://service-discovery-container:8761/eureka + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ +networks: + microservices_network: + driver: bridge + name: microservices_network \ No newline at end of file diff --git a/favourite-service/.gitignore b/favourite-service/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/favourite-service/.gitignore +++ b/favourite-service/.gitignore @@ -1,33 +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/ +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/favourite-service/.mvn/wrapper/MavenWrapperDownloader.java b/favourite-service/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/favourite-service/.mvn/wrapper/MavenWrapperDownloader.java +++ b/favourite-service/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/favourite-service/.mvn/wrapper/maven-wrapper.properties b/favourite-service/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/favourite-service/.mvn/wrapper/maven-wrapper.properties +++ b/favourite-service/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/favourite-service/Dockerfile b/favourite-service/Dockerfile index 82ab593f6..0bb9a8267 100644 --- a/favourite-service/Dockerfile +++ b/favourite-service/Dockerfile @@ -1,12 +1,12 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY favourite-service/ . -ADD favourite-service/target/favourite-service-v${PROJECT_VERSION}.jar favourite-service.jar -EXPOSE 8800 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "favourite-service.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +ENV SPRING_PROFILES_ACTIVE dev +COPY favourite-service/ . +ADD favourite-service/target/favourite-service-v${PROJECT_VERSION}.jar favourite-service.jar +EXPOSE 8800 +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "favourite-service.jar"] + + diff --git a/favourite-service/compose.yml b/favourite-service/compose.yml index 6a5607451..24393608d 100644 --- a/favourite-service/compose.yml +++ b/favourite-service/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - favourite-service-container: - image: selimhorri/favourite-service-ecommerce-boot:0.1.0 - ports: - - 8800:8800 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + favourite-service-container: + image: selimhorri/favourite-service-ecommerce-boot:0.1.0 + ports: + - 8800:8800 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/favourite-service/mvnw b/favourite-service/mvnw index a16b5431b..4c1c42714 100755 --- a/favourite-service/mvnw +++ b/favourite-service/mvnw @@ -1,310 +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 "$@" +#!/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/favourite-service/mvnw.cmd b/favourite-service/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/favourite-service/mvnw.cmd +++ b/favourite-service/mvnw.cmd @@ -1,182 +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% +@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/favourite-service/pom.xml b/favourite-service/pom.xml index c30204d36..1e9de2ab9 100644 --- a/favourite-service/pom.xml +++ b/favourite-service/pom.xml @@ -1,120 +1,120 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - favourite-service - favourite-service - Spring Boot Microservice! - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + favourite-service + favourite-service + Spring Boot Microservice! + jar + + + 11 + 2020.0.4 + 1.16.0 + + + + + org.springframework.cloud + spring-cloud-starter + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + com.h2database + h2 + runtime + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.testcontainers + mysql + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + ${project.artifactId}-v${project.version} + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/FavouriteServiceApplication.java b/favourite-service/src/main/java/com/selimhorri/app/FavouriteServiceApplication.java index 6227ea5ba..01d48965a 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/FavouriteServiceApplication.java +++ b/favourite-service/src/main/java/com/selimhorri/app/FavouriteServiceApplication.java @@ -1,23 +1,23 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -public class FavouriteServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(FavouriteServiceApplication.class, args); - } - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; + +@SpringBootApplication +@EnableEurekaClient +public class FavouriteServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(FavouriteServiceApplication.class, args); + } + + + +} + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/favourite-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java index a6346459a..27021f387 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ b/favourite-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.client; + +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class ClientConfig { + + @LoadBalanced + @Bean + public RestTemplate restTemplateBean() { + return new RestTemplate(); + } + + + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/favourite-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java index 7e0f843ea..f7de593a7 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ b/favourite-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java @@ -1,31 +1,31 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.mapper; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; + +@Configuration +public class MapperConfig { + + @Bean + public ObjectMapper objectMapperBean() { + return new JsonMapper() + .enable(SerializationFeature.INDENT_OUTPUT); + } + + + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/favourite-service/src/main/java/com/selimhorri/app/constant/AppConstant.java index 40f49bbc3..2e051c4b5 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ b/favourite-service/src/main/java/com/selimhorri/app/constant/AppConstant.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - +package com.selimhorri.app.constant; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public abstract class AppConstant { + + public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; + public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public abstract class DiscoveredDomainsApi { + + public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; + public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; + + public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; + public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; + + public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; + public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; + + public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; + public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; + + public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; + public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; + + public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; + public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; + + } + + + +} + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/favourite-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java index 3f4dd17fa..b19764968 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ b/favourite-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.time.Instant; + +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@MappedSuperclass +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@Data +abstract public class AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @CreatedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "created_at") + private Instant createdAt; + + @LastModifiedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "updated_at") + private Instant updatedAt; + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/domain/Favourite.java b/favourite-service/src/main/java/com/selimhorri/app/domain/Favourite.java index b245b54e1..2b25dbce9 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/domain/Favourite.java +++ b/favourite-service/src/main/java/com/selimhorri/app/domain/Favourite.java @@ -1,67 +1,67 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.Table; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.domain.id.FavouriteId; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "favourites") -@IdClass(FavouriteId.class) -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -@Data -@Builder -public final class Favourite extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @Column(name = "user_id", nullable = false) - private Integer userId; - - @Id - @Column(name = "product_id", nullable = false) - private Integer productId; - - @Id - @Column(name = "like_date", nullable = false) - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.Table; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; +import com.selimhorri.app.domain.id.FavouriteId; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "favourites") +@IdClass(FavouriteId.class) +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Data +@Builder +public final class Favourite extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "user_id", nullable = false) + private Integer userId; + + @Id + @Column(name = "product_id", nullable = false) + private Integer productId; + + @Id + @Column(name = "like_date", nullable = false) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime likeDate; + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/domain/id/FavouriteId.java b/favourite-service/src/main/java/com/selimhorri/app/domain/id/FavouriteId.java index 7f4b9be09..e310306db 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/domain/id/FavouriteId.java +++ b/favourite-service/src/main/java/com/selimhorri/app/domain/id/FavouriteId.java @@ -1,52 +1,52 @@ -package com.selimhorri.app.domain.id; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -public class FavouriteId implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull - private Integer userId; - - @NotNull - private Integer productId; - - @NotNull - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - -} - - - - - - - - - - +package com.selimhorri.app.domain.id; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import javax.validation.constraints.NotNull; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class FavouriteId implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull + private Integer userId; + + @NotNull + private Integer productId; + + @NotNull + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime likeDate; + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/dto/FavouriteDto.java b/favourite-service/src/main/java/com/selimhorri/app/dto/FavouriteDto.java index 10a061d44..e31a0e52c 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/dto/FavouriteDto.java +++ b/favourite-service/src/main/java/com/selimhorri/app/dto/FavouriteDto.java @@ -1,65 +1,65 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class FavouriteDto implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull(message = "Field must not be NULL") - private Integer userId; - - @NotNull(message = "Field must not be NULL") - private Integer productId; - - @NotNull(message = "Field must not be NULL") - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - - @JsonProperty("user") - @JsonInclude(Include.NON_NULL) - private UserDto userDto; - - @JsonProperty("product") - @JsonInclude(Include.NON_NULL) - private ProductDto productDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import javax.validation.constraints.NotNull; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class FavouriteDto implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "Field must not be NULL") + private Integer userId; + + @NotNull(message = "Field must not be NULL") + private Integer productId; + + @NotNull(message = "Field must not be NULL") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime likeDate; + + @JsonProperty("user") + @JsonInclude(Include.NON_NULL) + private UserDto userDto; + + @JsonProperty("product") + @JsonInclude(Include.NON_NULL) + private ProductDto productDto; + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/dto/ProductDto.java b/favourite-service/src/main/java/com/selimhorri/app/dto/ProductDto.java index 74ccbbb77..f9da75e58 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/dto/ProductDto.java +++ b/favourite-service/src/main/java/com/selimhorri/app/dto/ProductDto.java @@ -1,41 +1,41 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonInclude(Include.NON_NULL) - private Set favouriteDtos; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ProductDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer productId; + private String productTitle; + private String imageUrl; + private String sku; + private Double priceUnit; + private Integer quantity; + + @JsonInclude(Include.NON_NULL) + private Set favouriteDtos; + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/dto/UserDto.java b/favourite-service/src/main/java/com/selimhorri/app/dto/UserDto.java index 15b649f0f..3c881af98 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/dto/UserDto.java +++ b/favourite-service/src/main/java/com/selimhorri/app/dto/UserDto.java @@ -1,41 +1,41 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonInclude(Include.NON_NULL) - private Set favouriteDtos; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class UserDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer userId; + private String firstName; + private String lastName; + private String imageUrl; + private String email; + private String phone; + + @JsonInclude(Include.NON_NULL) + private Set favouriteDtos; + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/favourite-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java index 920a621ab..ecee30efd 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ b/favourite-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java @@ -1,28 +1,28 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - +package com.selimhorri.app.dto.response.collection; + +import java.util.Collection; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class DtoCollectionResponse { + + private Collection collection; + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/favourite-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java index deac66b67..a22066cf2 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ b/favourite-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java @@ -1,72 +1,72 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.FavouriteNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - FavouriteNotFoundException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.selimhorri.app.exception.payload.ExceptionMsg; +import com.selimhorri.app.exception.wrapper.FavouriteNotFoundException; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@ControllerAdvice +@Slf4j +@RequiredArgsConstructor +public class ApiExceptionHandler { + + @ExceptionHandler(value = { + MethodArgumentNotValidException.class, + HttpMessageNotReadableException.class, + }) + public ResponseEntity handleValidationException(final T e) { + + log.info("**ApiExceptionHandler controller, handle validation exception*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + @ExceptionHandler(value = { + FavouriteNotFoundException.class, + }) + public ResponseEntity handleApiRequestException(final T e) { + + log.info("**ApiExceptionHandler controller, handle API request*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("#### " + e.getMessage() + "! ####") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/favourite-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java index 274842143..77429c9d1 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ b/favourite-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - +package com.selimhorri.app.exception.payload; + +import java.io.Serializable; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@AllArgsConstructor +@Data +@Builder +public final class ExceptionMsg implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ZonedDateTimeSerializer.class) + @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) + private final ZonedDateTime timestamp; + + @JsonInclude(value = Include.NON_NULL) + private Throwable throwable; + private final HttpStatus httpStatus; + private final String msg; + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java b/favourite-service/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java index d7f9a6629..d7d68c9af 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java +++ b/favourite-service/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class FavouriteNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public FavouriteNotFoundException() { - super(); - } - - public FavouriteNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public FavouriteNotFoundException(String message) { - super(message); - } - - public FavouriteNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class FavouriteNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public FavouriteNotFoundException() { + super(); + } + + public FavouriteNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public FavouriteNotFoundException(String message) { + super(message); + } + + public FavouriteNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/helper/FavouriteMappingHelper.java b/favourite-service/src/main/java/com/selimhorri/app/helper/FavouriteMappingHelper.java index 2d5ca7d35..b06edd8f4 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/helper/FavouriteMappingHelper.java +++ b/favourite-service/src/main/java/com/selimhorri/app/helper/FavouriteMappingHelper.java @@ -1,46 +1,46 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Favourite; -import com.selimhorri.app.dto.FavouriteDto; -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.dto.UserDto; - -public interface FavouriteMappingHelper { - - public static FavouriteDto map(final Favourite favourite) { - return FavouriteDto.builder() - .userId(favourite.getUserId()) - .productId(favourite.getProductId()) - .likeDate(favourite.getLikeDate()) - .userDto( - UserDto.builder() - .userId(favourite.getUserId()) - .build()) - .productDto( - ProductDto.builder() - .productId(favourite.getProductId()) - .build()) - .build(); - } - - public static Favourite map(final FavouriteDto favouriteDto) { - return Favourite.builder() - .userId(favouriteDto.getUserId()) - .productId(favouriteDto.getProductId()) - .likeDate(favouriteDto.getLikeDate()) - .build(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.Favourite; +import com.selimhorri.app.dto.FavouriteDto; +import com.selimhorri.app.dto.ProductDto; +import com.selimhorri.app.dto.UserDto; + +public interface FavouriteMappingHelper { + + public static FavouriteDto map(final Favourite favourite) { + return FavouriteDto.builder() + .userId(favourite.getUserId()) + .productId(favourite.getProductId()) + .likeDate(favourite.getLikeDate()) + .userDto( + UserDto.builder() + .userId(favourite.getUserId()) + .build()) + .productDto( + ProductDto.builder() + .productId(favourite.getProductId()) + .build()) + .build(); + } + + public static Favourite map(final FavouriteDto favouriteDto) { + return Favourite.builder() + .userId(favouriteDto.getUserId()) + .productId(favouriteDto.getProductId()) + .likeDate(favouriteDto.getLikeDate()) + .build(); + } + + + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/repository/FavouriteRepository.java b/favourite-service/src/main/java/com/selimhorri/app/repository/FavouriteRepository.java index 3145deb3a..0cf4161b4 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/repository/FavouriteRepository.java +++ b/favourite-service/src/main/java/com/selimhorri/app/repository/FavouriteRepository.java @@ -1,12 +1,12 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Favourite; -import com.selimhorri.app.domain.id.FavouriteId; - -public interface FavouriteRepository extends JpaRepository { - - - -} +package com.selimhorri.app.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.Favourite; +import com.selimhorri.app.domain.id.FavouriteId; + +public interface FavouriteRepository extends JpaRepository { + + + +} diff --git a/favourite-service/src/main/java/com/selimhorri/app/resource/FavouriteResource.java b/favourite-service/src/main/java/com/selimhorri/app/resource/FavouriteResource.java index 33c27b835..18dd8b5fd 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/resource/FavouriteResource.java +++ b/favourite-service/src/main/java/com/selimhorri/app/resource/FavouriteResource.java @@ -1,113 +1,113 @@ -package com.selimhorri.app.resource; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.domain.id.FavouriteId; -import com.selimhorri.app.dto.FavouriteDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.FavouriteService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/favourites") -@Slf4j -@RequiredArgsConstructor -public class FavouriteResource { - - private final FavouriteService favouriteService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** FavouriteDto List, controller; fetch all favourites *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.favouriteService.findAll())); - } - - @GetMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity findById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate) { - log.info("*** FavouriteDto, resource; fetch favourite by id *"); - return ResponseEntity.ok(this.favouriteService.findById( - new FavouriteId(Integer.parseInt(userId), Integer.parseInt(productId), - LocalDateTime.parse(likeDate, DateTimeFormatter.ofPattern(AppConstant.LOCAL_DATE_TIME_FORMAT))))); - } - - @GetMapping("/find") - public ResponseEntity findById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteId favouriteId) { - log.info("*** FavouriteDto, resource; fetch favourite by id *"); - return ResponseEntity.ok(this.favouriteService.findById(favouriteId)); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteDto favouriteDto) { - log.info("*** FavouriteDto, resource; save favourite *"); - return ResponseEntity.ok(this.favouriteService.save(favouriteDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteDto favouriteDto) { - log.info("*** FavouriteDto, resource; update favourite *"); - return ResponseEntity.ok(this.favouriteService.update(favouriteDto)); - } - - @DeleteMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity deleteById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate) { - log.info("*** Boolean, resource; delete favourite by id *"); - this.favouriteService.deleteById(new FavouriteId(Integer.parseInt(userId), Integer.parseInt(productId), - LocalDateTime.parse(likeDate, DateTimeFormatter.ofPattern(AppConstant.LOCAL_DATE_TIME_FORMAT)))); - return ResponseEntity.ok(true); - } - - @DeleteMapping("/delete") - public ResponseEntity deleteById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteId favouriteId) { - log.info("*** Boolean, resource; delete favourite by id *"); - this.favouriteService.deleteById(favouriteId); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.constant.AppConstant; +import com.selimhorri.app.domain.id.FavouriteId; +import com.selimhorri.app.dto.FavouriteDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.FavouriteService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("/api/favourites") +@Slf4j +@RequiredArgsConstructor +public class FavouriteResource { + + private final FavouriteService favouriteService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** FavouriteDto List, controller; fetch all favourites *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.favouriteService.findAll())); + } + + @GetMapping("/{userId}/{productId}/{likeDate}") + public ResponseEntity findById( + @PathVariable("userId") final String userId, + @PathVariable("productId") final String productId, + @PathVariable("likeDate") final String likeDate) { + log.info("*** FavouriteDto, resource; fetch favourite by id *"); + return ResponseEntity.ok(this.favouriteService.findById( + new FavouriteId(Integer.parseInt(userId), Integer.parseInt(productId), + LocalDateTime.parse(likeDate, DateTimeFormatter.ofPattern(AppConstant.LOCAL_DATE_TIME_FORMAT))))); + } + + @GetMapping("/find") + public ResponseEntity findById( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final FavouriteId favouriteId) { + log.info("*** FavouriteDto, resource; fetch favourite by id *"); + return ResponseEntity.ok(this.favouriteService.findById(favouriteId)); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final FavouriteDto favouriteDto) { + log.info("*** FavouriteDto, resource; save favourite *"); + return ResponseEntity.ok(this.favouriteService.save(favouriteDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final FavouriteDto favouriteDto) { + log.info("*** FavouriteDto, resource; update favourite *"); + return ResponseEntity.ok(this.favouriteService.update(favouriteDto)); + } + + @DeleteMapping("/{userId}/{productId}/{likeDate}") + public ResponseEntity deleteById( + @PathVariable("userId") final String userId, + @PathVariable("productId") final String productId, + @PathVariable("likeDate") final String likeDate) { + log.info("*** Boolean, resource; delete favourite by id *"); + this.favouriteService.deleteById(new FavouriteId(Integer.parseInt(userId), Integer.parseInt(productId), + LocalDateTime.parse(likeDate, DateTimeFormatter.ofPattern(AppConstant.LOCAL_DATE_TIME_FORMAT)))); + return ResponseEntity.ok(true); + } + + @DeleteMapping("/delete") + public ResponseEntity deleteById( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final FavouriteId favouriteId) { + log.info("*** Boolean, resource; delete favourite by id *"); + this.favouriteService.deleteById(favouriteId); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/favourite-service/src/main/java/com/selimhorri/app/service/FavouriteService.java b/favourite-service/src/main/java/com/selimhorri/app/service/FavouriteService.java index c20a9ec45..01d50d7b2 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/service/FavouriteService.java +++ b/favourite-service/src/main/java/com/selimhorri/app/service/FavouriteService.java @@ -1,16 +1,16 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.domain.id.FavouriteId; -import com.selimhorri.app.dto.FavouriteDto; - -public interface FavouriteService { - - List findAll(); - FavouriteDto findById(final FavouriteId favouriteId); - FavouriteDto save(final FavouriteDto favouriteDto); - FavouriteDto update(final FavouriteDto favouriteDto); - void deleteById(final FavouriteId favouriteId); - -} +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.domain.id.FavouriteId; +import com.selimhorri.app.dto.FavouriteDto; + +public interface FavouriteService { + + List findAll(); + FavouriteDto findById(final FavouriteId favouriteId); + FavouriteDto save(final FavouriteDto favouriteDto); + FavouriteDto update(final FavouriteDto favouriteDto); + void deleteById(final FavouriteId favouriteId); + +} diff --git a/favourite-service/src/main/java/com/selimhorri/app/service/impl/FavouriteServiceImpl.java b/favourite-service/src/main/java/com/selimhorri/app/service/impl/FavouriteServiceImpl.java index a61753ff9..ca3658584 100644 --- a/favourite-service/src/main/java/com/selimhorri/app/service/impl/FavouriteServiceImpl.java +++ b/favourite-service/src/main/java/com/selimhorri/app/service/impl/FavouriteServiceImpl.java @@ -1,99 +1,99 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.domain.id.FavouriteId; -import com.selimhorri.app.dto.FavouriteDto; -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.dto.UserDto; -import com.selimhorri.app.exception.wrapper.FavouriteNotFoundException; -import com.selimhorri.app.helper.FavouriteMappingHelper; -import com.selimhorri.app.repository.FavouriteRepository; -import com.selimhorri.app.service.FavouriteService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class FavouriteServiceImpl implements FavouriteService { - - private final FavouriteRepository favouriteRepository; - private final RestTemplate restTemplate; - - @Override - public List findAll() { - log.info("*** FavouriteDto List, service; fetch all favourites *"); - return this.favouriteRepository.findAll() - .stream() - .map(FavouriteMappingHelper::map) - .map(f -> { - f.setUserDto(this.restTemplate - .getForObject(AppConstant.DiscoveredDomainsApi - .USER_SERVICE_API_URL + "/" + f.getUserId(), UserDto.class)); - f.setProductDto(this.restTemplate - .getForObject(AppConstant.DiscoveredDomainsApi - .PRODUCT_SERVICE_API_URL + "/" + f.getProductId(), ProductDto.class)); - return f; - }) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public FavouriteDto findById(final FavouriteId favouriteId) { - log.info("*** FavouriteDto, service; fetch favourite by id *"); - return this.favouriteRepository.findById(favouriteId) - .map(FavouriteMappingHelper::map) - .map(f -> { - f.setUserDto(this.restTemplate - .getForObject(AppConstant.DiscoveredDomainsApi - .USER_SERVICE_API_URL + "/" + f.getUserId(), UserDto.class)); - f.setProductDto(this.restTemplate - .getForObject(AppConstant.DiscoveredDomainsApi - .PRODUCT_SERVICE_API_URL + "/" + f.getProductId(), ProductDto.class)); - return f; - }) - .orElseThrow(() -> new FavouriteNotFoundException( - String.format("Favourite with id: [%s] not found!", favouriteId))); - } - - @Override - public FavouriteDto save(final FavouriteDto favouriteDto) { - return FavouriteMappingHelper.map(this.favouriteRepository - .save(FavouriteMappingHelper.map(favouriteDto))); - } - - @Override - public FavouriteDto update(final FavouriteDto favouriteDto) { - return FavouriteMappingHelper.map(this.favouriteRepository - .save(FavouriteMappingHelper.map(favouriteDto))); - } - - @Override - public void deleteById(final FavouriteId favouriteId) { - this.favouriteRepository.deleteById(favouriteId); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.selimhorri.app.constant.AppConstant; +import com.selimhorri.app.domain.id.FavouriteId; +import com.selimhorri.app.dto.FavouriteDto; +import com.selimhorri.app.dto.ProductDto; +import com.selimhorri.app.dto.UserDto; +import com.selimhorri.app.exception.wrapper.FavouriteNotFoundException; +import com.selimhorri.app.helper.FavouriteMappingHelper; +import com.selimhorri.app.repository.FavouriteRepository; +import com.selimhorri.app.service.FavouriteService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class FavouriteServiceImpl implements FavouriteService { + + private final FavouriteRepository favouriteRepository; + private final RestTemplate restTemplate; + + @Override + public List findAll() { + log.info("*** FavouriteDto List, service; fetch all favourites *"); + return this.favouriteRepository.findAll() + .stream() + .map(FavouriteMappingHelper::map) + .map(f -> { + f.setUserDto(this.restTemplate + .getForObject(AppConstant.DiscoveredDomainsApi + .USER_SERVICE_API_URL + "/" + f.getUserId(), UserDto.class)); + f.setProductDto(this.restTemplate + .getForObject(AppConstant.DiscoveredDomainsApi + .PRODUCT_SERVICE_API_URL + "/" + f.getProductId(), ProductDto.class)); + return f; + }) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public FavouriteDto findById(final FavouriteId favouriteId) { + log.info("*** FavouriteDto, service; fetch favourite by id *"); + return this.favouriteRepository.findById(favouriteId) + .map(FavouriteMappingHelper::map) + .map(f -> { + f.setUserDto(this.restTemplate + .getForObject(AppConstant.DiscoveredDomainsApi + .USER_SERVICE_API_URL + "/" + f.getUserId(), UserDto.class)); + f.setProductDto(this.restTemplate + .getForObject(AppConstant.DiscoveredDomainsApi + .PRODUCT_SERVICE_API_URL + "/" + f.getProductId(), ProductDto.class)); + return f; + }) + .orElseThrow(() -> new FavouriteNotFoundException( + String.format("Favourite with id: [%s] not found!", favouriteId))); + } + + @Override + public FavouriteDto save(final FavouriteDto favouriteDto) { + return FavouriteMappingHelper.map(this.favouriteRepository + .save(FavouriteMappingHelper.map(favouriteDto))); + } + + @Override + public FavouriteDto update(final FavouriteDto favouriteDto) { + return FavouriteMappingHelper.map(this.favouriteRepository + .save(FavouriteMappingHelper.map(favouriteDto))); + } + + @Override + public void deleteById(final FavouriteId favouriteId) { + this.favouriteRepository.deleteById(favouriteId); + } + + + +} + + + + + + + + + + diff --git a/favourite-service/src/main/resources/application-dev.yml b/favourite-service/src/main/resources/application-dev.yml index 98b3b174c..56f6d565e 100644 --- a/favourite-service/src/main/resources/application-dev.yml +++ b/favourite-service/src/main/resources/application-dev.yml @@ -1,47 +1,47 @@ - -server: - port: 8800 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8800 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect + use_sql_comments: true + format_sql: true + h2: + console: + enabled: true + path: /h2-console + #flyway: + # baseline-on-migrate: true + # enabled: true + +logging: + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/favourite-service/src/main/resources/application-prod.yml b/favourite-service/src/main/resources/application-prod.yml index 9cf19fbba..c14fc2b8b 100644 --- a/favourite-service/src/main/resources/application-prod.yml +++ b/favourite-service/src/main/resources/application-prod.yml @@ -1,43 +1,43 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - + +server: + port: 8300 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: false + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/prod_log.log + clean-history-on-start: false + level: + org: + hibernate: + SQL: INFO + springframework: + web: INFO + data: INFO + boot: + autoconfigure: + data: + rest: INFO + jpa: INFO + orm: INFO + diff --git a/favourite-service/src/main/resources/application-stage.yml b/favourite-service/src/main/resources/application-stage.yml index 92140f53e..e07e9b670 100644 --- a/favourite-service/src/main/resources/application-stage.yml +++ b/favourite-service/src/main/resources/application-stage.yml @@ -1,43 +1,43 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8300 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/stage_log.log + clean-history-on-start: true + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/favourite-service/src/main/resources/application.yml b/favourite-service/src/main/resources/application.yml index 6474033d8..df776ab6d 100644 --- a/favourite-service/src/main/resources/application.yml +++ b/favourite-service/src/main/resources/application.yml @@ -1,46 +1,46 @@ - -server: - servlet: - context-path: /favourite-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: FAVOURITE-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - favouriteService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - - + +server: + servlet: + context-path: /favourite-service + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + config: + import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} + application: + name: FAVOURITE-SERVICE + profiles: + active: + - dev + +resilience4j: + circuitbreaker: + instances: + favouriteService: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + + + + + + + + + diff --git a/favourite-service/src/main/resources/db/migration/V1__create_favourites_table.sql b/favourite-service/src/main/resources/db/migration/V1__create_favourites_table.sql index bbc0875e5..938196857 100644 --- a/favourite-service/src/main/resources/db/migration/V1__create_favourites_table.sql +++ b/favourite-service/src/main/resources/db/migration/V1__create_favourites_table.sql @@ -1,10 +1,10 @@ - -CREATE TABLE favourites ( - user_id INT(11) NOT NULL, - product_id INT(11) NOT NULL, - like_date TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP, - PRIMARY KEY (user_id, product_id, like_date) -); - + +CREATE TABLE favourites ( + user_id INT(11) NOT NULL, + product_id INT(11) NOT NULL, + like_date TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP, + PRIMARY KEY (user_id, product_id, like_date) +); + diff --git a/favourite-service/src/main/resources/db/migration/V2__insert_favourites_table.sql b/favourite-service/src/main/resources/db/migration/V2__insert_favourites_table.sql index b937c5222..b1ffe5433 100644 --- a/favourite-service/src/main/resources/db/migration/V2__insert_favourites_table.sql +++ b/favourite-service/src/main/resources/db/migration/V2__insert_favourites_table.sql @@ -1,7 +1,7 @@ - -INSERT INTO favourites -(user_id, product_id) VALUES -(1, 1), -(1, 2), -(2, 2); - + +INSERT INTO favourites +(user_id, product_id) VALUES +(1, 1), +(1, 2), +(2, 2); + diff --git a/favourite-service/src/test/java/com/selimhorri/app/FavouriteServiceApplicationTests.java b/favourite-service/src/test/java/com/selimhorri/app/FavouriteServiceApplicationTests.java index 15c663c40..7a42ca923 100644 --- a/favourite-service/src/test/java/com/selimhorri/app/FavouriteServiceApplicationTests.java +++ b/favourite-service/src/test/java/com/selimhorri/app/FavouriteServiceApplicationTests.java @@ -1,17 +1,17 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class FavouriteServiceApplicationTests { - - - -} - - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class FavouriteServiceApplicationTests { + + + +} + + + + + + + diff --git a/mvnw b/mvnw index a16b5431b..4c1c42714 100755 --- a/mvnw +++ b/mvnw @@ -1,310 +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 "$@" +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,182 +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% +@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/order-service/.gitignore b/order-service/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/order-service/.gitignore +++ b/order-service/.gitignore @@ -1,33 +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/ +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/order-service/.mvn/wrapper/MavenWrapperDownloader.java b/order-service/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/order-service/.mvn/wrapper/MavenWrapperDownloader.java +++ b/order-service/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/order-service/.mvn/wrapper/maven-wrapper.properties b/order-service/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/order-service/.mvn/wrapper/maven-wrapper.properties +++ b/order-service/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/order-service/Dockerfile b/order-service/Dockerfile index b2b25a41a..21decc56f 100644 --- a/order-service/Dockerfile +++ b/order-service/Dockerfile @@ -1,12 +1,12 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY order-service/ . -ADD order-service/target/order-service-v${PROJECT_VERSION}.jar order-service.jar -EXPOSE 8300 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "order-service.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +ENV SPRING_PROFILES_ACTIVE dev +COPY order-service/ . +ADD order-service/target/order-service-v${PROJECT_VERSION}.jar order-service.jar +EXPOSE 8300 +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "order-service.jar"] + + diff --git a/order-service/compose.yml b/order-service/compose.yml index 34107eacf..99f86dcc0 100644 --- a/order-service/compose.yml +++ b/order-service/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - order-service-container: - image: selimhorri/order-service-ecommerce-boot:0.1.0 - ports: - - 8300:8300 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + order-service-container: + image: selimhorri/order-service-ecommerce-boot:0.1.0 + ports: + - 8300:8300 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/order-service/mvnw b/order-service/mvnw index a16b5431b..4c1c42714 100755 --- a/order-service/mvnw +++ b/order-service/mvnw @@ -1,310 +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 "$@" +#!/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/order-service/mvnw.cmd b/order-service/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/order-service/mvnw.cmd +++ b/order-service/mvnw.cmd @@ -1,182 +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% +@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/order-service/pom.xml b/order-service/pom.xml index 13d9dd1ab..6dfdd3d86 100644 --- a/order-service/pom.xml +++ b/order-service/pom.xml @@ -1,119 +1,119 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - order-service - order-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + order-service + order-service + Spring Boot microservice + jar + + + 11 + 2020.0.4 + 1.16.0 + + + + + org.springframework.cloud + spring-cloud-starter + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + com.h2database + h2 + runtime + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.testcontainers + mysql + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + ${project.artifactId}-v${project.version} + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/OrderServiceApplication.java b/order-service/src/main/java/com/selimhorri/app/OrderServiceApplication.java index e3db730af..b38c416ab 100644 --- a/order-service/src/main/java/com/selimhorri/app/OrderServiceApplication.java +++ b/order-service/src/main/java/com/selimhorri/app/OrderServiceApplication.java @@ -1,35 +1,35 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -@EnableEurekaClient -public class OrderServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(OrderServiceApplication.class, args); - } - - - -} - -@RestController -class OrderController { - - @GetMapping - public String msg() { - return "Order controller responding!!"; - } - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@EnableEurekaClient +public class OrderServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(OrderServiceApplication.class, args); + } + + + +} + +@RestController +class OrderController { + + @GetMapping + public String msg() { + return "Order controller responding!!"; + } + +} + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/order-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java index a6346459a..27021f387 100644 --- a/order-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ b/order-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.client; + +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class ClientConfig { + + @LoadBalanced + @Bean + public RestTemplate restTemplateBean() { + return new RestTemplate(); + } + + + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/order-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java index 7e0f843ea..f7de593a7 100644 --- a/order-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ b/order-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java @@ -1,31 +1,31 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.mapper; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; + +@Configuration +public class MapperConfig { + + @Bean + public ObjectMapper objectMapperBean() { + return new JsonMapper() + .enable(SerializationFeature.INDENT_OUTPUT); + } + + + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/order-service/src/main/java/com/selimhorri/app/constant/AppConstant.java index 40f49bbc3..2e051c4b5 100644 --- a/order-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ b/order-service/src/main/java/com/selimhorri/app/constant/AppConstant.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - +package com.selimhorri.app.constant; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public abstract class AppConstant { + + public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; + public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public abstract class DiscoveredDomainsApi { + + public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; + public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; + + public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; + public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; + + public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; + public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; + + public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; + public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; + + public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; + public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; + + public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; + public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; + + } + + + +} + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/order-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java index 3f4dd17fa..b19764968 100644 --- a/order-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ b/order-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.time.Instant; + +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@MappedSuperclass +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@Data +abstract public class AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @CreatedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "created_at") + private Instant createdAt; + + @LastModifiedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "updated_at") + private Instant updatedAt; + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/domain/Cart.java b/order-service/src/main/java/com/selimhorri/app/domain/Cart.java index 6218b67ac..ed6a6ce84 100644 --- a/order-service/src/main/java/com/selimhorri/app/domain/Cart.java +++ b/order-service/src/main/java/com/selimhorri/app/domain/Cart.java @@ -1,57 +1,57 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "carts") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"orders"}) -@Data -@Builder -public final class Cart extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "cart_id", unique = true, nullable = false, updatable = false) - private Integer cartId; - - @Column(name = "user_id") - private Integer userId; - - @JsonIgnore - @OneToMany(mappedBy = "cart", fetch = FetchType.LAZY, cascade = CascadeType.ALL) - private Set orders; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "carts") +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true, exclude = {"orders"}) +@Data +@Builder +public final class Cart extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "cart_id", unique = true, nullable = false, updatable = false) + private Integer cartId; + + @Column(name = "user_id") + private Integer userId; + + @JsonIgnore + @OneToMany(mappedBy = "cart", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + private Set orders; + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/domain/Order.java b/order-service/src/main/java/com/selimhorri/app/domain/Order.java index d96518fb8..c57fe7212 100644 --- a/order-service/src/main/java/com/selimhorri/app/domain/Order.java +++ b/order-service/src/main/java/com/selimhorri/app/domain/Order.java @@ -1,75 +1,75 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "orders") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"cart"}) -@Data -@Builder -public final class Order extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "order_id", unique = true, nullable = false, updatable = false) - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - @Column(name = "order_date") - private LocalDateTime orderDate; - - @Column(name = "order_desc") - private String orderDesc; - - @Column(name = "order_fee", columnDefinition = "decimal") - private Double orderFee; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "cart_id") - private Cart cart; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "orders") +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true, exclude = {"cart"}) +@Data +@Builder +public final class Order extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "order_id", unique = true, nullable = false, updatable = false) + private Integer orderId; + + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + @Column(name = "order_date") + private LocalDateTime orderDate; + + @Column(name = "order_desc") + private String orderDesc; + + @Column(name = "order_fee", columnDefinition = "decimal") + private Double orderFee; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "cart_id") + private Cart cart; + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/dto/CartDto.java b/order-service/src/main/java/com/selimhorri/app/dto/CartDto.java index ac7d5f5dc..2cf9e4ef8 100644 --- a/order-service/src/main/java/com/selimhorri/app/dto/CartDto.java +++ b/order-service/src/main/java/com/selimhorri/app/dto/CartDto.java @@ -1,43 +1,43 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CartDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer cartId; - private Integer userId; - - @JsonInclude(Include.NON_NULL) - private Set orderDtos; - - @JsonProperty("user") - @JsonInclude(Include.NON_NULL) - private UserDto userDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CartDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer cartId; + private Integer userId; + + @JsonInclude(Include.NON_NULL) + private Set orderDtos; + + @JsonProperty("user") + @JsonInclude(Include.NON_NULL) + private UserDto userDto; + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/dto/OrderDto.java b/order-service/src/main/java/com/selimhorri/app/dto/OrderDto.java index 6db7b9a89..ac5f5ec33 100644 --- a/order-service/src/main/java/com/selimhorri/app/dto/OrderDto.java +++ b/order-service/src/main/java/com/selimhorri/app/dto/OrderDto.java @@ -1,56 +1,56 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - - @JsonProperty("cart") - @JsonInclude(Include.NON_NULL) - private CartDto cartDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer orderId; + + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime orderDate; + private String orderDesc; + private Double orderFee; + + @JsonProperty("cart") + @JsonInclude(Include.NON_NULL) + private CartDto cartDto; + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/dto/UserDto.java b/order-service/src/main/java/com/selimhorri/app/dto/UserDto.java index c8a2db53d..3454b6c57 100644 --- a/order-service/src/main/java/com/selimhorri/app/dto/UserDto.java +++ b/order-service/src/main/java/com/selimhorri/app/dto/UserDto.java @@ -1,42 +1,42 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonProperty("cart") - @JsonInclude(Include.NON_NULL) - private CartDto cartDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class UserDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer userId; + private String firstName; + private String lastName; + private String imageUrl; + private String email; + private String phone; + + @JsonProperty("cart") + @JsonInclude(Include.NON_NULL) + private CartDto cartDto; + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/order-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java index 920a621ab..ecee30efd 100644 --- a/order-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ b/order-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java @@ -1,28 +1,28 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - +package com.selimhorri.app.dto.response.collection; + +import java.util.Collection; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class DtoCollectionResponse { + + private Collection collection; + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/order-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java index b43fd0e4e..6182c7bc4 100644 --- a/order-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ b/order-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java @@ -1,75 +1,75 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.CartNotFoundException; -import com.selimhorri.app.exception.wrapper.OrderNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - CartNotFoundException.class, - OrderNotFoundException.class, - IllegalStateException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.selimhorri.app.exception.payload.ExceptionMsg; +import com.selimhorri.app.exception.wrapper.CartNotFoundException; +import com.selimhorri.app.exception.wrapper.OrderNotFoundException; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@ControllerAdvice +@Slf4j +@RequiredArgsConstructor +public class ApiExceptionHandler { + + @ExceptionHandler(value = { + MethodArgumentNotValidException.class, + HttpMessageNotReadableException.class, + }) + public ResponseEntity handleValidationException(final T e) { + + log.info("**ApiExceptionHandler controller, handle validation exception*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + @ExceptionHandler(value = { + CartNotFoundException.class, + OrderNotFoundException.class, + IllegalStateException.class, + }) + public ResponseEntity handleApiRequestException(final T e) { + + log.info("**ApiExceptionHandler controller, handle API request*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("#### " + e.getMessage() + "! ####") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/order-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java index 274842143..77429c9d1 100644 --- a/order-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ b/order-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - +package com.selimhorri.app.exception.payload; + +import java.io.Serializable; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@AllArgsConstructor +@Data +@Builder +public final class ExceptionMsg implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ZonedDateTimeSerializer.class) + @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) + private final ZonedDateTime timestamp; + + @JsonInclude(value = Include.NON_NULL) + private Throwable throwable; + private final HttpStatus httpStatus; + private final String msg; + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/exception/wrapper/CartNotFoundException.java b/order-service/src/main/java/com/selimhorri/app/exception/wrapper/CartNotFoundException.java index 8bf37d869..7510f738f 100644 --- a/order-service/src/main/java/com/selimhorri/app/exception/wrapper/CartNotFoundException.java +++ b/order-service/src/main/java/com/selimhorri/app/exception/wrapper/CartNotFoundException.java @@ -1,36 +1,36 @@ -package com.selimhorri.app.exception.wrapper; - -public class CartNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public CartNotFoundException() { - super(); - } - - public CartNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public CartNotFoundException(String message) { - super(message); - } - - public CartNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class CartNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public CartNotFoundException() { + super(); + } + + public CartNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public CartNotFoundException(String message) { + super(message); + } + + public CartNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderNotFoundException.java b/order-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderNotFoundException.java index 502a7ecdf..a4cbf9369 100644 --- a/order-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderNotFoundException.java +++ b/order-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderNotFoundException.java @@ -1,36 +1,36 @@ -package com.selimhorri.app.exception.wrapper; - -public class OrderNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public OrderNotFoundException() { - super(); - } - - public OrderNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public OrderNotFoundException(String message) { - super(message); - } - - public OrderNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class OrderNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public OrderNotFoundException() { + super(); + } + + public OrderNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public OrderNotFoundException(String message) { + super(message); + } + + public OrderNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/helper/CartMappingHelper.java b/order-service/src/main/java/com/selimhorri/app/helper/CartMappingHelper.java index ef1f6a8d5..4a5f3eba4 100644 --- a/order-service/src/main/java/com/selimhorri/app/helper/CartMappingHelper.java +++ b/order-service/src/main/java/com/selimhorri/app/helper/CartMappingHelper.java @@ -1,39 +1,39 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Cart; -import com.selimhorri.app.dto.CartDto; -import com.selimhorri.app.dto.UserDto; - -public interface CartMappingHelper { - - public static CartDto map(final Cart cart) { - return CartDto.builder() - .cartId(cart.getCartId()) - .userId(cart.getUserId()) - .userDto( - UserDto.builder() - .userId(cart.getUserId()) - .build()) - .build(); - } - - public static Cart map(final CartDto cartDto) { - return Cart.builder() - .cartId(cartDto.getCartId()) - .userId(cartDto.getUserId()) - .build(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.Cart; +import com.selimhorri.app.dto.CartDto; +import com.selimhorri.app.dto.UserDto; + +public interface CartMappingHelper { + + public static CartDto map(final Cart cart) { + return CartDto.builder() + .cartId(cart.getCartId()) + .userId(cart.getUserId()) + .userDto( + UserDto.builder() + .userId(cart.getUserId()) + .build()) + .build(); + } + + public static Cart map(final CartDto cartDto) { + return Cart.builder() + .cartId(cartDto.getCartId()) + .userId(cartDto.getUserId()) + .build(); + } + + + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/helper/OrderMappingHelper.java b/order-service/src/main/java/com/selimhorri/app/helper/OrderMappingHelper.java index 1905421cf..0c4371c91 100644 --- a/order-service/src/main/java/com/selimhorri/app/helper/OrderMappingHelper.java +++ b/order-service/src/main/java/com/selimhorri/app/helper/OrderMappingHelper.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Cart; -import com.selimhorri.app.domain.Order; -import com.selimhorri.app.dto.CartDto; -import com.selimhorri.app.dto.OrderDto; - -public interface OrderMappingHelper { - - public static OrderDto map(final Order order) { - return OrderDto.builder() - .orderId(order.getOrderId()) - .orderDate(order.getOrderDate()) - .orderDesc(order.getOrderDesc()) - .orderFee(order.getOrderFee()) - .cartDto( - CartDto.builder() - .cartId(order.getCart().getCartId()) - .build()) - .build(); - } - - public static Order map(final OrderDto orderDto) { - return Order.builder() - .orderId(orderDto.getOrderId()) - .orderDate(orderDto.getOrderDate()) - .orderDesc(orderDto.getOrderDesc()) - .orderFee(orderDto.getOrderFee()) - .cart( - Cart.builder() - .cartId(orderDto.getCartDto().getCartId()) - .build()) - .build(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.Cart; +import com.selimhorri.app.domain.Order; +import com.selimhorri.app.dto.CartDto; +import com.selimhorri.app.dto.OrderDto; + +public interface OrderMappingHelper { + + public static OrderDto map(final Order order) { + return OrderDto.builder() + .orderId(order.getOrderId()) + .orderDate(order.getOrderDate()) + .orderDesc(order.getOrderDesc()) + .orderFee(order.getOrderFee()) + .cartDto( + CartDto.builder() + .cartId(order.getCart().getCartId()) + .build()) + .build(); + } + + public static Order map(final OrderDto orderDto) { + return Order.builder() + .orderId(orderDto.getOrderId()) + .orderDate(orderDto.getOrderDate()) + .orderDesc(orderDto.getOrderDesc()) + .orderFee(orderDto.getOrderFee()) + .cart( + Cart.builder() + .cartId(orderDto.getCartDto().getCartId()) + .build()) + .build(); + } + + + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/repository/CartRepository.java b/order-service/src/main/java/com/selimhorri/app/repository/CartRepository.java index 80f4d670b..be9a2f082 100644 --- a/order-service/src/main/java/com/selimhorri/app/repository/CartRepository.java +++ b/order-service/src/main/java/com/selimhorri/app/repository/CartRepository.java @@ -1,11 +1,11 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Cart; - -public interface CartRepository extends JpaRepository { - - - -} +package com.selimhorri.app.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.Cart; + +public interface CartRepository extends JpaRepository { + + + +} diff --git a/order-service/src/main/java/com/selimhorri/app/repository/OrderRepository.java b/order-service/src/main/java/com/selimhorri/app/repository/OrderRepository.java index f3927ff16..39d7f4c00 100644 --- a/order-service/src/main/java/com/selimhorri/app/repository/OrderRepository.java +++ b/order-service/src/main/java/com/selimhorri/app/repository/OrderRepository.java @@ -1,11 +1,11 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Order; - -public interface OrderRepository extends JpaRepository { - - - -} +package com.selimhorri.app.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.Order; + +public interface OrderRepository extends JpaRepository { + + + +} diff --git a/order-service/src/main/java/com/selimhorri/app/resource/CartResource.java b/order-service/src/main/java/com/selimhorri/app/resource/CartResource.java index 89ce472c7..8ae187020 100644 --- a/order-service/src/main/java/com/selimhorri/app/resource/CartResource.java +++ b/order-service/src/main/java/com/selimhorri/app/resource/CartResource.java @@ -1,96 +1,96 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.CartDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.CartService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/carts") -@Slf4j -@RequiredArgsConstructor -public class CartResource { - - private final CartService cartService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** CartDto List, controller; fetch all categories *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.cartService.findAll())); - } - - @GetMapping("/{cartId}") - public ResponseEntity findById( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank") - @Valid final String cartId) { - log.info("*** CartDto, resource; fetch cart by id *"); - return ResponseEntity.ok(this.cartService.findById(Integer.parseInt(cartId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto) { - log.info("*** CartDto, resource; save cart *"); - return ResponseEntity.ok(this.cartService.save(cartDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CartDto cartDto) { - log.info("*** CartDto, resource; update cart *"); - return ResponseEntity.ok(this.cartService.update(cartDto)); - } - - @PutMapping("/{cartId}") - public ResponseEntity update( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank") - @Valid final String cartId, - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CartDto cartDto) { - log.info("*** CartDto, resource; update cart with cartId *"); - return ResponseEntity.ok(this.cartService.update(Integer.parseInt(cartId), cartDto)); - } - - @DeleteMapping("/{cartId}") - public ResponseEntity deleteById(@PathVariable("cartId") final String cartId) { - log.info("*** Boolean, resource; delete cart by id *"); - this.cartService.deleteById(Integer.parseInt(cartId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.dto.CartDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.CartService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("/api/carts") +@Slf4j +@RequiredArgsConstructor +public class CartResource { + + private final CartService cartService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** CartDto List, controller; fetch all categories *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.cartService.findAll())); + } + + @GetMapping("/{cartId}") + public ResponseEntity findById( + @PathVariable("cartId") + @NotBlank(message = "Input must not be blank") + @Valid final String cartId) { + log.info("*** CartDto, resource; fetch cart by id *"); + return ResponseEntity.ok(this.cartService.findById(Integer.parseInt(cartId))); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CartDto cartDto) { + log.info("*** CartDto, resource; save cart *"); + return ResponseEntity.ok(this.cartService.save(cartDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final CartDto cartDto) { + log.info("*** CartDto, resource; update cart *"); + return ResponseEntity.ok(this.cartService.update(cartDto)); + } + + @PutMapping("/{cartId}") + public ResponseEntity update( + @PathVariable("cartId") + @NotBlank(message = "Input must not be blank") + @Valid final String cartId, + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final CartDto cartDto) { + log.info("*** CartDto, resource; update cart with cartId *"); + return ResponseEntity.ok(this.cartService.update(Integer.parseInt(cartId), cartDto)); + } + + @DeleteMapping("/{cartId}") + public ResponseEntity deleteById(@PathVariable("cartId") final String cartId) { + log.info("*** Boolean, resource; delete cart by id *"); + this.cartService.deleteById(Integer.parseInt(cartId)); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/resource/OrderResource.java b/order-service/src/main/java/com/selimhorri/app/resource/OrderResource.java index 237d0a631..8a7a6a3d4 100644 --- a/order-service/src/main/java/com/selimhorri/app/resource/OrderResource.java +++ b/order-service/src/main/java/com/selimhorri/app/resource/OrderResource.java @@ -1,96 +1,96 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.OrderService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/orders") -@Slf4j -@RequiredArgsConstructor -public class OrderResource { - - private final OrderService orderService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** OrderDto List, controller; fetch all orders *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.orderService.findAll())); - } - - @GetMapping("/{orderId}") - public ResponseEntity findById( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank") - @Valid final String orderId) { - log.info("*** OrderDto, resource; fetch order by id *"); - return ResponseEntity.ok(this.orderService.findById(Integer.parseInt(orderId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderDto orderDto) { - log.info("*** OrderDto, resource; save order *"); - return ResponseEntity.ok(this.orderService.save(orderDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderDto orderDto) { - log.info("*** OrderDto, resource; update order *"); - return ResponseEntity.ok(this.orderService.update(orderDto)); - } - - @PutMapping("/{orderId}") - public ResponseEntity update( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank") - @Valid final String orderId, - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderDto orderDto) { - log.info("*** OrderDto, resource; update order with orderId *"); - return ResponseEntity.ok(this.orderService.update(Integer.parseInt(orderId), orderDto)); - } - - @DeleteMapping("/{orderId}") - public ResponseEntity deleteById(@PathVariable("orderId") final String orderId) { - log.info("*** Boolean, resource; delete order by id *"); - this.orderService.deleteById(Integer.parseInt(orderId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.dto.OrderDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.OrderService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("/api/orders") +@Slf4j +@RequiredArgsConstructor +public class OrderResource { + + private final OrderService orderService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** OrderDto List, controller; fetch all orders *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.orderService.findAll())); + } + + @GetMapping("/{orderId}") + public ResponseEntity findById( + @PathVariable("orderId") + @NotBlank(message = "Input must not be blank") + @Valid final String orderId) { + log.info("*** OrderDto, resource; fetch order by id *"); + return ResponseEntity.ok(this.orderService.findById(Integer.parseInt(orderId))); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderDto orderDto) { + log.info("*** OrderDto, resource; save order *"); + return ResponseEntity.ok(this.orderService.save(orderDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderDto orderDto) { + log.info("*** OrderDto, resource; update order *"); + return ResponseEntity.ok(this.orderService.update(orderDto)); + } + + @PutMapping("/{orderId}") + public ResponseEntity update( + @PathVariable("orderId") + @NotBlank(message = "Input must not be blank") + @Valid final String orderId, + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderDto orderDto) { + log.info("*** OrderDto, resource; update order with orderId *"); + return ResponseEntity.ok(this.orderService.update(Integer.parseInt(orderId), orderDto)); + } + + @DeleteMapping("/{orderId}") + public ResponseEntity deleteById(@PathVariable("orderId") final String orderId) { + log.info("*** Boolean, resource; delete order by id *"); + this.orderService.deleteById(Integer.parseInt(orderId)); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/service/CartService.java b/order-service/src/main/java/com/selimhorri/app/service/CartService.java index 7c9ca896b..759c4a3bb 100644 --- a/order-service/src/main/java/com/selimhorri/app/service/CartService.java +++ b/order-service/src/main/java/com/selimhorri/app/service/CartService.java @@ -1,16 +1,16 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.CartDto; - -public interface CartService { - - List findAll(); - CartDto findById(final Integer cartId); - CartDto save(final CartDto cartDto); - CartDto update(final CartDto cartDto); - CartDto update(final Integer cartId, final CartDto cartDto); - void deleteById(final Integer cartId); - -} +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.dto.CartDto; + +public interface CartService { + + List findAll(); + CartDto findById(final Integer cartId); + CartDto save(final CartDto cartDto); + CartDto update(final CartDto cartDto); + CartDto update(final Integer cartId, final CartDto cartDto); + void deleteById(final Integer cartId); + +} diff --git a/order-service/src/main/java/com/selimhorri/app/service/OrderService.java b/order-service/src/main/java/com/selimhorri/app/service/OrderService.java index 8cdae858d..28f44b2ef 100644 --- a/order-service/src/main/java/com/selimhorri/app/service/OrderService.java +++ b/order-service/src/main/java/com/selimhorri/app/service/OrderService.java @@ -1,16 +1,16 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.OrderDto; - -public interface OrderService { - - List findAll(); - OrderDto findById(final Integer orderId); - OrderDto save(final OrderDto orderDto); - OrderDto update(final OrderDto orderDto); - OrderDto update(final Integer orderId, final OrderDto orderDto); - void deleteById(final Integer orderId); - -} +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.dto.OrderDto; + +public interface OrderService { + + List findAll(); + OrderDto findById(final Integer orderId); + OrderDto save(final OrderDto orderDto); + OrderDto update(final OrderDto orderDto); + OrderDto update(final Integer orderId, final OrderDto orderDto); + void deleteById(final Integer orderId); + +} diff --git a/order-service/src/main/java/com/selimhorri/app/service/impl/CartServiceImpl.java b/order-service/src/main/java/com/selimhorri/app/service/impl/CartServiceImpl.java index d3c997398..21ef1b6bd 100644 --- a/order-service/src/main/java/com/selimhorri/app/service/impl/CartServiceImpl.java +++ b/order-service/src/main/java/com/selimhorri/app/service/impl/CartServiceImpl.java @@ -1,99 +1,99 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.dto.CartDto; -import com.selimhorri.app.dto.UserDto; -import com.selimhorri.app.exception.wrapper.CartNotFoundException; -import com.selimhorri.app.helper.CartMappingHelper; -import com.selimhorri.app.repository.CartRepository; -import com.selimhorri.app.service.CartService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class CartServiceImpl implements CartService { - - private final CartRepository cartRepository; - private final RestTemplate restTemplate; - - @Override - public List findAll() { - log.info("*** CartDto List, service; fetch all carts *"); - return this.cartRepository.findAll() - .stream() - .map(CartMappingHelper::map) - .map(c -> { - c.setUserDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .USER_SERVICE_API_URL + "/" + c.getUserDto().getUserId(), UserDto.class)); - return c; - }) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public CartDto findById(final Integer cartId) { - log.info("*** CartDto, service; fetch cart by id *"); - return this.cartRepository.findById(cartId) - .map(CartMappingHelper::map) - .map(c -> { - c.setUserDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .USER_SERVICE_API_URL + "/" + c.getUserDto().getUserId(), UserDto.class)); - return c; - }) - .orElseThrow(() -> new CartNotFoundException(String - .format("Cart with id: %d not found", cartId))); - } - - @Override - public CartDto save(final CartDto cartDto) { - log.info("*** CartDto, service; save cart *"); - return CartMappingHelper.map(this.cartRepository - .save(CartMappingHelper.map(cartDto))); - } - - @Override - public CartDto update(final CartDto cartDto) { - log.info("*** CartDto, service; update cart *"); - return CartMappingHelper.map(this.cartRepository - .save(CartMappingHelper.map(cartDto))); - } - - @Override - public CartDto update(final Integer cartId, final CartDto cartDto) { - log.info("*** CartDto, service; update cart with cartId *"); - return CartMappingHelper.map(this.cartRepository - .save(CartMappingHelper.map(this.findById(cartId)))); - } - - @Override - public void deleteById(final Integer cartId) { - log.info("*** Void, service; delete cart by id *"); - this.cartRepository.deleteById(cartId); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.selimhorri.app.constant.AppConstant; +import com.selimhorri.app.dto.CartDto; +import com.selimhorri.app.dto.UserDto; +import com.selimhorri.app.exception.wrapper.CartNotFoundException; +import com.selimhorri.app.helper.CartMappingHelper; +import com.selimhorri.app.repository.CartRepository; +import com.selimhorri.app.service.CartService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class CartServiceImpl implements CartService { + + private final CartRepository cartRepository; + private final RestTemplate restTemplate; + + @Override + public List findAll() { + log.info("*** CartDto List, service; fetch all carts *"); + return this.cartRepository.findAll() + .stream() + .map(CartMappingHelper::map) + .map(c -> { + c.setUserDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi + .USER_SERVICE_API_URL + "/" + c.getUserDto().getUserId(), UserDto.class)); + return c; + }) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public CartDto findById(final Integer cartId) { + log.info("*** CartDto, service; fetch cart by id *"); + return this.cartRepository.findById(cartId) + .map(CartMappingHelper::map) + .map(c -> { + c.setUserDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi + .USER_SERVICE_API_URL + "/" + c.getUserDto().getUserId(), UserDto.class)); + return c; + }) + .orElseThrow(() -> new CartNotFoundException(String + .format("Cart with id: %d not found", cartId))); + } + + @Override + public CartDto save(final CartDto cartDto) { + log.info("*** CartDto, service; save cart *"); + return CartMappingHelper.map(this.cartRepository + .save(CartMappingHelper.map(cartDto))); + } + + @Override + public CartDto update(final CartDto cartDto) { + log.info("*** CartDto, service; update cart *"); + return CartMappingHelper.map(this.cartRepository + .save(CartMappingHelper.map(cartDto))); + } + + @Override + public CartDto update(final Integer cartId, final CartDto cartDto) { + log.info("*** CartDto, service; update cart with cartId *"); + return CartMappingHelper.map(this.cartRepository + .save(CartMappingHelper.map(this.findById(cartId)))); + } + + @Override + public void deleteById(final Integer cartId) { + log.info("*** Void, service; delete cart by id *"); + this.cartRepository.deleteById(cartId); + } + + + +} + + + + + + + + + + diff --git a/order-service/src/main/java/com/selimhorri/app/service/impl/OrderServiceImpl.java b/order-service/src/main/java/com/selimhorri/app/service/impl/OrderServiceImpl.java index 2a656802e..69794628f 100644 --- a/order-service/src/main/java/com/selimhorri/app/service/impl/OrderServiceImpl.java +++ b/order-service/src/main/java/com/selimhorri/app/service/impl/OrderServiceImpl.java @@ -1,85 +1,85 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.exception.wrapper.OrderNotFoundException; -import com.selimhorri.app.helper.OrderMappingHelper; -import com.selimhorri.app.repository.OrderRepository; -import com.selimhorri.app.service.OrderService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class OrderServiceImpl implements OrderService { - - private final OrderRepository orderRepository; - - @Override - public List findAll() { - log.info("*** OrderDto List, service; fetch all orders *"); - return this.orderRepository.findAll() - .stream() - .map(OrderMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public OrderDto findById(final Integer orderId) { - log.info("*** OrderDto, service; fetch order by id *"); - return this.orderRepository.findById(orderId) - .map(OrderMappingHelper::map) - .orElseThrow(() -> new OrderNotFoundException(String - .format("Order with id: %d not found", orderId))); - } - - @Override - public OrderDto save(final OrderDto orderDto) { - log.info("*** OrderDto, service; save order *"); - return OrderMappingHelper.map(this.orderRepository - .save(OrderMappingHelper.map(orderDto))); - } - - @Override - public OrderDto update(final OrderDto orderDto) { - log.info("*** OrderDto, service; update order *"); - return OrderMappingHelper.map(this.orderRepository - .save(OrderMappingHelper.map(orderDto))); - } - - @Override - public OrderDto update(final Integer orderId, final OrderDto orderDto) { - log.info("*** OrderDto, service; update order with orderId *"); - return OrderMappingHelper.map(this.orderRepository - .save(OrderMappingHelper.map(this.findById(orderId)))); - } - - @Override - public void deleteById(final Integer orderId) { - log.info("*** Void, service; delete order by id *"); - this.orderRepository.delete(OrderMappingHelper.map(this.findById(orderId))); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; + +import com.selimhorri.app.dto.OrderDto; +import com.selimhorri.app.exception.wrapper.OrderNotFoundException; +import com.selimhorri.app.helper.OrderMappingHelper; +import com.selimhorri.app.repository.OrderRepository; +import com.selimhorri.app.service.OrderService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class OrderServiceImpl implements OrderService { + + private final OrderRepository orderRepository; + + @Override + public List findAll() { + log.info("*** OrderDto List, service; fetch all orders *"); + return this.orderRepository.findAll() + .stream() + .map(OrderMappingHelper::map) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public OrderDto findById(final Integer orderId) { + log.info("*** OrderDto, service; fetch order by id *"); + return this.orderRepository.findById(orderId) + .map(OrderMappingHelper::map) + .orElseThrow(() -> new OrderNotFoundException(String + .format("Order with id: %d not found", orderId))); + } + + @Override + public OrderDto save(final OrderDto orderDto) { + log.info("*** OrderDto, service; save order *"); + return OrderMappingHelper.map(this.orderRepository + .save(OrderMappingHelper.map(orderDto))); + } + + @Override + public OrderDto update(final OrderDto orderDto) { + log.info("*** OrderDto, service; update order *"); + return OrderMappingHelper.map(this.orderRepository + .save(OrderMappingHelper.map(orderDto))); + } + + @Override + public OrderDto update(final Integer orderId, final OrderDto orderDto) { + log.info("*** OrderDto, service; update order with orderId *"); + return OrderMappingHelper.map(this.orderRepository + .save(OrderMappingHelper.map(this.findById(orderId)))); + } + + @Override + public void deleteById(final Integer orderId) { + log.info("*** Void, service; delete order by id *"); + this.orderRepository.delete(OrderMappingHelper.map(this.findById(orderId))); + } + + + +} + + + + + + + + + + diff --git a/order-service/src/main/resources/application-dev.yml b/order-service/src/main/resources/application-dev.yml index e9e1b3681..3f7ebab04 100644 --- a/order-service/src/main/resources/application-dev.yml +++ b/order-service/src/main/resources/application-dev.yml @@ -1,47 +1,47 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8300 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect + use_sql_comments: true + format_sql: true + h2: + console: + enabled: true + path: /h2-console + #flyway: + # baseline-on-migrate: true + # enabled: true + +logging: + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/order-service/src/main/resources/application-prod.yml b/order-service/src/main/resources/application-prod.yml index 9cf19fbba..c14fc2b8b 100644 --- a/order-service/src/main/resources/application-prod.yml +++ b/order-service/src/main/resources/application-prod.yml @@ -1,43 +1,43 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - + +server: + port: 8300 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: false + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/prod_log.log + clean-history-on-start: false + level: + org: + hibernate: + SQL: INFO + springframework: + web: INFO + data: INFO + boot: + autoconfigure: + data: + rest: INFO + jpa: INFO + orm: INFO + diff --git a/order-service/src/main/resources/application-stage.yml b/order-service/src/main/resources/application-stage.yml index 92140f53e..e07e9b670 100644 --- a/order-service/src/main/resources/application-stage.yml +++ b/order-service/src/main/resources/application-stage.yml @@ -1,43 +1,43 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8300 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/stage_log.log + clean-history-on-start: true + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml index 1713e8409..b262008eb 100644 --- a/order-service/src/main/resources/application.yml +++ b/order-service/src/main/resources/application.yml @@ -1,46 +1,51 @@ - -server: - servlet: - context-path: /order-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: ORDER-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - orderService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - - + +server: + servlet: + context-path: /order-service + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + config: + import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} + application: + name: ORDER-SERVICE + profiles: + active: + - dev + +resilience4j: + circuitbreaker: + instances: + orderService: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + +eureka: + instance: + prefer-ip-address: true + metadata-map: + "management.port": 8300 + + + + + + + + diff --git a/order-service/src/main/resources/db/migration/V1__create_carts_table.sql b/order-service/src/main/resources/db/migration/V1__create_carts_table.sql index 8c9491854..bd7cad572 100644 --- a/order-service/src/main/resources/db/migration/V1__create_carts_table.sql +++ b/order-service/src/main/resources/db/migration/V1__create_carts_table.sql @@ -1,8 +1,8 @@ - -CREATE TABLE carts ( - cart_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - user_id INT(11), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - + +CREATE TABLE carts ( + cart_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + user_id INT(11), + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP +); + diff --git a/order-service/src/main/resources/db/migration/V2__insert_carts_table.sql b/order-service/src/main/resources/db/migration/V2__insert_carts_table.sql index 16ac0b9ae..f28ac5246 100644 --- a/order-service/src/main/resources/db/migration/V2__insert_carts_table.sql +++ b/order-service/src/main/resources/db/migration/V2__insert_carts_table.sql @@ -1,8 +1,8 @@ - -INSERT INTO carts -(user_id) VALUES -(1), -(2), -(3), -(4); - + +INSERT INTO carts +(user_id) VALUES +(1), +(2), +(3), +(4); + diff --git a/order-service/src/main/resources/db/migration/V3__create_orders_table.sql b/order-service/src/main/resources/db/migration/V3__create_orders_table.sql index 0bebcc1a7..e52d683ce 100644 --- a/order-service/src/main/resources/db/migration/V3__create_orders_table.sql +++ b/order-service/src/main/resources/db/migration/V3__create_orders_table.sql @@ -1,11 +1,11 @@ - -CREATE TABLE orders ( - order_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - cart_id INT(11), - order_date TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - order_desc VARCHAR(255), - order_fee DECIMAL(7, 2), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - + +CREATE TABLE orders ( + order_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + cart_id INT(11), + order_date TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + order_desc VARCHAR(255), + order_fee DECIMAL(7, 2), + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP +); + diff --git a/order-service/src/main/resources/db/migration/V4__insert_orders_table.sql b/order-service/src/main/resources/db/migration/V4__insert_orders_table.sql index 03dd9fade..3c788f050 100644 --- a/order-service/src/main/resources/db/migration/V4__insert_orders_table.sql +++ b/order-service/src/main/resources/db/migration/V4__insert_orders_table.sql @@ -1,8 +1,8 @@ - -INSERT INTO orders -(cart_id, order_desc, order_fee) VALUES -(1, 'init', 5000), -(2, 'init', 5000), -(3, 'init', 5000), -(4, 'init', 5000); - + +INSERT INTO orders +(cart_id, order_desc, order_fee) VALUES +(1, 'init', 5000), +(2, 'init', 5000), +(3, 'init', 5000), +(4, 'init', 5000); + diff --git a/order-service/src/main/resources/db/migration/V5__create_orders_cart_id_fk.sql b/order-service/src/main/resources/db/migration/V5__create_orders_cart_id_fk.sql index 1b3300d9b..d65de6eee 100644 --- a/order-service/src/main/resources/db/migration/V5__create_orders_cart_id_fk.sql +++ b/order-service/src/main/resources/db/migration/V5__create_orders_cart_id_fk.sql @@ -1,3 +1,3 @@ - -ALTER TABLE orders - ADD CONSTRAINT fk5_assign FOREIGN KEY (cart_id) REFERENCES carts (cart_id); + +ALTER TABLE orders + ADD CONSTRAINT fk5_assign FOREIGN KEY (cart_id) REFERENCES carts (cart_id); diff --git a/order-service/src/test/java/com/selimhorri/app/OrderServiceApplicationTests.java b/order-service/src/test/java/com/selimhorri/app/OrderServiceApplicationTests.java index 019d863ef..5d3771b1f 100644 --- a/order-service/src/test/java/com/selimhorri/app/OrderServiceApplicationTests.java +++ b/order-service/src/test/java/com/selimhorri/app/OrderServiceApplicationTests.java @@ -1,16 +1,16 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class OrderServiceApplicationTests { - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class OrderServiceApplicationTests { + + + +} + + + + + + diff --git a/payment-service/.gitignore b/payment-service/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/payment-service/.gitignore +++ b/payment-service/.gitignore @@ -1,33 +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/ +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/payment-service/.mvn/wrapper/MavenWrapperDownloader.java b/payment-service/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/payment-service/.mvn/wrapper/MavenWrapperDownloader.java +++ b/payment-service/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/payment-service/.mvn/wrapper/maven-wrapper.properties b/payment-service/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/payment-service/.mvn/wrapper/maven-wrapper.properties +++ b/payment-service/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/payment-service/Dockerfile b/payment-service/Dockerfile index 57d5b931c..b09fc63ea 100644 --- a/payment-service/Dockerfile +++ b/payment-service/Dockerfile @@ -1,12 +1,12 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY payment-service/ . -ADD payment-service/target/payment-service-v${PROJECT_VERSION}.jar payment-service.jar -EXPOSE 8400 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "payment-service.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +ENV SPRING_PROFILES_ACTIVE dev +COPY payment-service/ . +ADD payment-service/target/payment-service-v${PROJECT_VERSION}.jar payment-service.jar +EXPOSE 8400 +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "payment-service.jar"] + + diff --git a/payment-service/compose.yml b/payment-service/compose.yml index 4c3539d19..d6f9d9216 100644 --- a/payment-service/compose.yml +++ b/payment-service/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - payment-service-container: - image: selimhorri/payment-service-ecommerce-boot:0.1.0 - ports: - - 8400:8400 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + payment-service-container: + image: selimhorri/payment-service-ecommerce-boot:0.1.0 + ports: + - 8400:8400 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/payment-service/mvnw b/payment-service/mvnw index a16b5431b..4c1c42714 100755 --- a/payment-service/mvnw +++ b/payment-service/mvnw @@ -1,310 +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 "$@" +#!/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/payment-service/mvnw.cmd b/payment-service/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/payment-service/mvnw.cmd +++ b/payment-service/mvnw.cmd @@ -1,182 +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% +@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/payment-service/pom.xml b/payment-service/pom.xml index 0f3da9562..8f3632ebb 100644 --- a/payment-service/pom.xml +++ b/payment-service/pom.xml @@ -1,115 +1,115 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - payment-service - payment-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + payment-service + payment-service + Spring Boot microservice + jar + + + 11 + 2020.0.4 + 1.16.0 + + + + + org.springframework.cloud + spring-cloud-starter + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + com.h2database + h2 + runtime + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.testcontainers + mysql + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + ${project.artifactId}-v${project.version} + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/PaymentServiceApplication.java b/payment-service/src/main/java/com/selimhorri/app/PaymentServiceApplication.java index 4b46f8158..f01be6181 100644 --- a/payment-service/src/main/java/com/selimhorri/app/PaymentServiceApplication.java +++ b/payment-service/src/main/java/com/selimhorri/app/PaymentServiceApplication.java @@ -1,35 +1,35 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -@EnableEurekaClient -public class PaymentServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(PaymentServiceApplication.class, args); - } - - - -} - -@RestController -class PaymentController { - - @GetMapping - public String msg() { - return "Payment controller responding!!"; - } - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@EnableEurekaClient +public class PaymentServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(PaymentServiceApplication.class, args); + } + + + +} + +@RestController +class PaymentController { + + @GetMapping + public String msg() { + return "Payment controller responding!!"; + } + +} + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/payment-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java index a6346459a..27021f387 100644 --- a/payment-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ b/payment-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.client; + +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class ClientConfig { + + @LoadBalanced + @Bean + public RestTemplate restTemplateBean() { + return new RestTemplate(); + } + + + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/payment-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java index 7e0f843ea..f7de593a7 100644 --- a/payment-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ b/payment-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java @@ -1,31 +1,31 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.mapper; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; + +@Configuration +public class MapperConfig { + + @Bean + public ObjectMapper objectMapperBean() { + return new JsonMapper() + .enable(SerializationFeature.INDENT_OUTPUT); + } + + + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/payment-service/src/main/java/com/selimhorri/app/constant/AppConstant.java index 40f49bbc3..2e051c4b5 100644 --- a/payment-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ b/payment-service/src/main/java/com/selimhorri/app/constant/AppConstant.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - +package com.selimhorri.app.constant; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public abstract class AppConstant { + + public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; + public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public abstract class DiscoveredDomainsApi { + + public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; + public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; + + public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; + public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; + + public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; + public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; + + public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; + public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; + + public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; + public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; + + public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; + public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; + + } + + + +} + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/payment-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java index 3f4dd17fa..b19764968 100644 --- a/payment-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ b/payment-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.time.Instant; + +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@MappedSuperclass +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@Data +abstract public class AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @CreatedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "created_at") + private Instant createdAt; + + @LastModifiedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "updated_at") + private Instant updatedAt; + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/domain/Payment.java b/payment-service/src/main/java/com/selimhorri/app/domain/Payment.java index 3d2daed24..8455b8f1c 100644 --- a/payment-service/src/main/java/com/selimhorri/app/domain/Payment.java +++ b/payment-service/src/main/java/com/selimhorri/app/domain/Payment.java @@ -1,56 +1,56 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "payments") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -@Data -@Builder -public final class Payment extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "payment_id", unique = true, nullable = false, updatable = false) - private Integer paymentId; - - @Column(name = "order_id") - private Integer orderId; - - @Column(name = "is_payed") - private Boolean isPayed; - - @Enumerated(EnumType.STRING) - @Column(name = "payment_status") - private PaymentStatus paymentStatus; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "payments") +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Data +@Builder +public final class Payment extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "payment_id", unique = true, nullable = false, updatable = false) + private Integer paymentId; + + @Column(name = "order_id") + private Integer orderId; + + @Column(name = "is_payed") + private Boolean isPayed; + + @Enumerated(EnumType.STRING) + @Column(name = "payment_status") + private PaymentStatus paymentStatus; + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/domain/PaymentStatus.java b/payment-service/src/main/java/com/selimhorri/app/domain/PaymentStatus.java index 37c145c7c..72834abbb 100644 --- a/payment-service/src/main/java/com/selimhorri/app/domain/PaymentStatus.java +++ b/payment-service/src/main/java/com/selimhorri/app/domain/PaymentStatus.java @@ -1,16 +1,16 @@ -package com.selimhorri.app.domain; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum PaymentStatus { - - NOT_STARTED("not_started"), - IN_PROGRESS("in_progress"), - COMPLETED("completed"); - - private final String status; - -} +package com.selimhorri.app.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum PaymentStatus { + + NOT_STARTED("not_started"), + IN_PROGRESS("in_progress"), + COMPLETED("completed"); + + private final String status; + +} diff --git a/payment-service/src/main/java/com/selimhorri/app/dto/OrderDto.java b/payment-service/src/main/java/com/selimhorri/app/dto/OrderDto.java index 8e5598ece..a6dbaff7a 100644 --- a/payment-service/src/main/java/com/selimhorri/app/dto/OrderDto.java +++ b/payment-service/src/main/java/com/selimhorri/app/dto/OrderDto.java @@ -1,49 +1,49 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer orderId; + + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime orderDate; + private String orderDesc; + private Double orderFee; + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/dto/PaymentDto.java b/payment-service/src/main/java/com/selimhorri/app/dto/PaymentDto.java index a7c686081..e402223cc 100644 --- a/payment-service/src/main/java/com/selimhorri/app/dto/PaymentDto.java +++ b/payment-service/src/main/java/com/selimhorri/app/dto/PaymentDto.java @@ -1,41 +1,41 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.domain.PaymentStatus; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class PaymentDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer paymentId; - private Boolean isPayed; - private PaymentStatus paymentStatus; - - @JsonProperty("order") - @JsonInclude(Include.NON_NULL) - private OrderDto orderDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.selimhorri.app.domain.PaymentStatus; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class PaymentDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer paymentId; + private Boolean isPayed; + private PaymentStatus paymentStatus; + + @JsonProperty("order") + @JsonInclude(Include.NON_NULL) + private OrderDto orderDto; + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/payment-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java index 920a621ab..ecee30efd 100644 --- a/payment-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ b/payment-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java @@ -1,28 +1,28 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - +package com.selimhorri.app.dto.response.collection; + +import java.util.Collection; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class DtoCollectionResponse { + + private Collection collection; + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/payment-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java index 2a034e679..ef5bfe3b1 100644 --- a/payment-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ b/payment-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java @@ -1,73 +1,73 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.PaymentNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - IllegalStateException.class, - PaymentNotFoundException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.selimhorri.app.exception.payload.ExceptionMsg; +import com.selimhorri.app.exception.wrapper.PaymentNotFoundException; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@ControllerAdvice +@Slf4j +@RequiredArgsConstructor +public class ApiExceptionHandler { + + @ExceptionHandler(value = { + MethodArgumentNotValidException.class, + HttpMessageNotReadableException.class, + }) + public ResponseEntity handleValidationException(final T e) { + + log.info("**ApiExceptionHandler controller, handle validation exception*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + @ExceptionHandler(value = { + IllegalStateException.class, + PaymentNotFoundException.class, + }) + public ResponseEntity handleApiRequestException(final T e) { + + log.info("**ApiExceptionHandler controller, handle API request*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("#### " + e.getMessage() + "! ####") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/payment-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java index 274842143..77429c9d1 100644 --- a/payment-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ b/payment-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - +package com.selimhorri.app.exception.payload; + +import java.io.Serializable; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@AllArgsConstructor +@Data +@Builder +public final class ExceptionMsg implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ZonedDateTimeSerializer.class) + @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) + private final ZonedDateTime timestamp; + + @JsonInclude(value = Include.NON_NULL) + private Throwable throwable; + private final HttpStatus httpStatus; + private final String msg; + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/exception/wrapper/PaymentNotFoundException.java b/payment-service/src/main/java/com/selimhorri/app/exception/wrapper/PaymentNotFoundException.java index 9518bccb4..dd29e7250 100644 --- a/payment-service/src/main/java/com/selimhorri/app/exception/wrapper/PaymentNotFoundException.java +++ b/payment-service/src/main/java/com/selimhorri/app/exception/wrapper/PaymentNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class PaymentNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public PaymentNotFoundException() { - super(); - } - - public PaymentNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public PaymentNotFoundException(String message) { - super(message); - } - - public PaymentNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class PaymentNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public PaymentNotFoundException() { + super(); + } + + public PaymentNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public PaymentNotFoundException(String message) { + super(message); + } + + public PaymentNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/helper/PaymentMappingHelper.java b/payment-service/src/main/java/com/selimhorri/app/helper/PaymentMappingHelper.java index 9e06de140..5fa48b5fa 100644 --- a/payment-service/src/main/java/com/selimhorri/app/helper/PaymentMappingHelper.java +++ b/payment-service/src/main/java/com/selimhorri/app/helper/PaymentMappingHelper.java @@ -1,42 +1,42 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Payment; -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.PaymentDto; - -public interface PaymentMappingHelper { - - public static PaymentDto map(final Payment payment) { - return PaymentDto.builder() - .paymentId(payment.getPaymentId()) - .isPayed(payment.getIsPayed()) - .paymentStatus(payment.getPaymentStatus()) - .orderDto( - OrderDto.builder() - .orderId(payment.getOrderId()) - .build()) - .build(); - } - - public static Payment map(final PaymentDto paymentDto) { - return Payment.builder() - .paymentId(paymentDto.getPaymentId()) - .orderId(paymentDto.getOrderDto().getOrderId()) - .isPayed(paymentDto.getIsPayed()) - .paymentStatus(paymentDto.getPaymentStatus()) - .build(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.Payment; +import com.selimhorri.app.dto.OrderDto; +import com.selimhorri.app.dto.PaymentDto; + +public interface PaymentMappingHelper { + + public static PaymentDto map(final Payment payment) { + return PaymentDto.builder() + .paymentId(payment.getPaymentId()) + .isPayed(payment.getIsPayed()) + .paymentStatus(payment.getPaymentStatus()) + .orderDto( + OrderDto.builder() + .orderId(payment.getOrderId()) + .build()) + .build(); + } + + public static Payment map(final PaymentDto paymentDto) { + return Payment.builder() + .paymentId(paymentDto.getPaymentId()) + .orderId(paymentDto.getOrderDto().getOrderId()) + .isPayed(paymentDto.getIsPayed()) + .paymentStatus(paymentDto.getPaymentStatus()) + .build(); + } + + + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/repository/PaymentRepository.java b/payment-service/src/main/java/com/selimhorri/app/repository/PaymentRepository.java index 2aa489829..b6224c8fe 100644 --- a/payment-service/src/main/java/com/selimhorri/app/repository/PaymentRepository.java +++ b/payment-service/src/main/java/com/selimhorri/app/repository/PaymentRepository.java @@ -1,11 +1,11 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Payment; - -public interface PaymentRepository extends JpaRepository { - - - -} +package com.selimhorri.app.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.Payment; + +public interface PaymentRepository extends JpaRepository { + + + +} diff --git a/payment-service/src/main/java/com/selimhorri/app/resource/PaymentResource.java b/payment-service/src/main/java/com/selimhorri/app/resource/PaymentResource.java index 8ba435254..227419d92 100644 --- a/payment-service/src/main/java/com/selimhorri/app/resource/PaymentResource.java +++ b/payment-service/src/main/java/com/selimhorri/app/resource/PaymentResource.java @@ -1,84 +1,84 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.PaymentDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.PaymentService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/payments") -@Slf4j -@RequiredArgsConstructor -public class PaymentResource { - - private final PaymentService paymentService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** PaymentDto List, controller; fetch all payments *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.paymentService.findAll())); - } - - @GetMapping("/{paymentId}") - public ResponseEntity findById( - @PathVariable("paymentId") - @NotBlank(message = "Input must not be blank") - @Valid final String paymentId) { - log.info("*** PaymentDto, resource; fetch payment by id *"); - return ResponseEntity.ok(this.paymentService.findById(Integer.parseInt(paymentId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final PaymentDto paymentDto) { - log.info("*** PaymentDto, resource; save payment *"); - return ResponseEntity.ok(this.paymentService.save(paymentDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final PaymentDto paymentDto) { - log.info("*** PaymentDto, resource; update payment *"); - return ResponseEntity.ok(this.paymentService.update(paymentDto)); - } - - @DeleteMapping("/{paymentId}") - public ResponseEntity deleteById(@PathVariable("paymentId") final String paymentId) { - log.info("*** Boolean, resource; delete payment by id *"); - this.paymentService.deleteById(Integer.parseInt(paymentId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.dto.PaymentDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.PaymentService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("/api/payments") +@Slf4j +@RequiredArgsConstructor +public class PaymentResource { + + private final PaymentService paymentService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** PaymentDto List, controller; fetch all payments *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.paymentService.findAll())); + } + + @GetMapping("/{paymentId}") + public ResponseEntity findById( + @PathVariable("paymentId") + @NotBlank(message = "Input must not be blank") + @Valid final String paymentId) { + log.info("*** PaymentDto, resource; fetch payment by id *"); + return ResponseEntity.ok(this.paymentService.findById(Integer.parseInt(paymentId))); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final PaymentDto paymentDto) { + log.info("*** PaymentDto, resource; save payment *"); + return ResponseEntity.ok(this.paymentService.save(paymentDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final PaymentDto paymentDto) { + log.info("*** PaymentDto, resource; update payment *"); + return ResponseEntity.ok(this.paymentService.update(paymentDto)); + } + + @DeleteMapping("/{paymentId}") + public ResponseEntity deleteById(@PathVariable("paymentId") final String paymentId) { + log.info("*** Boolean, resource; delete payment by id *"); + this.paymentService.deleteById(Integer.parseInt(paymentId)); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/payment-service/src/main/java/com/selimhorri/app/service/PaymentService.java b/payment-service/src/main/java/com/selimhorri/app/service/PaymentService.java index fbf754754..c6876008f 100644 --- a/payment-service/src/main/java/com/selimhorri/app/service/PaymentService.java +++ b/payment-service/src/main/java/com/selimhorri/app/service/PaymentService.java @@ -1,15 +1,15 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.PaymentDto; - -public interface PaymentService { - - List findAll(); - PaymentDto findById(final Integer paymentId); - PaymentDto save(final PaymentDto paymentDto); - PaymentDto update(final PaymentDto paymentDto); - void deleteById(final Integer paymentId); - -} +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.dto.PaymentDto; + +public interface PaymentService { + + List findAll(); + PaymentDto findById(final Integer paymentId); + PaymentDto save(final PaymentDto paymentDto); + PaymentDto update(final PaymentDto paymentDto); + void deleteById(final Integer paymentId); + +} diff --git a/payment-service/src/main/java/com/selimhorri/app/service/impl/PaymentServiceImpl.java b/payment-service/src/main/java/com/selimhorri/app/service/impl/PaymentServiceImpl.java index 588d69942..d14d6f0d9 100644 --- a/payment-service/src/main/java/com/selimhorri/app/service/impl/PaymentServiceImpl.java +++ b/payment-service/src/main/java/com/selimhorri/app/service/impl/PaymentServiceImpl.java @@ -1,90 +1,90 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.PaymentDto; -import com.selimhorri.app.exception.wrapper.PaymentNotFoundException; -import com.selimhorri.app.helper.PaymentMappingHelper; -import com.selimhorri.app.repository.PaymentRepository; -import com.selimhorri.app.service.PaymentService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class PaymentServiceImpl implements PaymentService { - - private final PaymentRepository paymentRepository; - private final RestTemplate restTemplate; - - @Override - public List findAll() { - log.info("*** PaymentDto List, service; fetch all payments *"); - return this.paymentRepository.findAll() - .stream() - .map(PaymentMappingHelper::map) - .map(p -> { - p.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .ORDER_SERVICE_API_URL + "/" + p.getOrderDto().getOrderId(), OrderDto.class)); - return p; - }) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public PaymentDto findById(final Integer paymentId) { - log.info("*** PaymentDto, service; fetch payment by id *"); - return this.paymentRepository.findById(paymentId) - .map(PaymentMappingHelper::map) - .map(p -> { - p.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .ORDER_SERVICE_API_URL + "/" + p.getOrderDto().getOrderId(), OrderDto.class)); - return p; - }) - .orElseThrow(() -> new PaymentNotFoundException(String.format("Payment with id: %d not found", paymentId))); - } - - @Override - public PaymentDto save(final PaymentDto paymentDto) { - log.info("*** PaymentDto, service; save payment *"); - return PaymentMappingHelper.map(this.paymentRepository - .save(PaymentMappingHelper.map(paymentDto))); - } - - @Override - public PaymentDto update(final PaymentDto paymentDto) { - log.info("*** PaymentDto, service; update payment *"); - return PaymentMappingHelper.map(this.paymentRepository - .save(PaymentMappingHelper.map(paymentDto))); - } - - @Override - public void deleteById(final Integer paymentId) { - log.info("*** Void, service; delete payment by id *"); - this.paymentRepository.deleteById(paymentId); - } - - - -} - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.selimhorri.app.constant.AppConstant; +import com.selimhorri.app.dto.OrderDto; +import com.selimhorri.app.dto.PaymentDto; +import com.selimhorri.app.exception.wrapper.PaymentNotFoundException; +import com.selimhorri.app.helper.PaymentMappingHelper; +import com.selimhorri.app.repository.PaymentRepository; +import com.selimhorri.app.service.PaymentService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class PaymentServiceImpl implements PaymentService { + + private final PaymentRepository paymentRepository; + private final RestTemplate restTemplate; + + @Override + public List findAll() { + log.info("*** PaymentDto List, service; fetch all payments *"); + return this.paymentRepository.findAll() + .stream() + .map(PaymentMappingHelper::map) + .map(p -> { + p.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi + .ORDER_SERVICE_API_URL + "/" + p.getOrderDto().getOrderId(), OrderDto.class)); + return p; + }) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public PaymentDto findById(final Integer paymentId) { + log.info("*** PaymentDto, service; fetch payment by id *"); + return this.paymentRepository.findById(paymentId) + .map(PaymentMappingHelper::map) + .map(p -> { + p.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi + .ORDER_SERVICE_API_URL + "/" + p.getOrderDto().getOrderId(), OrderDto.class)); + return p; + }) + .orElseThrow(() -> new PaymentNotFoundException(String.format("Payment with id: %d not found", paymentId))); + } + + @Override + public PaymentDto save(final PaymentDto paymentDto) { + log.info("*** PaymentDto, service; save payment *"); + return PaymentMappingHelper.map(this.paymentRepository + .save(PaymentMappingHelper.map(paymentDto))); + } + + @Override + public PaymentDto update(final PaymentDto paymentDto) { + log.info("*** PaymentDto, service; update payment *"); + return PaymentMappingHelper.map(this.paymentRepository + .save(PaymentMappingHelper.map(paymentDto))); + } + + @Override + public void deleteById(final Integer paymentId) { + log.info("*** Void, service; delete payment by id *"); + this.paymentRepository.deleteById(paymentId); + } + + + +} + + + + + + + + + diff --git a/payment-service/src/main/resources/application-dev.yml b/payment-service/src/main/resources/application-dev.yml index adbba60ac..3aedacf69 100644 --- a/payment-service/src/main/resources/application-dev.yml +++ b/payment-service/src/main/resources/application-dev.yml @@ -1,47 +1,47 @@ - -server: - port: 8400 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8400 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect + use_sql_comments: true + format_sql: true + h2: + console: + enabled: true + path: /h2-console + #flyway: + # baseline-on-migrate: true + # enabled: true + +logging: + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/payment-service/src/main/resources/application-prod.yml b/payment-service/src/main/resources/application-prod.yml index fe86f59c1..be3e5eeb8 100644 --- a/payment-service/src/main/resources/application-prod.yml +++ b/payment-service/src/main/resources/application-prod.yml @@ -1,43 +1,43 @@ - -server: - port: 8400 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - + +server: + port: 8400 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: false + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/prod_log.log + clean-history-on-start: false + level: + org: + hibernate: + SQL: INFO + springframework: + web: INFO + data: INFO + boot: + autoconfigure: + data: + rest: INFO + jpa: INFO + orm: INFO + diff --git a/payment-service/src/main/resources/application-stage.yml b/payment-service/src/main/resources/application-stage.yml index 21eae16b6..9ab5e1c93 100644 --- a/payment-service/src/main/resources/application-stage.yml +++ b/payment-service/src/main/resources/application-stage.yml @@ -1,43 +1,43 @@ - -server: - port: 8400 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8400 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/stage_log.log + clean-history-on-start: true + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/payment-service/src/main/resources/application.yml b/payment-service/src/main/resources/application.yml index f595a0bf3..8a8521980 100644 --- a/payment-service/src/main/resources/application.yml +++ b/payment-service/src/main/resources/application.yml @@ -1,46 +1,63 @@ - -server: - servlet: - context-path: /payment-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: PAYMENT-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - paymentService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - - + +server: + servlet: + context-path: /payment-service + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + config: + import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} + application: + name: PAYMENT-SERVICE + profiles: + active: + - dev + +resilience4j: + circuitbreaker: + instances: + paymentService: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + +spring: + cloud: + loadbalancer: + ribbon: + enabled: false + cache: + enabled: false # Deshabilita el caché temporalmente para debugging + +eureka: + instance: + prefer-ip-address: true + instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} + client: + service-url: + defaultZone: http://service-discovery-container:8761/eureka/ + registry-fetch-interval-seconds: 5 # Más frecuente para testing + instance-info-replication-interval-seconds: 5 + + + + + + + + diff --git a/payment-service/src/main/resources/db/migration/V1__create_payments_table.sql b/payment-service/src/main/resources/db/migration/V1__create_payments_table.sql index c8d548761..d41db4dbd 100644 --- a/payment-service/src/main/resources/db/migration/V1__create_payments_table.sql +++ b/payment-service/src/main/resources/db/migration/V1__create_payments_table.sql @@ -1,10 +1,10 @@ - -CREATE TABLE payments ( - payment_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - order_id INT(11), - is_payed BOOLEAN, - payment_status VARCHAR(255), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - + +CREATE TABLE payments ( + payment_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + order_id INT(11), + is_payed BOOLEAN, + payment_status VARCHAR(255), + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP +); + diff --git a/payment-service/src/main/resources/db/migration/V2__insert_payments_table.sql b/payment-service/src/main/resources/db/migration/V2__insert_payments_table.sql index 888f0b942..3d03177e4 100644 --- a/payment-service/src/main/resources/db/migration/V2__insert_payments_table.sql +++ b/payment-service/src/main/resources/db/migration/V2__insert_payments_table.sql @@ -1,8 +1,8 @@ - -INSERT INTO payments -(order_id, is_payed, payment_status) VALUES -(1, false, 'IN_PROGRESS'), -(2, false, 'IN_PROGRESS'), -(3, false, 'IN_PROGRESS'), -(4, false, 'IN_PROGRESS'); - + +INSERT INTO payments +(order_id, is_payed, payment_status) VALUES +(1, false, 'IN_PROGRESS'), +(2, false, 'IN_PROGRESS'), +(3, false, 'IN_PROGRESS'), +(4, false, 'IN_PROGRESS'); + diff --git a/payment-service/src/test/java/com/selimhorri/app/PaymentServiceApplicationTests.java b/payment-service/src/test/java/com/selimhorri/app/PaymentServiceApplicationTests.java index 0858c9cd2..af8d26f2d 100644 --- a/payment-service/src/test/java/com/selimhorri/app/PaymentServiceApplicationTests.java +++ b/payment-service/src/test/java/com/selimhorri/app/PaymentServiceApplicationTests.java @@ -1,16 +1,16 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class PaymentServiceApplicationTests { - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class PaymentServiceApplicationTests { + + + +} + + + + + + diff --git a/pom.xml b/pom.xml index 832247436..27151c5b4 100644 --- a/pom.xml +++ b/pom.xml @@ -1,129 +1,129 @@ - - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.5.7 - - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - ecommerce-microservice-backend - Ecommerce backend implemented in Spring Boot and Spring Cloud! - pom - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.cloud - spring-cloud-starter-circuitbreaker-resilience4j - - - io.micrometer - micrometer-registry-prometheus - - - org.springframework.cloud - spring-cloud-sleuth-zipkin - - - org.springframework.cloud - spring-cloud-starter-sleuth - - - org.springframework.boot - spring-boot-devtools - runtime - true - - - org.springframework.boot - spring-boot-configuration-processor - true - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - org.springdoc - springdoc-openapi-ui - 1.6.3 - - - org.springframework.boot - spring-boot-starter-test - test - - - org.testcontainers - junit-jupiter - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - service-discovery - cloud-config - api-gateway - proxy-client - user-service - product-service - favourite-service - order-service - shipping-service - payment-service - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - ${project.artifactId}-v${project.version} - - - - - - - + + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.7 + + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + ecommerce-microservice-backend + Ecommerce backend implemented in Spring Boot and Spring Cloud! + pom + + + 11 + 2020.0.4 + 1.16.0 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-starter-circuitbreaker-resilience4j + + + io.micrometer + micrometer-registry-prometheus + + + org.springframework.cloud + spring-cloud-sleuth-zipkin + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-configuration-processor + true + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + org.springdoc + springdoc-openapi-ui + 1.6.3 + + + org.springframework.boot + spring-boot-starter-test + test + + + org.testcontainers + junit-jupiter + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + service-discovery + cloud-config + api-gateway + proxy-client + user-service + product-service + favourite-service + order-service + shipping-service + payment-service + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + ${project.artifactId}-v${project.version} + + + + + + + diff --git a/product-service/.gitignore b/product-service/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/product-service/.gitignore +++ b/product-service/.gitignore @@ -1,33 +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/ +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/product-service/.mvn/wrapper/MavenWrapperDownloader.java b/product-service/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/product-service/.mvn/wrapper/MavenWrapperDownloader.java +++ b/product-service/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/product-service/.mvn/wrapper/maven-wrapper.properties b/product-service/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/product-service/.mvn/wrapper/maven-wrapper.properties +++ b/product-service/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/product-service/Dockerfile b/product-service/Dockerfile index c052995cf..9fb128f89 100644 --- a/product-service/Dockerfile +++ b/product-service/Dockerfile @@ -1,12 +1,12 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY product-service/ . -ADD product-service/target/product-service-v${PROJECT_VERSION}.jar product-service.jar -EXPOSE 8500 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "product-service.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +ENV SPRING_PROFILES_ACTIVE dev +COPY product-service/ . +ADD product-service/target/product-service-v${PROJECT_VERSION}.jar product-service.jar +EXPOSE 8500 +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "product-service.jar"] + + diff --git a/product-service/compose.yml b/product-service/compose.yml index 618eb819a..69c6370eb 100644 --- a/product-service/compose.yml +++ b/product-service/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - product-service-container: - image: selimhorri/product-service-ecommerce-boot:0.1.0 - ports: - - 8500:8500 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + product-service-container: + image: selimhorri/product-service-ecommerce-boot:0.1.0 + ports: + - 8500:8500 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/product-service/mvnw b/product-service/mvnw index a16b5431b..4c1c42714 100755 --- a/product-service/mvnw +++ b/product-service/mvnw @@ -1,310 +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 "$@" +#!/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/product-service/mvnw.cmd b/product-service/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/product-service/mvnw.cmd +++ b/product-service/mvnw.cmd @@ -1,182 +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% +@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/product-service/pom.xml b/product-service/pom.xml index ac89c6c8a..c04252e05 100644 --- a/product-service/pom.xml +++ b/product-service/pom.xml @@ -1,119 +1,119 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - product-service - product-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + product-service + product-service + Spring Boot microservice + jar + + + 11 + 2020.0.4 + 1.16.0 + + + + + org.springframework.cloud + spring-cloud-starter + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + com.h2database + h2 + runtime + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.testcontainers + mysql + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + ${project.artifactId}-v${project.version} + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/ProductServiceApplication.java b/product-service/src/main/java/com/selimhorri/app/ProductServiceApplication.java index 0edb0b7fc..04c9708e9 100644 --- a/product-service/src/main/java/com/selimhorri/app/ProductServiceApplication.java +++ b/product-service/src/main/java/com/selimhorri/app/ProductServiceApplication.java @@ -1,23 +1,23 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -public class ProductServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(ProductServiceApplication.class, args); - } - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; + +@SpringBootApplication +@EnableEurekaClient +public class ProductServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(ProductServiceApplication.class, args); + } + + + +} + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/product-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java index a6346459a..27021f387 100644 --- a/product-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ b/product-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.client; + +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class ClientConfig { + + @LoadBalanced + @Bean + public RestTemplate restTemplateBean() { + return new RestTemplate(); + } + + + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/product-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java index 7e0f843ea..f7de593a7 100644 --- a/product-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ b/product-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java @@ -1,31 +1,31 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.mapper; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; + +@Configuration +public class MapperConfig { + + @Bean + public ObjectMapper objectMapperBean() { + return new JsonMapper() + .enable(SerializationFeature.INDENT_OUTPUT); + } + + + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/product-service/src/main/java/com/selimhorri/app/constant/AppConstant.java index 40f49bbc3..2e051c4b5 100644 --- a/product-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ b/product-service/src/main/java/com/selimhorri/app/constant/AppConstant.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - +package com.selimhorri.app.constant; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public abstract class AppConstant { + + public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; + public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public abstract class DiscoveredDomainsApi { + + public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; + public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; + + public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; + public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; + + public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; + public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; + + public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; + public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; + + public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; + public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; + + public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; + public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; + + } + + + +} + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/product-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java index 3f4dd17fa..b19764968 100644 --- a/product-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ b/product-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.time.Instant; + +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@MappedSuperclass +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@Data +abstract public class AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @CreatedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "created_at") + private Instant createdAt; + + @LastModifiedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "updated_at") + private Instant updatedAt; + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/domain/Category.java b/product-service/src/main/java/com/selimhorri/app/domain/Category.java index fae7ae140..8696fcf56 100644 --- a/product-service/src/main/java/com/selimhorri/app/domain/Category.java +++ b/product-service/src/main/java/com/selimhorri/app/domain/Category.java @@ -1,70 +1,70 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "categories") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"subCategories", "parentCategory", "products"}) -@Data -@Builder -public final class Category extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "category_id", unique = true, nullable = false, updatable = false) - private Integer categoryId; - - @Column(name = "category_title") - private String categoryTitle; - - @Column(name = "image_url") - private String imageUrl; - - @JsonIgnore - @OneToMany(mappedBy = "parentCategory", fetch = FetchType.LAZY, cascade = CascadeType.ALL) - private Set subCategories; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "parent_category_id") - private Category parentCategory; - - @JsonIgnore - @OneToMany(mappedBy = "category", fetch = FetchType.LAZY, cascade = CascadeType.ALL) - private Set products; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "categories") +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true, exclude = {"subCategories", "parentCategory", "products"}) +@Data +@Builder +public final class Category extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "category_id", unique = true, nullable = false, updatable = false) + private Integer categoryId; + + @Column(name = "category_title") + private String categoryTitle; + + @Column(name = "image_url") + private String imageUrl; + + @JsonIgnore + @OneToMany(mappedBy = "parentCategory", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + private Set subCategories; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "parent_category_id") + private Category parentCategory; + + @JsonIgnore + @OneToMany(mappedBy = "category", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + private Set products; + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/domain/Product.java b/product-service/src/main/java/com/selimhorri/app/domain/Product.java index 5d5d7a003..6864f707f 100644 --- a/product-service/src/main/java/com/selimhorri/app/domain/Product.java +++ b/product-service/src/main/java/com/selimhorri/app/domain/Product.java @@ -1,66 +1,66 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "products") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"category"}) -@Data -@Builder -public final class Product extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "product_id", unique = true, nullable = false, updatable = false) - private Integer productId; - - @Column(name = "product_title") - private String productTitle; - - @Column(name = "image_url") - private String imageUrl; - - @Column(unique = true) - private String sku; - - @Column(name = "price_unit", columnDefinition = "decimal") - private Double priceUnit; - - @Column(name = "quantity") - private Integer quantity; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "category_id") - private Category category; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "products") +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true, exclude = {"category"}) +@Data +@Builder +public final class Product extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "product_id", unique = true, nullable = false, updatable = false) + private Integer productId; + + @Column(name = "product_title") + private String productTitle; + + @Column(name = "image_url") + private String imageUrl; + + @Column(unique = true) + private String sku; + + @Column(name = "price_unit", columnDefinition = "decimal") + private Double priceUnit; + + @Column(name = "quantity") + private Integer quantity; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "category_id") + private Category category; + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/dto/CategoryDto.java b/product-service/src/main/java/com/selimhorri/app/dto/CategoryDto.java index b66fb7d60..e641d3653 100644 --- a/product-service/src/main/java/com/selimhorri/app/dto/CategoryDto.java +++ b/product-service/src/main/java/com/selimhorri/app/dto/CategoryDto.java @@ -1,47 +1,47 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CategoryDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer categoryId; - private String categoryTitle; - private String imageUrl; - - @JsonInclude(Include.NON_NULL) - private Set subCategoriesDtos; - - @JsonProperty("parentCategory") - @JsonInclude(Include.NON_NULL) - private CategoryDto parentCategoryDto; - - @JsonInclude(Include.NON_NULL) - private Set productDtos; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CategoryDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer categoryId; + private String categoryTitle; + private String imageUrl; + + @JsonInclude(Include.NON_NULL) + private Set subCategoriesDtos; + + @JsonProperty("parentCategory") + @JsonInclude(Include.NON_NULL) + private CategoryDto parentCategoryDto; + + @JsonInclude(Include.NON_NULL) + private Set productDtos; + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/dto/ProductDto.java b/product-service/src/main/java/com/selimhorri/app/dto/ProductDto.java index fe45297e6..d5d70c66f 100644 --- a/product-service/src/main/java/com/selimhorri/app/dto/ProductDto.java +++ b/product-service/src/main/java/com/selimhorri/app/dto/ProductDto.java @@ -1,42 +1,42 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonProperty("category") - @JsonInclude(Include.NON_NULL) - private CategoryDto categoryDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ProductDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer productId; + private String productTitle; + private String imageUrl; + private String sku; + private Double priceUnit; + private Integer quantity; + + @JsonProperty("category") + @JsonInclude(Include.NON_NULL) + private CategoryDto categoryDto; + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/product-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java index 920a621ab..ecee30efd 100644 --- a/product-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ b/product-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java @@ -1,28 +1,28 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - +package com.selimhorri.app.dto.response.collection; + +import java.util.Collection; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class DtoCollectionResponse { + + private Collection collection; + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/product-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java index 1912cbfef..98a98437c 100644 --- a/product-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ b/product-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java @@ -1,74 +1,74 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.CategoryNotFoundException; -import com.selimhorri.app.exception.wrapper.ProductNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - CategoryNotFoundException.class, - ProductNotFoundException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.selimhorri.app.exception.payload.ExceptionMsg; +import com.selimhorri.app.exception.wrapper.CategoryNotFoundException; +import com.selimhorri.app.exception.wrapper.ProductNotFoundException; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@ControllerAdvice +@Slf4j +@RequiredArgsConstructor +public class ApiExceptionHandler { + + @ExceptionHandler(value = { + MethodArgumentNotValidException.class, + HttpMessageNotReadableException.class, + }) + public ResponseEntity handleValidationException(final T e) { + + log.info("**ApiExceptionHandler controller, handle validation exception*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + @ExceptionHandler(value = { + CategoryNotFoundException.class, + ProductNotFoundException.class, + }) + public ResponseEntity handleApiRequestException(final T e) { + + log.info("**ApiExceptionHandler controller, handle API request*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("#### " + e.getMessage() + "! ####") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/product-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java index 274842143..77429c9d1 100644 --- a/product-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ b/product-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - +package com.selimhorri.app.exception.payload; + +import java.io.Serializable; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@AllArgsConstructor +@Data +@Builder +public final class ExceptionMsg implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ZonedDateTimeSerializer.class) + @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) + private final ZonedDateTime timestamp; + + @JsonInclude(value = Include.NON_NULL) + private Throwable throwable; + private final HttpStatus httpStatus; + private final String msg; + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/exception/wrapper/CategoryNotFoundException.java b/product-service/src/main/java/com/selimhorri/app/exception/wrapper/CategoryNotFoundException.java index 5e4d0fa97..f31ee9689 100644 --- a/product-service/src/main/java/com/selimhorri/app/exception/wrapper/CategoryNotFoundException.java +++ b/product-service/src/main/java/com/selimhorri/app/exception/wrapper/CategoryNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class CategoryNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public CategoryNotFoundException() { - super(); - } - - public CategoryNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public CategoryNotFoundException(String message) { - super(message); - } - - public CategoryNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class CategoryNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public CategoryNotFoundException() { + super(); + } + + public CategoryNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public CategoryNotFoundException(String message) { + super(message); + } + + public CategoryNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/exception/wrapper/ProductNotFoundException.java b/product-service/src/main/java/com/selimhorri/app/exception/wrapper/ProductNotFoundException.java index b452b50ef..8e16e7e21 100644 --- a/product-service/src/main/java/com/selimhorri/app/exception/wrapper/ProductNotFoundException.java +++ b/product-service/src/main/java/com/selimhorri/app/exception/wrapper/ProductNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class ProductNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public ProductNotFoundException() { - super(); - } - - public ProductNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public ProductNotFoundException(String message) { - super(message); - } - - public ProductNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class ProductNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public ProductNotFoundException() { + super(); + } + + public ProductNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public ProductNotFoundException(String message) { + super(message); + } + + public ProductNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/helper/CategoryMappingHelper.java b/product-service/src/main/java/com/selimhorri/app/helper/CategoryMappingHelper.java index 0c91ace1e..3e9f805e8 100644 --- a/product-service/src/main/java/com/selimhorri/app/helper/CategoryMappingHelper.java +++ b/product-service/src/main/java/com/selimhorri/app/helper/CategoryMappingHelper.java @@ -1,58 +1,58 @@ -package com.selimhorri.app.helper; - -import java.util.Optional; - -import com.selimhorri.app.domain.Category; -import com.selimhorri.app.dto.CategoryDto; - -public interface CategoryMappingHelper { - - public static CategoryDto map(final Category category) { - - final var parentCategory = Optional.ofNullable(category - .getParentCategory()).orElseGet(() -> new Category()); - - return CategoryDto.builder() - .categoryId(category.getCategoryId()) - .categoryTitle(category.getCategoryTitle()) - .imageUrl(category.getImageUrl()) - .parentCategoryDto( - CategoryDto.builder() - .categoryId(parentCategory.getCategoryId()) - .categoryTitle(parentCategory.getCategoryTitle()) - .imageUrl(parentCategory.getImageUrl()) - .build()) - .build(); - } - - public static Category map(final CategoryDto categoryDto) { - - final var parentCategoryDto = Optional.ofNullable(categoryDto - .getParentCategoryDto()).orElseGet(() -> new CategoryDto()); - - return Category.builder() - .categoryId(categoryDto.getCategoryId()) - .categoryTitle(categoryDto.getCategoryTitle()) - .imageUrl(categoryDto.getImageUrl()) - .parentCategory( - Category.builder() - .categoryId(parentCategoryDto.getCategoryId()) - .categoryTitle(parentCategoryDto.getCategoryTitle()) - .imageUrl(parentCategoryDto.getImageUrl()) - .build()) - .build(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.helper; + +import java.util.Optional; + +import com.selimhorri.app.domain.Category; +import com.selimhorri.app.dto.CategoryDto; + +public interface CategoryMappingHelper { + + public static CategoryDto map(final Category category) { + + final var parentCategory = Optional.ofNullable(category + .getParentCategory()).orElseGet(() -> new Category()); + + return CategoryDto.builder() + .categoryId(category.getCategoryId()) + .categoryTitle(category.getCategoryTitle()) + .imageUrl(category.getImageUrl()) + .parentCategoryDto( + CategoryDto.builder() + .categoryId(parentCategory.getCategoryId()) + .categoryTitle(parentCategory.getCategoryTitle()) + .imageUrl(parentCategory.getImageUrl()) + .build()) + .build(); + } + + public static Category map(final CategoryDto categoryDto) { + + final var parentCategoryDto = Optional.ofNullable(categoryDto + .getParentCategoryDto()).orElseGet(() -> new CategoryDto()); + + return Category.builder() + .categoryId(categoryDto.getCategoryId()) + .categoryTitle(categoryDto.getCategoryTitle()) + .imageUrl(categoryDto.getImageUrl()) + .parentCategory( + Category.builder() + .categoryId(parentCategoryDto.getCategoryId()) + .categoryTitle(parentCategoryDto.getCategoryTitle()) + .imageUrl(parentCategoryDto.getImageUrl()) + .build()) + .build(); + } + + + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/helper/ProductMappingHelper.java b/product-service/src/main/java/com/selimhorri/app/helper/ProductMappingHelper.java index 9cf5ebca8..ce42f3c62 100644 --- a/product-service/src/main/java/com/selimhorri/app/helper/ProductMappingHelper.java +++ b/product-service/src/main/java/com/selimhorri/app/helper/ProductMappingHelper.java @@ -1,56 +1,56 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Category; -import com.selimhorri.app.domain.Product; -import com.selimhorri.app.dto.CategoryDto; -import com.selimhorri.app.dto.ProductDto; - -public interface ProductMappingHelper { - - public static ProductDto map(final Product product) { - return ProductDto.builder() - .productId(product.getProductId()) - .productTitle(product.getProductTitle()) - .imageUrl(product.getImageUrl()) - .sku(product.getSku()) - .priceUnit(product.getPriceUnit()) - .quantity(product.getQuantity()) - .categoryDto( - CategoryDto.builder() - .categoryId(product.getCategory().getCategoryId()) - .categoryTitle(product.getCategory().getCategoryTitle()) - .imageUrl(product.getCategory().getImageUrl()) - .build()) - .build(); - } - - public static Product map(final ProductDto productDto) { - return Product.builder() - .productId(productDto.getProductId()) - .productTitle(productDto.getProductTitle()) - .imageUrl(productDto.getImageUrl()) - .sku(productDto.getSku()) - .priceUnit(productDto.getPriceUnit()) - .quantity(productDto.getQuantity()) - .category( - Category.builder() - .categoryId(productDto.getCategoryDto().getCategoryId()) - .categoryTitle(productDto.getCategoryDto().getCategoryTitle()) - .imageUrl(productDto.getCategoryDto().getImageUrl()) - .build()) - .build(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.Category; +import com.selimhorri.app.domain.Product; +import com.selimhorri.app.dto.CategoryDto; +import com.selimhorri.app.dto.ProductDto; + +public interface ProductMappingHelper { + + public static ProductDto map(final Product product) { + return ProductDto.builder() + .productId(product.getProductId()) + .productTitle(product.getProductTitle()) + .imageUrl(product.getImageUrl()) + .sku(product.getSku()) + .priceUnit(product.getPriceUnit()) + .quantity(product.getQuantity()) + .categoryDto( + CategoryDto.builder() + .categoryId(product.getCategory().getCategoryId()) + .categoryTitle(product.getCategory().getCategoryTitle()) + .imageUrl(product.getCategory().getImageUrl()) + .build()) + .build(); + } + + public static Product map(final ProductDto productDto) { + return Product.builder() + .productId(productDto.getProductId()) + .productTitle(productDto.getProductTitle()) + .imageUrl(productDto.getImageUrl()) + .sku(productDto.getSku()) + .priceUnit(productDto.getPriceUnit()) + .quantity(productDto.getQuantity()) + .category( + Category.builder() + .categoryId(productDto.getCategoryDto().getCategoryId()) + .categoryTitle(productDto.getCategoryDto().getCategoryTitle()) + .imageUrl(productDto.getCategoryDto().getImageUrl()) + .build()) + .build(); + } + + + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/repository/CategoryRepository.java b/product-service/src/main/java/com/selimhorri/app/repository/CategoryRepository.java index db0fe24cd..4aee2cdd6 100644 --- a/product-service/src/main/java/com/selimhorri/app/repository/CategoryRepository.java +++ b/product-service/src/main/java/com/selimhorri/app/repository/CategoryRepository.java @@ -1,11 +1,11 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Category; - -public interface CategoryRepository extends JpaRepository { - - - -} +package com.selimhorri.app.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.Category; + +public interface CategoryRepository extends JpaRepository { + + + +} diff --git a/product-service/src/main/java/com/selimhorri/app/repository/ProductRepository.java b/product-service/src/main/java/com/selimhorri/app/repository/ProductRepository.java index 771a1a0a5..4dbae2a92 100644 --- a/product-service/src/main/java/com/selimhorri/app/repository/ProductRepository.java +++ b/product-service/src/main/java/com/selimhorri/app/repository/ProductRepository.java @@ -1,11 +1,11 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Product; - -public interface ProductRepository extends JpaRepository { - - - -} +package com.selimhorri.app.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.Product; + +public interface ProductRepository extends JpaRepository { + + + +} diff --git a/product-service/src/main/java/com/selimhorri/app/resource/CategoryResource.java b/product-service/src/main/java/com/selimhorri/app/resource/CategoryResource.java index ae1a447f1..917738a03 100644 --- a/product-service/src/main/java/com/selimhorri/app/resource/CategoryResource.java +++ b/product-service/src/main/java/com/selimhorri/app/resource/CategoryResource.java @@ -1,96 +1,96 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.CategoryDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.CategoryService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/categories") -@Slf4j -@RequiredArgsConstructor -public class CategoryResource { - - private final CategoryService categoryService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** CategoryDto List, controller; fetch all categories *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.categoryService.findAll())); - } - - @GetMapping("/{categoryId}") - public ResponseEntity findById( - @PathVariable("categoryId") - @NotBlank(message = "Input must not be blank") - @Valid final String categoryId) { - log.info("*** CategoryDto, resource; fetch category by id *"); - return ResponseEntity.ok(this.categoryService.findById(Integer.parseInt(categoryId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CategoryDto categoryDto) { - log.info("*** CategoryDto, resource; save category *"); - return ResponseEntity.ok(this.categoryService.save(categoryDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CategoryDto categoryDto) { - log.info("*** CategoryDto, resource; update category *"); - return ResponseEntity.ok(this.categoryService.update(categoryDto)); - } - - @PutMapping("/{categoryId}") - public ResponseEntity update( - @PathVariable("categoryId") - @NotBlank(message = "Input must not be blank") - @Valid final String categoryId, - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CategoryDto categoryDto) { - log.info("*** CategoryDto, resource; update category with categoryId *"); - return ResponseEntity.ok(this.categoryService.update(Integer.parseInt(categoryId), categoryDto)); - } - - @DeleteMapping("/{categoryId}") - public ResponseEntity deleteById(@PathVariable("categoryId") final String categoryId) { - log.info("*** Boolean, resource; delete category by id *"); - this.categoryService.deleteById(Integer.parseInt(categoryId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.dto.CategoryDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.CategoryService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("/api/categories") +@Slf4j +@RequiredArgsConstructor +public class CategoryResource { + + private final CategoryService categoryService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** CategoryDto List, controller; fetch all categories *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.categoryService.findAll())); + } + + @GetMapping("/{categoryId}") + public ResponseEntity findById( + @PathVariable("categoryId") + @NotBlank(message = "Input must not be blank") + @Valid final String categoryId) { + log.info("*** CategoryDto, resource; fetch category by id *"); + return ResponseEntity.ok(this.categoryService.findById(Integer.parseInt(categoryId))); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final CategoryDto categoryDto) { + log.info("*** CategoryDto, resource; save category *"); + return ResponseEntity.ok(this.categoryService.save(categoryDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final CategoryDto categoryDto) { + log.info("*** CategoryDto, resource; update category *"); + return ResponseEntity.ok(this.categoryService.update(categoryDto)); + } + + @PutMapping("/{categoryId}") + public ResponseEntity update( + @PathVariable("categoryId") + @NotBlank(message = "Input must not be blank") + @Valid final String categoryId, + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final CategoryDto categoryDto) { + log.info("*** CategoryDto, resource; update category with categoryId *"); + return ResponseEntity.ok(this.categoryService.update(Integer.parseInt(categoryId), categoryDto)); + } + + @DeleteMapping("/{categoryId}") + public ResponseEntity deleteById(@PathVariable("categoryId") final String categoryId) { + log.info("*** Boolean, resource; delete category by id *"); + this.categoryService.deleteById(Integer.parseInt(categoryId)); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/resource/ProductResource.java b/product-service/src/main/java/com/selimhorri/app/resource/ProductResource.java index d7f30270e..7fd57dd18 100644 --- a/product-service/src/main/java/com/selimhorri/app/resource/ProductResource.java +++ b/product-service/src/main/java/com/selimhorri/app/resource/ProductResource.java @@ -1,96 +1,96 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.ProductService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/products") -@Slf4j -@RequiredArgsConstructor -public class ProductResource { - - private final ProductService productService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** ProductDto List, controller; fetch all categories *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.productService.findAll())); - } - - @GetMapping("/{productId}") - public ResponseEntity findById( - @PathVariable("productId") - @NotBlank(message = "Input must not be blank!") - @Valid final String productId) { - log.info("*** ProductDto, resource; fetch product by id *"); - return ResponseEntity.ok(this.productService.findById(Integer.parseInt(productId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto) { - log.info("*** ProductDto, resource; save product *"); - return ResponseEntity.ok(this.productService.save(productDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto) { - log.info("*** ProductDto, resource; update product *"); - return ResponseEntity.ok(this.productService.update(productDto)); - } - - @PutMapping("/{productId}") - public ResponseEntity update( - @PathVariable("productId") - @NotBlank(message = "Input must not be blank!") - @Valid final String productId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto) { - log.info("*** ProductDto, resource; update product with productId *"); - return ResponseEntity.ok(this.productService.update(Integer.parseInt(productId), productDto)); - } - - @DeleteMapping("/{productId}") - public ResponseEntity deleteById(@PathVariable("productId") final String productId) { - log.info("*** Boolean, resource; delete product by id *"); - this.productService.deleteById(Integer.parseInt(productId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.dto.ProductDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.ProductService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("/api/products") +@Slf4j +@RequiredArgsConstructor +public class ProductResource { + + private final ProductService productService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** ProductDto List, controller; fetch all categories *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.productService.findAll())); + } + + @GetMapping("/{productId}") + public ResponseEntity findById( + @PathVariable("productId") + @NotBlank(message = "Input must not be blank!") + @Valid final String productId) { + log.info("*** ProductDto, resource; fetch product by id *"); + return ResponseEntity.ok(this.productService.findById(Integer.parseInt(productId))); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final ProductDto productDto) { + log.info("*** ProductDto, resource; save product *"); + return ResponseEntity.ok(this.productService.save(productDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final ProductDto productDto) { + log.info("*** ProductDto, resource; update product *"); + return ResponseEntity.ok(this.productService.update(productDto)); + } + + @PutMapping("/{productId}") + public ResponseEntity update( + @PathVariable("productId") + @NotBlank(message = "Input must not be blank!") + @Valid final String productId, + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final ProductDto productDto) { + log.info("*** ProductDto, resource; update product with productId *"); + return ResponseEntity.ok(this.productService.update(Integer.parseInt(productId), productDto)); + } + + @DeleteMapping("/{productId}") + public ResponseEntity deleteById(@PathVariable("productId") final String productId) { + log.info("*** Boolean, resource; delete product by id *"); + this.productService.deleteById(Integer.parseInt(productId)); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/service/CategoryService.java b/product-service/src/main/java/com/selimhorri/app/service/CategoryService.java index 98afb44ac..bffc53e81 100644 --- a/product-service/src/main/java/com/selimhorri/app/service/CategoryService.java +++ b/product-service/src/main/java/com/selimhorri/app/service/CategoryService.java @@ -1,16 +1,16 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.CategoryDto; - -public interface CategoryService { - - List findAll(); - CategoryDto findById(final Integer categoryId); - CategoryDto save(final CategoryDto categoryDto); - CategoryDto update(final CategoryDto categoryDto); - CategoryDto update(final Integer categoryId, final CategoryDto categoryDto); - void deleteById(final Integer categoryId); - -} +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.dto.CategoryDto; + +public interface CategoryService { + + List findAll(); + CategoryDto findById(final Integer categoryId); + CategoryDto save(final CategoryDto categoryDto); + CategoryDto update(final CategoryDto categoryDto); + CategoryDto update(final Integer categoryId, final CategoryDto categoryDto); + void deleteById(final Integer categoryId); + +} diff --git a/product-service/src/main/java/com/selimhorri/app/service/ProductService.java b/product-service/src/main/java/com/selimhorri/app/service/ProductService.java index da12cabcf..b6f7d572f 100644 --- a/product-service/src/main/java/com/selimhorri/app/service/ProductService.java +++ b/product-service/src/main/java/com/selimhorri/app/service/ProductService.java @@ -1,16 +1,16 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.ProductDto; - -public interface ProductService { - - List findAll(); - ProductDto findById(final Integer productId); - ProductDto save(final ProductDto productDto); - ProductDto update(final ProductDto productDto); - ProductDto update(final Integer productId, final ProductDto productDto); - void deleteById(final Integer productId); - -} +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.dto.ProductDto; + +public interface ProductService { + + List findAll(); + ProductDto findById(final Integer productId); + ProductDto save(final ProductDto productDto); + ProductDto update(final ProductDto productDto); + ProductDto update(final Integer productId, final ProductDto productDto); + void deleteById(final Integer productId); + +} diff --git a/product-service/src/main/java/com/selimhorri/app/service/impl/CategoryServiceImpl.java b/product-service/src/main/java/com/selimhorri/app/service/impl/CategoryServiceImpl.java index 7754c7dd3..4fc89277d 100644 --- a/product-service/src/main/java/com/selimhorri/app/service/impl/CategoryServiceImpl.java +++ b/product-service/src/main/java/com/selimhorri/app/service/impl/CategoryServiceImpl.java @@ -1,83 +1,83 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.CategoryDto; -import com.selimhorri.app.exception.wrapper.CategoryNotFoundException; -import com.selimhorri.app.helper.CategoryMappingHelper; -import com.selimhorri.app.repository.CategoryRepository; -import com.selimhorri.app.service.CategoryService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class CategoryServiceImpl implements CategoryService { - - private final CategoryRepository categoryRepository; - - @Override - public List findAll() { - log.info("*** CategoryDto List, service; fetch all categorys *"); - return this.categoryRepository.findAll() - .stream() - .map(CategoryMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public CategoryDto findById(final Integer categoryId) { - log.info("*** CategoryDto, service; fetch category by id *"); - return this.categoryRepository.findById(categoryId) - .map(CategoryMappingHelper::map) - .orElseThrow(() -> new CategoryNotFoundException(String.format("Category with id: %d not found", categoryId))); - } - - @Override - public CategoryDto save(final CategoryDto categoryDto) { - log.info("*** CategoryDto, service; save category *"); - return CategoryMappingHelper.map(this.categoryRepository - .save(CategoryMappingHelper.map(categoryDto))); - } - - @Override - public CategoryDto update(final CategoryDto categoryDto) { - log.info("*** CategoryDto, service; update category *"); - return CategoryMappingHelper.map(this.categoryRepository - .save(CategoryMappingHelper.map(categoryDto))); - } - - @Override - public CategoryDto update(final Integer categoryId, final CategoryDto categoryDto) { - log.info("*** CategoryDto, service; update category with categoryId *"); - return CategoryMappingHelper.map(this.categoryRepository - .save(CategoryMappingHelper.map(this.findById(categoryId)))); - } - - @Override - public void deleteById(final Integer categoryId) { - log.info("*** Void, service; delete category by id *"); - this.categoryRepository.deleteById(categoryId); - } - - - -} - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; + +import com.selimhorri.app.dto.CategoryDto; +import com.selimhorri.app.exception.wrapper.CategoryNotFoundException; +import com.selimhorri.app.helper.CategoryMappingHelper; +import com.selimhorri.app.repository.CategoryRepository; +import com.selimhorri.app.service.CategoryService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class CategoryServiceImpl implements CategoryService { + + private final CategoryRepository categoryRepository; + + @Override + public List findAll() { + log.info("*** CategoryDto List, service; fetch all categorys *"); + return this.categoryRepository.findAll() + .stream() + .map(CategoryMappingHelper::map) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public CategoryDto findById(final Integer categoryId) { + log.info("*** CategoryDto, service; fetch category by id *"); + return this.categoryRepository.findById(categoryId) + .map(CategoryMappingHelper::map) + .orElseThrow(() -> new CategoryNotFoundException(String.format("Category with id: %d not found", categoryId))); + } + + @Override + public CategoryDto save(final CategoryDto categoryDto) { + log.info("*** CategoryDto, service; save category *"); + return CategoryMappingHelper.map(this.categoryRepository + .save(CategoryMappingHelper.map(categoryDto))); + } + + @Override + public CategoryDto update(final CategoryDto categoryDto) { + log.info("*** CategoryDto, service; update category *"); + return CategoryMappingHelper.map(this.categoryRepository + .save(CategoryMappingHelper.map(categoryDto))); + } + + @Override + public CategoryDto update(final Integer categoryId, final CategoryDto categoryDto) { + log.info("*** CategoryDto, service; update category with categoryId *"); + return CategoryMappingHelper.map(this.categoryRepository + .save(CategoryMappingHelper.map(this.findById(categoryId)))); + } + + @Override + public void deleteById(final Integer categoryId) { + log.info("*** Void, service; delete category by id *"); + this.categoryRepository.deleteById(categoryId); + } + + + +} + + + + + + + + + diff --git a/product-service/src/main/java/com/selimhorri/app/service/impl/ProductServiceImpl.java b/product-service/src/main/java/com/selimhorri/app/service/impl/ProductServiceImpl.java index 6427acd21..6a624614c 100644 --- a/product-service/src/main/java/com/selimhorri/app/service/impl/ProductServiceImpl.java +++ b/product-service/src/main/java/com/selimhorri/app/service/impl/ProductServiceImpl.java @@ -1,84 +1,84 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.exception.wrapper.ProductNotFoundException; -import com.selimhorri.app.helper.ProductMappingHelper; -import com.selimhorri.app.repository.ProductRepository; -import com.selimhorri.app.service.ProductService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class ProductServiceImpl implements ProductService { - - private final ProductRepository productRepository; - - @Override - public List findAll() { - log.info("*** ProductDto List, service; fetch all products *"); - return this.productRepository.findAll() - .stream() - .map(ProductMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public ProductDto findById(final Integer productId) { - log.info("*** ProductDto, service; fetch product by id *"); - return this.productRepository.findById(productId) - .map(ProductMappingHelper::map) - .orElseThrow(() -> new ProductNotFoundException(String.format("Product with id: %d not found", productId))); - } - - @Override - public ProductDto save(final ProductDto productDto) { - log.info("*** ProductDto, service; save product *"); - return ProductMappingHelper.map(this.productRepository - .save(ProductMappingHelper.map(productDto))); - } - - @Override - public ProductDto update(final ProductDto productDto) { - log.info("*** ProductDto, service; update product *"); - return ProductMappingHelper.map(this.productRepository - .save(ProductMappingHelper.map(productDto))); - } - - @Override - public ProductDto update(final Integer productId, final ProductDto productDto) { - log.info("*** ProductDto, service; update product with productId *"); - return ProductMappingHelper.map(this.productRepository - .save(ProductMappingHelper.map(this.findById(productId)))); - } - - @Override - public void deleteById(final Integer productId) { - log.info("*** Void, service; delete product by id *"); - this.productRepository.delete(ProductMappingHelper - .map(this.findById(productId))); - } - - - -} - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; + +import com.selimhorri.app.dto.ProductDto; +import com.selimhorri.app.exception.wrapper.ProductNotFoundException; +import com.selimhorri.app.helper.ProductMappingHelper; +import com.selimhorri.app.repository.ProductRepository; +import com.selimhorri.app.service.ProductService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class ProductServiceImpl implements ProductService { + + private final ProductRepository productRepository; + + @Override + public List findAll() { + log.info("*** ProductDto List, service; fetch all products *"); + return this.productRepository.findAll() + .stream() + .map(ProductMappingHelper::map) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public ProductDto findById(final Integer productId) { + log.info("*** ProductDto, service; fetch product by id *"); + return this.productRepository.findById(productId) + .map(ProductMappingHelper::map) + .orElseThrow(() -> new ProductNotFoundException(String.format("Product with id: %d not found", productId))); + } + + @Override + public ProductDto save(final ProductDto productDto) { + log.info("*** ProductDto, service; save product *"); + return ProductMappingHelper.map(this.productRepository + .save(ProductMappingHelper.map(productDto))); + } + + @Override + public ProductDto update(final ProductDto productDto) { + log.info("*** ProductDto, service; update product *"); + return ProductMappingHelper.map(this.productRepository + .save(ProductMappingHelper.map(productDto))); + } + + @Override + public ProductDto update(final Integer productId, final ProductDto productDto) { + log.info("*** ProductDto, service; update product with productId *"); + return ProductMappingHelper.map(this.productRepository + .save(ProductMappingHelper.map(this.findById(productId)))); + } + + @Override + public void deleteById(final Integer productId) { + log.info("*** Void, service; delete product by id *"); + this.productRepository.delete(ProductMappingHelper + .map(this.findById(productId))); + } + + + +} + + + + + + + + + diff --git a/product-service/src/main/resources/application-dev.yml b/product-service/src/main/resources/application-dev.yml index cf7b17e41..706d90e48 100644 --- a/product-service/src/main/resources/application-dev.yml +++ b/product-service/src/main/resources/application-dev.yml @@ -1,47 +1,47 @@ - -server: - port: 8500 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8500 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect + use_sql_comments: true + format_sql: true + h2: + console: + enabled: true + path: /h2-console + #flyway: + # baseline-on-migrate: true + # enabled: true + +logging: + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/product-service/src/main/resources/application-prod.yml b/product-service/src/main/resources/application-prod.yml index 6f171453a..7fa685710 100644 --- a/product-service/src/main/resources/application-prod.yml +++ b/product-service/src/main/resources/application-prod.yml @@ -1,43 +1,43 @@ - -server: - port: 8500 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - + +server: + port: 8500 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: false + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/prod_log.log + clean-history-on-start: false + level: + org: + hibernate: + SQL: INFO + springframework: + web: INFO + data: INFO + boot: + autoconfigure: + data: + rest: INFO + jpa: INFO + orm: INFO + diff --git a/product-service/src/main/resources/application-stage.yml b/product-service/src/main/resources/application-stage.yml index 92140f53e..e07e9b670 100644 --- a/product-service/src/main/resources/application-stage.yml +++ b/product-service/src/main/resources/application-stage.yml @@ -1,43 +1,43 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8300 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/stage_log.log + clean-history-on-start: true + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/product-service/src/main/resources/application.yml b/product-service/src/main/resources/application.yml index 75c2b0a46..d0296b82c 100644 --- a/product-service/src/main/resources/application.yml +++ b/product-service/src/main/resources/application.yml @@ -1,45 +1,45 @@ - -server: - servlet: - context-path: /product-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: PRODUCT-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - productService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - + +server: + servlet: + context-path: /product-service + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + config: + import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} + application: + name: PRODUCT-SERVICE + profiles: + active: + - dev + +resilience4j: + circuitbreaker: + instances: + productService: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + + + + + + + + diff --git a/product-service/src/main/resources/db/migration/V1__create_categories_table.sql b/product-service/src/main/resources/db/migration/V1__create_categories_table.sql index 445f5877d..12cb7ffb2 100644 --- a/product-service/src/main/resources/db/migration/V1__create_categories_table.sql +++ b/product-service/src/main/resources/db/migration/V1__create_categories_table.sql @@ -1,10 +1,10 @@ - -CREATE TABLE categories ( - category_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - parent_category_id INT(11), - category_title VARCHAR(255), - image_url VARCHAR(255), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - + +CREATE TABLE categories ( + category_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + parent_category_id INT(11), + category_title VARCHAR(255), + image_url VARCHAR(255), + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP +); + diff --git a/product-service/src/main/resources/db/migration/V2__insert_categories_table.sql b/product-service/src/main/resources/db/migration/V2__insert_categories_table.sql index d5ab0c6d6..a74aa0b0a 100644 --- a/product-service/src/main/resources/db/migration/V2__insert_categories_table.sql +++ b/product-service/src/main/resources/db/migration/V2__insert_categories_table.sql @@ -1,7 +1,7 @@ - -INSERT INTO categories -(parent_category_id, category_title) VALUES -(null, 'Computer'), -(null, 'Mode'), -(null, 'Game'); - + +INSERT INTO categories +(parent_category_id, category_title) VALUES +(null, 'Computer'), +(null, 'Mode'), +(null, 'Game'); + diff --git a/product-service/src/main/resources/db/migration/V3__create_products_table.sql b/product-service/src/main/resources/db/migration/V3__create_products_table.sql index 539c38e4d..9d2920f4a 100644 --- a/product-service/src/main/resources/db/migration/V3__create_products_table.sql +++ b/product-service/src/main/resources/db/migration/V3__create_products_table.sql @@ -1,13 +1,13 @@ - -CREATE TABLE products ( - product_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - category_id INT(11), - product_title VARCHAR(255), - image_url VARCHAR(255), - sku VARCHAR(255), - price_unit DECIMAL(7, 2), - quantity INT(11), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - + +CREATE TABLE products ( + product_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + category_id INT(11), + product_title VARCHAR(255), + image_url VARCHAR(255), + sku VARCHAR(255), + price_unit DECIMAL(7, 2), + quantity INT(11), + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP +); + diff --git a/product-service/src/main/resources/db/migration/V4__insert_products_table.sql b/product-service/src/main/resources/db/migration/V4__insert_products_table.sql index 97324939f..fed0c1192 100644 --- a/product-service/src/main/resources/db/migration/V4__insert_products_table.sql +++ b/product-service/src/main/resources/db/migration/V4__insert_products_table.sql @@ -1,8 +1,8 @@ - -INSERT INTO products -(category_id, product_title, image_url, sku, price_unit, quantity) VALUES -(1, 'asus', 'xxx', 'dfqejklejrkn', 0, 50), -(1, 'hp', 'xxx', 'zsejfedbjh', 0, 50), -(2, 'Armani', 'xxx', 'fjdvf', 0, 50), -(3, 'GTA', 'xxx', 'qsdkjnvfrekjrf', 0, 50); - + +INSERT INTO products +(category_id, product_title, image_url, sku, price_unit, quantity) VALUES +(1, 'asus', 'xxx', 'dfqejklejrkn', 0, 50), +(1, 'hp', 'xxx', 'zsejfedbjh', 0, 50), +(2, 'Armani', 'xxx', 'fjdvf', 0, 50), +(3, 'GTA', 'xxx', 'qsdkjnvfrekjrf', 0, 50); + diff --git a/product-service/src/main/resources/db/migration/V5__create_categories_parent_category_id_fk.sql b/product-service/src/main/resources/db/migration/V5__create_categories_parent_category_id_fk.sql index 5a14fea4e..88f863ae3 100644 --- a/product-service/src/main/resources/db/migration/V5__create_categories_parent_category_id_fk.sql +++ b/product-service/src/main/resources/db/migration/V5__create_categories_parent_category_id_fk.sql @@ -1,3 +1,3 @@ - -ALTER TABLE categories - ADD CONSTRAINT fk7_assign FOREIGN KEY (parent_category_id) REFERENCES categories (category_id); + +ALTER TABLE categories + ADD CONSTRAINT fk7_assign FOREIGN KEY (parent_category_id) REFERENCES categories (category_id); diff --git a/product-service/src/main/resources/db/migration/V6__create_products_category_id_fk.sql b/product-service/src/main/resources/db/migration/V6__create_products_category_id_fk.sql index ca38f5ea9..e43114299 100644 --- a/product-service/src/main/resources/db/migration/V6__create_products_category_id_fk.sql +++ b/product-service/src/main/resources/db/migration/V6__create_products_category_id_fk.sql @@ -1,3 +1,3 @@ - -ALTER TABLE products - ADD CONSTRAINT fk8_assign FOREIGN KEY (category_id) REFERENCES categories (category_id); + +ALTER TABLE products + ADD CONSTRAINT fk8_assign FOREIGN KEY (category_id) REFERENCES categories (category_id); diff --git a/product-service/src/test/java/com/selimhorri/app/ProductServiceApplicationTests.java b/product-service/src/test/java/com/selimhorri/app/ProductServiceApplicationTests.java index ca5a42946..e3d2ced32 100644 --- a/product-service/src/test/java/com/selimhorri/app/ProductServiceApplicationTests.java +++ b/product-service/src/test/java/com/selimhorri/app/ProductServiceApplicationTests.java @@ -1,16 +1,16 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ProductServiceApplicationTests { - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ProductServiceApplicationTests { + + + +} + + + + + + diff --git a/proxy-client/.gitignore b/proxy-client/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/proxy-client/.gitignore +++ b/proxy-client/.gitignore @@ -1,33 +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/ +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/proxy-client/.mvn/wrapper/MavenWrapperDownloader.java b/proxy-client/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/proxy-client/.mvn/wrapper/MavenWrapperDownloader.java +++ b/proxy-client/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/proxy-client/.mvn/wrapper/maven-wrapper.properties b/proxy-client/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/proxy-client/.mvn/wrapper/maven-wrapper.properties +++ b/proxy-client/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/proxy-client/Dockerfile b/proxy-client/Dockerfile index deac97bb7..e0e8715f1 100644 --- a/proxy-client/Dockerfile +++ b/proxy-client/Dockerfile @@ -1,12 +1,12 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY proxy-client/ . -ADD proxy-client/target/proxy-client-v${PROJECT_VERSION}.jar proxy-client.jar -EXPOSE 8900 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "proxy-client.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +ENV SPRING_PROFILES_ACTIVE dev +COPY proxy-client/ . +ADD proxy-client/target/proxy-client-v${PROJECT_VERSION}.jar proxy-client.jar +EXPOSE 8900 +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "proxy-client.jar"] + + diff --git a/proxy-client/compose.yml b/proxy-client/compose.yml index 6255f4c12..3f06548c4 100644 --- a/proxy-client/compose.yml +++ b/proxy-client/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - auth-service-container: - image: selimhorri/proxy-client-ecommerce-boot:0.1.0 - ports: - - 8900:8900 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + auth-service-container: + image: selimhorri/proxy-client-ecommerce-boot:0.1.0 + ports: + - 8900:8900 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/proxy-client/mvnw b/proxy-client/mvnw index a16b5431b..4c1c42714 100755 --- a/proxy-client/mvnw +++ b/proxy-client/mvnw @@ -1,310 +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 "$@" +#!/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/proxy-client/mvnw.cmd b/proxy-client/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/proxy-client/mvnw.cmd +++ b/proxy-client/mvnw.cmd @@ -1,182 +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% +@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/proxy-client/pom.xml b/proxy-client/pom.xml index 16a9917f3..fda228a04 100644 --- a/proxy-client/pom.xml +++ b/proxy-client/pom.xml @@ -1,117 +1,117 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - proxy-client - proxy-client - Spring Boot Microservice! - jar - - - 11 - 2020.0.4 - 1.16.2 - - - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - org.springframework.boot - spring-boot-starter-validation - - - io.jsonwebtoken - jjwt - 0.9.1 - - - javax.xml.bind - jaxb-api - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity5 - - - org.projectlombok - lombok - true - - - org.springframework.security - spring-security-test - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + proxy-client + proxy-client + Spring Boot Microservice! + jar + + + 11 + 2020.0.4 + 1.16.2 + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.boot + spring-boot-starter-validation + + + io.jsonwebtoken + jjwt + 0.9.1 + + + javax.xml.bind + jaxb-api + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity5 + + + org.projectlombok + lombok + true + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + ${project.artifactId}-v${project.version} + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/ProxyClientApplication.java b/proxy-client/src/main/java/com/selimhorri/app/ProxyClientApplication.java index afe229d68..a6ee05612 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/ProxyClientApplication.java +++ b/proxy-client/src/main/java/com/selimhorri/app/ProxyClientApplication.java @@ -1,29 +1,29 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.cloud.openfeign.EnableFeignClients; - -@SpringBootApplication -@EnableEurekaClient -@EnableFeignClients -public class ProxyClientApplication { - - public static void main(String[] args) { - SpringApplication.run(ProxyClientApplication.class, args); - } - - - -} - - - - - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@SpringBootApplication +@EnableEurekaClient +@EnableFeignClients +public class ProxyClientApplication { + + public static void main(String[] args) { + SpringApplication.run(ProxyClientApplication.class, args); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/controller/AuthenticationController.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/controller/AuthenticationController.java index b493955da..b822d07b4 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/controller/AuthenticationController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/auth/controller/AuthenticationController.java @@ -1,56 +1,56 @@ -package com.selimhorri.app.business.auth.controller; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.auth.model.request.AuthenticationRequest; -import com.selimhorri.app.business.auth.model.response.AuthenticationResponse; -import com.selimhorri.app.business.auth.service.AuthenticationService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/authenticate") -@Slf4j -@RequiredArgsConstructor -public class AuthenticationController { - - private final AuthenticationService authenticationService; - - @PostMapping - public ResponseEntity authenticate( - @RequestBody - @NotNull(message = "") - @Valid final AuthenticationRequest authenticationRequest) { - log.info("**Authentication controller, proceed with the request*\n"); - return ResponseEntity.ok(this.authenticationService.authenticate(authenticationRequest)); - } - - @GetMapping("/jwt/{jwt}") - public ResponseEntity authenticate(@PathVariable("jwt") final String jwt) { - log.info("**Authentication controller, proceed with the request*\n"); - return ResponseEntity.ok(this.authenticationService.authenticate(jwt)); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.auth.controller; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.auth.model.request.AuthenticationRequest; +import com.selimhorri.app.business.auth.model.response.AuthenticationResponse; +import com.selimhorri.app.business.auth.service.AuthenticationService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("/api/authenticate") +@Slf4j +@RequiredArgsConstructor +public class AuthenticationController { + + private final AuthenticationService authenticationService; + + @PostMapping + public ResponseEntity authenticate( + @RequestBody + @NotNull(message = "") + @Valid final AuthenticationRequest authenticationRequest) { + log.info("**Authentication controller, proceed with the request*\n"); + return ResponseEntity.ok(this.authenticationService.authenticate(authenticationRequest)); + } + + @GetMapping("/jwt/{jwt}") + public ResponseEntity authenticate(@PathVariable("jwt") final String jwt) { + log.info("**Authentication controller, proceed with the request*\n"); + return ResponseEntity.ok(this.authenticationService.authenticate(jwt)); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/request/AuthenticationRequest.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/request/AuthenticationRequest.java index b7c51ad91..31b74073b 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/request/AuthenticationRequest.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/request/AuthenticationRequest.java @@ -1,37 +1,37 @@ -package com.selimhorri.app.business.auth.model.request; - -import java.io.Serializable; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AuthenticationRequest implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotBlank(message = "*Username must not be empty!**") - private String username; - - @NotNull(message = "*Password must not be null!**") - private String password; - -} - - - - - - - - - - +package com.selimhorri.app.business.auth.model.request; + +import java.io.Serializable; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class AuthenticationRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotBlank(message = "*Username must not be empty!**") + private String username; + + @NotNull(message = "*Password must not be null!**") + private String password; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/response/AuthenticationResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/response/AuthenticationResponse.java index 42ae43c74..901a36505 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/response/AuthenticationResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/response/AuthenticationResponse.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.business.auth.model.response; - -import java.io.Serializable; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AuthenticationResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private String jwtToken; - -} - - - - - - - - - - +package com.selimhorri.app.business.auth.model.response; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class AuthenticationResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private String jwtToken; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/AuthenticationService.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/AuthenticationService.java index 0777f4309..93efbe9bb 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/AuthenticationService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/AuthenticationService.java @@ -1,11 +1,11 @@ -package com.selimhorri.app.business.auth.service; - -import com.selimhorri.app.business.auth.model.request.AuthenticationRequest; -import com.selimhorri.app.business.auth.model.response.AuthenticationResponse; - -public interface AuthenticationService { - - AuthenticationResponse authenticate(final AuthenticationRequest authenticationRequest); - Boolean authenticate(final String jwt); - -} +package com.selimhorri.app.business.auth.service; + +import com.selimhorri.app.business.auth.model.request.AuthenticationRequest; +import com.selimhorri.app.business.auth.model.response.AuthenticationResponse; + +public interface AuthenticationService { + + AuthenticationResponse authenticate(final AuthenticationRequest authenticationRequest); + Boolean authenticate(final String jwt); + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/AuthenticationServiceImpl.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/AuthenticationServiceImpl.java index da4b958f2..76d3ee93a 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/AuthenticationServiceImpl.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/AuthenticationServiceImpl.java @@ -1,61 +1,61 @@ -package com.selimhorri.app.business.auth.service.impl; - -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.stereotype.Service; - -import com.selimhorri.app.business.auth.model.request.AuthenticationRequest; -import com.selimhorri.app.business.auth.model.response.AuthenticationResponse; -import com.selimhorri.app.business.auth.service.AuthenticationService; -import com.selimhorri.app.exception.wrapper.IllegalAuthenticationCredentialsException; -import com.selimhorri.app.jwt.service.JwtService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Slf4j -@RequiredArgsConstructor -public class AuthenticationServiceImpl implements AuthenticationService { - - private final AuthenticationManager authenticationManager; - private final UserDetailsService userDetailsService; - private final JwtService jwtService; - - @Override - public AuthenticationResponse authenticate(final AuthenticationRequest authenticationRequest) { - - log.info("** AuthenticationResponse, authenticate user service*\n"); - - try { - this.authenticationManager.authenticate(new UsernamePasswordAuthenticationToken( - authenticationRequest.getUsername(), authenticationRequest.getPassword())); - } - catch (BadCredentialsException e) { - throw new IllegalAuthenticationCredentialsException("#### Bad credentials! ####"); - } - - return new AuthenticationResponse(this.jwtService.generateToken(this.userDetailsService - .loadUserByUsername(authenticationRequest.getUsername()))); - } - - @Override - public Boolean authenticate(final String jwt) { - return null; - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.auth.service.impl; + +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; + +import com.selimhorri.app.business.auth.model.request.AuthenticationRequest; +import com.selimhorri.app.business.auth.model.response.AuthenticationResponse; +import com.selimhorri.app.business.auth.service.AuthenticationService; +import com.selimhorri.app.exception.wrapper.IllegalAuthenticationCredentialsException; +import com.selimhorri.app.jwt.service.JwtService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Slf4j +@RequiredArgsConstructor +public class AuthenticationServiceImpl implements AuthenticationService { + + private final AuthenticationManager authenticationManager; + private final UserDetailsService userDetailsService; + private final JwtService jwtService; + + @Override + public AuthenticationResponse authenticate(final AuthenticationRequest authenticationRequest) { + + log.info("** AuthenticationResponse, authenticate user service*\n"); + + try { + this.authenticationManager.authenticate(new UsernamePasswordAuthenticationToken( + authenticationRequest.getUsername(), authenticationRequest.getPassword())); + } + catch (BadCredentialsException e) { + throw new IllegalAuthenticationCredentialsException("#### Bad credentials! ####"); + } + + return new AuthenticationResponse(this.jwtService.generateToken(this.userDetailsService + .loadUserByUsername(authenticationRequest.getUsername()))); + } + + @Override + public Boolean authenticate(final String jwt) { + return null; + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/UserDetailsServiceImpl.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/UserDetailsServiceImpl.java index 3dba5f5fa..6df28972d 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/UserDetailsServiceImpl.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/UserDetailsServiceImpl.java @@ -1,42 +1,42 @@ -package com.selimhorri.app.business.auth.service.impl; - -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.business.user.model.CredentialDto; -import com.selimhorri.app.business.user.model.UserDetailsImpl; -import com.selimhorri.app.constant.AppConstant; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Slf4j -@RequiredArgsConstructor -public class UserDetailsServiceImpl implements UserDetailsService { - - private static final String API_URL = AppConstant.DiscoveredDomainsApi.USER_SERVICE_HOST + "/api/credentials"; - private final RestTemplate restTemplate; - - @Override - public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException { - log.info("**UserDetails, load user by username*\n"); - return new UserDetailsImpl(this.restTemplate.getForObject(API_URL + "/username/" + username, CredentialDto.class)); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.auth.service.impl; + +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.selimhorri.app.business.user.model.CredentialDto; +import com.selimhorri.app.business.user.model.UserDetailsImpl; +import com.selimhorri.app.constant.AppConstant; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Slf4j +@RequiredArgsConstructor +public class UserDetailsServiceImpl implements UserDetailsService { + + private static final String API_URL = AppConstant.DiscoveredDomainsApi.USER_SERVICE_HOST + "/api/credentials"; + private final RestTemplate restTemplate; + + @Override + public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException { + log.info("**UserDetails, load user by username*\n"); + return new UserDetailsImpl(this.restTemplate.getForObject(API_URL + "/username/" + username, CredentialDto.class)); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/controller/FavouriteController.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/controller/FavouriteController.java index 885e2eebe..3a1cc2825 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/controller/FavouriteController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/controller/FavouriteController.java @@ -1,82 +1,82 @@ -package com.selimhorri.app.business.favourite.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.favourite.model.FavouriteDto; -import com.selimhorri.app.business.favourite.model.FavouriteId; -import com.selimhorri.app.business.favourite.model.response.FavouriteFavouriteServiceCollectionDtoResponse; -import com.selimhorri.app.business.favourite.service.FavouriteClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/favourites") -@RequiredArgsConstructor -public class FavouriteController { - - private final FavouriteClientService favouriteClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.favouriteClientService.findAll().getBody()); - } - - @GetMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity findById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate) { - return ResponseEntity.ok(this.favouriteClientService.findById(userId, productId, likeDate).getBody()); - } - - @GetMapping("/find") - public ResponseEntity findById(@RequestBody final FavouriteId favouriteId) { - return ResponseEntity.ok(this.favouriteClientService.findById(favouriteId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final FavouriteDto favouriteDto) { - return ResponseEntity.ok(this.favouriteClientService.save(favouriteDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final FavouriteDto favouriteDto) { - return ResponseEntity.ok(this.favouriteClientService.update(favouriteDto).getBody()); - } - - @DeleteMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity deleteById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate) { - this.favouriteClientService.deleteById(userId, productId, likeDate).getBody(); - return ResponseEntity.ok(true); - } - - @DeleteMapping("/delete") - public ResponseEntity deleteById(@RequestBody final FavouriteId favouriteId) { - this.favouriteClientService.deleteById(favouriteId).getBody(); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.favourite.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.favourite.model.FavouriteDto; +import com.selimhorri.app.business.favourite.model.FavouriteId; +import com.selimhorri.app.business.favourite.model.response.FavouriteFavouriteServiceCollectionDtoResponse; +import com.selimhorri.app.business.favourite.service.FavouriteClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/favourites") +@RequiredArgsConstructor +public class FavouriteController { + + private final FavouriteClientService favouriteClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.favouriteClientService.findAll().getBody()); + } + + @GetMapping("/{userId}/{productId}/{likeDate}") + public ResponseEntity findById( + @PathVariable("userId") final String userId, + @PathVariable("productId") final String productId, + @PathVariable("likeDate") final String likeDate) { + return ResponseEntity.ok(this.favouriteClientService.findById(userId, productId, likeDate).getBody()); + } + + @GetMapping("/find") + public ResponseEntity findById(@RequestBody final FavouriteId favouriteId) { + return ResponseEntity.ok(this.favouriteClientService.findById(favouriteId).getBody()); + } + + @PostMapping + public ResponseEntity save(@RequestBody final FavouriteDto favouriteDto) { + return ResponseEntity.ok(this.favouriteClientService.save(favouriteDto).getBody()); + } + + @PutMapping + public ResponseEntity update(@RequestBody final FavouriteDto favouriteDto) { + return ResponseEntity.ok(this.favouriteClientService.update(favouriteDto).getBody()); + } + + @DeleteMapping("/{userId}/{productId}/{likeDate}") + public ResponseEntity deleteById( + @PathVariable("userId") final String userId, + @PathVariable("productId") final String productId, + @PathVariable("likeDate") final String likeDate) { + this.favouriteClientService.deleteById(userId, productId, likeDate).getBody(); + return ResponseEntity.ok(true); + } + + @DeleteMapping("/delete") + public ResponseEntity deleteById(@RequestBody final FavouriteId favouriteId) { + this.favouriteClientService.deleteById(favouriteId).getBody(); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteDto.java index f42977cdf..e07acb732 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteDto.java @@ -1,65 +1,65 @@ -package com.selimhorri.app.business.favourite.model; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class FavouriteDto implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull(message = "Field must not be NULL") - private Integer userId; - - @NotNull(message = "Field must not be NULL") - private Integer productId; - - @NotNull(message = "Field must not be NULL") - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - - @JsonProperty("user") - @JsonInclude(Include.NON_NULL) - private UserDto userDto; - - @JsonProperty("product") - @JsonInclude(Include.NON_NULL) - private ProductDto productDto; - -} - - - - - - - - - - +package com.selimhorri.app.business.favourite.model; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import javax.validation.constraints.NotNull; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class FavouriteDto implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "Field must not be NULL") + private Integer userId; + + @NotNull(message = "Field must not be NULL") + private Integer productId; + + @NotNull(message = "Field must not be NULL") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime likeDate; + + @JsonProperty("user") + @JsonInclude(Include.NON_NULL) + private UserDto userDto; + + @JsonProperty("product") + @JsonInclude(Include.NON_NULL) + private ProductDto productDto; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteId.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteId.java index 60bd71816..ea618070c 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteId.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteId.java @@ -1,52 +1,52 @@ -package com.selimhorri.app.business.favourite.model; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -public class FavouriteId implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull - private Integer userId; - - @NotNull - private Integer productId; - - @NotNull - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - -} - - - - - - - - - - +package com.selimhorri.app.business.favourite.model; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import javax.validation.constraints.NotNull; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class FavouriteId implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull + private Integer userId; + + @NotNull + private Integer productId; + + @NotNull + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime likeDate; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/ProductDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/ProductDto.java index 3fc6f80e8..208d130bf 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/ProductDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/ProductDto.java @@ -1,41 +1,41 @@ -package com.selimhorri.app.business.favourite.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonInclude(Include.NON_NULL) - private Set favouriteDtos; - -} - - - - - - - - - - +package com.selimhorri.app.business.favourite.model; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ProductDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer productId; + private String productTitle; + private String imageUrl; + private String sku; + private Double priceUnit; + private Integer quantity; + + @JsonInclude(Include.NON_NULL) + private Set favouriteDtos; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/UserDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/UserDto.java index 414ca8f85..70843a6c2 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/UserDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/UserDto.java @@ -1,41 +1,41 @@ -package com.selimhorri.app.business.favourite.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonInclude(Include.NON_NULL) - private Set favouriteDtos; - -} - - - - - - - - - - +package com.selimhorri.app.business.favourite.model; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class UserDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer userId; + private String firstName; + private String lastName; + private String imageUrl; + private String email; + private String phone; + + @JsonInclude(Include.NON_NULL) + private Set favouriteDtos; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/response/FavouriteFavouriteServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/response/FavouriteFavouriteServiceCollectionDtoResponse.java index bbda91fe3..f8d829780 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/response/FavouriteFavouriteServiceCollectionDtoResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/response/FavouriteFavouriteServiceCollectionDtoResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.favourite.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.favourite.model.FavouriteDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class FavouriteFavouriteServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.favourite.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.favourite.model.FavouriteDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class FavouriteFavouriteServiceCollectionDtoResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/service/FavouriteClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/service/FavouriteClientService.java index 866b1d5de..89313123c 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/service/FavouriteClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/service/FavouriteClientService.java @@ -1,71 +1,71 @@ -package com.selimhorri.app.business.favourite.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.favourite.model.FavouriteDto; -import com.selimhorri.app.business.favourite.model.FavouriteId; -import com.selimhorri.app.business.favourite.model.response.FavouriteFavouriteServiceCollectionDtoResponse; - -@FeignClient(name = "FAVOURITE-SERVICE", contextId = "favouriteClientService", path = "/favourite-service/api/favourites") -public interface FavouriteClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity findById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate); - - @GetMapping("/find") - public ResponseEntity findById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteId favouriteId); - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteDto favouriteDto); - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteDto favouriteDto); - - @DeleteMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity deleteById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate); - - @DeleteMapping("/delete") - public ResponseEntity deleteById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteId favouriteId); - -} - - - - - - - - - - +package com.selimhorri.app.business.favourite.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.favourite.model.FavouriteDto; +import com.selimhorri.app.business.favourite.model.FavouriteId; +import com.selimhorri.app.business.favourite.model.response.FavouriteFavouriteServiceCollectionDtoResponse; + +@FeignClient(name = "FAVOURITE-SERVICE", contextId = "favouriteClientService", path = "/favourite-service/api/favourites") +public interface FavouriteClientService { + + @GetMapping + ResponseEntity findAll(); + + @GetMapping("/{userId}/{productId}/{likeDate}") + public ResponseEntity findById( + @PathVariable("userId") final String userId, + @PathVariable("productId") final String productId, + @PathVariable("likeDate") final String likeDate); + + @GetMapping("/find") + public ResponseEntity findById( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final FavouriteId favouriteId); + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final FavouriteDto favouriteDto); + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final FavouriteDto favouriteDto); + + @DeleteMapping("/{userId}/{productId}/{likeDate}") + public ResponseEntity deleteById( + @PathVariable("userId") final String userId, + @PathVariable("productId") final String productId, + @PathVariable("likeDate") final String likeDate); + + @DeleteMapping("/delete") + public ResponseEntity deleteById( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final FavouriteId favouriteId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/CartController.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/CartController.java index c95b84df2..abda4edd4 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/CartController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/CartController.java @@ -1,78 +1,78 @@ -package com.selimhorri.app.business.order.controller; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.order.model.CartDto; -import com.selimhorri.app.business.order.model.response.CartOrderServiceDtoCollectionResponse; -import com.selimhorri.app.business.order.service.CartClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/carts") -@RequiredArgsConstructor -public class CartController { - - private final CartClientService cartClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.cartClientService.findAll().getBody()); - } - - @GetMapping("/{cartId}") - public ResponseEntity findById( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank!") - @Valid final String cartId) { - return ResponseEntity.ok(this.cartClientService.findById(cartId).getBody()); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto) { - return ResponseEntity.ok(this.cartClientService.save(cartDto).getBody()); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto) { - return ResponseEntity.ok(this.cartClientService.update(cartDto).getBody()); - } - - @PutMapping("/{cartId}") - public ResponseEntity update( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank!") - @Valid final String cartId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto) { - return ResponseEntity.ok(this.cartClientService.update(cartId, cartDto).getBody()); - } - - @DeleteMapping("/{cartId}") - public ResponseEntity deleteById(@PathVariable("cartId") final String cartId) { - this.cartClientService.deleteById(cartId).getBody(); - return ResponseEntity.ok(true); - } - - - -} +package com.selimhorri.app.business.order.controller; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.order.model.CartDto; +import com.selimhorri.app.business.order.model.response.CartOrderServiceDtoCollectionResponse; +import com.selimhorri.app.business.order.service.CartClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/carts") +@RequiredArgsConstructor +public class CartController { + + private final CartClientService cartClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.cartClientService.findAll().getBody()); + } + + @GetMapping("/{cartId}") + public ResponseEntity findById( + @PathVariable("cartId") + @NotBlank(message = "Input must not be blank!") + @Valid final String cartId) { + return ResponseEntity.ok(this.cartClientService.findById(cartId).getBody()); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CartDto cartDto) { + return ResponseEntity.ok(this.cartClientService.save(cartDto).getBody()); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CartDto cartDto) { + return ResponseEntity.ok(this.cartClientService.update(cartDto).getBody()); + } + + @PutMapping("/{cartId}") + public ResponseEntity update( + @PathVariable("cartId") + @NotBlank(message = "Input must not be blank!") + @Valid final String cartId, + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CartDto cartDto) { + return ResponseEntity.ok(this.cartClientService.update(cartId, cartDto).getBody()); + } + + @DeleteMapping("/{cartId}") + public ResponseEntity deleteById(@PathVariable("cartId") final String cartId) { + this.cartClientService.deleteById(cartId).getBody(); + return ResponseEntity.ok(true); + } + + + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/OrderController.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/OrderController.java index 18655773b..f5f772c88 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/OrderController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/OrderController.java @@ -1,78 +1,78 @@ -package com.selimhorri.app.business.order.controller; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.order.model.OrderDto; -import com.selimhorri.app.business.order.model.response.OrderOrderServiceDtoCollectionResponse; -import com.selimhorri.app.business.order.service.OrderClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/orders") -@RequiredArgsConstructor -public class OrderController { - - private final OrderClientService orderClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.orderClientService.findAll().getBody()); - } - - @GetMapping("/{orderId}") - public ResponseEntity findById( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank!") - @Valid final String orderId) { - return ResponseEntity.ok(this.orderClientService.findById(orderId).getBody()); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto) { - return ResponseEntity.ok(this.orderClientService.save(orderDto).getBody()); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto) { - return ResponseEntity.ok(this.orderClientService.update(orderDto).getBody()); - } - - @PutMapping("/{orderId}") - public ResponseEntity update( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank!") - @Valid final String orderId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto) { - return ResponseEntity.ok(this.orderClientService.update(orderId, orderDto).getBody()); - } - - @DeleteMapping("/{orderId}") - public ResponseEntity deleteById(@PathVariable("orderId") final String orderId) { - this.orderClientService.deleteById(orderId).getBody(); - return ResponseEntity.ok(true); - } - - - -} +package com.selimhorri.app.business.order.controller; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.order.model.OrderDto; +import com.selimhorri.app.business.order.model.response.OrderOrderServiceDtoCollectionResponse; +import com.selimhorri.app.business.order.service.OrderClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/orders") +@RequiredArgsConstructor +public class OrderController { + + private final OrderClientService orderClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.orderClientService.findAll().getBody()); + } + + @GetMapping("/{orderId}") + public ResponseEntity findById( + @PathVariable("orderId") + @NotBlank(message = "Input must not be blank!") + @Valid final String orderId) { + return ResponseEntity.ok(this.orderClientService.findById(orderId).getBody()); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final OrderDto orderDto) { + return ResponseEntity.ok(this.orderClientService.save(orderDto).getBody()); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final OrderDto orderDto) { + return ResponseEntity.ok(this.orderClientService.update(orderDto).getBody()); + } + + @PutMapping("/{orderId}") + public ResponseEntity update( + @PathVariable("orderId") + @NotBlank(message = "Input must not be blank!") + @Valid final String orderId, + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final OrderDto orderDto) { + return ResponseEntity.ok(this.orderClientService.update(orderId, orderDto).getBody()); + } + + @DeleteMapping("/{orderId}") + public ResponseEntity deleteById(@PathVariable("orderId") final String orderId) { + this.orderClientService.deleteById(orderId).getBody(); + return ResponseEntity.ok(true); + } + + + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/CartDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/CartDto.java index 9df4aa564..570546ccc 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/CartDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/CartDto.java @@ -1,43 +1,43 @@ -package com.selimhorri.app.business.order.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CartDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer cartId; - private Integer userId; - - @JsonInclude(Include.NON_NULL) - private Set orderDtos; - - @JsonProperty("user") - @JsonInclude(Include.NON_NULL) - private UserDto userDto; - -} - - - - - - - - - - +package com.selimhorri.app.business.order.model; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CartDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer cartId; + private Integer userId; + + @JsonInclude(Include.NON_NULL) + private Set orderDtos; + + @JsonProperty("user") + @JsonInclude(Include.NON_NULL) + private UserDto userDto; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/OrderDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/OrderDto.java index 2a13c4ded..ad1ed8ded 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/OrderDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/OrderDto.java @@ -1,56 +1,56 @@ -package com.selimhorri.app.business.order.model; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - - @JsonProperty("cart") - @JsonInclude(Include.NON_NULL) - private CartDto cartDto; - -} - - - - - - - - - - +package com.selimhorri.app.business.order.model; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer orderId; + + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime orderDate; + private String orderDesc; + private Double orderFee; + + @JsonProperty("cart") + @JsonInclude(Include.NON_NULL) + private CartDto cartDto; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/UserDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/UserDto.java index 38c0b14e9..23e1813a6 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/UserDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/UserDto.java @@ -1,42 +1,42 @@ -package com.selimhorri.app.business.order.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonProperty("cart") - @JsonInclude(Include.NON_NULL) - private CartDto cartDto; - -} - - - - - - - - - - +package com.selimhorri.app.business.order.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class UserDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer userId; + private String firstName; + private String lastName; + private String imageUrl; + private String email; + private String phone; + + @JsonProperty("cart") + @JsonInclude(Include.NON_NULL) + private CartDto cartDto; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/CartOrderServiceDtoCollectionResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/CartOrderServiceDtoCollectionResponse.java index 9e85d95f0..12bc5fb1f 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/CartOrderServiceDtoCollectionResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/CartOrderServiceDtoCollectionResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.order.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.order.model.CartDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CartOrderServiceDtoCollectionResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.order.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.order.model.CartDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CartOrderServiceDtoCollectionResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/OrderOrderServiceDtoCollectionResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/OrderOrderServiceDtoCollectionResponse.java index 3d32ddadc..c61e6b574 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/OrderOrderServiceDtoCollectionResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/OrderOrderServiceDtoCollectionResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.order.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.order.model.OrderDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderOrderServiceDtoCollectionResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.order.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.order.model.OrderDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderOrderServiceDtoCollectionResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/service/CartClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/service/CartClientService.java index a68de06e2..32be02946 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/service/CartClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/order/service/CartClientService.java @@ -1,65 +1,65 @@ -package com.selimhorri.app.business.order.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.order.model.CartDto; -import com.selimhorri.app.business.order.model.response.CartOrderServiceDtoCollectionResponse; - -@FeignClient(name = "ORDER-SERVICE", contextId = "cartClientService", path = "/order-service/api/carts") -public interface CartClientService { - - @GetMapping - public ResponseEntity findAll(); - - @GetMapping("/{cartId}") - public ResponseEntity findById( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank!") - @Valid final String cartId); - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto); - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto); - - @PutMapping("/{cartId}") - public ResponseEntity update( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank!") - @Valid final String cartId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto); - - @DeleteMapping("/{cartId}") - public ResponseEntity deleteById(@PathVariable("cartId") final String cartId); - -} - - - - - - - - - - +package com.selimhorri.app.business.order.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.order.model.CartDto; +import com.selimhorri.app.business.order.model.response.CartOrderServiceDtoCollectionResponse; + +@FeignClient(name = "ORDER-SERVICE", contextId = "cartClientService", path = "/order-service/api/carts") +public interface CartClientService { + + @GetMapping + public ResponseEntity findAll(); + + @GetMapping("/{cartId}") + public ResponseEntity findById( + @PathVariable("cartId") + @NotBlank(message = "Input must not be blank!") + @Valid final String cartId); + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CartDto cartDto); + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CartDto cartDto); + + @PutMapping("/{cartId}") + public ResponseEntity update( + @PathVariable("cartId") + @NotBlank(message = "Input must not be blank!") + @Valid final String cartId, + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CartDto cartDto); + + @DeleteMapping("/{cartId}") + public ResponseEntity deleteById(@PathVariable("cartId") final String cartId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/service/OrderClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/service/OrderClientService.java index bea489571..ba9406c57 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/service/OrderClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/order/service/OrderClientService.java @@ -1,65 +1,65 @@ -package com.selimhorri.app.business.order.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.order.model.OrderDto; -import com.selimhorri.app.business.order.model.response.OrderOrderServiceDtoCollectionResponse; - -@FeignClient(name = "ORDER-SERVICE", contextId = "orderClientService", path = "/order-service/api/orders") -public interface OrderClientService { - - @GetMapping - public ResponseEntity findAll(); - - @GetMapping("/{orderId}") - public ResponseEntity findById( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank!") - @Valid final String orderId); - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto); - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto); - - @PutMapping("/{orderId}") - public ResponseEntity update( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank!") - @Valid final String orderId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto); - - @DeleteMapping("/{orderId}") - public ResponseEntity deleteById(@PathVariable("orderId") final String orderId); - -} - - - - - - - - - - +package com.selimhorri.app.business.order.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.order.model.OrderDto; +import com.selimhorri.app.business.order.model.response.OrderOrderServiceDtoCollectionResponse; + +@FeignClient(name = "ORDER-SERVICE", contextId = "orderClientService", path = "/order-service/api/orders") +public interface OrderClientService { + + @GetMapping + public ResponseEntity findAll(); + + @GetMapping("/{orderId}") + public ResponseEntity findById( + @PathVariable("orderId") + @NotBlank(message = "Input must not be blank!") + @Valid final String orderId); + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final OrderDto orderDto); + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final OrderDto orderDto); + + @PutMapping("/{orderId}") + public ResponseEntity update( + @PathVariable("orderId") + @NotBlank(message = "Input must not be blank!") + @Valid final String orderId, + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final OrderDto orderDto); + + @DeleteMapping("/{orderId}") + public ResponseEntity deleteById(@PathVariable("orderId") final String orderId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/controller/OrderItemController.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/controller/OrderItemController.java index dc7073399..6e5a8ab04 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/controller/OrderItemController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/controller/OrderItemController.java @@ -1,82 +1,82 @@ -package com.selimhorri.app.business.orderItem.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.orderItem.model.OrderItemDto; -import com.selimhorri.app.business.orderItem.model.OrderItemId; -import com.selimhorri.app.business.orderItem.model.response.OrderItemOrderItemServiceDtoCollectionResponse; -import com.selimhorri.app.business.orderItem.service.OrderItemClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/shippings") -@RequiredArgsConstructor -public class OrderItemController { - - private final OrderItemClientService orderItemClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.orderItemClientService.findAll().getBody()); - } - - @GetMapping("/{orderId}/{productId}") - public ResponseEntity findById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId) { - return ResponseEntity.ok(this.orderItemClientService.findById(new OrderItemId(Integer.parseInt(productId), - Integer.parseInt(orderId))).getBody()); - } - - @GetMapping("/find") - public ResponseEntity findById(@RequestBody final OrderItemId orderItemId) { - return ResponseEntity.ok(this.orderItemClientService.findById(orderItemId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final OrderItemDto orderItemDto) { - return ResponseEntity.ok(this.orderItemClientService.save(orderItemDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final OrderItemDto orderItemDto) { - return ResponseEntity.ok(this.orderItemClientService.update(orderItemDto).getBody()); - } - - @DeleteMapping("/{orderId}/{productId}") - public ResponseEntity deleteById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId) { - this.orderItemClientService.deleteById(new OrderItemId(Integer.parseInt(orderId), - Integer.parseInt(productId))).getBody(); - return ResponseEntity.ok(true); - } - - @DeleteMapping("/delete") - public ResponseEntity deleteById(@RequestBody final OrderItemId orderItemId) { - this.orderItemClientService.deleteById(orderItemId).getBody(); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.orderItem.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.orderItem.model.OrderItemDto; +import com.selimhorri.app.business.orderItem.model.OrderItemId; +import com.selimhorri.app.business.orderItem.model.response.OrderItemOrderItemServiceDtoCollectionResponse; +import com.selimhorri.app.business.orderItem.service.OrderItemClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/shippings") +@RequiredArgsConstructor +public class OrderItemController { + + private final OrderItemClientService orderItemClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.orderItemClientService.findAll().getBody()); + } + + @GetMapping("/{orderId}/{productId}") + public ResponseEntity findById( + @PathVariable("orderId") final String orderId, + @PathVariable("productId") final String productId) { + return ResponseEntity.ok(this.orderItemClientService.findById(new OrderItemId(Integer.parseInt(productId), + Integer.parseInt(orderId))).getBody()); + } + + @GetMapping("/find") + public ResponseEntity findById(@RequestBody final OrderItemId orderItemId) { + return ResponseEntity.ok(this.orderItemClientService.findById(orderItemId).getBody()); + } + + @PostMapping + public ResponseEntity save(@RequestBody final OrderItemDto orderItemDto) { + return ResponseEntity.ok(this.orderItemClientService.save(orderItemDto).getBody()); + } + + @PutMapping + public ResponseEntity update(@RequestBody final OrderItemDto orderItemDto) { + return ResponseEntity.ok(this.orderItemClientService.update(orderItemDto).getBody()); + } + + @DeleteMapping("/{orderId}/{productId}") + public ResponseEntity deleteById( + @PathVariable("orderId") final String orderId, + @PathVariable("productId") final String productId) { + this.orderItemClientService.deleteById(new OrderItemId(Integer.parseInt(orderId), + Integer.parseInt(productId))).getBody(); + return ResponseEntity.ok(true); + } + + @DeleteMapping("/delete") + public ResponseEntity deleteById(@RequestBody final OrderItemId orderItemId) { + this.orderItemClientService.deleteById(orderItemId).getBody(); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderDto.java index 754e27e15..e7fd52906 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderDto.java @@ -1,55 +1,55 @@ -package com.selimhorri.app.business.orderItem.model; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.Set; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - - @JsonInclude(Include.NON_NULL) - private Set orderItemDtos; - -} - - - - - - - - - - +package com.selimhorri.app.business.orderItem.model; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Set; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer orderId; + + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime orderDate; + private String orderDesc; + private Double orderFee; + + @JsonInclude(Include.NON_NULL) + private Set orderItemDtos; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemDto.java index 01402bbe9..b9ebb62e2 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemDto.java @@ -1,44 +1,44 @@ -package com.selimhorri.app.business.orderItem.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderItemDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer productId; - private Integer orderId; - private Integer orderedQuantity; - - @JsonProperty("product") - @JsonInclude(Include.NON_NULL) - private ProductDto productDto; - - @JsonProperty("order") - @JsonInclude(Include.NON_NULL) - private OrderDto orderDto; - -} - - - - - - - - - - +package com.selimhorri.app.business.orderItem.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderItemDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer productId; + private Integer orderId; + private Integer orderedQuantity; + + @JsonProperty("product") + @JsonInclude(Include.NON_NULL) + private ProductDto productDto; + + @JsonProperty("order") + @JsonInclude(Include.NON_NULL) + private OrderDto orderDto; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemId.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemId.java index 03dc98556..54de8a58b 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemId.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemId.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.business.orderItem.model; - -import java.io.Serializable; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -public class OrderItemId implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private Integer orderId; - -} - - - - - - - - - - - +package com.selimhorri.app.business.orderItem.model; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class OrderItemId implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer productId; + private Integer orderId; + +} + + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/ProductDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/ProductDto.java index 1151a0aba..fbacf607b 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/ProductDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/ProductDto.java @@ -1,41 +1,41 @@ -package com.selimhorri.app.business.orderItem.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonInclude(Include.NON_NULL) - private Set orderItemDtos; - -} - - - - - - - - - - +package com.selimhorri.app.business.orderItem.model; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ProductDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer productId; + private String productTitle; + private String imageUrl; + private String sku; + private Double priceUnit; + private Integer quantity; + + @JsonInclude(Include.NON_NULL) + private Set orderItemDtos; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/response/OrderItemOrderItemServiceDtoCollectionResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/response/OrderItemOrderItemServiceDtoCollectionResponse.java index 1223bfeff..375e407e6 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/response/OrderItemOrderItemServiceDtoCollectionResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/response/OrderItemOrderItemServiceDtoCollectionResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.orderItem.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.orderItem.model.OrderItemDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderItemOrderItemServiceDtoCollectionResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.orderItem.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.orderItem.model.OrderItemDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderItemOrderItemServiceDtoCollectionResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/service/OrderItemClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/service/OrderItemClientService.java index 62e269dfe..069a11362 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/service/OrderItemClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/service/OrderItemClientService.java @@ -1,69 +1,69 @@ -package com.selimhorri.app.business.orderItem.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.orderItem.model.OrderItemDto; -import com.selimhorri.app.business.orderItem.model.OrderItemId; -import com.selimhorri.app.business.orderItem.model.response.OrderItemOrderItemServiceDtoCollectionResponse; - -@FeignClient(name = "SHIPPING-SERVICE", contextId = "shippingClientService", path = "/shipping-service/api/shippings") -public interface OrderItemClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{orderId}/{productId}") - ResponseEntity findById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId); - - @GetMapping("/find") - ResponseEntity findById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemId orderItemId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemDto orderItemDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemDto orderItemDto); - - @DeleteMapping("/{orderId}/{productId}") - ResponseEntity deleteById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId); - - @DeleteMapping("/delete") - ResponseEntity deleteById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemId orderItemId); - -} - - - - - - - - - - +package com.selimhorri.app.business.orderItem.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.orderItem.model.OrderItemDto; +import com.selimhorri.app.business.orderItem.model.OrderItemId; +import com.selimhorri.app.business.orderItem.model.response.OrderItemOrderItemServiceDtoCollectionResponse; + +@FeignClient(name = "SHIPPING-SERVICE", contextId = "shippingClientService", path = "/shipping-service/api/shippings") +public interface OrderItemClientService { + + @GetMapping + ResponseEntity findAll(); + + @GetMapping("/{orderId}/{productId}") + ResponseEntity findById( + @PathVariable("orderId") final String orderId, + @PathVariable("productId") final String productId); + + @GetMapping("/find") + ResponseEntity findById( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderItemId orderItemId); + + @PostMapping + ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderItemDto orderItemDto); + + @PutMapping + ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderItemDto orderItemDto); + + @DeleteMapping("/{orderId}/{productId}") + ResponseEntity deleteById( + @PathVariable("orderId") final String orderId, + @PathVariable("productId") final String productId); + + @DeleteMapping("/delete") + ResponseEntity deleteById( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderItemId orderItemId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/controller/PaymentController.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/controller/PaymentController.java index f72ce2df2..e10d783d7 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/controller/PaymentController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/payment/controller/PaymentController.java @@ -1,63 +1,63 @@ -package com.selimhorri.app.business.payment.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.payment.model.PaymentDto; -import com.selimhorri.app.business.payment.model.response.PaymentPaymentServiceDtoCollectionResponse; -import com.selimhorri.app.business.payment.service.PaymentClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/payments") -@RequiredArgsConstructor -public class PaymentController { - - private final PaymentClientService paymentClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.paymentClientService.findAll().getBody()); - } - - @GetMapping("/{paymentId}") - public ResponseEntity findById(@PathVariable("paymentId") final String paymentId) { - return ResponseEntity.ok(this.paymentClientService.findById(paymentId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final PaymentDto paymentDto) { - return ResponseEntity.ok(this.paymentClientService.save(paymentDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final PaymentDto paymentDto) { - return ResponseEntity.ok(this.paymentClientService.update(paymentDto).getBody()); - } - - @DeleteMapping("/{paymentId}") - public ResponseEntity deleteById(@PathVariable("paymentId") final String paymentId) { - return ResponseEntity.ok(this.paymentClientService.deleteById(paymentId).getBody()); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.payment.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.payment.model.PaymentDto; +import com.selimhorri.app.business.payment.model.response.PaymentPaymentServiceDtoCollectionResponse; +import com.selimhorri.app.business.payment.service.PaymentClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/payments") +@RequiredArgsConstructor +public class PaymentController { + + private final PaymentClientService paymentClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.paymentClientService.findAll().getBody()); + } + + @GetMapping("/{paymentId}") + public ResponseEntity findById(@PathVariable("paymentId") final String paymentId) { + return ResponseEntity.ok(this.paymentClientService.findById(paymentId).getBody()); + } + + @PostMapping + public ResponseEntity save(@RequestBody final PaymentDto paymentDto) { + return ResponseEntity.ok(this.paymentClientService.save(paymentDto).getBody()); + } + + @PutMapping + public ResponseEntity update(@RequestBody final PaymentDto paymentDto) { + return ResponseEntity.ok(this.paymentClientService.update(paymentDto).getBody()); + } + + @DeleteMapping("/{paymentId}") + public ResponseEntity deleteById(@PathVariable("paymentId") final String paymentId) { + return ResponseEntity.ok(this.paymentClientService.deleteById(paymentId).getBody()); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/OrderDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/OrderDto.java index f588638bd..9eb872532 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/OrderDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/OrderDto.java @@ -1,49 +1,49 @@ -package com.selimhorri.app.business.payment.model; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - -} - - - - - - - - - - +package com.selimhorri.app.business.payment.model; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer orderId; + + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime orderDate; + private String orderDesc; + private Double orderFee; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentDto.java index 93e038816..c888f76eb 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentDto.java @@ -1,40 +1,40 @@ -package com.selimhorri.app.business.payment.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class PaymentDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer paymentId; - private Boolean isPayed; - private PaymentStatus paymentStatus; - - @JsonProperty("order") - @JsonInclude(Include.NON_NULL) - private OrderDto orderDto; - -} - - - - - - - - - - +package com.selimhorri.app.business.payment.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class PaymentDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer paymentId; + private Boolean isPayed; + private PaymentStatus paymentStatus; + + @JsonProperty("order") + @JsonInclude(Include.NON_NULL) + private OrderDto orderDto; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentStatus.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentStatus.java index b8b141f24..3eb9aa0bf 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentStatus.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentStatus.java @@ -1,16 +1,16 @@ -package com.selimhorri.app.business.payment.model; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum PaymentStatus { - - NOT_STARTED("not_started"), - IN_PROGRESS("in_progress"), - COMPLETED("completed"); - - private final String status; - -} +package com.selimhorri.app.business.payment.model; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum PaymentStatus { + + NOT_STARTED("not_started"), + IN_PROGRESS("in_progress"), + COMPLETED("completed"); + + private final String status; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/response/PaymentPaymentServiceDtoCollectionResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/response/PaymentPaymentServiceDtoCollectionResponse.java index b11d282ef..a6086f067 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/response/PaymentPaymentServiceDtoCollectionResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/response/PaymentPaymentServiceDtoCollectionResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.payment.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.payment.model.PaymentDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class PaymentPaymentServiceDtoCollectionResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.payment.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.payment.model.PaymentDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class PaymentPaymentServiceDtoCollectionResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/service/PaymentClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/service/PaymentClientService.java index 8f76be006..a629633f4 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/service/PaymentClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/payment/service/PaymentClientService.java @@ -1,56 +1,56 @@ -package com.selimhorri.app.business.payment.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.payment.model.PaymentDto; -import com.selimhorri.app.business.payment.model.response.PaymentPaymentServiceDtoCollectionResponse; - -@FeignClient(name = "PAYMENT-SERVICE", contextId = "paymentClientService", path = "/payment-service/api/payments") -public interface PaymentClientService { - - @GetMapping - public ResponseEntity findAll(); - - @GetMapping("/{paymentId}") - public ResponseEntity findById( - @PathVariable("paymentId") - @NotBlank(message = "Input must not be blank!") - @Valid final String paymentId); - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final PaymentDto paymentDto); - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final PaymentDto paymentDto); - - @DeleteMapping("/{paymentId}") - public ResponseEntity deleteById(@PathVariable("paymentId") final String paymentId); - -} - - - - - - - - - - +package com.selimhorri.app.business.payment.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.payment.model.PaymentDto; +import com.selimhorri.app.business.payment.model.response.PaymentPaymentServiceDtoCollectionResponse; + +@FeignClient(name = "PAYMENT-SERVICE", contextId = "paymentClientService", path = "/payment-service/api/payments") +public interface PaymentClientService { + + @GetMapping + public ResponseEntity findAll(); + + @GetMapping("/{paymentId}") + public ResponseEntity findById( + @PathVariable("paymentId") + @NotBlank(message = "Input must not be blank!") + @Valid final String paymentId); + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final PaymentDto paymentDto); + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final PaymentDto paymentDto); + + @DeleteMapping("/{paymentId}") + public ResponseEntity deleteById(@PathVariable("paymentId") final String paymentId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/CategoryController.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/CategoryController.java index 7ddf8668c..4b6d248a2 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/CategoryController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/CategoryController.java @@ -1,69 +1,69 @@ -package com.selimhorri.app.business.product.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.product.model.CategoryDto; -import com.selimhorri.app.business.product.model.response.CategoryProductServiceCollectionDtoResponse; -import com.selimhorri.app.business.product.service.CategoryClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/categories") -@RequiredArgsConstructor -public class CategoryController { - - private final CategoryClientService categoryClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.categoryClientService.findAll().getBody()); - } - - @GetMapping("/{categoryId}") - public ResponseEntity findById(@PathVariable("categoryId") final String categoryId) { - return ResponseEntity.ok(this.categoryClientService.findById(categoryId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final CategoryDto categoryDto) { - return ResponseEntity.ok(this.categoryClientService.save(categoryDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final CategoryDto categoryDto) { - return ResponseEntity.ok(this.categoryClientService.update(categoryDto).getBody()); - } - - @PutMapping("/{categoryId}") - public ResponseEntity update(@PathVariable("categoryId") final String categoryId, - @RequestBody final CategoryDto categoryDto) { - return ResponseEntity.ok(this.categoryClientService.update(categoryId, categoryDto).getBody()); - } - - @DeleteMapping("/{categoryId}") - public ResponseEntity deleteById(@PathVariable("categoryId") final String categoryId) { - return ResponseEntity.ok(this.categoryClientService.deleteById(categoryId).getBody()); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.product.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.product.model.CategoryDto; +import com.selimhorri.app.business.product.model.response.CategoryProductServiceCollectionDtoResponse; +import com.selimhorri.app.business.product.service.CategoryClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/categories") +@RequiredArgsConstructor +public class CategoryController { + + private final CategoryClientService categoryClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.categoryClientService.findAll().getBody()); + } + + @GetMapping("/{categoryId}") + public ResponseEntity findById(@PathVariable("categoryId") final String categoryId) { + return ResponseEntity.ok(this.categoryClientService.findById(categoryId).getBody()); + } + + @PostMapping + public ResponseEntity save(@RequestBody final CategoryDto categoryDto) { + return ResponseEntity.ok(this.categoryClientService.save(categoryDto).getBody()); + } + + @PutMapping + public ResponseEntity update(@RequestBody final CategoryDto categoryDto) { + return ResponseEntity.ok(this.categoryClientService.update(categoryDto).getBody()); + } + + @PutMapping("/{categoryId}") + public ResponseEntity update(@PathVariable("categoryId") final String categoryId, + @RequestBody final CategoryDto categoryDto) { + return ResponseEntity.ok(this.categoryClientService.update(categoryId, categoryDto).getBody()); + } + + @DeleteMapping("/{categoryId}") + public ResponseEntity deleteById(@PathVariable("categoryId") final String categoryId) { + return ResponseEntity.ok(this.categoryClientService.deleteById(categoryId).getBody()); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/ProductController.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/ProductController.java index 9abd38f5d..ce1420a49 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/ProductController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/ProductController.java @@ -1,69 +1,69 @@ -package com.selimhorri.app.business.product.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.product.model.ProductDto; -import com.selimhorri.app.business.product.model.response.ProductProductServiceCollectionDtoResponse; -import com.selimhorri.app.business.product.service.ProductClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/products") -@RequiredArgsConstructor -public class ProductController { - - private final ProductClientService productClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.productClientService.findAll().getBody()); - } - - @GetMapping("/{productId}") - public ResponseEntity findById(@PathVariable("productId") final String productId) { - return ResponseEntity.ok(this.productClientService.findById(productId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final ProductDto productDto) { - return ResponseEntity.ok(this.productClientService.save(productDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final ProductDto productDto) { - return ResponseEntity.ok(this.productClientService.update(productDto).getBody()); - } - - @PutMapping("/{productId}") - public ResponseEntity update(@PathVariable("productId") final String productId, - @RequestBody final ProductDto productDto) { - return ResponseEntity.ok(this.productClientService.update(productId, productDto).getBody()); - } - - @DeleteMapping("/{productId}") - public ResponseEntity deleteById(@PathVariable("productId") final String productId) { - return ResponseEntity.ok(this.productClientService.deleteById(productId).getBody()); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.product.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.product.model.ProductDto; +import com.selimhorri.app.business.product.model.response.ProductProductServiceCollectionDtoResponse; +import com.selimhorri.app.business.product.service.ProductClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/products") +@RequiredArgsConstructor +public class ProductController { + + private final ProductClientService productClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.productClientService.findAll().getBody()); + } + + @GetMapping("/{productId}") + public ResponseEntity findById(@PathVariable("productId") final String productId) { + return ResponseEntity.ok(this.productClientService.findById(productId).getBody()); + } + + @PostMapping + public ResponseEntity save(@RequestBody final ProductDto productDto) { + return ResponseEntity.ok(this.productClientService.save(productDto).getBody()); + } + + @PutMapping + public ResponseEntity update(@RequestBody final ProductDto productDto) { + return ResponseEntity.ok(this.productClientService.update(productDto).getBody()); + } + + @PutMapping("/{productId}") + public ResponseEntity update(@PathVariable("productId") final String productId, + @RequestBody final ProductDto productDto) { + return ResponseEntity.ok(this.productClientService.update(productId, productDto).getBody()); + } + + @DeleteMapping("/{productId}") + public ResponseEntity deleteById(@PathVariable("productId") final String productId) { + return ResponseEntity.ok(this.productClientService.deleteById(productId).getBody()); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/CategoryDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/CategoryDto.java index 6c15e5a3a..2c67fa505 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/CategoryDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/CategoryDto.java @@ -1,47 +1,47 @@ -package com.selimhorri.app.business.product.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CategoryDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer categoryId; - private String categoryTitle; - private String imageUrl; - - @JsonInclude(Include.NON_NULL) - private Set subCategoriesDtos; - - @JsonProperty("parentCategory") - @JsonInclude(Include.NON_NULL) - private CategoryDto parentCategoryDto; - - @JsonInclude(Include.NON_NULL) - private Set productDtos; - -} - - - - - - - - - - +package com.selimhorri.app.business.product.model; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CategoryDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer categoryId; + private String categoryTitle; + private String imageUrl; + + @JsonInclude(Include.NON_NULL) + private Set subCategoriesDtos; + + @JsonProperty("parentCategory") + @JsonInclude(Include.NON_NULL) + private CategoryDto parentCategoryDto; + + @JsonInclude(Include.NON_NULL) + private Set productDtos; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/ProductDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/ProductDto.java index ed83b6d70..3da6399f7 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/ProductDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/ProductDto.java @@ -1,42 +1,42 @@ -package com.selimhorri.app.business.product.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonProperty("category") - @JsonInclude(Include.NON_NULL) - private CategoryDto categoryDto; - -} - - - - - - - - - - +package com.selimhorri.app.business.product.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ProductDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer productId; + private String productTitle; + private String imageUrl; + private String sku; + private Double priceUnit; + private Integer quantity; + + @JsonProperty("category") + @JsonInclude(Include.NON_NULL) + private CategoryDto categoryDto; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/CategoryProductServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/CategoryProductServiceCollectionDtoResponse.java index d67c2b51b..f654fc965 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/CategoryProductServiceCollectionDtoResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/CategoryProductServiceCollectionDtoResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.product.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.product.model.CategoryDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CategoryProductServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.product.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.product.model.CategoryDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CategoryProductServiceCollectionDtoResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/ProductProductServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/ProductProductServiceCollectionDtoResponse.java index 8505b863d..94396dc0a 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/ProductProductServiceCollectionDtoResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/ProductProductServiceCollectionDtoResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.product.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.product.model.ProductDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductProductServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.product.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.product.model.ProductDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ProductProductServiceCollectionDtoResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/service/CategoryClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/service/CategoryClientService.java index 12fa6a499..843182b8d 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/service/CategoryClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/product/service/CategoryClientService.java @@ -1,65 +1,65 @@ -package com.selimhorri.app.business.product.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.product.model.CategoryDto; -import com.selimhorri.app.business.product.model.response.CategoryProductServiceCollectionDtoResponse; - -@FeignClient(name = "PRODUCT-SERVICE", contextId = "categoryClientService", path = "/product-service/api/categories") -public interface CategoryClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{categoryId}") - ResponseEntity findById( - @PathVariable("categoryId") - @NotBlank(message = "Input must not be blank!") - @Valid final String categoryId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CategoryDto categoryDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CategoryDto categoryDto); - - @PutMapping("/{categoryId}") - ResponseEntity update( - @PathVariable("categoryId") - @NotBlank(message = "Input must not be blank!") - @Valid final String categoryId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CategoryDto categoryDto); - - @DeleteMapping("/{categoryId}") - ResponseEntity deleteById(@PathVariable("categoryId") final String categoryId); - -} - - - - - - - - - - +package com.selimhorri.app.business.product.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.product.model.CategoryDto; +import com.selimhorri.app.business.product.model.response.CategoryProductServiceCollectionDtoResponse; + +@FeignClient(name = "PRODUCT-SERVICE", contextId = "categoryClientService", path = "/product-service/api/categories") +public interface CategoryClientService { + + @GetMapping + ResponseEntity findAll(); + + @GetMapping("/{categoryId}") + ResponseEntity findById( + @PathVariable("categoryId") + @NotBlank(message = "Input must not be blank!") + @Valid final String categoryId); + + @PostMapping + ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CategoryDto categoryDto); + + @PutMapping + ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CategoryDto categoryDto); + + @PutMapping("/{categoryId}") + ResponseEntity update( + @PathVariable("categoryId") + @NotBlank(message = "Input must not be blank!") + @Valid final String categoryId, + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final CategoryDto categoryDto); + + @DeleteMapping("/{categoryId}") + ResponseEntity deleteById(@PathVariable("categoryId") final String categoryId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/service/ProductClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/service/ProductClientService.java index 7a332daf2..fb36962df 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/service/ProductClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/product/service/ProductClientService.java @@ -1,65 +1,65 @@ -package com.selimhorri.app.business.product.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.product.model.ProductDto; -import com.selimhorri.app.business.product.model.response.ProductProductServiceCollectionDtoResponse; - -@FeignClient(name = "PRODUCT-SERVICE", contextId = "productClientService", path = "/product-service/api/products") -public interface ProductClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{productId}") - ResponseEntity findById( - @PathVariable("productId") - @NotBlank(message = "Input must not be blank!") - @Valid final String productId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto); - - @PutMapping("/{productId}") - ResponseEntity update( - @PathVariable("productId") - @NotBlank(message = "Input must not be blank!") - @Valid final String productId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto); - - @DeleteMapping("/{productId}") - ResponseEntity deleteById(@PathVariable("productId") final String productId); - -} - - - - - - - - - - +package com.selimhorri.app.business.product.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.product.model.ProductDto; +import com.selimhorri.app.business.product.model.response.ProductProductServiceCollectionDtoResponse; + +@FeignClient(name = "PRODUCT-SERVICE", contextId = "productClientService", path = "/product-service/api/products") +public interface ProductClientService { + + @GetMapping + ResponseEntity findAll(); + + @GetMapping("/{productId}") + ResponseEntity findById( + @PathVariable("productId") + @NotBlank(message = "Input must not be blank!") + @Valid final String productId); + + @PostMapping + ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final ProductDto productDto); + + @PutMapping + ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final ProductDto productDto); + + @PutMapping("/{productId}") + ResponseEntity update( + @PathVariable("productId") + @NotBlank(message = "Input must not be blank!") + @Valid final String productId, + @RequestBody + @NotNull(message = "Input must not be NULL!") + @Valid final ProductDto productDto); + + @DeleteMapping("/{productId}") + ResponseEntity deleteById(@PathVariable("productId") final String productId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/AddressController.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/AddressController.java index e18410282..3f446258a 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/AddressController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/AddressController.java @@ -1,68 +1,68 @@ -package com.selimhorri.app.business.user.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.user.model.AddressDto; -import com.selimhorri.app.business.user.model.response.AddressUserServiceCollectionDtoResponse; -import com.selimhorri.app.business.user.service.AddressClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/address") -@RequiredArgsConstructor -public class AddressController { - - private final AddressClientService addressClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.addressClientService.findAll().getBody()); - } - - @GetMapping("/{addressId}") - public ResponseEntity findById(@PathVariable("addressId") final String addressId) { - return ResponseEntity.ok(this.addressClientService.findById(addressId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final AddressDto addressDto) { - return ResponseEntity.ok(this.addressClientService.save(addressDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final AddressDto addressDto) { - return ResponseEntity.ok(this.addressClientService.update(addressDto).getBody()); - } - - @PutMapping("/{addressId}") - public ResponseEntity update(@PathVariable("addressId") final String addressId, @RequestBody final AddressDto addressDto) { - return ResponseEntity.ok(this.addressClientService.update(addressDto).getBody()); - } - - @DeleteMapping("/{addressId}") - public ResponseEntity deleteById(@PathVariable("addressId") final String addressId) { - return ResponseEntity.ok(this.addressClientService.deleteById(addressId).getBody()); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.user.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.user.model.AddressDto; +import com.selimhorri.app.business.user.model.response.AddressUserServiceCollectionDtoResponse; +import com.selimhorri.app.business.user.service.AddressClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/address") +@RequiredArgsConstructor +public class AddressController { + + private final AddressClientService addressClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.addressClientService.findAll().getBody()); + } + + @GetMapping("/{addressId}") + public ResponseEntity findById(@PathVariable("addressId") final String addressId) { + return ResponseEntity.ok(this.addressClientService.findById(addressId).getBody()); + } + + @PostMapping + public ResponseEntity save(@RequestBody final AddressDto addressDto) { + return ResponseEntity.ok(this.addressClientService.save(addressDto).getBody()); + } + + @PutMapping + public ResponseEntity update(@RequestBody final AddressDto addressDto) { + return ResponseEntity.ok(this.addressClientService.update(addressDto).getBody()); + } + + @PutMapping("/{addressId}") + public ResponseEntity update(@PathVariable("addressId") final String addressId, @RequestBody final AddressDto addressDto) { + return ResponseEntity.ok(this.addressClientService.update(addressDto).getBody()); + } + + @DeleteMapping("/{addressId}") + public ResponseEntity deleteById(@PathVariable("addressId") final String addressId) { + return ResponseEntity.ok(this.addressClientService.deleteById(addressId).getBody()); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/CredentialController.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/CredentialController.java index a5db47603..dfc5cbfbe 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/CredentialController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/CredentialController.java @@ -1,73 +1,73 @@ -package com.selimhorri.app.business.user.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.user.model.CredentialDto; -import com.selimhorri.app.business.user.model.response.CredentialUserServiceCollectionDtoResponse; -import com.selimhorri.app.business.user.service.CredentialClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/credentials") -@RequiredArgsConstructor -public class CredentialController { - - private final CredentialClientService credentialClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.credentialClientService.findAll().getBody()); - } - - @GetMapping("/{credentialId}") - public ResponseEntity findById(@PathVariable("credentialId") final String credentialId) { - return ResponseEntity.ok(this.credentialClientService.findById(credentialId).getBody()); - } - - @GetMapping("/username/{username}") - public ResponseEntity findByCredentialname(@PathVariable("username") final String username) { - return ResponseEntity.ok(this.credentialClientService.findByUsername(username).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final CredentialDto credentialDto) { - return ResponseEntity.ok(this.credentialClientService.save(credentialDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final CredentialDto credentialDto) { - return ResponseEntity.ok(this.credentialClientService.update(credentialDto).getBody()); - } - - @PutMapping("/{credentialId}") - public ResponseEntity update(@PathVariable("credentialId") final String credentialId, @RequestBody final CredentialDto credentialDto) { - return ResponseEntity.ok(this.credentialClientService.update(credentialDto).getBody()); - } - - @DeleteMapping("/{credentialId}") - public ResponseEntity deleteById(@PathVariable("credentialId") final String credentialId) { - return ResponseEntity.ok(this.credentialClientService.deleteById(credentialId).getBody()); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.user.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.user.model.CredentialDto; +import com.selimhorri.app.business.user.model.response.CredentialUserServiceCollectionDtoResponse; +import com.selimhorri.app.business.user.service.CredentialClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/credentials") +@RequiredArgsConstructor +public class CredentialController { + + private final CredentialClientService credentialClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.credentialClientService.findAll().getBody()); + } + + @GetMapping("/{credentialId}") + public ResponseEntity findById(@PathVariable("credentialId") final String credentialId) { + return ResponseEntity.ok(this.credentialClientService.findById(credentialId).getBody()); + } + + @GetMapping("/username/{username}") + public ResponseEntity findByCredentialname(@PathVariable("username") final String username) { + return ResponseEntity.ok(this.credentialClientService.findByUsername(username).getBody()); + } + + @PostMapping + public ResponseEntity save(@RequestBody final CredentialDto credentialDto) { + return ResponseEntity.ok(this.credentialClientService.save(credentialDto).getBody()); + } + + @PutMapping + public ResponseEntity update(@RequestBody final CredentialDto credentialDto) { + return ResponseEntity.ok(this.credentialClientService.update(credentialDto).getBody()); + } + + @PutMapping("/{credentialId}") + public ResponseEntity update(@PathVariable("credentialId") final String credentialId, @RequestBody final CredentialDto credentialDto) { + return ResponseEntity.ok(this.credentialClientService.update(credentialDto).getBody()); + } + + @DeleteMapping("/{credentialId}") + public ResponseEntity deleteById(@PathVariable("credentialId") final String credentialId) { + return ResponseEntity.ok(this.credentialClientService.deleteById(credentialId).getBody()); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/UserController.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/UserController.java index 31bf0f032..3999e8026 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/UserController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/UserController.java @@ -1,73 +1,73 @@ -package com.selimhorri.app.business.user.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.user.model.UserDto; -import com.selimhorri.app.business.user.model.response.UserUserServiceCollectionDtoResponse; -import com.selimhorri.app.business.user.service.UserClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/users") -@RequiredArgsConstructor -public class UserController { - - private final UserClientService userClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.userClientService.findAll().getBody()); - } - - @GetMapping("/{userId}") - public ResponseEntity findById(@PathVariable("userId") final String userId) { - return ResponseEntity.ok(this.userClientService.findById(userId).getBody()); - } - - @GetMapping("/username/{username}") - public ResponseEntity findByUsername(@PathVariable("username") final String username) { - return ResponseEntity.ok(this.userClientService.findByUsername(username).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final UserDto userDto) { - return ResponseEntity.ok(this.userClientService.save(userDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final UserDto userDto) { - return ResponseEntity.ok(this.userClientService.update(userDto).getBody()); - } - - @PutMapping("/{userId}") - public ResponseEntity update(@PathVariable("userId") final String userId, @RequestBody final UserDto userDto) { - return ResponseEntity.ok(this.userClientService.update(userDto).getBody()); - } - - @DeleteMapping("/{userId}") - public ResponseEntity deleteById(@PathVariable("userId") final String userId) { - return ResponseEntity.ok(this.userClientService.deleteById(userId).getBody()); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.user.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.user.model.UserDto; +import com.selimhorri.app.business.user.model.response.UserUserServiceCollectionDtoResponse; +import com.selimhorri.app.business.user.service.UserClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/users") +@RequiredArgsConstructor +public class UserController { + + private final UserClientService userClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.userClientService.findAll().getBody()); + } + + @GetMapping("/{userId}") + public ResponseEntity findById(@PathVariable("userId") final String userId) { + return ResponseEntity.ok(this.userClientService.findById(userId).getBody()); + } + + @GetMapping("/username/{username}") + public ResponseEntity findByUsername(@PathVariable("username") final String username) { + return ResponseEntity.ok(this.userClientService.findByUsername(username).getBody()); + } + + @PostMapping + public ResponseEntity save(@RequestBody final UserDto userDto) { + return ResponseEntity.ok(this.userClientService.save(userDto).getBody()); + } + + @PutMapping + public ResponseEntity update(@RequestBody final UserDto userDto) { + return ResponseEntity.ok(this.userClientService.update(userDto).getBody()); + } + + @PutMapping("/{userId}") + public ResponseEntity update(@PathVariable("userId") final String userId, @RequestBody final UserDto userDto) { + return ResponseEntity.ok(this.userClientService.update(userDto).getBody()); + } + + @DeleteMapping("/{userId}") + public ResponseEntity deleteById(@PathVariable("userId") final String userId) { + return ResponseEntity.ok(this.userClientService.deleteById(userId).getBody()); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/VerificationTokenController.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/VerificationTokenController.java index 833f5c84e..c1608a9da 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/VerificationTokenController.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/VerificationTokenController.java @@ -1,68 +1,68 @@ -package com.selimhorri.app.business.user.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.user.model.VerificationTokenDto; -import com.selimhorri.app.business.user.model.response.VerificationUserTokenServiceCollectionDtoResponse; -import com.selimhorri.app.business.user.service.VerificationTokenClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/verificationTokens") -@RequiredArgsConstructor -public class VerificationTokenController { - - private final VerificationTokenClientService verificationTokenClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.verificationTokenClientService.findAll().getBody()); - } - - @GetMapping("/{verificationTokenId}") - public ResponseEntity findById(@PathVariable("verificationTokenId") final String verificationTokenId) { - return ResponseEntity.ok(this.verificationTokenClientService.findById(verificationTokenId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final VerificationTokenDto verificationTokenDto) { - return ResponseEntity.ok(this.verificationTokenClientService.save(verificationTokenDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final VerificationTokenDto verificationTokenDto) { - return ResponseEntity.ok(this.verificationTokenClientService.update(verificationTokenDto).getBody()); - } - - @PutMapping("/{verificationTokenId}") - public ResponseEntity update(@PathVariable("verificationTokenId") final String verificationTokenId, @RequestBody final VerificationTokenDto verificationTokenDto) { - return ResponseEntity.ok(this.verificationTokenClientService.update(verificationTokenDto).getBody()); - } - - @DeleteMapping("/{verificationTokenId}") - public ResponseEntity deleteById(@PathVariable("verificationTokenId") final String verificationTokenId) { - return ResponseEntity.ok(this.verificationTokenClientService.deleteById(verificationTokenId).getBody()); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.user.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.business.user.model.VerificationTokenDto; +import com.selimhorri.app.business.user.model.response.VerificationUserTokenServiceCollectionDtoResponse; +import com.selimhorri.app.business.user.service.VerificationTokenClientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/verificationTokens") +@RequiredArgsConstructor +public class VerificationTokenController { + + private final VerificationTokenClientService verificationTokenClientService; + + @GetMapping + public ResponseEntity findAll() { + return ResponseEntity.ok(this.verificationTokenClientService.findAll().getBody()); + } + + @GetMapping("/{verificationTokenId}") + public ResponseEntity findById(@PathVariable("verificationTokenId") final String verificationTokenId) { + return ResponseEntity.ok(this.verificationTokenClientService.findById(verificationTokenId).getBody()); + } + + @PostMapping + public ResponseEntity save(@RequestBody final VerificationTokenDto verificationTokenDto) { + return ResponseEntity.ok(this.verificationTokenClientService.save(verificationTokenDto).getBody()); + } + + @PutMapping + public ResponseEntity update(@RequestBody final VerificationTokenDto verificationTokenDto) { + return ResponseEntity.ok(this.verificationTokenClientService.update(verificationTokenDto).getBody()); + } + + @PutMapping("/{verificationTokenId}") + public ResponseEntity update(@PathVariable("verificationTokenId") final String verificationTokenId, @RequestBody final VerificationTokenDto verificationTokenDto) { + return ResponseEntity.ok(this.verificationTokenClientService.update(verificationTokenDto).getBody()); + } + + @DeleteMapping("/{verificationTokenId}") + public ResponseEntity deleteById(@PathVariable("verificationTokenId") final String verificationTokenId) { + return ResponseEntity.ok(this.verificationTokenClientService.deleteById(verificationTokenId).getBody()); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/AddressDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/AddressDto.java index c62f4637f..0e055ecdf 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/AddressDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/AddressDto.java @@ -1,44 +1,44 @@ -package com.selimhorri.app.business.user.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AddressDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer addressId; - - private String fullAddress; - - private String postalCode; - - private String city; - - @JsonProperty("user") - @JsonInclude(value = Include.NON_NULL) - private UserDto userDto; - -} - - - - - - - - - - +package com.selimhorri.app.business.user.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class AddressDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer addressId; + + private String fullAddress; + + private String postalCode; + + private String city; + + @JsonProperty("user") + @JsonInclude(value = Include.NON_NULL) + private UserDto userDto; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/CredentialDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/CredentialDto.java index 579b336a5..a8048167b 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/CredentialDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/CredentialDto.java @@ -1,43 +1,43 @@ -package com.selimhorri.app.business.user.model; - -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CredentialDto { - - private Integer credentialId; - private String username; - private String password; - private RoleBasedAuthority roleBasedAuthority; - private Boolean isEnabled; - private Boolean isAccountNonExpired; - private Boolean isAccountNonLocked; - private Boolean isCredentialsNonExpired; - - @JsonProperty("user") - @JsonInclude(value = Include.NON_NULL) - private UserDto userDto; - - @JsonInclude(value = Include.NON_NULL) - private Set verificationTokenDtos; - -} - - - - - - - +package com.selimhorri.app.business.user.model; + +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CredentialDto { + + private Integer credentialId; + private String username; + private String password; + private RoleBasedAuthority roleBasedAuthority; + private Boolean isEnabled; + private Boolean isAccountNonExpired; + private Boolean isAccountNonLocked; + private Boolean isCredentialsNonExpired; + + @JsonProperty("user") + @JsonInclude(value = Include.NON_NULL) + private UserDto userDto; + + @JsonInclude(value = Include.NON_NULL) + private Set verificationTokenDtos; + +} + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/RoleBasedAuthority.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/RoleBasedAuthority.java index 86a306c0f..f19d341fb 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/RoleBasedAuthority.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/RoleBasedAuthority.java @@ -1,15 +1,15 @@ -package com.selimhorri.app.business.user.model; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum RoleBasedAuthority { - - ROLE_USER("USER"), - ROLE_ADMIN("ADMIN"); - - private final String role; - -} +package com.selimhorri.app.business.user.model; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum RoleBasedAuthority { + + ROLE_USER("USER"), + ROLE_ADMIN("ADMIN"); + + private final String role; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDetailsImpl.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDetailsImpl.java index 72092e137..ef11a0f46 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDetailsImpl.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDetailsImpl.java @@ -1,65 +1,65 @@ -package com.selimhorri.app.business.user.model; - -import java.util.Collection; -import java.util.List; - -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class UserDetailsImpl implements UserDetails { - - private static final long serialVersionUID = 1L; - private final CredentialDto credential; - - @Override - public Collection getAuthorities() { - return List.of(new SimpleGrantedAuthority(this.credential.getRoleBasedAuthority().name())); - } - - @Override - public String getUsername() { - return this.credential.getUsername(); - } - - @Override - public String getPassword() { - return this.credential.getPassword(); - } - - @Override - public boolean isEnabled() { - return this.credential.getIsEnabled(); - } - - @Override - public boolean isAccountNonExpired() { - return this.credential.getIsAccountNonExpired(); - } - - @Override - public boolean isAccountNonLocked() { - return this.credential.getIsAccountNonLocked(); - } - - @Override - public boolean isCredentialsNonExpired() { - return this.credential.getIsCredentialsNonExpired(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.business.user.model; + +import java.util.Collection; +import java.util.List; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class UserDetailsImpl implements UserDetails { + + private static final long serialVersionUID = 1L; + private final CredentialDto credential; + + @Override + public Collection getAuthorities() { + return List.of(new SimpleGrantedAuthority(this.credential.getRoleBasedAuthority().name())); + } + + @Override + public String getUsername() { + return this.credential.getUsername(); + } + + @Override + public String getPassword() { + return this.credential.getPassword(); + } + + @Override + public boolean isEnabled() { + return this.credential.getIsEnabled(); + } + + @Override + public boolean isAccountNonExpired() { + return this.credential.getIsAccountNonExpired(); + } + + @Override + public boolean isAccountNonLocked() { + return this.credential.getIsAccountNonLocked(); + } + + @Override + public boolean isCredentialsNonExpired() { + return this.credential.getIsCredentialsNonExpired(); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDto.java index cb2d0077b..397addf19 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDto.java @@ -1,44 +1,44 @@ -package com.selimhorri.app.business.user.model; - -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto { - - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonInclude(value = Include.NON_NULL) - private Set addressDtos; - - @JsonProperty("credential") - @JsonInclude(value = Include.NON_NULL) - private CredentialDto credentialDto; - -} - - - - - - - - - - +package com.selimhorri.app.business.user.model; + +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class UserDto { + + private Integer userId; + private String firstName; + private String lastName; + private String imageUrl; + private String email; + private String phone; + + @JsonInclude(value = Include.NON_NULL) + private Set addressDtos; + + @JsonProperty("credential") + @JsonInclude(value = Include.NON_NULL) + private CredentialDto credentialDto; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/VerificationTokenDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/VerificationTokenDto.java index 15abe3a10..57b247f53 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/VerificationTokenDto.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/VerificationTokenDto.java @@ -1,45 +1,45 @@ -package com.selimhorri.app.business.user.model; - -import java.time.LocalDate; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class VerificationTokenDto { - - private Integer verificationTokenId; - private String token; - - @JsonFormat(pattern = AppConstant.LOCAL_DATE_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_FORMAT) - private LocalDate expireDate; - - @JsonProperty("credential") - @JsonInclude(value = Include.NON_NULL) - private CredentialDto credentialDto; - -} - - - - - - - - - +package com.selimhorri.app.business.user.model; + +import java.time.LocalDate; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class VerificationTokenDto { + + private Integer verificationTokenId; + private String token; + + @JsonFormat(pattern = AppConstant.LOCAL_DATE_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_FORMAT) + private LocalDate expireDate; + + @JsonProperty("credential") + @JsonInclude(value = Include.NON_NULL) + private CredentialDto credentialDto; + +} + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/AddressUserServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/AddressUserServiceCollectionDtoResponse.java index 5d78c26f2..37df00570 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/AddressUserServiceCollectionDtoResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/AddressUserServiceCollectionDtoResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.user.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.user.model.AddressDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AddressUserServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.user.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.user.model.AddressDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class AddressUserServiceCollectionDtoResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/CredentialUserServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/CredentialUserServiceCollectionDtoResponse.java index 86dd278bc..da0942a24 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/CredentialUserServiceCollectionDtoResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/CredentialUserServiceCollectionDtoResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.user.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.user.model.CredentialDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CredentialUserServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.user.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.user.model.CredentialDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CredentialUserServiceCollectionDtoResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/UserUserServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/UserUserServiceCollectionDtoResponse.java index 3ae5317c3..bff0f0aa4 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/UserUserServiceCollectionDtoResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/UserUserServiceCollectionDtoResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.user.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.user.model.UserDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserUserServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.user.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.user.model.UserDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class UserUserServiceCollectionDtoResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/VerificationUserTokenServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/VerificationUserTokenServiceCollectionDtoResponse.java index 4137c0ff6..7941fd571 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/VerificationUserTokenServiceCollectionDtoResponse.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/VerificationUserTokenServiceCollectionDtoResponse.java @@ -1,22 +1,22 @@ -package com.selimhorri.app.business.user.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.user.model.VerificationTokenDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class VerificationUserTokenServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} +package com.selimhorri.app.business.user.model.response; + +import java.io.Serializable; +import java.util.Collection; + +import com.selimhorri.app.business.user.model.VerificationTokenDto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class VerificationUserTokenServiceCollectionDtoResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private Collection collection; + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/AddressClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/AddressClientService.java index 99fab4efe..3c9cc9b43 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/AddressClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/AddressClientService.java @@ -1,64 +1,64 @@ -package com.selimhorri.app.business.user.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.user.model.AddressDto; -import com.selimhorri.app.business.user.model.response.AddressUserServiceCollectionDtoResponse; - -@FeignClient(name = "USER-SERVICE", contextId = "addressClientService", path = "/user-service/api/address", decode404 = true) -public interface AddressClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{addressId}") - ResponseEntity findById( - @PathVariable("addressId") - @NotBlank(message = "*Input must not blank!**") - @Valid final String addressId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final AddressDto addressDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final AddressDto addressDto); - - @PutMapping("/{addressId}") - ResponseEntity update( - @PathVariable("addressId") - @NotBlank(message = "*Input must not blank!**") final String addressId, - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final AddressDto addressDto); - - @DeleteMapping("/{addressId}") - ResponseEntity deleteById(@PathVariable("addressId") @NotBlank(message = "*Input must not blank!**") @Valid final String addressId); - -} - - - - - - - - - - +package com.selimhorri.app.business.user.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.user.model.AddressDto; +import com.selimhorri.app.business.user.model.response.AddressUserServiceCollectionDtoResponse; + +@FeignClient(name = "USER-SERVICE", contextId = "addressClientService", path = "/user-service/api/address", decode404 = true) +public interface AddressClientService { + + @GetMapping + ResponseEntity findAll(); + + @GetMapping("/{addressId}") + ResponseEntity findById( + @PathVariable("addressId") + @NotBlank(message = "*Input must not blank!**") + @Valid final String addressId); + + @PostMapping + ResponseEntity save( + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final AddressDto addressDto); + + @PutMapping + ResponseEntity update( + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final AddressDto addressDto); + + @PutMapping("/{addressId}") + ResponseEntity update( + @PathVariable("addressId") + @NotBlank(message = "*Input must not blank!**") final String addressId, + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final AddressDto addressDto); + + @DeleteMapping("/{addressId}") + ResponseEntity deleteById(@PathVariable("addressId") @NotBlank(message = "*Input must not blank!**") @Valid final String addressId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/CredentialClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/CredentialClientService.java index c1217db95..665b58075 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/CredentialClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/CredentialClientService.java @@ -1,70 +1,70 @@ -package com.selimhorri.app.business.user.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.user.model.CredentialDto; -import com.selimhorri.app.business.user.model.response.CredentialUserServiceCollectionDtoResponse; - -@FeignClient(name = "USER-SERVICE", contextId = "credentialClientService", path = "/user-service/api/credentials", decode404 = true) -public interface CredentialClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{credentialId}") - ResponseEntity findById( - @PathVariable("credentialId") - @NotBlank(message = "*Input must not blank!**") - @Valid final String credentialId); - - @GetMapping("/username/{username}") - ResponseEntity findByUsername( - @PathVariable("username") - @NotBlank(message = "*Input must not blank!**") - @Valid final String username); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final CredentialDto credentialDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final CredentialDto credentialDto); - - @PutMapping("/{credentialId}") - ResponseEntity update( - @PathVariable("credentialId") - @NotBlank(message = "*Input must not blank!**") final String credentialId, - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final CredentialDto credentialDto); - - @DeleteMapping("/{credentialId}") - ResponseEntity deleteById(@PathVariable("credentialId") @NotBlank(message = "*Input must not blank!**") @Valid final String credentialId); - -} - - - - - - - - - - +package com.selimhorri.app.business.user.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.user.model.CredentialDto; +import com.selimhorri.app.business.user.model.response.CredentialUserServiceCollectionDtoResponse; + +@FeignClient(name = "USER-SERVICE", contextId = "credentialClientService", path = "/user-service/api/credentials", decode404 = true) +public interface CredentialClientService { + + @GetMapping + ResponseEntity findAll(); + + @GetMapping("/{credentialId}") + ResponseEntity findById( + @PathVariable("credentialId") + @NotBlank(message = "*Input must not blank!**") + @Valid final String credentialId); + + @GetMapping("/username/{username}") + ResponseEntity findByUsername( + @PathVariable("username") + @NotBlank(message = "*Input must not blank!**") + @Valid final String username); + + @PostMapping + ResponseEntity save( + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final CredentialDto credentialDto); + + @PutMapping + ResponseEntity update( + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final CredentialDto credentialDto); + + @PutMapping("/{credentialId}") + ResponseEntity update( + @PathVariable("credentialId") + @NotBlank(message = "*Input must not blank!**") final String credentialId, + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final CredentialDto credentialDto); + + @DeleteMapping("/{credentialId}") + ResponseEntity deleteById(@PathVariable("credentialId") @NotBlank(message = "*Input must not blank!**") @Valid final String credentialId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/UserClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/UserClientService.java index 17983a120..9657ebee0 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/UserClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/UserClientService.java @@ -1,70 +1,70 @@ -package com.selimhorri.app.business.user.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.user.model.UserDto; -import com.selimhorri.app.business.user.model.response.UserUserServiceCollectionDtoResponse; - -@FeignClient(name = "USER-SERVICE", contextId = "userClientService", path = "/user-service/api/users", decode404 = true) -public interface UserClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{userId}") - ResponseEntity findById( - @PathVariable("userId") - @NotBlank(message = "*Input must not blank!**") - @Valid final String userId); - - @GetMapping("/username/{username}") - ResponseEntity findByUsername( - @PathVariable("username") - @NotBlank(message = "*Input must not blank!**") - @Valid final String username); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final UserDto userDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final UserDto userDto); - - @PutMapping("/{userId}") - ResponseEntity update( - @PathVariable("userId") - @NotBlank(message = "*Input must not blank!**") final String userId, - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final UserDto userDto); - - @DeleteMapping("/{userId}") - ResponseEntity deleteById(@PathVariable("userId") @NotBlank(message = "*Input must not blank!**") @Valid final String userId); - -} - - - - - - - - - - +package com.selimhorri.app.business.user.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.user.model.UserDto; +import com.selimhorri.app.business.user.model.response.UserUserServiceCollectionDtoResponse; + +@FeignClient(name = "USER-SERVICE", contextId = "userClientService", path = "/user-service/api/users", decode404 = true) +public interface UserClientService { + + @GetMapping + ResponseEntity findAll(); + + @GetMapping("/{userId}") + ResponseEntity findById( + @PathVariable("userId") + @NotBlank(message = "*Input must not blank!**") + @Valid final String userId); + + @GetMapping("/username/{username}") + ResponseEntity findByUsername( + @PathVariable("username") + @NotBlank(message = "*Input must not blank!**") + @Valid final String username); + + @PostMapping + ResponseEntity save( + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final UserDto userDto); + + @PutMapping + ResponseEntity update( + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final UserDto userDto); + + @PutMapping("/{userId}") + ResponseEntity update( + @PathVariable("userId") + @NotBlank(message = "*Input must not blank!**") final String userId, + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final UserDto userDto); + + @DeleteMapping("/{userId}") + ResponseEntity deleteById(@PathVariable("userId") @NotBlank(message = "*Input must not blank!**") @Valid final String userId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/VerificationTokenClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/VerificationTokenClientService.java index 2cc383d19..f039fc577 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/VerificationTokenClientService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/VerificationTokenClientService.java @@ -1,64 +1,64 @@ -package com.selimhorri.app.business.user.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.user.model.VerificationTokenDto; -import com.selimhorri.app.business.user.model.response.VerificationUserTokenServiceCollectionDtoResponse; - -@FeignClient(name = "USER-SERVICE", contextId = "verificationTokenClientService", path = "/user-service/api/verificationTokens", decode404 = true) -public interface VerificationTokenClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{verificationTokenId}") - ResponseEntity findById( - @PathVariable("verificationTokenId") - @NotBlank(message = "*Input must not blank!**") - @Valid final String verificationTokenId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final VerificationTokenDto verificationTokenDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final VerificationTokenDto verificationTokenDto); - - @PutMapping("/{verificationTokenId}") - ResponseEntity update( - @PathVariable("verificationTokenId") - @NotBlank(message = "*Input must not blank!**") final String verificationTokenId, - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final VerificationTokenDto verificationTokenDto); - - @DeleteMapping("/{verificationTokenId}") - ResponseEntity deleteById(@PathVariable("verificationTokenId") @NotBlank(message = "*Input must not blank!**") @Valid final String verificationTokenId); - -} - - - - - - - - - - +package com.selimhorri.app.business.user.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.selimhorri.app.business.user.model.VerificationTokenDto; +import com.selimhorri.app.business.user.model.response.VerificationUserTokenServiceCollectionDtoResponse; + +@FeignClient(name = "USER-SERVICE", contextId = "verificationTokenClientService", path = "/user-service/api/verificationTokens", decode404 = true) +public interface VerificationTokenClientService { + + @GetMapping + ResponseEntity findAll(); + + @GetMapping("/{verificationTokenId}") + ResponseEntity findById( + @PathVariable("verificationTokenId") + @NotBlank(message = "*Input must not blank!**") + @Valid final String verificationTokenId); + + @PostMapping + ResponseEntity save( + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final VerificationTokenDto verificationTokenDto); + + @PutMapping + ResponseEntity update( + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final VerificationTokenDto verificationTokenDto); + + @PutMapping("/{verificationTokenId}") + ResponseEntity update( + @PathVariable("verificationTokenId") + @NotBlank(message = "*Input must not blank!**") final String verificationTokenId, + @RequestBody + @NotNull(message = "*Input must not NULL!**") + @Valid final VerificationTokenDto verificationTokenDto); + + @DeleteMapping("/{verificationTokenId}") + ResponseEntity deleteById(@PathVariable("verificationTokenId") @NotBlank(message = "*Input must not blank!**") @Valid final String verificationTokenId); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/config/encoder/EncoderConfig.java b/proxy-client/src/main/java/com/selimhorri/app/config/encoder/EncoderConfig.java index ad600fe42..76f5e5e73 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/config/encoder/EncoderConfig.java +++ b/proxy-client/src/main/java/com/selimhorri/app/config/encoder/EncoderConfig.java @@ -1,26 +1,26 @@ -package com.selimhorri.app.config.encoder; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; - -@Configuration -public class EncoderConfig { - - @Bean - public PasswordEncoder getPasswordEncoder() { - return new BCryptPasswordEncoder(); - } - - - -} - - - - - - - - +package com.selimhorri.app.config.encoder; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class EncoderConfig { + + @Bean + public PasswordEncoder getPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + + +} + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/config/filter/JwtRequestFilter.java b/proxy-client/src/main/java/com/selimhorri/app/config/filter/JwtRequestFilter.java index 06be12562..f3750d912 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/config/filter/JwtRequestFilter.java +++ b/proxy-client/src/main/java/com/selimhorri/app/config/filter/JwtRequestFilter.java @@ -1,76 +1,76 @@ -package com.selimhorri.app.config.filter; - -import java.io.IOException; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import com.selimhorri.app.jwt.service.JwtService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Component -@Slf4j -@RequiredArgsConstructor -public class JwtRequestFilter extends OncePerRequestFilter { - - private final UserDetailsService userDetailsService; - private final JwtService jwtService; - - @Override - protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) - throws ServletException, IOException { - - log.info("**JwtRequestFilter, once per request, validating and extracting token*\n"); - - final var authorizationHeader = request.getHeader("Authorization"); - - String username = null; - String jwt = null; - - if ( authorizationHeader != null && authorizationHeader.startsWith("Bearer ") ) { - jwt = authorizationHeader.substring(7); - username = jwtService.extractUsername(jwt); - } - - if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { - - final UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); - - if (this.jwtService.validateToken(jwt, userDetails)) { - final UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = - new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); - } - - } - - filterChain.doFilter(request, response); - log.info("**Jwt request filtered!*\n"); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.filter; + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import com.selimhorri.app.jwt.service.JwtService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Component +@Slf4j +@RequiredArgsConstructor +public class JwtRequestFilter extends OncePerRequestFilter { + + private final UserDetailsService userDetailsService; + private final JwtService jwtService; + + @Override + protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) + throws ServletException, IOException { + + log.info("**JwtRequestFilter, once per request, validating and extracting token*\n"); + + final var authorizationHeader = request.getHeader("Authorization"); + + String username = null; + String jwt = null; + + if ( authorizationHeader != null && authorizationHeader.startsWith("Bearer ") ) { + jwt = authorizationHeader.substring(7); + username = jwtService.extractUsername(jwt); + } + + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + + final UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); + + if (this.jwtService.validateToken(jwt, userDetails)) { + final UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = + new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); + } + + } + + filterChain.doFilter(request, response); + log.info("**Jwt request filtered!*\n"); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/config/template/TemplateConfig.java b/proxy-client/src/main/java/com/selimhorri/app/config/template/TemplateConfig.java index 1ad0ee4a0..9a127b3cc 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/config/template/TemplateConfig.java +++ b/proxy-client/src/main/java/com/selimhorri/app/config/template/TemplateConfig.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.config.template; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class TemplateConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.template; + +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class TemplateConfig { + + @LoadBalanced + @Bean + public RestTemplate restTemplateBean() { + return new RestTemplate(); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/constant/AppConstant.java b/proxy-client/src/main/java/com/selimhorri/app/constant/AppConstant.java index 40f49bbc3..2e051c4b5 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ b/proxy-client/src/main/java/com/selimhorri/app/constant/AppConstant.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - +package com.selimhorri.app.constant; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public abstract class AppConstant { + + public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; + public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public abstract class DiscoveredDomainsApi { + + public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; + public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; + + public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; + public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; + + public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; + public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; + + public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; + public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; + + public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; + public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; + + public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; + public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; + + } + + + +} + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/proxy-client/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java index 5bc0cb0a9..31f794e45 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ b/proxy-client/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java @@ -1,101 +1,101 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.CredentialNotFoundException; -import com.selimhorri.app.exception.wrapper.FavouriteNotFoundException; -import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; -import com.selimhorri.app.exception.wrapper.VerificationTokenNotFoundException; - -import feign.FeignException; -import feign.FeignException.FeignClientException; -import feign.FeignException.FeignServerException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - FeignClientException.class, - FeignServerException.class, - FeignException.class - }) - public ResponseEntity handleProxyException(final T e) { - - log.info("**ApiExceptionHandler controller, handle feign proxy exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg(e.contentUTF8()) - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg(e.getBindingResult().getFieldError().getDefaultMessage()) - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - UserObjectNotFoundException.class, - CredentialNotFoundException.class, - VerificationTokenNotFoundException.class, - FavouriteNotFoundException.class, - IllegalStateException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg(e.getMessage()) - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.selimhorri.app.exception.payload.ExceptionMsg; +import com.selimhorri.app.exception.wrapper.CredentialNotFoundException; +import com.selimhorri.app.exception.wrapper.FavouriteNotFoundException; +import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; +import com.selimhorri.app.exception.wrapper.VerificationTokenNotFoundException; + +import feign.FeignException; +import feign.FeignException.FeignClientException; +import feign.FeignException.FeignServerException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@ControllerAdvice +@Slf4j +@RequiredArgsConstructor +public class ApiExceptionHandler { + + @ExceptionHandler(value = { + FeignClientException.class, + FeignServerException.class, + FeignException.class + }) + public ResponseEntity handleProxyException(final T e) { + + log.info("**ApiExceptionHandler controller, handle feign proxy exception*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg(e.contentUTF8()) + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + @ExceptionHandler(value = { + MethodArgumentNotValidException.class, + HttpMessageNotReadableException.class + }) + public ResponseEntity handleValidationException(final T e) { + + log.info("**ApiExceptionHandler controller, handle validation exception*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg(e.getBindingResult().getFieldError().getDefaultMessage()) + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + @ExceptionHandler(value = { + UserObjectNotFoundException.class, + CredentialNotFoundException.class, + VerificationTokenNotFoundException.class, + FavouriteNotFoundException.class, + IllegalStateException.class, + }) + public ResponseEntity handleApiRequestException(final T e) { + + log.info("**ApiExceptionHandler controller, handle API request*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg(e.getMessage()) + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/proxy-client/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java index 833c9cc32..96659ad64 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ b/proxy-client/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java @@ -1,50 +1,50 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - - private final HttpStatus httpStatus; - - private final String msg; - -} - - - - - - - - - - +package com.selimhorri.app.exception.payload; + +import java.io.Serializable; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@AllArgsConstructor +@Data +@Builder +public final class ExceptionMsg implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ZonedDateTimeSerializer.class) + @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) + private final ZonedDateTime timestamp; + + @JsonInclude(value = Include.NON_NULL) + private Throwable throwable; + + private final HttpStatus httpStatus; + + private final String msg; + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java index 74095fbc2..284fa381b 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java +++ b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class CredentialNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public CredentialNotFoundException() { - super(); - } - - public CredentialNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public CredentialNotFoundException(String message) { - super(message); - } - - public CredentialNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class CredentialNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public CredentialNotFoundException() { + super(); + } + + public CredentialNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public CredentialNotFoundException(String message) { + super(message); + } + + public CredentialNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java index d7f9a6629..d7d68c9af 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java +++ b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class FavouriteNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public FavouriteNotFoundException() { - super(); - } - - public FavouriteNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public FavouriteNotFoundException(String message) { - super(message); - } - - public FavouriteNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class FavouriteNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public FavouriteNotFoundException() { + super(); + } + + public FavouriteNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public FavouriteNotFoundException(String message) { + super(message); + } + + public FavouriteNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/IllegalAuthenticationCredentialsException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/IllegalAuthenticationCredentialsException.java index 42a41f65a..7b3ba8d1a 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/IllegalAuthenticationCredentialsException.java +++ b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/IllegalAuthenticationCredentialsException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class IllegalAuthenticationCredentialsException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public IllegalAuthenticationCredentialsException() { - super(); - } - - public IllegalAuthenticationCredentialsException(String message, Throwable cause) { - super(message, cause); - } - - public IllegalAuthenticationCredentialsException(String message) { - super(message); - } - - public IllegalAuthenticationCredentialsException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class IllegalAuthenticationCredentialsException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public IllegalAuthenticationCredentialsException() { + super(); + } + + public IllegalAuthenticationCredentialsException(String message, Throwable cause) { + super(message, cause); + } + + public IllegalAuthenticationCredentialsException(String message) { + super(message); + } + + public IllegalAuthenticationCredentialsException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java index 35505a066..199e193ff 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java +++ b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class UserObjectNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public UserObjectNotFoundException() { - super(); - } - - public UserObjectNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public UserObjectNotFoundException(String message) { - super(message); - } - - public UserObjectNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class UserObjectNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public UserObjectNotFoundException() { + super(); + } + + public UserObjectNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public UserObjectNotFoundException(String message) { + super(message); + } + + public UserObjectNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java index 869117fa3..eaa184f77 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java +++ b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class VerificationTokenNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public VerificationTokenNotFoundException() { - super(); - } - - public VerificationTokenNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public VerificationTokenNotFoundException(String message) { - super(message); - } - - public VerificationTokenNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class VerificationTokenNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public VerificationTokenNotFoundException() { + super(); + } + + public VerificationTokenNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public VerificationTokenNotFoundException(String message) { + super(message); + } + + public VerificationTokenNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/jwt/service/JwtService.java b/proxy-client/src/main/java/com/selimhorri/app/jwt/service/JwtService.java index 4a64cef3f..c88f62a67 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/jwt/service/JwtService.java +++ b/proxy-client/src/main/java/com/selimhorri/app/jwt/service/JwtService.java @@ -1,28 +1,28 @@ -package com.selimhorri.app.jwt.service; - -import java.util.Date; -import java.util.function.Function; - -import org.springframework.security.core.userdetails.UserDetails; - -import io.jsonwebtoken.Claims; - -public interface JwtService { - - String extractUsername(final String token); - Date extractExpiration(final String token); - T extractClaims(final String token, final Function claimsResolver); - String generateToken(final UserDetails userDetails); - Boolean validateToken(final String token, final UserDetails userDetails); - -} - - - - - - - - - - +package com.selimhorri.app.jwt.service; + +import java.util.Date; +import java.util.function.Function; + +import org.springframework.security.core.userdetails.UserDetails; + +import io.jsonwebtoken.Claims; + +public interface JwtService { + + String extractUsername(final String token); + Date extractExpiration(final String token); + T extractClaims(final String token, final Function claimsResolver); + String generateToken(final UserDetails userDetails); + Boolean validateToken(final String token, final UserDetails userDetails); + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/jwt/service/impl/JwtServiceImpl.java b/proxy-client/src/main/java/com/selimhorri/app/jwt/service/impl/JwtServiceImpl.java index e98253c85..6c7a7c21c 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/jwt/service/impl/JwtServiceImpl.java +++ b/proxy-client/src/main/java/com/selimhorri/app/jwt/service/impl/JwtServiceImpl.java @@ -1,65 +1,65 @@ -package com.selimhorri.app.jwt.service.impl; - -import java.util.Date; -import java.util.function.Function; - -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Service; - -import com.selimhorri.app.jwt.service.JwtService; -import com.selimhorri.app.jwt.util.JwtUtil; - -import io.jsonwebtoken.Claims; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Slf4j -@RequiredArgsConstructor -public class JwtServiceImpl implements JwtService { - - private final JwtUtil jwtUtil; - - @Override - public String extractUsername(final String token) { - log.info("**String, jwt service extract username from given token!*"); - return this.jwtUtil.extractUsername(token); - } - - @Override - public Date extractExpiration(final String token) { - log.info("**Date, jwt service extract expiration from given token!*"); - return this.jwtUtil.extractExpiration(token); - } - - @Override - public T extractClaims(final String token, final Function claimsResolver) { - log.info("**T, jwt service extract claims from given token and claimResolver Function!*"); - return this.jwtUtil.extractClaims(token, claimsResolver); - } - - @Override - public String generateToken(final UserDetails userDetails) { - log.info("**String, jwt service generate token from given userDetails!*"); - return this.jwtUtil.generateToken(userDetails); - } - - @Override - public Boolean validateToken(final String token, final UserDetails userDetails) { - log.info("**Boolean, jwt service validate token from given token and userDetails!*"); - return this.jwtUtil.validateToken(token, userDetails); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.jwt.service.impl; + +import java.util.Date; +import java.util.function.Function; + +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Service; + +import com.selimhorri.app.jwt.service.JwtService; +import com.selimhorri.app.jwt.util.JwtUtil; + +import io.jsonwebtoken.Claims; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Slf4j +@RequiredArgsConstructor +public class JwtServiceImpl implements JwtService { + + private final JwtUtil jwtUtil; + + @Override + public String extractUsername(final String token) { + log.info("**String, jwt service extract username from given token!*"); + return this.jwtUtil.extractUsername(token); + } + + @Override + public Date extractExpiration(final String token) { + log.info("**Date, jwt service extract expiration from given token!*"); + return this.jwtUtil.extractExpiration(token); + } + + @Override + public T extractClaims(final String token, final Function claimsResolver) { + log.info("**T, jwt service extract claims from given token and claimResolver Function!*"); + return this.jwtUtil.extractClaims(token, claimsResolver); + } + + @Override + public String generateToken(final UserDetails userDetails) { + log.info("**String, jwt service generate token from given userDetails!*"); + return this.jwtUtil.generateToken(userDetails); + } + + @Override + public Boolean validateToken(final String token, final UserDetails userDetails) { + log.info("**Boolean, jwt service validate token from given token and userDetails!*"); + return this.jwtUtil.validateToken(token, userDetails); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/jwt/util/JwtUtil.java b/proxy-client/src/main/java/com/selimhorri/app/jwt/util/JwtUtil.java index 5c5d9d16d..67ca9ac9f 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/jwt/util/JwtUtil.java +++ b/proxy-client/src/main/java/com/selimhorri/app/jwt/util/JwtUtil.java @@ -1,18 +1,18 @@ -package com.selimhorri.app.jwt.util; - -import java.util.Date; -import java.util.function.Function; - -import org.springframework.security.core.userdetails.UserDetails; - -import io.jsonwebtoken.Claims; - -public interface JwtUtil { - - String extractUsername(final String token); - Date extractExpiration(final String token); - T extractClaims(final String token, final Function claimsResolver); - String generateToken(final UserDetails userDetails); - Boolean validateToken(final String token, final UserDetails userDetails); - -} +package com.selimhorri.app.jwt.util; + +import java.util.Date; +import java.util.function.Function; + +import org.springframework.security.core.userdetails.UserDetails; + +import io.jsonwebtoken.Claims; + +public interface JwtUtil { + + String extractUsername(final String token); + Date extractExpiration(final String token); + T extractClaims(final String token, final Function claimsResolver); + String generateToken(final UserDetails userDetails); + Boolean validateToken(final String token, final UserDetails userDetails); + +} diff --git a/proxy-client/src/main/java/com/selimhorri/app/jwt/util/impl/JwtUtilImpl.java b/proxy-client/src/main/java/com/selimhorri/app/jwt/util/impl/JwtUtilImpl.java index 71e2a0438..3d5dec6de 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/jwt/util/impl/JwtUtilImpl.java +++ b/proxy-client/src/main/java/com/selimhorri/app/jwt/util/impl/JwtUtilImpl.java @@ -1,82 +1,82 @@ -package com.selimhorri.app.jwt.util.impl; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Component; - -import com.selimhorri.app.jwt.util.JwtUtil; - -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; - -@Component -public class JwtUtilImpl implements JwtUtil { - - private static final String SECRET_KEY = "secret"; - - @Override - public String extractUsername(final String token) { - return this.extractClaims(token, Claims::getSubject); - } - - @Override - public Date extractExpiration(final String token) { - return this.extractClaims(token, Claims::getExpiration); - } - - @Override - public T extractClaims(final String token, Function claimsResolver) { - final Claims claims = this.extractAllClaims(token); - return claimsResolver.apply(claims); - } - - private Claims extractAllClaims(final String token) { - return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody(); - } - - private Boolean isTokenExpired(final String token) { - return this.extractExpiration(token).before(new Date()); - } - - @Override - public String generateToken(final UserDetails userDetails) { - final Map claims = new HashMap<>(); - return this.createToken(claims, userDetails.getUsername()); - } - - private String createToken(final Map claims, final String subject) { - return Jwts.builder() - .setClaims(claims) - .setSubject(subject) - .setIssuedAt(new Date(System.currentTimeMillis())) - .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) - .signWith(SignatureAlgorithm.HS256, SECRET_KEY) - .compact(); - } - - @Override - public Boolean validateToken(final String token, final UserDetails userDetails) { - final String username = this.extractUsername(token); - return ( - username.equals(userDetails.getUsername()) && !isTokenExpired(token) - ); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.jwt.util.impl; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +import com.selimhorri.app.jwt.util.JwtUtil; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +@Component +public class JwtUtilImpl implements JwtUtil { + + private static final String SECRET_KEY = "secret"; + + @Override + public String extractUsername(final String token) { + return this.extractClaims(token, Claims::getSubject); + } + + @Override + public Date extractExpiration(final String token) { + return this.extractClaims(token, Claims::getExpiration); + } + + @Override + public T extractClaims(final String token, Function claimsResolver) { + final Claims claims = this.extractAllClaims(token); + return claimsResolver.apply(claims); + } + + private Claims extractAllClaims(final String token) { + return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody(); + } + + private Boolean isTokenExpired(final String token) { + return this.extractExpiration(token).before(new Date()); + } + + @Override + public String generateToken(final UserDetails userDetails) { + final Map claims = new HashMap<>(); + return this.createToken(claims, userDetails.getUsername()); + } + + private String createToken(final Map claims, final String subject) { + return Jwts.builder() + .setClaims(claims) + .setSubject(subject) + .setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) + .signWith(SignatureAlgorithm.HS256, SECRET_KEY) + .compact(); + } + + @Override + public Boolean validateToken(final String token, final UserDetails userDetails) { + final String username = this.extractUsername(token); + return ( + username.equals(userDetails.getUsername()) && !isTokenExpired(token) + ); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/java/com/selimhorri/app/security/SecurityConfig.java b/proxy-client/src/main/java/com/selimhorri/app/security/SecurityConfig.java index c7ab79291..40e9f7b6d 100644 --- a/proxy-client/src/main/java/com/selimhorri/app/security/SecurityConfig.java +++ b/proxy-client/src/main/java/com/selimhorri/app/security/SecurityConfig.java @@ -1,83 +1,83 @@ -package com.selimhorri.app.security; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -import com.selimhorri.app.business.user.model.RoleBasedAuthority; -import com.selimhorri.app.config.filter.JwtRequestFilter; - -import lombok.RequiredArgsConstructor; - -@Configuration -@EnableWebSecurity -@RequiredArgsConstructor -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - private final UserDetailsService userDetailsService; - private final PasswordEncoder passwordEncoder; - private final JwtRequestFilter jwtRequestFilter; - - @Override - protected void configure(final AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(this.userDetailsService) - .passwordEncoder(this.passwordEncoder); - } - - @Override - protected void configure(final HttpSecurity http) throws Exception { - http.cors().disable() - .csrf().disable() - .authorizeRequests() - .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() - .antMatchers("/", "index", "**/css/**", "**/js/**").permitAll() - .antMatchers("/api/authenticate/**").permitAll() - .antMatchers("/api/categories/**").permitAll() - .antMatchers("/api/products/**").permitAll() - .antMatchers("/api/**") - .hasAnyRole(RoleBasedAuthority.ROLE_USER.getRole(), - RoleBasedAuthority.ROLE_ADMIN.getRole()) - .antMatchers("/actuator/health/**", "/actuator/info/**") - .permitAll() - .antMatchers("/actuator/**") - .hasAnyRole(RoleBasedAuthority.ROLE_ADMIN.getRole()) - .anyRequest().authenticated() - .and() - .headers() - .frameOptions() - .sameOrigin() - .and() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .addFilterBefore(this.jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); - } - - @Bean - @Override - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import com.selimhorri.app.business.user.model.RoleBasedAuthority; +import com.selimhorri.app.config.filter.JwtRequestFilter; + +import lombok.RequiredArgsConstructor; + +@Configuration +@EnableWebSecurity +@RequiredArgsConstructor +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + private final UserDetailsService userDetailsService; + private final PasswordEncoder passwordEncoder; + private final JwtRequestFilter jwtRequestFilter; + + @Override + protected void configure(final AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(this.userDetailsService) + .passwordEncoder(this.passwordEncoder); + } + + @Override + protected void configure(final HttpSecurity http) throws Exception { + http.cors().disable() + .csrf().disable() + .authorizeRequests() + .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() + .antMatchers("/", "index", "**/css/**", "**/js/**").permitAll() + .antMatchers("/api/authenticate/**").permitAll() + .antMatchers("/api/categories/**").permitAll() + .antMatchers("/api/products/**").permitAll() + .antMatchers("/api/**") + .hasAnyRole(RoleBasedAuthority.ROLE_USER.getRole(), + RoleBasedAuthority.ROLE_ADMIN.getRole()) + .antMatchers("/actuator/health/**", "/actuator/info/**") + .permitAll() + .antMatchers("/actuator/**") + .hasAnyRole(RoleBasedAuthority.ROLE_ADMIN.getRole()) + .anyRequest().authenticated() + .and() + .headers() + .frameOptions() + .sameOrigin() + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .addFilterBefore(this.jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); + } + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + + +} + + + + + + + + + + diff --git a/proxy-client/src/main/resources/application-dev.yml b/proxy-client/src/main/resources/application-dev.yml index 651b1aef8..b577c93a4 100644 --- a/proxy-client/src/main/resources/application-dev.yml +++ b/proxy-client/src/main/resources/application-dev.yml @@ -1,25 +1,25 @@ - -server: - port: 8900 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8900 + +management: + endpoints: + web: + exposure: + include: "*" + +logging: + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/proxy-client/src/main/resources/application-prod.yml b/proxy-client/src/main/resources/application-prod.yml index d3b6eda75..cb71cf7c6 100644 --- a/proxy-client/src/main/resources/application-prod.yml +++ b/proxy-client/src/main/resources/application-prod.yml @@ -1,28 +1,28 @@ - -server: - port: 8900 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8900 + +management: + endpoints: + web: + exposure: + include: "*" + +logging: + file: + name: src/main/resources/script/prod_log.log + clean-history-on-start: false + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/proxy-client/src/main/resources/application-stage.yml b/proxy-client/src/main/resources/application-stage.yml index 62ab48bd3..18547761f 100644 --- a/proxy-client/src/main/resources/application-stage.yml +++ b/proxy-client/src/main/resources/application-stage.yml @@ -1,28 +1,28 @@ - -server: - port: 8900 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8900 + +management: + endpoints: + web: + exposure: + include: "*" + +logging: + file: + name: src/main/resources/script/stage_log.log + clean-history-on-start: true + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/proxy-client/src/main/resources/application.yml b/proxy-client/src/main/resources/application.yml index 3869e3030..70d90fc16 100644 --- a/proxy-client/src/main/resources/application.yml +++ b/proxy-client/src/main/resources/application.yml @@ -1,45 +1,45 @@ - -server: - servlet: - context-path: /app - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: PROXY-CLIENT - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - proxyService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - + +server: + servlet: + context-path: /app + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + config: + import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} + application: + name: PROXY-CLIENT + profiles: + active: + - dev + +resilience4j: + circuitbreaker: + instances: + proxyService: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + + + + + + + + diff --git a/proxy-client/src/test/java/com/selimhorri/app/ProxyClientApplicationTests.java b/proxy-client/src/test/java/com/selimhorri/app/ProxyClientApplicationTests.java index 1590d89e9..47d7749c5 100644 --- a/proxy-client/src/test/java/com/selimhorri/app/ProxyClientApplicationTests.java +++ b/proxy-client/src/test/java/com/selimhorri/app/ProxyClientApplicationTests.java @@ -1,10 +1,10 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ProxyClientApplicationTests { - - - -} +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ProxyClientApplicationTests { + + + +} diff --git a/service-discovery/.gitignore b/service-discovery/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/service-discovery/.gitignore +++ b/service-discovery/.gitignore @@ -1,33 +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/ +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/service-discovery/.mvn/wrapper/MavenWrapperDownloader.java b/service-discovery/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/service-discovery/.mvn/wrapper/MavenWrapperDownloader.java +++ b/service-discovery/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/service-discovery/.mvn/wrapper/maven-wrapper.properties b/service-discovery/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/service-discovery/.mvn/wrapper/maven-wrapper.properties +++ b/service-discovery/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/service-discovery/Dockerfile b/service-discovery/Dockerfile index 7562e96fa..1ac8fcbc6 100644 --- a/service-discovery/Dockerfile +++ b/service-discovery/Dockerfile @@ -1,12 +1,12 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY service-discovery/ . -ADD service-discovery/target/service-discovery-v${PROJECT_VERSION}.jar service-discovery.jar -EXPOSE 8761 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "service-discovery.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +ENV SPRING_PROFILES_ACTIVE dev +COPY service-discovery/ . +ADD service-discovery/target/service-discovery-v${PROJECT_VERSION}.jar service-discovery.jar +EXPOSE 8761 +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "service-discovery.jar"] + + diff --git a/service-discovery/compose.yml b/service-discovery/compose.yml index 21226ed39..340e3f25b 100644 --- a/service-discovery/compose.yml +++ b/service-discovery/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - service-discovery-container: - image: selimhorri/service-discovery-ecommerce-boot:0.1.0 - ports: - - 8761:8761 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + service-discovery-container: + image: selimhorri/service-discovery-ecommerce-boot:0.1.0 + ports: + - 8761:8761 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/service-discovery/mvnw b/service-discovery/mvnw index a16b5431b..4c1c42714 100755 --- a/service-discovery/mvnw +++ b/service-discovery/mvnw @@ -1,310 +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 "$@" +#!/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/service-discovery/mvnw.cmd b/service-discovery/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/service-discovery/mvnw.cmd +++ b/service-discovery/mvnw.cmd @@ -1,182 +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% +@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/service-discovery/pom.xml b/service-discovery/pom.xml index 36c4d624c..970495806 100644 --- a/service-discovery/pom.xml +++ b/service-discovery/pom.xml @@ -1,56 +1,56 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - service-discovery - service-discovery - Spring Boot microservice! - jar - - - 11 - 2020.0.4 - - - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-server - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - ${project.artifactId}-v${project.version} - - - - - - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + service-discovery + service-discovery + Spring Boot microservice! + jar + + + 11 + 2020.0.4 + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-server + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + ${project.artifactId}-v${project.version} + + + + + + + + diff --git a/service-discovery/src/main/java/com/selimhorri/app/ServiceDiscoveryApplication.java b/service-discovery/src/main/java/com/selimhorri/app/ServiceDiscoveryApplication.java index 3841a1974..1ef59568b 100644 --- a/service-discovery/src/main/java/com/selimhorri/app/ServiceDiscoveryApplication.java +++ b/service-discovery/src/main/java/com/selimhorri/app/ServiceDiscoveryApplication.java @@ -1,24 +1,24 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; - -@SpringBootApplication -@EnableEurekaServer -public class ServiceDiscoveryApplication { - - public static void main(String[] args) { - SpringApplication.run(ServiceDiscoveryApplication.class, args); - } - - - -} - - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; + +@SpringBootApplication +@EnableEurekaServer +public class ServiceDiscoveryApplication { + + public static void main(String[] args) { + SpringApplication.run(ServiceDiscoveryApplication.class, args); + } + + + +} + + + + + + + diff --git a/service-discovery/src/main/resources/application-dev.yml b/service-discovery/src/main/resources/application-dev.yml index bbe032cc2..c15f335d7 100644 --- a/service-discovery/src/main/resources/application-dev.yml +++ b/service-discovery/src/main/resources/application-dev.yml @@ -1,30 +1,30 @@ - -server: - port: 8761 - -management: - endpoints: - web: - exposure: - include: "*" - -eureka: - client: - register-with-eureka: false - fetch-registry: false - -logging: - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - + +server: + port: 8761 + +management: + endpoints: + web: + exposure: + include: "*" + +eureka: + client: + register-with-eureka: false + fetch-registry: false + +logging: + level: + org: + hibernate: + SQL: INFO + springframework: + web: INFO + data: INFO + boot: + autoconfigure: + data: + rest: INFO + jpa: INFO + orm: INFO + diff --git a/service-discovery/src/main/resources/application-prod.yml b/service-discovery/src/main/resources/application-prod.yml index ac077b7f2..b9b7aa587 100644 --- a/service-discovery/src/main/resources/application-prod.yml +++ b/service-discovery/src/main/resources/application-prod.yml @@ -1,28 +1,28 @@ - -server: - port: 8761 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - + +server: + port: 8761 + +management: + endpoints: + web: + exposure: + include: "*" + +logging: + file: + name: src/main/resources/script/prod_log.log + clean-history-on-start: false + level: + org: + hibernate: + SQL: INFO + springframework: + web: INFO + data: INFO + boot: + autoconfigure: + data: + rest: INFO + jpa: INFO + orm: INFO + diff --git a/service-discovery/src/main/resources/application-stage.yml b/service-discovery/src/main/resources/application-stage.yml index 0772be198..3e082b8b5 100644 --- a/service-discovery/src/main/resources/application-stage.yml +++ b/service-discovery/src/main/resources/application-stage.yml @@ -1,28 +1,28 @@ - -server: - port: 8761 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8761 + +management: + endpoints: + web: + exposure: + include: "*" + +logging: + file: + name: src/main/resources/script/stage_log.log + clean-history-on-start: true + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/service-discovery/src/main/resources/application.yml b/service-discovery/src/main/resources/application.yml index 8af09cce0..688fc278c 100644 --- a/service-discovery/src/main/resources/application.yml +++ b/service-discovery/src/main/resources/application.yml @@ -1,39 +1,39 @@ - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - application: - name: SERVICE-DISCOVERY - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - serviceDiscovery: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + application: + name: SERVICE-DISCOVERY + profiles: + active: + - dev + +resilience4j: + circuitbreaker: + instances: + serviceDiscovery: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + + + + + + + + diff --git a/service-discovery/src/test/java/com/selimhorri/app/ServiceDiscoveryApplicationTests.java b/service-discovery/src/test/java/com/selimhorri/app/ServiceDiscoveryApplicationTests.java index 0705d4f2e..ee7c54fec 100644 --- a/service-discovery/src/test/java/com/selimhorri/app/ServiceDiscoveryApplicationTests.java +++ b/service-discovery/src/test/java/com/selimhorri/app/ServiceDiscoveryApplicationTests.java @@ -1,16 +1,16 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ServiceDiscoveryApplicationTests { - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ServiceDiscoveryApplicationTests { + + + +} + + + + + + diff --git a/shipping-service/.gitignore b/shipping-service/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/shipping-service/.gitignore +++ b/shipping-service/.gitignore @@ -1,33 +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/ +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/shipping-service/.mvn/wrapper/MavenWrapperDownloader.java b/shipping-service/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/shipping-service/.mvn/wrapper/MavenWrapperDownloader.java +++ b/shipping-service/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/shipping-service/.mvn/wrapper/maven-wrapper.properties b/shipping-service/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/shipping-service/.mvn/wrapper/maven-wrapper.properties +++ b/shipping-service/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/shipping-service/Dockerfile b/shipping-service/Dockerfile index c678aef31..fddc2f6cd 100644 --- a/shipping-service/Dockerfile +++ b/shipping-service/Dockerfile @@ -1,12 +1,12 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY shipping-service/ . -ADD shipping-service/target/shipping-service-v${PROJECT_VERSION}.jar shipping-service.jar -EXPOSE 8600 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "shipping-service.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +ENV SPRING_PROFILES_ACTIVE dev +COPY shipping-service/ . +ADD shipping-service/target/shipping-service-v${PROJECT_VERSION}.jar shipping-service.jar +EXPOSE 8600 +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "shipping-service.jar"] + + diff --git a/shipping-service/compose.yml b/shipping-service/compose.yml index 81878a33a..f50bb8e8e 100644 --- a/shipping-service/compose.yml +++ b/shipping-service/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - shipping-service-container: - image: selimhorri/shipping-service-ecommerce-boot:0.1.0 - ports: - - 8600:8600 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + shipping-service-container: + image: selimhorri/shipping-service-ecommerce-boot:0.1.0 + ports: + - 8600:8600 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/shipping-service/mvnw b/shipping-service/mvnw index a16b5431b..4c1c42714 100755 --- a/shipping-service/mvnw +++ b/shipping-service/mvnw @@ -1,310 +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 "$@" +#!/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/shipping-service/mvnw.cmd b/shipping-service/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/shipping-service/mvnw.cmd +++ b/shipping-service/mvnw.cmd @@ -1,182 +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% +@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/shipping-service/pom.xml b/shipping-service/pom.xml index 9e1c2d509..f0b871146 100644 --- a/shipping-service/pom.xml +++ b/shipping-service/pom.xml @@ -1,120 +1,120 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - shipping-service - shipping-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + shipping-service + shipping-service + Spring Boot microservice + jar + + + 11 + 2020.0.4 + 1.16.0 + + + + + org.springframework.cloud + spring-cloud-starter + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + com.h2database + h2 + runtime + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.testcontainers + mysql + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + ${project.artifactId}-v${project.version} + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/ShippingServiceApplication.java b/shipping-service/src/main/java/com/selimhorri/app/ShippingServiceApplication.java index b2ec46e90..be2c3ca13 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/ShippingServiceApplication.java +++ b/shipping-service/src/main/java/com/selimhorri/app/ShippingServiceApplication.java @@ -1,35 +1,35 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -@EnableEurekaClient -public class ShippingServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(ShippingServiceApplication.class, args); - } - - - -} - -@RestController -class ShippingController { - - @GetMapping - public String msg() { - return "shipping controller responding!!"; - } - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@EnableEurekaClient +public class ShippingServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(ShippingServiceApplication.class, args); + } + + + +} + +@RestController +class ShippingController { + + @GetMapping + public String msg() { + return "shipping controller responding!!"; + } + +} + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/shipping-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java index a6346459a..27021f387 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ b/shipping-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.client; + +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class ClientConfig { + + @LoadBalanced + @Bean + public RestTemplate restTemplateBean() { + return new RestTemplate(); + } + + + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/shipping-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java index 7e0f843ea..f7de593a7 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ b/shipping-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java @@ -1,31 +1,31 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.mapper; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; + +@Configuration +public class MapperConfig { + + @Bean + public ObjectMapper objectMapperBean() { + return new JsonMapper() + .enable(SerializationFeature.INDENT_OUTPUT); + } + + + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/shipping-service/src/main/java/com/selimhorri/app/constant/AppConstant.java index 40f49bbc3..2e051c4b5 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ b/shipping-service/src/main/java/com/selimhorri/app/constant/AppConstant.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - +package com.selimhorri.app.constant; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public abstract class AppConstant { + + public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; + public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public abstract class DiscoveredDomainsApi { + + public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; + public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; + + public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; + public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; + + public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; + public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; + + public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; + public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; + + public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; + public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; + + public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; + public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; + + } + + + +} + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/shipping-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java index 3f4dd17fa..b19764968 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ b/shipping-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.time.Instant; + +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@MappedSuperclass +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@Data +abstract public class AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @CreatedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "created_at") + private Instant createdAt; + + @LastModifiedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "updated_at") + private Instant updatedAt; + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/domain/OrderItem.java b/shipping-service/src/main/java/com/selimhorri/app/domain/OrderItem.java index 2c0047ea1..dcae49965 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/domain/OrderItem.java +++ b/shipping-service/src/main/java/com/selimhorri/app/domain/OrderItem.java @@ -1,52 +1,52 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.Table; - -import com.selimhorri.app.domain.id.OrderItemId; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "order_items") -@IdClass(OrderItemId.class) -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -@Data -@Builder -public final class OrderItem extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @Column(name = "product_id", nullable = false, updatable = false) - private Integer productId; - - @Id - @Column(name = "order_id", nullable = false, updatable = false) - private Integer orderId; - - @Column(name = "ordered_quantity") - private Integer orderedQuantity; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.Table; + +import com.selimhorri.app.domain.id.OrderItemId; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "order_items") +@IdClass(OrderItemId.class) +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Data +@Builder +public final class OrderItem extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "product_id", nullable = false, updatable = false) + private Integer productId; + + @Id + @Column(name = "order_id", nullable = false, updatable = false) + private Integer orderId; + + @Column(name = "ordered_quantity") + private Integer orderedQuantity; + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/domain/id/OrderItemId.java b/shipping-service/src/main/java/com/selimhorri/app/domain/id/OrderItemId.java index 0ca595a39..dbd171539 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/domain/id/OrderItemId.java +++ b/shipping-service/src/main/java/com/selimhorri/app/domain/id/OrderItemId.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.domain.id; - -import java.io.Serializable; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -public class OrderItemId implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private Integer orderId; - -} - - - - - - - - - - - +package com.selimhorri.app.domain.id; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class OrderItemId implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer productId; + private Integer orderId; + +} + + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/dto/OrderDto.java b/shipping-service/src/main/java/com/selimhorri/app/dto/OrderDto.java index c9d6eb02e..893e12f43 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/dto/OrderDto.java +++ b/shipping-service/src/main/java/com/selimhorri/app/dto/OrderDto.java @@ -1,55 +1,55 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.Set; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - - @JsonInclude(Include.NON_NULL) - private Set orderItemDtos; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Set; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer orderId; + + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) + private LocalDateTime orderDate; + private String orderDesc; + private Double orderFee; + + @JsonInclude(Include.NON_NULL) + private Set orderItemDtos; + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/dto/OrderItemDto.java b/shipping-service/src/main/java/com/selimhorri/app/dto/OrderItemDto.java index 10a838903..560b6b298 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/dto/OrderItemDto.java +++ b/shipping-service/src/main/java/com/selimhorri/app/dto/OrderItemDto.java @@ -1,44 +1,44 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderItemDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer productId; - private Integer orderId; - private Integer orderedQuantity; - - @JsonProperty("product") - @JsonInclude(Include.NON_NULL) - private ProductDto productDto; - - @JsonProperty("order") - @JsonInclude(Include.NON_NULL) - private OrderDto orderDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrderItemDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer productId; + private Integer orderId; + private Integer orderedQuantity; + + @JsonProperty("product") + @JsonInclude(Include.NON_NULL) + private ProductDto productDto; + + @JsonProperty("order") + @JsonInclude(Include.NON_NULL) + private OrderDto orderDto; + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/dto/ProductDto.java b/shipping-service/src/main/java/com/selimhorri/app/dto/ProductDto.java index 34c42ca36..931c095b1 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/dto/ProductDto.java +++ b/shipping-service/src/main/java/com/selimhorri/app/dto/ProductDto.java @@ -1,41 +1,41 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonInclude(Include.NON_NULL) - private Set orderItemDtos; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ProductDto implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer productId; + private String productTitle; + private String imageUrl; + private String sku; + private Double priceUnit; + private Integer quantity; + + @JsonInclude(Include.NON_NULL) + private Set orderItemDtos; + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/shipping-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java index 920a621ab..ecee30efd 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ b/shipping-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java @@ -1,28 +1,28 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - +package com.selimhorri.app.dto.response.collection; + +import java.util.Collection; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class DtoCollectionResponse { + + private Collection collection; + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/shipping-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java index 4951fef4d..fb8c5fa70 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ b/shipping-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java @@ -1,71 +1,71 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - IllegalStateException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.selimhorri.app.exception.payload.ExceptionMsg; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@ControllerAdvice +@Slf4j +@RequiredArgsConstructor +public class ApiExceptionHandler { + + @ExceptionHandler(value = { + MethodArgumentNotValidException.class, + HttpMessageNotReadableException.class, + }) + public ResponseEntity handleValidationException(final T e) { + + log.info("**ApiExceptionHandler controller, handle validation exception*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + @ExceptionHandler(value = { + IllegalStateException.class, + }) + public ResponseEntity handleApiRequestException(final T e) { + + log.info("**ApiExceptionHandler controller, handle API request*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("#### " + e.getMessage() + "! ####") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/shipping-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java index 274842143..77429c9d1 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ b/shipping-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - +package com.selimhorri.app.exception.payload; + +import java.io.Serializable; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@AllArgsConstructor +@Data +@Builder +public final class ExceptionMsg implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ZonedDateTimeSerializer.class) + @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) + private final ZonedDateTime timestamp; + + @JsonInclude(value = Include.NON_NULL) + private Throwable throwable; + private final HttpStatus httpStatus; + private final String msg; + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderItemNotFoundException.java b/shipping-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderItemNotFoundException.java index 2aeb243b0..96b08b745 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderItemNotFoundException.java +++ b/shipping-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderItemNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class OrderItemNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public OrderItemNotFoundException() { - super(); - } - - public OrderItemNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public OrderItemNotFoundException(String message) { - super(message); - } - - public OrderItemNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class OrderItemNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public OrderItemNotFoundException() { + super(); + } + + public OrderItemNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public OrderItemNotFoundException(String message) { + super(message); + } + + public OrderItemNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/helper/OrderItemMappingHelper.java b/shipping-service/src/main/java/com/selimhorri/app/helper/OrderItemMappingHelper.java index 28a579855..eb43bff2d 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/helper/OrderItemMappingHelper.java +++ b/shipping-service/src/main/java/com/selimhorri/app/helper/OrderItemMappingHelper.java @@ -1,46 +1,46 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.OrderItem; -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.OrderItemDto; -import com.selimhorri.app.dto.ProductDto; - -public interface OrderItemMappingHelper { - - public static OrderItemDto map(final OrderItem orderItem) { - return OrderItemDto.builder() - .productId(orderItem.getProductId()) - .orderId(orderItem.getOrderId()) - .orderedQuantity(orderItem.getOrderedQuantity()) - .productDto( - ProductDto.builder() - .productId(orderItem.getProductId()) - .build()) - .orderDto( - OrderDto.builder() - .orderId(orderItem.getOrderId()) - .build()) - .build(); - } - - public static OrderItem map(final OrderItemDto orderItemDto) { - return OrderItem.builder() - .productId(orderItemDto.getProductId()) - .orderId(orderItemDto.getOrderId()) - .orderedQuantity(orderItemDto.getOrderedQuantity()) - .build(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.OrderItem; +import com.selimhorri.app.dto.OrderDto; +import com.selimhorri.app.dto.OrderItemDto; +import com.selimhorri.app.dto.ProductDto; + +public interface OrderItemMappingHelper { + + public static OrderItemDto map(final OrderItem orderItem) { + return OrderItemDto.builder() + .productId(orderItem.getProductId()) + .orderId(orderItem.getOrderId()) + .orderedQuantity(orderItem.getOrderedQuantity()) + .productDto( + ProductDto.builder() + .productId(orderItem.getProductId()) + .build()) + .orderDto( + OrderDto.builder() + .orderId(orderItem.getOrderId()) + .build()) + .build(); + } + + public static OrderItem map(final OrderItemDto orderItemDto) { + return OrderItem.builder() + .productId(orderItemDto.getProductId()) + .orderId(orderItemDto.getOrderId()) + .orderedQuantity(orderItemDto.getOrderedQuantity()) + .build(); + } + + + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/repository/OrderItemRepository.java b/shipping-service/src/main/java/com/selimhorri/app/repository/OrderItemRepository.java index 9c58b1205..f476be222 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/repository/OrderItemRepository.java +++ b/shipping-service/src/main/java/com/selimhorri/app/repository/OrderItemRepository.java @@ -1,12 +1,12 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.OrderItem; -import com.selimhorri.app.domain.id.OrderItemId; - -public interface OrderItemRepository extends JpaRepository { - - - -} +package com.selimhorri.app.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.OrderItem; +import com.selimhorri.app.domain.id.OrderItemId; + +public interface OrderItemRepository extends JpaRepository { + + + +} diff --git a/shipping-service/src/main/java/com/selimhorri/app/resource/OrderItemResource.java b/shipping-service/src/main/java/com/selimhorri/app/resource/OrderItemResource.java index 74a232b32..d07f7dc87 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/resource/OrderItemResource.java +++ b/shipping-service/src/main/java/com/selimhorri/app/resource/OrderItemResource.java @@ -1,105 +1,105 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.domain.id.OrderItemId; -import com.selimhorri.app.dto.OrderItemDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.OrderItemService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/shippings") -@Slf4j -@RequiredArgsConstructor -public class OrderItemResource { - - private final OrderItemService orderItemService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** OrderItemDto List, controller; fetch all orderItems *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.orderItemService.findAll())); - } - - @GetMapping("/{orderId}/{productId}") - public ResponseEntity findById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId) { - log.info("*** OrderItemDto, resource; fetch orderItem by id *"); - return ResponseEntity.ok(this.orderItemService.findById( - new OrderItemId(Integer.parseInt(orderId), Integer.parseInt(productId)))); - } - - @GetMapping("/find") - public ResponseEntity findById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemId orderItemId) { - log.info("*** OrderItemDto, resource; fetch orderItem by id *"); - return ResponseEntity.ok(this.orderItemService.findById(orderItemId)); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemDto orderItemDto) { - log.info("*** OrderItemDto, resource; save orderItem *"); - return ResponseEntity.ok(this.orderItemService.save(orderItemDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemDto orderItemDto) { - log.info("*** OrderItemDto, resource; update orderItem *"); - return ResponseEntity.ok(this.orderItemService.update(orderItemDto)); - } - - @DeleteMapping("/{orderId}/{productId}") - public ResponseEntity deleteById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId) { - log.info("*** Boolean, resource; delete orderItem by id *"); - this.orderItemService.deleteById(new OrderItemId(Integer.parseInt(orderId), Integer.parseInt(productId))); - return ResponseEntity.ok(true); - } - - @DeleteMapping("/delete") - public ResponseEntity deleteById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemId orderItemId) { - log.info("*** Boolean, resource; delete orderItem by id *"); - this.orderItemService.deleteById(orderItemId); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.domain.id.OrderItemId; +import com.selimhorri.app.dto.OrderItemDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.OrderItemService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("/api/shippings") +@Slf4j +@RequiredArgsConstructor +public class OrderItemResource { + + private final OrderItemService orderItemService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** OrderItemDto List, controller; fetch all orderItems *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.orderItemService.findAll())); + } + + @GetMapping("/{orderId}/{productId}") + public ResponseEntity findById( + @PathVariable("orderId") final String orderId, + @PathVariable("productId") final String productId) { + log.info("*** OrderItemDto, resource; fetch orderItem by id *"); + return ResponseEntity.ok(this.orderItemService.findById( + new OrderItemId(Integer.parseInt(orderId), Integer.parseInt(productId)))); + } + + @GetMapping("/find") + public ResponseEntity findById( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderItemId orderItemId) { + log.info("*** OrderItemDto, resource; fetch orderItem by id *"); + return ResponseEntity.ok(this.orderItemService.findById(orderItemId)); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderItemDto orderItemDto) { + log.info("*** OrderItemDto, resource; save orderItem *"); + return ResponseEntity.ok(this.orderItemService.save(orderItemDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderItemDto orderItemDto) { + log.info("*** OrderItemDto, resource; update orderItem *"); + return ResponseEntity.ok(this.orderItemService.update(orderItemDto)); + } + + @DeleteMapping("/{orderId}/{productId}") + public ResponseEntity deleteById( + @PathVariable("orderId") final String orderId, + @PathVariable("productId") final String productId) { + log.info("*** Boolean, resource; delete orderItem by id *"); + this.orderItemService.deleteById(new OrderItemId(Integer.parseInt(orderId), Integer.parseInt(productId))); + return ResponseEntity.ok(true); + } + + @DeleteMapping("/delete") + public ResponseEntity deleteById( + @RequestBody + @NotNull(message = "Input must not be NULL") + @Valid final OrderItemId orderItemId) { + log.info("*** Boolean, resource; delete orderItem by id *"); + this.orderItemService.deleteById(orderItemId); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/selimhorri/app/service/OrderItemService.java b/shipping-service/src/main/java/com/selimhorri/app/service/OrderItemService.java index 43bb825fd..e3dfe41b9 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/service/OrderItemService.java +++ b/shipping-service/src/main/java/com/selimhorri/app/service/OrderItemService.java @@ -1,16 +1,16 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.domain.id.OrderItemId; -import com.selimhorri.app.dto.OrderItemDto; - -public interface OrderItemService { - - List findAll(); - OrderItemDto findById(final OrderItemId orderItemId); - OrderItemDto save(final OrderItemDto orderItemDto); - OrderItemDto update(final OrderItemDto orderItemDto); - void deleteById(final OrderItemId orderItemId); - -} +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.domain.id.OrderItemId; +import com.selimhorri.app.dto.OrderItemDto; + +public interface OrderItemService { + + List findAll(); + OrderItemDto findById(final OrderItemId orderItemId); + OrderItemDto save(final OrderItemDto orderItemDto); + OrderItemDto update(final OrderItemDto orderItemDto); + void deleteById(final OrderItemId orderItemId); + +} diff --git a/shipping-service/src/main/java/com/selimhorri/app/service/impl/OrderItemServiceImpl.java b/shipping-service/src/main/java/com/selimhorri/app/service/impl/OrderItemServiceImpl.java index 8a6605ad9..10f1e1e18 100644 --- a/shipping-service/src/main/java/com/selimhorri/app/service/impl/OrderItemServiceImpl.java +++ b/shipping-service/src/main/java/com/selimhorri/app/service/impl/OrderItemServiceImpl.java @@ -1,96 +1,96 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.domain.id.OrderItemId; -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.OrderItemDto; -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.exception.wrapper.OrderItemNotFoundException; -import com.selimhorri.app.helper.OrderItemMappingHelper; -import com.selimhorri.app.repository.OrderItemRepository; -import com.selimhorri.app.service.OrderItemService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class OrderItemServiceImpl implements OrderItemService { - - private final OrderItemRepository orderItemRepository; - private final RestTemplate restTemplate; - - @Override - public List findAll() { - log.info("*** OrderItemDto List, service; fetch all orderItems *"); - return this.orderItemRepository.findAll() - .stream() - .map(OrderItemMappingHelper::map) - .map(o -> { - o.setProductDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .PRODUCT_SERVICE_API_URL + "/" + o.getProductDto().getProductId(), ProductDto.class)); - o.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .ORDER_SERVICE_API_URL + "/" + o.getOrderDto().getOrderId(), OrderDto.class)); - return o; - }) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public OrderItemDto findById(final OrderItemId orderItemId) { - log.info("*** OrderItemDto, service; fetch orderItem by id *"); - return this.orderItemRepository.findById(null) - .map(OrderItemMappingHelper::map) - .map(o -> { - o.setProductDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .PRODUCT_SERVICE_API_URL + "/" + o.getProductDto().getProductId(), ProductDto.class)); - o.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .ORDER_SERVICE_API_URL + "/" + o.getOrderDto().getOrderId(), OrderDto.class)); - return o; - }) - .orElseThrow(() -> new OrderItemNotFoundException(String.format("OrderItem with id: %s not found", orderItemId))); - } - - @Override - public OrderItemDto save(final OrderItemDto orderItemDto) { - log.info("*** OrderItemDto, service; save orderItem *"); - return OrderItemMappingHelper.map(this.orderItemRepository - .save(OrderItemMappingHelper.map(orderItemDto))); - } - - @Override - public OrderItemDto update(final OrderItemDto orderItemDto) { - log.info("*** OrderItemDto, service; update orderItem *"); - return OrderItemMappingHelper.map(this.orderItemRepository - .save(OrderItemMappingHelper.map(orderItemDto))); - } - - @Override - public void deleteById(final OrderItemId orderItemId) { - log.info("*** Void, service; delete orderItem by id *"); - this.orderItemRepository.deleteById(orderItemId); - } - - - -} - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.selimhorri.app.constant.AppConstant; +import com.selimhorri.app.domain.id.OrderItemId; +import com.selimhorri.app.dto.OrderDto; +import com.selimhorri.app.dto.OrderItemDto; +import com.selimhorri.app.dto.ProductDto; +import com.selimhorri.app.exception.wrapper.OrderItemNotFoundException; +import com.selimhorri.app.helper.OrderItemMappingHelper; +import com.selimhorri.app.repository.OrderItemRepository; +import com.selimhorri.app.service.OrderItemService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class OrderItemServiceImpl implements OrderItemService { + + private final OrderItemRepository orderItemRepository; + private final RestTemplate restTemplate; + + @Override + public List findAll() { + log.info("*** OrderItemDto List, service; fetch all orderItems *"); + return this.orderItemRepository.findAll() + .stream() + .map(OrderItemMappingHelper::map) + .map(o -> { + o.setProductDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi + .PRODUCT_SERVICE_API_URL + "/" + o.getProductDto().getProductId(), ProductDto.class)); + o.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi + .ORDER_SERVICE_API_URL + "/" + o.getOrderDto().getOrderId(), OrderDto.class)); + return o; + }) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public OrderItemDto findById(final OrderItemId orderItemId) { + log.info("*** OrderItemDto, service; fetch orderItem by id *"); + return this.orderItemRepository.findById(null) + .map(OrderItemMappingHelper::map) + .map(o -> { + o.setProductDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi + .PRODUCT_SERVICE_API_URL + "/" + o.getProductDto().getProductId(), ProductDto.class)); + o.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi + .ORDER_SERVICE_API_URL + "/" + o.getOrderDto().getOrderId(), OrderDto.class)); + return o; + }) + .orElseThrow(() -> new OrderItemNotFoundException(String.format("OrderItem with id: %s not found", orderItemId))); + } + + @Override + public OrderItemDto save(final OrderItemDto orderItemDto) { + log.info("*** OrderItemDto, service; save orderItem *"); + return OrderItemMappingHelper.map(this.orderItemRepository + .save(OrderItemMappingHelper.map(orderItemDto))); + } + + @Override + public OrderItemDto update(final OrderItemDto orderItemDto) { + log.info("*** OrderItemDto, service; update orderItem *"); + return OrderItemMappingHelper.map(this.orderItemRepository + .save(OrderItemMappingHelper.map(orderItemDto))); + } + + @Override + public void deleteById(final OrderItemId orderItemId) { + log.info("*** Void, service; delete orderItem by id *"); + this.orderItemRepository.deleteById(orderItemId); + } + + + +} + + + + + + + + + diff --git a/shipping-service/src/main/resources/application-dev.yml b/shipping-service/src/main/resources/application-dev.yml index 8b235b3d6..1c60cfae9 100644 --- a/shipping-service/src/main/resources/application-dev.yml +++ b/shipping-service/src/main/resources/application-dev.yml @@ -1,47 +1,47 @@ - -server: - port: 8600 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8600 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect + use_sql_comments: true + format_sql: true + h2: + console: + enabled: true + path: /h2-console + #flyway: + # baseline-on-migrate: true + # enabled: true + +logging: + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/shipping-service/src/main/resources/application-prod.yml b/shipping-service/src/main/resources/application-prod.yml index db3540ee5..24c23f755 100644 --- a/shipping-service/src/main/resources/application-prod.yml +++ b/shipping-service/src/main/resources/application-prod.yml @@ -1,43 +1,43 @@ - -server: - port: 8600 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - + +server: + port: 8600 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: false + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/prod_log.log + clean-history-on-start: false + level: + org: + hibernate: + SQL: INFO + springframework: + web: INFO + data: INFO + boot: + autoconfigure: + data: + rest: INFO + jpa: INFO + orm: INFO + diff --git a/shipping-service/src/main/resources/application-stage.yml b/shipping-service/src/main/resources/application-stage.yml index c57106df3..087e3ee4d 100644 --- a/shipping-service/src/main/resources/application-stage.yml +++ b/shipping-service/src/main/resources/application-stage.yml @@ -1,43 +1,43 @@ - -server: - port: 8600 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8600 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/stage_log.log + clean-history-on-start: true + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/shipping-service/src/main/resources/application.yml b/shipping-service/src/main/resources/application.yml index a7230f2ae..5f4be4217 100644 --- a/shipping-service/src/main/resources/application.yml +++ b/shipping-service/src/main/resources/application.yml @@ -1,45 +1,45 @@ - -server: - servlet: - context-path: /shipping-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: SHIPPING-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - shippingService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - + +server: + servlet: + context-path: /shipping-service + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + config: + import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} + application: + name: SHIPPING-SERVICE + profiles: + active: + - dev + +resilience4j: + circuitbreaker: + instances: + shippingService: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + + + + + + + + diff --git a/shipping-service/src/main/resources/db/migration/V1__create_order_items_table.sql b/shipping-service/src/main/resources/db/migration/V1__create_order_items_table.sql index 1054db4ba..7c700182e 100644 --- a/shipping-service/src/main/resources/db/migration/V1__create_order_items_table.sql +++ b/shipping-service/src/main/resources/db/migration/V1__create_order_items_table.sql @@ -1,10 +1,10 @@ - -CREATE TABLE order_items ( - product_id INT(11) NOT NULL, - order_id INT(11) NOT NULL, - ordered_quantity INT(11), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP, - PRIMARY KEY (product_id, order_id) -); - + +CREATE TABLE order_items ( + product_id INT(11) NOT NULL, + order_id INT(11) NOT NULL, + ordered_quantity INT(11), + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP, + PRIMARY KEY (product_id, order_id) +); + diff --git a/shipping-service/src/main/resources/db/migration/V2__insert_order_items_table.sql b/shipping-service/src/main/resources/db/migration/V2__insert_order_items_table.sql index c3c5fb3cb..f1a6e6d2a 100644 --- a/shipping-service/src/main/resources/db/migration/V2__insert_order_items_table.sql +++ b/shipping-service/src/main/resources/db/migration/V2__insert_order_items_table.sql @@ -1,8 +1,8 @@ - -INSERT INTO order_items -(product_id, order_id, ordered_quantity) VALUES -(1, 1, 2), -(1, 2, 1), -(2, 1, 1), -(2, 2, 1); - + +INSERT INTO order_items +(product_id, order_id, ordered_quantity) VALUES +(1, 1, 2), +(1, 2, 1), +(2, 1, 1), +(2, 2, 1); + diff --git a/shipping-service/src/test/java/com/selimhorri/app/ShippingServiceApplicationTests.java b/shipping-service/src/test/java/com/selimhorri/app/ShippingServiceApplicationTests.java index 6d89e46f0..a9d4e37b5 100644 --- a/shipping-service/src/test/java/com/selimhorri/app/ShippingServiceApplicationTests.java +++ b/shipping-service/src/test/java/com/selimhorri/app/ShippingServiceApplicationTests.java @@ -1,16 +1,16 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ShippingServiceApplicationTests { - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ShippingServiceApplicationTests { + + + +} + + + + + + diff --git a/src/test/java/com/selimhorri/app/EcommerceMicroserviceBackendApplicationTests.java b/src/test/java/com/selimhorri/app/EcommerceMicroserviceBackendApplicationTests.java index 2b5ee5b1a..452fca4d5 100644 --- a/src/test/java/com/selimhorri/app/EcommerceMicroserviceBackendApplicationTests.java +++ b/src/test/java/com/selimhorri/app/EcommerceMicroserviceBackendApplicationTests.java @@ -1,10 +1,10 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class EcommerceMicroserviceBackendApplicationTests { - - - -} +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class EcommerceMicroserviceBackendApplicationTests { + + + +} diff --git a/user-service/.gitignore b/user-service/.gitignore index 549e00a2a..7bc4bf79e 100644 --- a/user-service/.gitignore +++ b/user-service/.gitignore @@ -1,33 +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/ +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/user-service/.mvn/wrapper/MavenWrapperDownloader.java b/user-service/.mvn/wrapper/MavenWrapperDownloader.java index e76d1f324..ecf77ce35 100644 --- a/user-service/.mvn/wrapper/MavenWrapperDownloader.java +++ b/user-service/.mvn/wrapper/MavenWrapperDownloader.java @@ -1,117 +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(); - } - -} +/* + * 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/user-service/.mvn/wrapper/maven-wrapper.properties b/user-service/.mvn/wrapper/maven-wrapper.properties index a9f1ef87b..7c9d0da42 100644 --- a/user-service/.mvn/wrapper/maven-wrapper.properties +++ b/user-service/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +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 +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/user-service/Dockerfile b/user-service/Dockerfile index fdc109e11..efa479f7d 100644 --- a/user-service/Dockerfile +++ b/user-service/Dockerfile @@ -1,12 +1,12 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY user-service/ . -ADD user-service/target/user-service-v${PROJECT_VERSION}.jar user-service.jar -EXPOSE 8700 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "user-service.jar"] - - + +FROM openjdk:11 +ARG PROJECT_VERSION=0.1.0 +RUN mkdir -p /home/app +WORKDIR /home/app +ENV SPRING_PROFILES_ACTIVE dev +COPY user-service/ . +ADD user-service/target/user-service-v${PROJECT_VERSION}.jar user-service.jar +EXPOSE 8700 +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "user-service.jar"] + + diff --git a/user-service/compose.yml b/user-service/compose.yml index 18c0f49a0..852204260 100644 --- a/user-service/compose.yml +++ b/user-service/compose.yml @@ -1,12 +1,12 @@ - -version: '3' -services: - user-service-container: - image: selimhorri/user-service-ecommerce-boot:0.1.0 - ports: - - 8700:8700 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - + +version: '3' +services: + user-service-container: + image: selimhorri/user-service-ecommerce-boot:0.1.0 + ports: + - 8700:8700 + environment: + - SPRING_PROFILES_ACTIVE=dev + + + diff --git a/user-service/mvnw b/user-service/mvnw index a16b5431b..4c1c42714 100755 --- a/user-service/mvnw +++ b/user-service/mvnw @@ -1,310 +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 "$@" +#!/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/user-service/mvnw.cmd b/user-service/mvnw.cmd index c8d43372c..66db70c15 100644 --- a/user-service/mvnw.cmd +++ b/user-service/mvnw.cmd @@ -1,182 +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% +@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/user-service/pom.xml b/user-service/pom.xml index 28bed9bd3..91cb40d81 100644 --- a/user-service/pom.xml +++ b/user-service/pom.xml @@ -1,118 +1,118 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - user-service - user-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - + + + + 4.0.0 + + com.selimhorri + ecommerce-microservice-backend + 0.1.0 + + user-service + user-service + Spring Boot microservice + jar + + + 11 + 2020.0.4 + 1.16.0 + + + + + org.springframework.cloud + spring-cloud-starter + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + com.h2database + h2 + runtime + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.testcontainers + mysql + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + ${project.artifactId}-v${project.version} + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/UserServiceApplication.java b/user-service/src/main/java/com/selimhorri/app/UserServiceApplication.java index ba262a9da..a26cbf129 100644 --- a/user-service/src/main/java/com/selimhorri/app/UserServiceApplication.java +++ b/user-service/src/main/java/com/selimhorri/app/UserServiceApplication.java @@ -1,23 +1,23 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -public class UserServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(UserServiceApplication.class, args); - } - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; + +@SpringBootApplication +@EnableEurekaClient +public class UserServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(UserServiceApplication.class, args); + } + + + +} + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/user-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java index a6346459a..27021f387 100644 --- a/user-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ b/user-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java @@ -1,29 +1,29 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.client; + +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class ClientConfig { + + @LoadBalanced + @Bean + public RestTemplate restTemplateBean() { + return new RestTemplate(); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/user-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java index 7e0f843ea..f7de593a7 100644 --- a/user-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ b/user-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java @@ -1,31 +1,31 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.config.mapper; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; + +@Configuration +public class MapperConfig { + + @Bean + public ObjectMapper objectMapperBean() { + return new JsonMapper() + .enable(SerializationFeature.INDENT_OUTPUT); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/user-service/src/main/java/com/selimhorri/app/constant/AppConstant.java index 40f49bbc3..2e051c4b5 100644 --- a/user-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ b/user-service/src/main/java/com/selimhorri/app/constant/AppConstant.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - +package com.selimhorri.app.constant; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public abstract class AppConstant { + + public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; + public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public abstract class DiscoveredDomainsApi { + + public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; + public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; + + public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; + public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; + + public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; + public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; + + public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; + public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; + + public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; + public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; + + public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; + public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; + + } + + + +} + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/user-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java index 3f4dd17fa..b19764968 100644 --- a/user-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ b/user-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java @@ -1,48 +1,48 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.time.Instant; + +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@MappedSuperclass +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@Data +abstract public class AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @CreatedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "created_at") + private Instant createdAt; + + @LastModifiedDate + @JsonFormat(shape = Shape.STRING) + @Column(name = "updated_at") + private Instant updatedAt; + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/domain/Address.java b/user-service/src/main/java/com/selimhorri/app/domain/Address.java index 66bb217c8..ce9b354f6 100644 --- a/user-service/src/main/java/com/selimhorri/app/domain/Address.java +++ b/user-service/src/main/java/com/selimhorri/app/domain/Address.java @@ -1,58 +1,58 @@ -package com.selimhorri.app.domain; - -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.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "address") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"user"}) -@Data -@Builder -public final class Address extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "address_id", unique = true, nullable = false, updatable = false) - private Integer addressId; - - @Column(name = "full_address", unique = true) - private String fullAddress; - - @Column(name = "postal_code") - private String postalCode; - - private String city; - - @ManyToOne - @JoinColumn(name = "user_id") - private User user; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +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.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "address") +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true, exclude = {"user"}) +@Data +@Builder +public final class Address extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "address_id", unique = true, nullable = false, updatable = false) + private Integer addressId; + + @Column(name = "full_address", unique = true) + private String fullAddress; + + @Column(name = "postal_code") + private String postalCode; + + private String city; + + @ManyToOne + @JoinColumn(name = "user_id") + private User user; + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/domain/Credential.java b/user-service/src/main/java/com/selimhorri/app/domain/Credential.java index 440690fcc..6bf002160 100644 --- a/user-service/src/main/java/com/selimhorri/app/domain/Credential.java +++ b/user-service/src/main/java/com/selimhorri/app/domain/Credential.java @@ -1,81 +1,81 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "credentials") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"user", "verificationTokens"}) -@Data -@Builder -public final class Credential extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "credential_id", unique = true, nullable = false, updatable = false) - private Integer credentialId; - - @Column(unique = true) - private String username; - - private String password; - - @Enumerated(EnumType.STRING) - @Column(name = "role") - private RoleBasedAuthority roleBasedAuthority; - - @Column(name = "is_enabled") - private Boolean isEnabled; - - @Column(name = "is_account_non_expired") - private Boolean isAccountNonExpired; - - @Column(name = "is_account_non_locked") - private Boolean isAccountNonLocked; - - @Column(name = "is_credentials_non_expired") - private Boolean isCredentialsNonExpired; - - @JsonIgnore - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id", nullable = false) - private User user; - - @JsonIgnore - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "credential") - private Set verificationTokens; - -} - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "credentials") +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true, exclude = {"user", "verificationTokens"}) +@Data +@Builder +public final class Credential extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "credential_id", unique = true, nullable = false, updatable = false) + private Integer credentialId; + + @Column(unique = true) + private String username; + + private String password; + + @Enumerated(EnumType.STRING) + @Column(name = "role") + private RoleBasedAuthority roleBasedAuthority; + + @Column(name = "is_enabled") + private Boolean isEnabled; + + @Column(name = "is_account_non_expired") + private Boolean isAccountNonExpired; + + @Column(name = "is_account_non_locked") + private Boolean isAccountNonLocked; + + @Column(name = "is_credentials_non_expired") + private Boolean isCredentialsNonExpired; + + @JsonIgnore + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @JsonIgnore + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "credential") + private Set verificationTokens; + +} + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/domain/RoleBasedAuthority.java b/user-service/src/main/java/com/selimhorri/app/domain/RoleBasedAuthority.java index e3ebcf5f8..f5b61d682 100644 --- a/user-service/src/main/java/com/selimhorri/app/domain/RoleBasedAuthority.java +++ b/user-service/src/main/java/com/selimhorri/app/domain/RoleBasedAuthority.java @@ -1,15 +1,15 @@ -package com.selimhorri.app.domain; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum RoleBasedAuthority { - - ROLE_USER("USER"), - ROLE_ADMIN("ADMIN"); - - private final String role; - -} +package com.selimhorri.app.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum RoleBasedAuthority { + + ROLE_USER("USER"), + ROLE_ADMIN("ADMIN"); + + private final String role; + +} diff --git a/user-service/src/main/java/com/selimhorri/app/domain/User.java b/user-service/src/main/java/com/selimhorri/app/domain/User.java index b5383b0d3..bab00f3e1 100644 --- a/user-service/src/main/java/com/selimhorri/app/domain/User.java +++ b/user-service/src/main/java/com/selimhorri/app/domain/User.java @@ -1,73 +1,73 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.validation.constraints.Email; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "users") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"addresses", "credential"}) -@Data -@Builder -public final class User extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "user_id", unique = true, nullable = false, updatable = false) - private Integer userId; - - @Column(name = "first_name") - private String firstName; - - @Column(name = "last_name") - private String lastName; - - @Column(name = "image_url") - private String imageUrl; - - @Email(message = "*Input must be in Email format!**") - private String email; - - private String phone; - - @JsonIgnore - @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.LAZY) - private Set
addresses; - - @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user") - private Credential credential; - -} - - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.validation.constraints.Email; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "users") +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true, exclude = {"addresses", "credential"}) +@Data +@Builder +public final class User extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_id", unique = true, nullable = false, updatable = false) + private Integer userId; + + @Column(name = "first_name") + private String firstName; + + @Column(name = "last_name") + private String lastName; + + @Column(name = "image_url") + private String imageUrl; + + @Email(message = "*Input must be in Email format!**") + private String email; + + private String phone; + + @JsonIgnore + @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.LAZY) + private Set
addresses; + + @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user") + private Credential credential; + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/domain/VerificationToken.java b/user-service/src/main/java/com/selimhorri/app/domain/VerificationToken.java index 0d366be4d..e8c075073 100644 --- a/user-service/src/main/java/com/selimhorri/app/domain/VerificationToken.java +++ b/user-service/src/main/java/com/selimhorri/app/domain/VerificationToken.java @@ -1,65 +1,65 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.LocalDate; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "verification_tokens") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"credential"}) -@Data -@Builder -public final class VerificationToken extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "verification_token_id", unique = true, nullable = false, updatable = false) - private Integer verificationTokenId; - - @Column(name = "verif_token") - private String token; - - @JsonFormat(pattern = AppConstant.LOCAL_DATE_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_FORMAT) - @Column(name = "expire_date") - private LocalDate expireDate; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "credential_id") - private Credential credential; - -} - - - - - - - - - +package com.selimhorri.app.domain; + +import java.io.Serializable; +import java.time.LocalDate; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "verification_tokens") +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true, exclude = {"credential"}) +@Data +@Builder +public final class VerificationToken extends AbstractMappedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "verification_token_id", unique = true, nullable = false, updatable = false) + private Integer verificationTokenId; + + @Column(name = "verif_token") + private String token; + + @JsonFormat(pattern = AppConstant.LOCAL_DATE_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_FORMAT) + @Column(name = "expire_date") + private LocalDate expireDate; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "credential_id") + private Credential credential; + +} + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/dto/AddressDto.java b/user-service/src/main/java/com/selimhorri/app/dto/AddressDto.java index f31f6beeb..a866738c1 100644 --- a/user-service/src/main/java/com/selimhorri/app/dto/AddressDto.java +++ b/user-service/src/main/java/com/selimhorri/app/dto/AddressDto.java @@ -1,44 +1,44 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AddressDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer addressId; - - private String fullAddress; - - private String postalCode; - - private String city; - - @JsonProperty("user") - @JsonInclude(value = Include.NON_NULL) - private UserDto userDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class AddressDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer addressId; + + private String fullAddress; + + private String postalCode; + + private String city; + + @JsonProperty("user") + @JsonInclude(value = Include.NON_NULL) + private UserDto userDto; + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/dto/CredentialDto.java b/user-service/src/main/java/com/selimhorri/app/dto/CredentialDto.java index f985389b9..bf919952f 100644 --- a/user-service/src/main/java/com/selimhorri/app/dto/CredentialDto.java +++ b/user-service/src/main/java/com/selimhorri/app/dto/CredentialDto.java @@ -1,57 +1,57 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.domain.RoleBasedAuthority; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CredentialDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer credentialId; - - private String username; - - private String password; - - private RoleBasedAuthority roleBasedAuthority; - - private Boolean isEnabled; - - private Boolean isAccountNonExpired; - - private Boolean isAccountNonLocked; - - private Boolean isCredentialsNonExpired; - - @JsonProperty("user") - @JsonInclude(value = Include.NON_NULL) - private UserDto userDto; - - @JsonInclude(value = Include.NON_NULL) - private Set verificationTokenDtos; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.selimhorri.app.domain.RoleBasedAuthority; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CredentialDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer credentialId; + + private String username; + + private String password; + + private RoleBasedAuthority roleBasedAuthority; + + private Boolean isEnabled; + + private Boolean isAccountNonExpired; + + private Boolean isAccountNonLocked; + + private Boolean isCredentialsNonExpired; + + @JsonProperty("user") + @JsonInclude(value = Include.NON_NULL) + private UserDto userDto; + + @JsonInclude(value = Include.NON_NULL) + private Set verificationTokenDtos; + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/dto/UserDto.java b/user-service/src/main/java/com/selimhorri/app/dto/UserDto.java index 3987d6d3e..aaf6a1f6a 100644 --- a/user-service/src/main/java/com/selimhorri/app/dto/UserDto.java +++ b/user-service/src/main/java/com/selimhorri/app/dto/UserDto.java @@ -1,52 +1,52 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer userId; - - private String firstName; - - private String lastName; - - private String imageUrl; - - private String email; - - private String phone; - - @JsonInclude(value = Include.NON_NULL) - private Set addressDtos; - - @JsonProperty("credential") - @JsonInclude(value = Include.NON_NULL) - private CredentialDto credentialDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.util.Set; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class UserDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer userId; + + private String firstName; + + private String lastName; + + private String imageUrl; + + private String email; + + private String phone; + + @JsonInclude(value = Include.NON_NULL) + private Set addressDtos; + + @JsonProperty("credential") + @JsonInclude(value = Include.NON_NULL) + private CredentialDto credentialDto; + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/dto/VerificationTokenDto.java b/user-service/src/main/java/com/selimhorri/app/dto/VerificationTokenDto.java index cfc158570..cb56dab8f 100644 --- a/user-service/src/main/java/com/selimhorri/app/dto/VerificationTokenDto.java +++ b/user-service/src/main/java/com/selimhorri/app/dto/VerificationTokenDto.java @@ -1,50 +1,50 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDate; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class VerificationTokenDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer verificationTokenId; - - private String token; - - @JsonFormat(pattern = AppConstant.LOCAL_DATE_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_FORMAT) - private LocalDate expireDate; - - @JsonProperty("credential") - @JsonInclude(value = Include.NON_NULL) - private CredentialDto credentialDto; - -} - - - - - - - - - - +package com.selimhorri.app.dto; + +import java.io.Serializable; +import java.time.LocalDate; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class VerificationTokenDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer verificationTokenId; + + private String token; + + @JsonFormat(pattern = AppConstant.LOCAL_DATE_FORMAT, shape = Shape.STRING) + @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_FORMAT) + private LocalDate expireDate; + + @JsonProperty("credential") + @JsonInclude(value = Include.NON_NULL) + private CredentialDto credentialDto; + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/user-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java index 920a621ab..ecee30efd 100644 --- a/user-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ b/user-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java @@ -1,28 +1,28 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - +package com.selimhorri.app.dto.response.collection; + +import java.util.Collection; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class DtoCollectionResponse { + + private Collection collection; + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/user-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java index 938729f2c..48b12f331 100644 --- a/user-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ b/user-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java @@ -1,78 +1,78 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.AddressNotFoundException; -import com.selimhorri.app.exception.wrapper.CredentialNotFoundException; -import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; -import com.selimhorri.app.exception.wrapper.VerificationTokenNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - UserObjectNotFoundException.class, - CredentialNotFoundException.class, - VerificationTokenNotFoundException.class, - AddressNotFoundException.class - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.selimhorri.app.exception.payload.ExceptionMsg; +import com.selimhorri.app.exception.wrapper.AddressNotFoundException; +import com.selimhorri.app.exception.wrapper.CredentialNotFoundException; +import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; +import com.selimhorri.app.exception.wrapper.VerificationTokenNotFoundException; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@ControllerAdvice +@Slf4j +@RequiredArgsConstructor +public class ApiExceptionHandler { + + @ExceptionHandler(value = { + MethodArgumentNotValidException.class, + HttpMessageNotReadableException.class + }) + public ResponseEntity handleValidationException(final T e) { + + log.info("**ApiExceptionHandler controller, handle validation exception*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + @ExceptionHandler(value = { + UserObjectNotFoundException.class, + CredentialNotFoundException.class, + VerificationTokenNotFoundException.class, + AddressNotFoundException.class + }) + public ResponseEntity handleApiRequestException(final T e) { + + log.info("**ApiExceptionHandler controller, handle API request*\n"); + final var badRequest = HttpStatus.BAD_REQUEST; + + return new ResponseEntity<>( + ExceptionMsg.builder() + .msg("#### " + e.getMessage() + "! ####") + .httpStatus(badRequest) + .timestamp(ZonedDateTime + .now(ZoneId.systemDefault())) + .build(), badRequest); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/user-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java index 8536da91a..a031689a9 100644 --- a/user-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ b/user-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java @@ -1,47 +1,47 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - - private final HttpStatus httpStatus; - - private final String msg; - -} - - - - - - - - - - +package com.selimhorri.app.exception.payload; + +import java.io.Serializable; +import java.time.ZonedDateTime; + +import org.springframework.http.HttpStatus; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonFormat.Shape; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.selimhorri.app.constant.AppConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@AllArgsConstructor +@Data +@Builder +public final class ExceptionMsg implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) + private final ZonedDateTime timestamp; + + @JsonInclude(value = Include.NON_NULL) + private Throwable throwable; + + private final HttpStatus httpStatus; + + private final String msg; + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/AddressNotFoundException.java b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/AddressNotFoundException.java index 2a6367010..89dcca363 100644 --- a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/AddressNotFoundException.java +++ b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/AddressNotFoundException.java @@ -1,25 +1,25 @@ -package com.selimhorri.app.exception.wrapper; - -public class AddressNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public AddressNotFoundException() { - super(); - } - - public AddressNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public AddressNotFoundException(String message) { - super(message); - } - - public AddressNotFoundException(Throwable cause) { - super(cause); - } - - - -} +package com.selimhorri.app.exception.wrapper; + +public class AddressNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public AddressNotFoundException() { + super(); + } + + public AddressNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public AddressNotFoundException(String message) { + super(message); + } + + public AddressNotFoundException(Throwable cause) { + super(cause); + } + + + +} diff --git a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java index 74095fbc2..284fa381b 100644 --- a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java +++ b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class CredentialNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public CredentialNotFoundException() { - super(); - } - - public CredentialNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public CredentialNotFoundException(String message) { - super(message); - } - - public CredentialNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class CredentialNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public CredentialNotFoundException() { + super(); + } + + public CredentialNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public CredentialNotFoundException(String message) { + super(message); + } + + public CredentialNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java index 35505a066..199e193ff 100644 --- a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java +++ b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class UserObjectNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public UserObjectNotFoundException() { - super(); - } - - public UserObjectNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public UserObjectNotFoundException(String message) { - super(message); - } - - public UserObjectNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class UserObjectNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public UserObjectNotFoundException() { + super(); + } + + public UserObjectNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public UserObjectNotFoundException(String message) { + super(message); + } + + public UserObjectNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java index 869117fa3..eaa184f77 100644 --- a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java +++ b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java @@ -1,35 +1,35 @@ -package com.selimhorri.app.exception.wrapper; - -public class VerificationTokenNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public VerificationTokenNotFoundException() { - super(); - } - - public VerificationTokenNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public VerificationTokenNotFoundException(String message) { - super(message); - } - - public VerificationTokenNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.exception.wrapper; + +public class VerificationTokenNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public VerificationTokenNotFoundException() { + super(); + } + + public VerificationTokenNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public VerificationTokenNotFoundException(String message) { + super(message); + } + + public VerificationTokenNotFoundException(Throwable cause) { + super(cause); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/helper/AddressMappingHelper.java b/user-service/src/main/java/com/selimhorri/app/helper/AddressMappingHelper.java index aee5ee05e..523f94e5a 100644 --- a/user-service/src/main/java/com/selimhorri/app/helper/AddressMappingHelper.java +++ b/user-service/src/main/java/com/selimhorri/app/helper/AddressMappingHelper.java @@ -1,58 +1,58 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Address; -import com.selimhorri.app.domain.User; -import com.selimhorri.app.dto.AddressDto; -import com.selimhorri.app.dto.UserDto; - -public interface AddressMappingHelper { - - public static AddressDto map(final Address address) { - return AddressDto.builder() - .addressId(address.getAddressId()) - .fullAddress(address.getFullAddress()) - .postalCode(address.getPostalCode()) - .city(address.getCity()) - .userDto( - UserDto.builder() - .userId(address.getUser().getUserId()) - .firstName(address.getUser().getFirstName()) - .lastName(address.getUser().getLastName()) - .imageUrl(address.getUser().getImageUrl()) - .email(address.getUser().getEmail()) - .phone(address.getUser().getPhone()) - .build()) - .build(); - } - - public static Address map(final AddressDto addressDto) { - return Address.builder() - .addressId(addressDto.getAddressId()) - .fullAddress(addressDto.getFullAddress()) - .postalCode(addressDto.getPostalCode()) - .city(addressDto.getCity()) - .user( - User.builder() - .userId(addressDto.getUserDto().getUserId()) - .firstName(addressDto.getUserDto().getFirstName()) - .lastName(addressDto.getUserDto().getLastName()) - .imageUrl(addressDto.getUserDto().getImageUrl()) - .email(addressDto.getUserDto().getEmail()) - .phone(addressDto.getUserDto().getPhone()) - .build()) - .build(); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.Address; +import com.selimhorri.app.domain.User; +import com.selimhorri.app.dto.AddressDto; +import com.selimhorri.app.dto.UserDto; + +public interface AddressMappingHelper { + + public static AddressDto map(final Address address) { + return AddressDto.builder() + .addressId(address.getAddressId()) + .fullAddress(address.getFullAddress()) + .postalCode(address.getPostalCode()) + .city(address.getCity()) + .userDto( + UserDto.builder() + .userId(address.getUser().getUserId()) + .firstName(address.getUser().getFirstName()) + .lastName(address.getUser().getLastName()) + .imageUrl(address.getUser().getImageUrl()) + .email(address.getUser().getEmail()) + .phone(address.getUser().getPhone()) + .build()) + .build(); + } + + public static Address map(final AddressDto addressDto) { + return Address.builder() + .addressId(addressDto.getAddressId()) + .fullAddress(addressDto.getFullAddress()) + .postalCode(addressDto.getPostalCode()) + .city(addressDto.getCity()) + .user( + User.builder() + .userId(addressDto.getUserDto().getUserId()) + .firstName(addressDto.getUserDto().getFirstName()) + .lastName(addressDto.getUserDto().getLastName()) + .imageUrl(addressDto.getUserDto().getImageUrl()) + .email(addressDto.getUserDto().getEmail()) + .phone(addressDto.getUserDto().getPhone()) + .build()) + .build(); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/helper/CredentialMappingHelper.java b/user-service/src/main/java/com/selimhorri/app/helper/CredentialMappingHelper.java index d22c7d5b6..d349f98e2 100644 --- a/user-service/src/main/java/com/selimhorri/app/helper/CredentialMappingHelper.java +++ b/user-service/src/main/java/com/selimhorri/app/helper/CredentialMappingHelper.java @@ -1,62 +1,62 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Credential; -import com.selimhorri.app.domain.User; -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.dto.UserDto; - -public interface CredentialMappingHelper { - - public static CredentialDto map(final Credential credential) { - return CredentialDto.builder() - .credentialId(credential.getCredentialId()) - .username(credential.getUsername()) - .password(credential.getPassword()) - .roleBasedAuthority(credential.getRoleBasedAuthority()) - .isEnabled(credential.getIsEnabled()) - .isAccountNonExpired(credential.getIsAccountNonExpired()) - .isAccountNonLocked(credential.getIsAccountNonLocked()) - .isCredentialsNonExpired(credential.getIsCredentialsNonExpired()) - .userDto( - UserDto.builder() - .userId(credential.getUser().getUserId()) - .firstName(credential.getUser().getFirstName()) - .lastName(credential.getUser().getLastName()) - .imageUrl(credential.getUser().getImageUrl()) - .email(credential.getUser().getEmail()) - .phone(credential.getUser().getPhone()) - .build()) - .build(); - } - - public static Credential map(final CredentialDto credentialDto) { - return Credential.builder() - .credentialId(credentialDto.getCredentialId()) - .username(credentialDto.getUsername()) - .password(credentialDto.getPassword()) - .roleBasedAuthority(credentialDto.getRoleBasedAuthority()) - .isEnabled(credentialDto.getIsEnabled()) - .isAccountNonExpired(credentialDto.getIsAccountNonExpired()) - .isAccountNonLocked(credentialDto.getIsAccountNonLocked()) - .isCredentialsNonExpired(credentialDto.getIsCredentialsNonExpired()) - .user( - User.builder() - .userId(credentialDto.getUserDto().getUserId()) - .firstName(credentialDto.getUserDto().getFirstName()) - .lastName(credentialDto.getUserDto().getLastName()) - .imageUrl(credentialDto.getUserDto().getImageUrl()) - .email(credentialDto.getUserDto().getEmail()) - .phone(credentialDto.getUserDto().getPhone()) - .build()) - .build(); - } - - - -} - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.Credential; +import com.selimhorri.app.domain.User; +import com.selimhorri.app.dto.CredentialDto; +import com.selimhorri.app.dto.UserDto; + +public interface CredentialMappingHelper { + + public static CredentialDto map(final Credential credential) { + return CredentialDto.builder() + .credentialId(credential.getCredentialId()) + .username(credential.getUsername()) + .password(credential.getPassword()) + .roleBasedAuthority(credential.getRoleBasedAuthority()) + .isEnabled(credential.getIsEnabled()) + .isAccountNonExpired(credential.getIsAccountNonExpired()) + .isAccountNonLocked(credential.getIsAccountNonLocked()) + .isCredentialsNonExpired(credential.getIsCredentialsNonExpired()) + .userDto( + UserDto.builder() + .userId(credential.getUser().getUserId()) + .firstName(credential.getUser().getFirstName()) + .lastName(credential.getUser().getLastName()) + .imageUrl(credential.getUser().getImageUrl()) + .email(credential.getUser().getEmail()) + .phone(credential.getUser().getPhone()) + .build()) + .build(); + } + + public static Credential map(final CredentialDto credentialDto) { + return Credential.builder() + .credentialId(credentialDto.getCredentialId()) + .username(credentialDto.getUsername()) + .password(credentialDto.getPassword()) + .roleBasedAuthority(credentialDto.getRoleBasedAuthority()) + .isEnabled(credentialDto.getIsEnabled()) + .isAccountNonExpired(credentialDto.getIsAccountNonExpired()) + .isAccountNonLocked(credentialDto.getIsAccountNonLocked()) + .isCredentialsNonExpired(credentialDto.getIsCredentialsNonExpired()) + .user( + User.builder() + .userId(credentialDto.getUserDto().getUserId()) + .firstName(credentialDto.getUserDto().getFirstName()) + .lastName(credentialDto.getUserDto().getLastName()) + .imageUrl(credentialDto.getUserDto().getImageUrl()) + .email(credentialDto.getUserDto().getEmail()) + .phone(credentialDto.getUserDto().getPhone()) + .build()) + .build(); + } + + + +} + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/helper/UserMappingHelper.java b/user-service/src/main/java/com/selimhorri/app/helper/UserMappingHelper.java index 1bb02c2d6..96c93f96a 100644 --- a/user-service/src/main/java/com/selimhorri/app/helper/UserMappingHelper.java +++ b/user-service/src/main/java/com/selimhorri/app/helper/UserMappingHelper.java @@ -1,62 +1,62 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Credential; -import com.selimhorri.app.domain.User; -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.dto.UserDto; - -public interface UserMappingHelper { - - public static UserDto map(final User user) { - return UserDto.builder() - .userId(user.getUserId()) - .firstName(user.getFirstName()) - .lastName(user.getLastName()) - .imageUrl(user.getImageUrl()) - .email(user.getEmail()) - .phone(user.getPhone()) - .credentialDto( - CredentialDto.builder() - .credentialId(user.getCredential().getCredentialId()) - .username(user.getCredential().getUsername()) - .password(user.getCredential().getPassword()) - .roleBasedAuthority(user.getCredential().getRoleBasedAuthority()) - .isEnabled(user.getCredential().getIsEnabled()) - .isAccountNonExpired(user.getCredential().getIsAccountNonExpired()) - .isAccountNonLocked(user.getCredential().getIsAccountNonLocked()) - .isCredentialsNonExpired(user.getCredential().getIsCredentialsNonExpired()) - .build()) - .build(); - } - - public static User map(final UserDto userDto) { - return User.builder() - .userId(userDto.getUserId()) - .firstName(userDto.getFirstName()) - .lastName(userDto.getLastName()) - .imageUrl(userDto.getImageUrl()) - .email(userDto.getEmail()) - .phone(userDto.getPhone()) - .credential( - Credential.builder() - .credentialId(userDto.getCredentialDto().getCredentialId()) - .username(userDto.getCredentialDto().getUsername()) - .password(userDto.getCredentialDto().getPassword()) - .roleBasedAuthority(userDto.getCredentialDto().getRoleBasedAuthority()) - .isEnabled(userDto.getCredentialDto().getIsEnabled()) - .isAccountNonExpired(userDto.getCredentialDto().getIsAccountNonExpired()) - .isAccountNonLocked(userDto.getCredentialDto().getIsAccountNonLocked()) - .isCredentialsNonExpired(userDto.getCredentialDto().getIsCredentialsNonExpired()) - .build()) - .build(); - } - - - -} - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.Credential; +import com.selimhorri.app.domain.User; +import com.selimhorri.app.dto.CredentialDto; +import com.selimhorri.app.dto.UserDto; + +public interface UserMappingHelper { + + public static UserDto map(final User user) { + return UserDto.builder() + .userId(user.getUserId()) + .firstName(user.getFirstName()) + .lastName(user.getLastName()) + .imageUrl(user.getImageUrl()) + .email(user.getEmail()) + .phone(user.getPhone()) + .credentialDto( + CredentialDto.builder() + .credentialId(user.getCredential().getCredentialId()) + .username(user.getCredential().getUsername()) + .password(user.getCredential().getPassword()) + .roleBasedAuthority(user.getCredential().getRoleBasedAuthority()) + .isEnabled(user.getCredential().getIsEnabled()) + .isAccountNonExpired(user.getCredential().getIsAccountNonExpired()) + .isAccountNonLocked(user.getCredential().getIsAccountNonLocked()) + .isCredentialsNonExpired(user.getCredential().getIsCredentialsNonExpired()) + .build()) + .build(); + } + + public static User map(final UserDto userDto) { + return User.builder() + .userId(userDto.getUserId()) + .firstName(userDto.getFirstName()) + .lastName(userDto.getLastName()) + .imageUrl(userDto.getImageUrl()) + .email(userDto.getEmail()) + .phone(userDto.getPhone()) + .credential( + Credential.builder() + .credentialId(userDto.getCredentialDto().getCredentialId()) + .username(userDto.getCredentialDto().getUsername()) + .password(userDto.getCredentialDto().getPassword()) + .roleBasedAuthority(userDto.getCredentialDto().getRoleBasedAuthority()) + .isEnabled(userDto.getCredentialDto().getIsEnabled()) + .isAccountNonExpired(userDto.getCredentialDto().getIsAccountNonExpired()) + .isAccountNonLocked(userDto.getCredentialDto().getIsAccountNonLocked()) + .isCredentialsNonExpired(userDto.getCredentialDto().getIsCredentialsNonExpired()) + .build()) + .build(); + } + + + +} + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/helper/VerificationTokenMappingHelper.java b/user-service/src/main/java/com/selimhorri/app/helper/VerificationTokenMappingHelper.java index dc070bc0a..2c106feee 100644 --- a/user-service/src/main/java/com/selimhorri/app/helper/VerificationTokenMappingHelper.java +++ b/user-service/src/main/java/com/selimhorri/app/helper/VerificationTokenMappingHelper.java @@ -1,56 +1,56 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Credential; -import com.selimhorri.app.domain.VerificationToken; -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.dto.VerificationTokenDto; - -public interface VerificationTokenMappingHelper { - - public static VerificationTokenDto map(final VerificationToken verificationToken) { - return VerificationTokenDto.builder() - .verificationTokenId(verificationToken.getVerificationTokenId()) - .token(verificationToken.getToken()) - .expireDate(verificationToken.getExpireDate()) - .credentialDto( - CredentialDto.builder() - .credentialId(verificationToken.getCredential().getCredentialId()) - .username(verificationToken.getCredential().getUsername()) - .password(verificationToken.getCredential().getPassword()) - .roleBasedAuthority(verificationToken.getCredential().getRoleBasedAuthority()) - .isEnabled(verificationToken.getCredential().getIsEnabled()) - .isAccountNonExpired(verificationToken.getCredential().getIsAccountNonExpired()) - .isAccountNonLocked(verificationToken.getCredential().getIsAccountNonLocked()) - .isCredentialsNonExpired(verificationToken.getCredential().getIsCredentialsNonExpired()) - .build()) - .build(); - } - - public static VerificationToken map(final VerificationTokenDto verificationTokenDto) { - return VerificationToken.builder() - .verificationTokenId(verificationTokenDto.getVerificationTokenId()) - .token(verificationTokenDto.getToken()) - .expireDate(verificationTokenDto.getExpireDate()) - .credential( - Credential.builder() - .credentialId(verificationTokenDto.getCredentialDto().getCredentialId()) - .username(verificationTokenDto.getCredentialDto().getUsername()) - .password(verificationTokenDto.getCredentialDto().getPassword()) - .roleBasedAuthority(verificationTokenDto.getCredentialDto().getRoleBasedAuthority()) - .isEnabled(verificationTokenDto.getCredentialDto().getIsEnabled()) - .isAccountNonExpired(verificationTokenDto.getCredentialDto().getIsAccountNonExpired()) - .isAccountNonLocked(verificationTokenDto.getCredentialDto().getIsAccountNonLocked()) - .isCredentialsNonExpired(verificationTokenDto.getCredentialDto().getIsCredentialsNonExpired()) - .build()) - .build(); - } - - - -} - - - - - - +package com.selimhorri.app.helper; + +import com.selimhorri.app.domain.Credential; +import com.selimhorri.app.domain.VerificationToken; +import com.selimhorri.app.dto.CredentialDto; +import com.selimhorri.app.dto.VerificationTokenDto; + +public interface VerificationTokenMappingHelper { + + public static VerificationTokenDto map(final VerificationToken verificationToken) { + return VerificationTokenDto.builder() + .verificationTokenId(verificationToken.getVerificationTokenId()) + .token(verificationToken.getToken()) + .expireDate(verificationToken.getExpireDate()) + .credentialDto( + CredentialDto.builder() + .credentialId(verificationToken.getCredential().getCredentialId()) + .username(verificationToken.getCredential().getUsername()) + .password(verificationToken.getCredential().getPassword()) + .roleBasedAuthority(verificationToken.getCredential().getRoleBasedAuthority()) + .isEnabled(verificationToken.getCredential().getIsEnabled()) + .isAccountNonExpired(verificationToken.getCredential().getIsAccountNonExpired()) + .isAccountNonLocked(verificationToken.getCredential().getIsAccountNonLocked()) + .isCredentialsNonExpired(verificationToken.getCredential().getIsCredentialsNonExpired()) + .build()) + .build(); + } + + public static VerificationToken map(final VerificationTokenDto verificationTokenDto) { + return VerificationToken.builder() + .verificationTokenId(verificationTokenDto.getVerificationTokenId()) + .token(verificationTokenDto.getToken()) + .expireDate(verificationTokenDto.getExpireDate()) + .credential( + Credential.builder() + .credentialId(verificationTokenDto.getCredentialDto().getCredentialId()) + .username(verificationTokenDto.getCredentialDto().getUsername()) + .password(verificationTokenDto.getCredentialDto().getPassword()) + .roleBasedAuthority(verificationTokenDto.getCredentialDto().getRoleBasedAuthority()) + .isEnabled(verificationTokenDto.getCredentialDto().getIsEnabled()) + .isAccountNonExpired(verificationTokenDto.getCredentialDto().getIsAccountNonExpired()) + .isAccountNonLocked(verificationTokenDto.getCredentialDto().getIsAccountNonLocked()) + .isCredentialsNonExpired(verificationTokenDto.getCredentialDto().getIsCredentialsNonExpired()) + .build()) + .build(); + } + + + +} + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/repository/AddressRepository.java b/user-service/src/main/java/com/selimhorri/app/repository/AddressRepository.java index 804082d0b..36e92489f 100644 --- a/user-service/src/main/java/com/selimhorri/app/repository/AddressRepository.java +++ b/user-service/src/main/java/com/selimhorri/app/repository/AddressRepository.java @@ -1,11 +1,11 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Address; - -public interface AddressRepository extends JpaRepository { - - - -} +package com.selimhorri.app.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.Address; + +public interface AddressRepository extends JpaRepository { + + + +} diff --git a/user-service/src/main/java/com/selimhorri/app/repository/CredentialRepository.java b/user-service/src/main/java/com/selimhorri/app/repository/CredentialRepository.java index 54b44dc9c..162151cbc 100644 --- a/user-service/src/main/java/com/selimhorri/app/repository/CredentialRepository.java +++ b/user-service/src/main/java/com/selimhorri/app/repository/CredentialRepository.java @@ -1,13 +1,13 @@ -package com.selimhorri.app.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Credential; - -public interface CredentialRepository extends JpaRepository { - - Optional findByUsername(final String username); - -} +package com.selimhorri.app.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.Credential; + +public interface CredentialRepository extends JpaRepository { + + Optional findByUsername(final String username); + +} diff --git a/user-service/src/main/java/com/selimhorri/app/repository/UserRepository.java b/user-service/src/main/java/com/selimhorri/app/repository/UserRepository.java index 5afd4610a..97b45d0cf 100644 --- a/user-service/src/main/java/com/selimhorri/app/repository/UserRepository.java +++ b/user-service/src/main/java/com/selimhorri/app/repository/UserRepository.java @@ -1,13 +1,13 @@ -package com.selimhorri.app.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.User; - -public interface UserRepository extends JpaRepository { - - Optional findByCredentialUsername(final String username); - -} +package com.selimhorri.app.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.User; + +public interface UserRepository extends JpaRepository { + + Optional findByCredentialUsername(final String username); + +} diff --git a/user-service/src/main/java/com/selimhorri/app/repository/VerificationTokenRepository.java b/user-service/src/main/java/com/selimhorri/app/repository/VerificationTokenRepository.java index 0612e8bd8..308c10bca 100644 --- a/user-service/src/main/java/com/selimhorri/app/repository/VerificationTokenRepository.java +++ b/user-service/src/main/java/com/selimhorri/app/repository/VerificationTokenRepository.java @@ -1,11 +1,11 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.VerificationToken; - -public interface VerificationTokenRepository extends JpaRepository { - - - -} +package com.selimhorri.app.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.selimhorri.app.domain.VerificationToken; + +public interface VerificationTokenRepository extends JpaRepository { + + + +} diff --git a/user-service/src/main/java/com/selimhorri/app/resource/AddressResource.java b/user-service/src/main/java/com/selimhorri/app/resource/AddressResource.java index 5edff63ab..7d367e916 100644 --- a/user-service/src/main/java/com/selimhorri/app/resource/AddressResource.java +++ b/user-service/src/main/java/com/selimhorri/app/resource/AddressResource.java @@ -1,95 +1,95 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.AddressDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.AddressService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping(value = {"/api/address"}) -@Slf4j -@RequiredArgsConstructor -public class AddressResource { - - private final AddressService addressService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** AddressDto List, controller; fetch all addresss *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.addressService.findAll())); - } - - @GetMapping("/{addressId}") - public ResponseEntity findById( - @PathVariable("addressId") - @NotBlank(message = "Input must not blank") - @Valid final String addressId) { - log.info("*** AddressDto, resource; fetch address by id *"); - return ResponseEntity.ok(this.addressService.findById(Integer.parseInt(addressId.strip()))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final AddressDto addressDto) { - log.info("*** AddressDto, resource; save address *"); - return ResponseEntity.ok(this.addressService.save(addressDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final AddressDto addressDto) { - log.info("*** AddressDto, resource; update address *"); - return ResponseEntity.ok(this.addressService.update(addressDto)); - } - - @PutMapping("/{addressId}") - public ResponseEntity update( - @PathVariable("addressId") - @NotBlank(message = "Input must not blank") final String addressId, - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final AddressDto addressDto) { - log.info("*** AddressDto, resource; update address with addressId *"); - return ResponseEntity.ok(this.addressService.update(Integer.parseInt(addressId.strip()), addressDto)); - } - - @DeleteMapping("/{addressId}") - public ResponseEntity deleteById(@PathVariable("addressId") @NotBlank(message = "Input must not blank") @Valid final String addressId) { - log.info("*** Boolean, resource; delete address by id *"); - this.addressService.deleteById(Integer.parseInt(addressId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.dto.AddressDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.AddressService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping(value = {"/api/address"}) +@Slf4j +@RequiredArgsConstructor +public class AddressResource { + + private final AddressService addressService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** AddressDto List, controller; fetch all addresss *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.addressService.findAll())); + } + + @GetMapping("/{addressId}") + public ResponseEntity findById( + @PathVariable("addressId") + @NotBlank(message = "Input must not blank") + @Valid final String addressId) { + log.info("*** AddressDto, resource; fetch address by id *"); + return ResponseEntity.ok(this.addressService.findById(Integer.parseInt(addressId.strip()))); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final AddressDto addressDto) { + log.info("*** AddressDto, resource; save address *"); + return ResponseEntity.ok(this.addressService.save(addressDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final AddressDto addressDto) { + log.info("*** AddressDto, resource; update address *"); + return ResponseEntity.ok(this.addressService.update(addressDto)); + } + + @PutMapping("/{addressId}") + public ResponseEntity update( + @PathVariable("addressId") + @NotBlank(message = "Input must not blank") final String addressId, + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final AddressDto addressDto) { + log.info("*** AddressDto, resource; update address with addressId *"); + return ResponseEntity.ok(this.addressService.update(Integer.parseInt(addressId.strip()), addressDto)); + } + + @DeleteMapping("/{addressId}") + public ResponseEntity deleteById(@PathVariable("addressId") @NotBlank(message = "Input must not blank") @Valid final String addressId) { + log.info("*** Boolean, resource; delete address by id *"); + this.addressService.deleteById(Integer.parseInt(addressId)); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/resource/CredentialResource.java b/user-service/src/main/java/com/selimhorri/app/resource/CredentialResource.java index cb8b516f6..3502b9dd6 100644 --- a/user-service/src/main/java/com/selimhorri/app/resource/CredentialResource.java +++ b/user-service/src/main/java/com/selimhorri/app/resource/CredentialResource.java @@ -1,107 +1,107 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.CredentialService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping(value = {"/api/credentials"}) -@Slf4j -@RequiredArgsConstructor -public class CredentialResource { - - private final CredentialService credentialService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** CredentialDto List, controller; fetch all credentials *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.credentialService.findAll())); - } - - @GetMapping("/{credentialId}") - public ResponseEntity findById( - @PathVariable("credentialId") - @NotBlank(message = "Input must not blank") - @Valid final String credentialId) { - log.info("*** CredentialDto, resource; fetch credential by id *"); - return ResponseEntity.ok(this.credentialService.findById(Integer.parseInt(credentialId.strip()))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final CredentialDto credentialDto) { - log.info("*** CredentialDto, resource; save credential *"); - return ResponseEntity.ok(this.credentialService.save(credentialDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final CredentialDto credentialDto) { - log.info("*** CredentialDto, resource; update credential *"); - return ResponseEntity.ok(this.credentialService.update(credentialDto)); - } - - @PutMapping("/{credentialId}") - public ResponseEntity update( - @PathVariable("credentialId") - @NotBlank(message = "Input must not blank") final String credentialId, - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final CredentialDto credentialDto) { - log.info("*** CredentialDto, resource; update credential with credentialId *"); - return ResponseEntity.ok(this.credentialService.update(Integer.parseInt(credentialId.strip()), credentialDto)); - } - - @DeleteMapping("/{credentialId}") - public ResponseEntity deleteById( - @PathVariable("credentialId") - @NotBlank(message = "Input must not blank") - @Valid final String credentialId) { - log.info("*** Boolean, resource; delete credential by id *"); - this.credentialService.deleteById(Integer.parseInt(credentialId)); - return ResponseEntity.ok(true); - } - - @GetMapping("/username/{username}") - public ResponseEntity findByUsername( - @PathVariable("username") - @NotBlank(message = "Input must not blank") - @Valid final String username) { - log.info("*** CredentialDto, resource; update credential with credentialId *"); - return ResponseEntity.ok(this.credentialService.findByUsername(username)); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.dto.CredentialDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.CredentialService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping(value = {"/api/credentials"}) +@Slf4j +@RequiredArgsConstructor +public class CredentialResource { + + private final CredentialService credentialService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** CredentialDto List, controller; fetch all credentials *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.credentialService.findAll())); + } + + @GetMapping("/{credentialId}") + public ResponseEntity findById( + @PathVariable("credentialId") + @NotBlank(message = "Input must not blank") + @Valid final String credentialId) { + log.info("*** CredentialDto, resource; fetch credential by id *"); + return ResponseEntity.ok(this.credentialService.findById(Integer.parseInt(credentialId.strip()))); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final CredentialDto credentialDto) { + log.info("*** CredentialDto, resource; save credential *"); + return ResponseEntity.ok(this.credentialService.save(credentialDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final CredentialDto credentialDto) { + log.info("*** CredentialDto, resource; update credential *"); + return ResponseEntity.ok(this.credentialService.update(credentialDto)); + } + + @PutMapping("/{credentialId}") + public ResponseEntity update( + @PathVariable("credentialId") + @NotBlank(message = "Input must not blank") final String credentialId, + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final CredentialDto credentialDto) { + log.info("*** CredentialDto, resource; update credential with credentialId *"); + return ResponseEntity.ok(this.credentialService.update(Integer.parseInt(credentialId.strip()), credentialDto)); + } + + @DeleteMapping("/{credentialId}") + public ResponseEntity deleteById( + @PathVariable("credentialId") + @NotBlank(message = "Input must not blank") + @Valid final String credentialId) { + log.info("*** Boolean, resource; delete credential by id *"); + this.credentialService.deleteById(Integer.parseInt(credentialId)); + return ResponseEntity.ok(true); + } + + @GetMapping("/username/{username}") + public ResponseEntity findByUsername( + @PathVariable("username") + @NotBlank(message = "Input must not blank") + @Valid final String username) { + log.info("*** CredentialDto, resource; update credential with credentialId *"); + return ResponseEntity.ok(this.credentialService.findByUsername(username)); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/resource/UserResource.java b/user-service/src/main/java/com/selimhorri/app/resource/UserResource.java index 6bf4dc448..5afb7abe2 100644 --- a/user-service/src/main/java/com/selimhorri/app/resource/UserResource.java +++ b/user-service/src/main/java/com/selimhorri/app/resource/UserResource.java @@ -1,103 +1,103 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.UserDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.UserService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping(value = {"/api/users"}) -@Slf4j -@RequiredArgsConstructor -public class UserResource { - - private final UserService userService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** UserDto List, controller; fetch all users *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.userService.findAll())); - } - - @GetMapping("/{userId}") - public ResponseEntity findById( - @PathVariable("userId") - @NotBlank(message = "Input must not blank") - @Valid final String userId) { - log.info("*** UserDto, resource; fetch user by id *"); - return ResponseEntity.ok(this.userService.findById(Integer.parseInt(userId.strip()))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final UserDto userDto) { - log.info("*** UserDto, resource; save user *"); - return ResponseEntity.ok(this.userService.save(userDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final UserDto userDto) { - log.info("*** UserDto, resource; update user *"); - return ResponseEntity.ok(this.userService.update(userDto)); - } - - @PutMapping("/{userId}") - public ResponseEntity update( - @PathVariable("userId") - @NotBlank(message = "Input must not blank") final String userId, - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final UserDto userDto) { - log.info("*** UserDto, resource; update user with userId *"); - return ResponseEntity.ok(this.userService.update(Integer.parseInt(userId.strip()), userDto)); - } - - @DeleteMapping("/{userId}") - public ResponseEntity deleteById(@PathVariable("userId") @NotBlank(message = "Input must not blank") @Valid final String userId) { - log.info("*** Boolean, resource; delete user by id *"); - this.userService.deleteById(Integer.parseInt(userId)); - return ResponseEntity.ok(true); - } - - @GetMapping("/username/{username}") - public ResponseEntity findByUsername( - @PathVariable("username") - @NotBlank(message = "Input must not blank") - @Valid final String username) { - return ResponseEntity.ok(this.userService.findByUsername(username)); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.dto.UserDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.UserService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping(value = {"/api/users"}) +@Slf4j +@RequiredArgsConstructor +public class UserResource { + + private final UserService userService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** UserDto List, controller; fetch all users *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.userService.findAll())); + } + + @GetMapping("/{userId}") + public ResponseEntity findById( + @PathVariable("userId") + @NotBlank(message = "Input must not blank") + @Valid final String userId) { + log.info("*** UserDto, resource; fetch user by id *"); + return ResponseEntity.ok(this.userService.findById(Integer.parseInt(userId.strip()))); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final UserDto userDto) { + log.info("*** UserDto, resource; save user *"); + return ResponseEntity.ok(this.userService.save(userDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final UserDto userDto) { + log.info("*** UserDto, resource; update user *"); + return ResponseEntity.ok(this.userService.update(userDto)); + } + + @PutMapping("/{userId}") + public ResponseEntity update( + @PathVariable("userId") + @NotBlank(message = "Input must not blank") final String userId, + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final UserDto userDto) { + log.info("*** UserDto, resource; update user with userId *"); + return ResponseEntity.ok(this.userService.update(Integer.parseInt(userId.strip()), userDto)); + } + + @DeleteMapping("/{userId}") + public ResponseEntity deleteById(@PathVariable("userId") @NotBlank(message = "Input must not blank") @Valid final String userId) { + log.info("*** Boolean, resource; delete user by id *"); + this.userService.deleteById(Integer.parseInt(userId)); + return ResponseEntity.ok(true); + } + + @GetMapping("/username/{username}") + public ResponseEntity findByUsername( + @PathVariable("username") + @NotBlank(message = "Input must not blank") + @Valid final String username) { + return ResponseEntity.ok(this.userService.findByUsername(username)); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/resource/VerificationTokenResource.java b/user-service/src/main/java/com/selimhorri/app/resource/VerificationTokenResource.java index 5f76bda0d..4ec4dcff2 100644 --- a/user-service/src/main/java/com/selimhorri/app/resource/VerificationTokenResource.java +++ b/user-service/src/main/java/com/selimhorri/app/resource/VerificationTokenResource.java @@ -1,97 +1,97 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.VerificationTokenDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.VerificationTokenService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping(value = {"/api/verificationTokens"}) -@Slf4j -@RequiredArgsConstructor -public class VerificationTokenResource { - - private final VerificationTokenService verificationTokenService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** VerificationTokenDto List, controller; fetch all verificationTokens *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.verificationTokenService.findAll())); - } - - @GetMapping("/{verificationTokenId}") - public ResponseEntity findById( - @PathVariable("verificationTokenId") - @NotBlank(message = "Input must not blank") - @Valid final String verificationTokenId) { - log.info("*** VerificationTokenDto, resource; fetch verificationToken by id *"); - return ResponseEntity.ok(this.verificationTokenService.findById(Integer.parseInt(verificationTokenId.strip()))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, resource; save verificationToken *"); - return ResponseEntity.ok(this.verificationTokenService.save(verificationTokenDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, resource; update verificationToken *"); - return ResponseEntity.ok(this.verificationTokenService.update(verificationTokenDto)); - } - - @PutMapping("/{verificationTokenId}") - public ResponseEntity update( - @PathVariable("verificationTokenId") - @NotBlank(message = "Input must not blank") final String verificationTokenId, - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, resource; update verificationToken with verificationTokenId *"); - return ResponseEntity.ok(this.verificationTokenService.update(Integer.parseInt(verificationTokenId.strip()), verificationTokenDto)); - } - - @DeleteMapping("/{verificationTokenId}") - public ResponseEntity deleteById( - @PathVariable("verificationTokenId") - @NotBlank(message = "Input must not blank") final String verificationTokenId) { - log.info("*** Boolean, resource; delete verificationToken by id *"); - this.verificationTokenService.deleteById(Integer.parseInt(verificationTokenId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.resource; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.selimhorri.app.dto.VerificationTokenDto; +import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; +import com.selimhorri.app.service.VerificationTokenService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping(value = {"/api/verificationTokens"}) +@Slf4j +@RequiredArgsConstructor +public class VerificationTokenResource { + + private final VerificationTokenService verificationTokenService; + + @GetMapping + public ResponseEntity> findAll() { + log.info("*** VerificationTokenDto List, controller; fetch all verificationTokens *"); + return ResponseEntity.ok(new DtoCollectionResponse<>(this.verificationTokenService.findAll())); + } + + @GetMapping("/{verificationTokenId}") + public ResponseEntity findById( + @PathVariable("verificationTokenId") + @NotBlank(message = "Input must not blank") + @Valid final String verificationTokenId) { + log.info("*** VerificationTokenDto, resource; fetch verificationToken by id *"); + return ResponseEntity.ok(this.verificationTokenService.findById(Integer.parseInt(verificationTokenId.strip()))); + } + + @PostMapping + public ResponseEntity save( + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final VerificationTokenDto verificationTokenDto) { + log.info("*** VerificationTokenDto, resource; save verificationToken *"); + return ResponseEntity.ok(this.verificationTokenService.save(verificationTokenDto)); + } + + @PutMapping + public ResponseEntity update( + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final VerificationTokenDto verificationTokenDto) { + log.info("*** VerificationTokenDto, resource; update verificationToken *"); + return ResponseEntity.ok(this.verificationTokenService.update(verificationTokenDto)); + } + + @PutMapping("/{verificationTokenId}") + public ResponseEntity update( + @PathVariable("verificationTokenId") + @NotBlank(message = "Input must not blank") final String verificationTokenId, + @RequestBody + @NotNull(message = "Input must not NULL") + @Valid final VerificationTokenDto verificationTokenDto) { + log.info("*** VerificationTokenDto, resource; update verificationToken with verificationTokenId *"); + return ResponseEntity.ok(this.verificationTokenService.update(Integer.parseInt(verificationTokenId.strip()), verificationTokenDto)); + } + + @DeleteMapping("/{verificationTokenId}") + public ResponseEntity deleteById( + @PathVariable("verificationTokenId") + @NotBlank(message = "Input must not blank") final String verificationTokenId) { + log.info("*** Boolean, resource; delete verificationToken by id *"); + this.verificationTokenService.deleteById(Integer.parseInt(verificationTokenId)); + return ResponseEntity.ok(true); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/service/AddressService.java b/user-service/src/main/java/com/selimhorri/app/service/AddressService.java index aab8f2871..fdfdbe8c7 100644 --- a/user-service/src/main/java/com/selimhorri/app/service/AddressService.java +++ b/user-service/src/main/java/com/selimhorri/app/service/AddressService.java @@ -1,16 +1,16 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.AddressDto; - -public interface AddressService { - - List findAll(); - AddressDto findById(final Integer addressId); - AddressDto save(final AddressDto addressDto); - AddressDto update(final AddressDto addressDto); - AddressDto update(final Integer addressId, final AddressDto addressDto); - void deleteById(final Integer addressId); - -} +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.dto.AddressDto; + +public interface AddressService { + + List findAll(); + AddressDto findById(final Integer addressId); + AddressDto save(final AddressDto addressDto); + AddressDto update(final AddressDto addressDto); + AddressDto update(final Integer addressId, final AddressDto addressDto); + void deleteById(final Integer addressId); + +} diff --git a/user-service/src/main/java/com/selimhorri/app/service/CredentialService.java b/user-service/src/main/java/com/selimhorri/app/service/CredentialService.java index 976901543..cfe0588d8 100644 --- a/user-service/src/main/java/com/selimhorri/app/service/CredentialService.java +++ b/user-service/src/main/java/com/selimhorri/app/service/CredentialService.java @@ -1,27 +1,27 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.CredentialDto; - -public interface CredentialService { - - List findAll(); - CredentialDto findById(final Integer credentialId); - CredentialDto save(final CredentialDto credentialDto); - CredentialDto update(final CredentialDto credentialDto); - CredentialDto update(final Integer credentialId, final CredentialDto credentialDto); - void deleteById(final Integer credentialId); - CredentialDto findByUsername(final String username); - -} - - - - - - - - - - +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.dto.CredentialDto; + +public interface CredentialService { + + List findAll(); + CredentialDto findById(final Integer credentialId); + CredentialDto save(final CredentialDto credentialDto); + CredentialDto update(final CredentialDto credentialDto); + CredentialDto update(final Integer credentialId, final CredentialDto credentialDto); + void deleteById(final Integer credentialId); + CredentialDto findByUsername(final String username); + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/service/UserService.java b/user-service/src/main/java/com/selimhorri/app/service/UserService.java index 086973438..2507057ca 100644 --- a/user-service/src/main/java/com/selimhorri/app/service/UserService.java +++ b/user-service/src/main/java/com/selimhorri/app/service/UserService.java @@ -1,27 +1,27 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.UserDto; - -public interface UserService { - - List findAll(); - UserDto findById(final Integer userId); - UserDto save(final UserDto userDto); - UserDto update(final UserDto userDto); - UserDto update(final Integer userId, final UserDto userDto); - void deleteById(final Integer userId); - UserDto findByUsername(final String username); - -} - - - - - - - - - - +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.dto.UserDto; + +public interface UserService { + + List findAll(); + UserDto findById(final Integer userId); + UserDto save(final UserDto userDto); + UserDto update(final UserDto userDto); + UserDto update(final Integer userId, final UserDto userDto); + void deleteById(final Integer userId); + UserDto findByUsername(final String username); + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/service/VerificationTokenService.java b/user-service/src/main/java/com/selimhorri/app/service/VerificationTokenService.java index 854c96192..cab289f03 100644 --- a/user-service/src/main/java/com/selimhorri/app/service/VerificationTokenService.java +++ b/user-service/src/main/java/com/selimhorri/app/service/VerificationTokenService.java @@ -1,26 +1,26 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.VerificationTokenDto; - -public interface VerificationTokenService { - - List findAll(); - VerificationTokenDto findById(final Integer verificationTokenId); - VerificationTokenDto save(final VerificationTokenDto verificationTokenDto); - VerificationTokenDto update(final VerificationTokenDto verificationTokenDto); - VerificationTokenDto update(final Integer verificationTokenId, final VerificationTokenDto verificationTokenDto); - void deleteById(final Integer verificationTokenId); - -} - - - - - - - - - - +package com.selimhorri.app.service; + +import java.util.List; + +import com.selimhorri.app.dto.VerificationTokenDto; + +public interface VerificationTokenService { + + List findAll(); + VerificationTokenDto findById(final Integer verificationTokenId); + VerificationTokenDto save(final VerificationTokenDto verificationTokenDto); + VerificationTokenDto update(final VerificationTokenDto verificationTokenDto); + VerificationTokenDto update(final Integer verificationTokenId, final VerificationTokenDto verificationTokenDto); + void deleteById(final Integer verificationTokenId); + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/service/impl/AddressServiceImpl.java b/user-service/src/main/java/com/selimhorri/app/service/impl/AddressServiceImpl.java index 1bce7e253..13c14c3ab 100644 --- a/user-service/src/main/java/com/selimhorri/app/service/impl/AddressServiceImpl.java +++ b/user-service/src/main/java/com/selimhorri/app/service/impl/AddressServiceImpl.java @@ -1,82 +1,82 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.AddressDto; -import com.selimhorri.app.exception.wrapper.AddressNotFoundException; -import com.selimhorri.app.helper.AddressMappingHelper; -import com.selimhorri.app.repository.AddressRepository; -import com.selimhorri.app.service.AddressService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class AddressServiceImpl implements AddressService { - - private final AddressRepository addressRepository; - - @Override - public List findAll() { - log.info("*** AddressDto List, service; fetch all addresss *"); - return this.addressRepository.findAll() - .stream() - .map(AddressMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public AddressDto findById(final Integer addressId) { - log.info("*** AddressDto, service; fetch address by id *"); - return this.addressRepository.findById(addressId) - .map(AddressMappingHelper::map) - .orElseThrow(() -> new AddressNotFoundException(String.format("#### Address with id: %d not found! ####", addressId))); - } - - @Override - public AddressDto save(final AddressDto addressDto) { - log.info("*** AddressDto, service; save address *"); - return AddressMappingHelper.map(this.addressRepository.save(AddressMappingHelper.map(addressDto))); - } - - @Override - public AddressDto update(final AddressDto addressDto) { - log.info("*** AddressDto, service; update address *"); - return AddressMappingHelper.map(this.addressRepository.save(AddressMappingHelper.map(addressDto))); - } - - @Override - public AddressDto update(final Integer addressId, final AddressDto addressDto) { - log.info("*** AddressDto, service; update address with addressId *"); - return AddressMappingHelper.map(this.addressRepository.save( - AddressMappingHelper.map(this.findById(addressId)))); - } - - @Override - public void deleteById(final Integer addressId) { - log.info("*** Void, service; delete address by id *"); - this.addressRepository.deleteById(addressId); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; + +import com.selimhorri.app.dto.AddressDto; +import com.selimhorri.app.exception.wrapper.AddressNotFoundException; +import com.selimhorri.app.helper.AddressMappingHelper; +import com.selimhorri.app.repository.AddressRepository; +import com.selimhorri.app.service.AddressService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class AddressServiceImpl implements AddressService { + + private final AddressRepository addressRepository; + + @Override + public List findAll() { + log.info("*** AddressDto List, service; fetch all addresss *"); + return this.addressRepository.findAll() + .stream() + .map(AddressMappingHelper::map) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public AddressDto findById(final Integer addressId) { + log.info("*** AddressDto, service; fetch address by id *"); + return this.addressRepository.findById(addressId) + .map(AddressMappingHelper::map) + .orElseThrow(() -> new AddressNotFoundException(String.format("#### Address with id: %d not found! ####", addressId))); + } + + @Override + public AddressDto save(final AddressDto addressDto) { + log.info("*** AddressDto, service; save address *"); + return AddressMappingHelper.map(this.addressRepository.save(AddressMappingHelper.map(addressDto))); + } + + @Override + public AddressDto update(final AddressDto addressDto) { + log.info("*** AddressDto, service; update address *"); + return AddressMappingHelper.map(this.addressRepository.save(AddressMappingHelper.map(addressDto))); + } + + @Override + public AddressDto update(final Integer addressId, final AddressDto addressDto) { + log.info("*** AddressDto, service; update address with addressId *"); + return AddressMappingHelper.map(this.addressRepository.save( + AddressMappingHelper.map(this.findById(addressId)))); + } + + @Override + public void deleteById(final Integer addressId) { + log.info("*** Void, service; delete address by id *"); + this.addressRepository.deleteById(addressId); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/service/impl/CredentialServiceImpl.java b/user-service/src/main/java/com/selimhorri/app/service/impl/CredentialServiceImpl.java index 3da0ed0dd..a7b1dda51 100644 --- a/user-service/src/main/java/com/selimhorri/app/service/impl/CredentialServiceImpl.java +++ b/user-service/src/main/java/com/selimhorri/app/service/impl/CredentialServiceImpl.java @@ -1,89 +1,89 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.exception.wrapper.CredentialNotFoundException; -import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; -import com.selimhorri.app.helper.CredentialMappingHelper; -import com.selimhorri.app.repository.CredentialRepository; -import com.selimhorri.app.service.CredentialService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class CredentialServiceImpl implements CredentialService { - - private final CredentialRepository credentialRepository; - - @Override - public List findAll() { - log.info("*** CredentialDto List, service; fetch all credentials *"); - return this.credentialRepository.findAll() - .stream() - .map(CredentialMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public CredentialDto findById(final Integer credentialId) { - log.info("*** CredentialDto, service; fetch credential by ids *"); - return this.credentialRepository.findById(credentialId) - .map(CredentialMappingHelper::map) - .orElseThrow(() -> new CredentialNotFoundException(String.format("#### Credential with id: %d not found! ####", credentialId))); - } - - @Override - public CredentialDto save(final CredentialDto credentialDto) { - log.info("*** CredentialDto, service; save credential *"); - return CredentialMappingHelper.map(this.credentialRepository.save(CredentialMappingHelper.map(credentialDto))); - } - - @Override - public CredentialDto update(final CredentialDto credentialDto) { - log.info("*** CredentialDto, service; update credential *"); - return CredentialMappingHelper.map(this.credentialRepository.save(CredentialMappingHelper.map(credentialDto))); - } - - @Override - public CredentialDto update(final Integer credentialId, final CredentialDto credentialDto) { - log.info("*** CredentialDto, service; update credential with credentialId *"); - return CredentialMappingHelper.map(this.credentialRepository.save( - CredentialMappingHelper.map(this.findById(credentialId)))); - } - - @Override - public void deleteById(final Integer credentialId) { - log.info("*** Void, service; delete credential by id *"); - this.credentialRepository.deleteById(credentialId); - } - - @Override - public CredentialDto findByUsername(final String username) { - return CredentialMappingHelper.map(this.credentialRepository.findByUsername(username) - .orElseThrow(() -> new UserObjectNotFoundException(String.format("#### Credential with username: %s not found! ####", username)))); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; + +import com.selimhorri.app.dto.CredentialDto; +import com.selimhorri.app.exception.wrapper.CredentialNotFoundException; +import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; +import com.selimhorri.app.helper.CredentialMappingHelper; +import com.selimhorri.app.repository.CredentialRepository; +import com.selimhorri.app.service.CredentialService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class CredentialServiceImpl implements CredentialService { + + private final CredentialRepository credentialRepository; + + @Override + public List findAll() { + log.info("*** CredentialDto List, service; fetch all credentials *"); + return this.credentialRepository.findAll() + .stream() + .map(CredentialMappingHelper::map) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public CredentialDto findById(final Integer credentialId) { + log.info("*** CredentialDto, service; fetch credential by ids *"); + return this.credentialRepository.findById(credentialId) + .map(CredentialMappingHelper::map) + .orElseThrow(() -> new CredentialNotFoundException(String.format("#### Credential with id: %d not found! ####", credentialId))); + } + + @Override + public CredentialDto save(final CredentialDto credentialDto) { + log.info("*** CredentialDto, service; save credential *"); + return CredentialMappingHelper.map(this.credentialRepository.save(CredentialMappingHelper.map(credentialDto))); + } + + @Override + public CredentialDto update(final CredentialDto credentialDto) { + log.info("*** CredentialDto, service; update credential *"); + return CredentialMappingHelper.map(this.credentialRepository.save(CredentialMappingHelper.map(credentialDto))); + } + + @Override + public CredentialDto update(final Integer credentialId, final CredentialDto credentialDto) { + log.info("*** CredentialDto, service; update credential with credentialId *"); + return CredentialMappingHelper.map(this.credentialRepository.save( + CredentialMappingHelper.map(this.findById(credentialId)))); + } + + @Override + public void deleteById(final Integer credentialId) { + log.info("*** Void, service; delete credential by id *"); + this.credentialRepository.deleteById(credentialId); + } + + @Override + public CredentialDto findByUsername(final String username) { + return CredentialMappingHelper.map(this.credentialRepository.findByUsername(username) + .orElseThrow(() -> new UserObjectNotFoundException(String.format("#### Credential with username: %s not found! ####", username)))); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/service/impl/UserServiceImpl.java b/user-service/src/main/java/com/selimhorri/app/service/impl/UserServiceImpl.java index 436599baa..64e8fbe79 100644 --- a/user-service/src/main/java/com/selimhorri/app/service/impl/UserServiceImpl.java +++ b/user-service/src/main/java/com/selimhorri/app/service/impl/UserServiceImpl.java @@ -1,89 +1,89 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.UserDto; -import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; -import com.selimhorri.app.helper.UserMappingHelper; -import com.selimhorri.app.repository.UserRepository; -import com.selimhorri.app.service.UserService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class UserServiceImpl implements UserService { - - private final UserRepository userRepository; - - @Override - public List findAll() { - log.info("*** UserDto List, service; fetch all users *"); - return this.userRepository.findAll() - .stream() - .map(UserMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public UserDto findById(final Integer userId) { - log.info("*** UserDto, service; fetch user by id *"); - return this.userRepository.findById(userId) - .map(UserMappingHelper::map) - .orElseThrow(() -> new UserObjectNotFoundException(String.format("User with id: %d not found", userId))); - } - - @Override - public UserDto save(final UserDto userDto) { - log.info("*** UserDto, service; save user *"); - return UserMappingHelper.map(this.userRepository.save(UserMappingHelper.map(userDto))); - } - - @Override - public UserDto update(final UserDto userDto) { - log.info("*** UserDto, service; update user *"); - return UserMappingHelper.map(this.userRepository.save(UserMappingHelper.map(userDto))); - } - - @Override - public UserDto update(final Integer userId, final UserDto userDto) { - log.info("*** UserDto, service; update user with userId *"); - return UserMappingHelper.map(this.userRepository.save( - UserMappingHelper.map(this.findById(userId)))); - } - - @Override - public void deleteById(final Integer userId) { - log.info("*** Void, service; delete user by id *"); - this.userRepository.deleteById(userId); - } - - @Override - public UserDto findByUsername(final String username) { - log.info("*** UserDto, service; fetch user with username *"); - return UserMappingHelper.map(this.userRepository.findByCredentialUsername(username) - .orElseThrow(() -> new UserObjectNotFoundException(String.format("User with username: %s not found", username)))); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; + +import com.selimhorri.app.dto.UserDto; +import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; +import com.selimhorri.app.helper.UserMappingHelper; +import com.selimhorri.app.repository.UserRepository; +import com.selimhorri.app.service.UserService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class UserServiceImpl implements UserService { + + private final UserRepository userRepository; + + @Override + public List findAll() { + log.info("*** UserDto List, service; fetch all users *"); + return this.userRepository.findAll() + .stream() + .map(UserMappingHelper::map) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public UserDto findById(final Integer userId) { + log.info("*** UserDto, service; fetch user by id *"); + return this.userRepository.findById(userId) + .map(UserMappingHelper::map) + .orElseThrow(() -> new UserObjectNotFoundException(String.format("User with id: %d not found", userId))); + } + + @Override + public UserDto save(final UserDto userDto) { + log.info("*** UserDto, service; save user *"); + return UserMappingHelper.map(this.userRepository.save(UserMappingHelper.map(userDto))); + } + + @Override + public UserDto update(final UserDto userDto) { + log.info("*** UserDto, service; update user *"); + return UserMappingHelper.map(this.userRepository.save(UserMappingHelper.map(userDto))); + } + + @Override + public UserDto update(final Integer userId, final UserDto userDto) { + log.info("*** UserDto, service; update user with userId *"); + return UserMappingHelper.map(this.userRepository.save( + UserMappingHelper.map(this.findById(userId)))); + } + + @Override + public void deleteById(final Integer userId) { + log.info("*** Void, service; delete user by id *"); + this.userRepository.deleteById(userId); + } + + @Override + public UserDto findByUsername(final String username) { + log.info("*** UserDto, service; fetch user with username *"); + return UserMappingHelper.map(this.userRepository.findByCredentialUsername(username) + .orElseThrow(() -> new UserObjectNotFoundException(String.format("User with username: %s not found", username)))); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/java/com/selimhorri/app/service/impl/VerificationTokenServiceImpl.java b/user-service/src/main/java/com/selimhorri/app/service/impl/VerificationTokenServiceImpl.java index 2b73d5625..27b8d13a4 100644 --- a/user-service/src/main/java/com/selimhorri/app/service/impl/VerificationTokenServiceImpl.java +++ b/user-service/src/main/java/com/selimhorri/app/service/impl/VerificationTokenServiceImpl.java @@ -1,85 +1,85 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.VerificationTokenDto; -import com.selimhorri.app.exception.wrapper.VerificationTokenNotFoundException; -import com.selimhorri.app.helper.VerificationTokenMappingHelper; -import com.selimhorri.app.repository.VerificationTokenRepository; -import com.selimhorri.app.service.VerificationTokenService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class VerificationTokenServiceImpl implements VerificationTokenService { - - private final VerificationTokenRepository verificationTokenRepository; - - @Override - public List findAll() { - log.info("*** VerificationTokenDto List, service; fetch all verificationTokens *"); - return this.verificationTokenRepository.findAll() - .stream() - .map(VerificationTokenMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public VerificationTokenDto findById(final Integer verificationTokenId) { - log.info("*** VerificationTokenDto, service; fetch verificationToken by ids *"); - return this.verificationTokenRepository.findById(verificationTokenId) - .map(VerificationTokenMappingHelper::map) - .orElseThrow(() -> new VerificationTokenNotFoundException(String - .format("#### VerificationToken with id: %d not found! ####", verificationTokenId))); - } - - @Override - public VerificationTokenDto save(final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, service; save verificationToken *"); - return VerificationTokenMappingHelper.map(this.verificationTokenRepository - .save(VerificationTokenMappingHelper.map(verificationTokenDto))); - } - - @Override - public VerificationTokenDto update(final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, service; update verificationToken *"); - return VerificationTokenMappingHelper.map(this.verificationTokenRepository - .save(VerificationTokenMappingHelper.map(verificationTokenDto))); - } - - @Override - public VerificationTokenDto update(final Integer verificationTokenId, final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, service; update verificationToken with verificationTokenId *"); - return VerificationTokenMappingHelper.map(this.verificationTokenRepository.save( - VerificationTokenMappingHelper.map(this.findById(verificationTokenId)))); - } - - @Override - public void deleteById(final Integer verificationTokenId) { - log.info("*** Void, service; delete verificationToken by id *"); - this.verificationTokenRepository.deleteById(verificationTokenId); - } - - - -} - - - - - - - - - - +package com.selimhorri.app.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; + +import com.selimhorri.app.dto.VerificationTokenDto; +import com.selimhorri.app.exception.wrapper.VerificationTokenNotFoundException; +import com.selimhorri.app.helper.VerificationTokenMappingHelper; +import com.selimhorri.app.repository.VerificationTokenRepository; +import com.selimhorri.app.service.VerificationTokenService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Transactional +@Slf4j +@RequiredArgsConstructor +public class VerificationTokenServiceImpl implements VerificationTokenService { + + private final VerificationTokenRepository verificationTokenRepository; + + @Override + public List findAll() { + log.info("*** VerificationTokenDto List, service; fetch all verificationTokens *"); + return this.verificationTokenRepository.findAll() + .stream() + .map(VerificationTokenMappingHelper::map) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public VerificationTokenDto findById(final Integer verificationTokenId) { + log.info("*** VerificationTokenDto, service; fetch verificationToken by ids *"); + return this.verificationTokenRepository.findById(verificationTokenId) + .map(VerificationTokenMappingHelper::map) + .orElseThrow(() -> new VerificationTokenNotFoundException(String + .format("#### VerificationToken with id: %d not found! ####", verificationTokenId))); + } + + @Override + public VerificationTokenDto save(final VerificationTokenDto verificationTokenDto) { + log.info("*** VerificationTokenDto, service; save verificationToken *"); + return VerificationTokenMappingHelper.map(this.verificationTokenRepository + .save(VerificationTokenMappingHelper.map(verificationTokenDto))); + } + + @Override + public VerificationTokenDto update(final VerificationTokenDto verificationTokenDto) { + log.info("*** VerificationTokenDto, service; update verificationToken *"); + return VerificationTokenMappingHelper.map(this.verificationTokenRepository + .save(VerificationTokenMappingHelper.map(verificationTokenDto))); + } + + @Override + public VerificationTokenDto update(final Integer verificationTokenId, final VerificationTokenDto verificationTokenDto) { + log.info("*** VerificationTokenDto, service; update verificationToken with verificationTokenId *"); + return VerificationTokenMappingHelper.map(this.verificationTokenRepository.save( + VerificationTokenMappingHelper.map(this.findById(verificationTokenId)))); + } + + @Override + public void deleteById(final Integer verificationTokenId) { + log.info("*** Void, service; delete verificationToken by id *"); + this.verificationTokenRepository.deleteById(verificationTokenId); + } + + + +} + + + + + + + + + + diff --git a/user-service/src/main/resources/application-dev.yml b/user-service/src/main/resources/application-dev.yml index 44bd55cd6..50ed172a8 100644 --- a/user-service/src/main/resources/application-dev.yml +++ b/user-service/src/main/resources/application-dev.yml @@ -1,47 +1,47 @@ - -server: - port: 8700 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8700 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect + use_sql_comments: true + format_sql: true + h2: + console: + enabled: true + path: /h2-console + #flyway: + # baseline-on-migrate: true + # enabled: true + +logging: + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/user-service/src/main/resources/application-prod.yml b/user-service/src/main/resources/application-prod.yml index 1a668ef31..46e1a718f 100644 --- a/user-service/src/main/resources/application-prod.yml +++ b/user-service/src/main/resources/application-prod.yml @@ -1,43 +1,43 @@ - -server: - port: 8700 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - + +server: + port: 8700 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: false + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/prod_log.log + clean-history-on-start: false + level: + org: + hibernate: + SQL: INFO + springframework: + web: INFO + data: INFO + boot: + autoconfigure: + data: + rest: INFO + jpa: INFO + orm: INFO + diff --git a/user-service/src/main/resources/application-stage.yml b/user-service/src/main/resources/application-stage.yml index 31be1dd20..4ae59af32 100644 --- a/user-service/src/main/resources/application-stage.yml +++ b/user-service/src/main/resources/application-stage.yml @@ -1,43 +1,43 @@ - -server: - port: 8700 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - + +server: + port: 8700 + +management: + endpoints: + web: + exposure: + include: "*" + +spring: + datasource: + url: jdbc:mysql://localhost:3306/ecommerce_stage_db + username: root + password: + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + use_sql_comments: true + format_sql: true + +logging: + file: + name: src/main/resources/script/stage_log.log + clean-history-on-start: true + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + data: DEBUG + boot: + autoconfigure: + data: + rest: DEBUG + jpa: DEBUG + orm: DEBUG + diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 27596cdd2..f3669dcf4 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -1,45 +1,45 @@ - -server: - servlet: - context-path: /user-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: USER-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - userService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - + +server: + servlet: + context-path: /user-service + +spring: + zipkin: + base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} + config: + import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} + application: + name: USER-SERVICE + profiles: + active: + - dev + +resilience4j: + circuitbreaker: + instances: + userService: + register-health-indicator: true + event-consumer-buffer-size: 10 + automatic-transition-from-open-to-half-open-enabled: true + failure-rate-threshold: 50 + minimum-number-of-calls: 5 + permitted-number-of-calls-in-half-open-state: 3 + sliding-window-size: 10 + wait-duration-in-open-state: 5s + sliding-window-type: COUNT_BASED + +management: + health: + circuitbreakers: + enabled: true + endpoint: + health: + show-details: always + + + + + + + + diff --git a/user-service/src/main/resources/db/migration/V10__create_credentials_user_id_fk.sql b/user-service/src/main/resources/db/migration/V10__create_credentials_user_id_fk.sql index d7e43b855..4d4d93794 100644 --- a/user-service/src/main/resources/db/migration/V10__create_credentials_user_id_fk.sql +++ b/user-service/src/main/resources/db/migration/V10__create_credentials_user_id_fk.sql @@ -1,3 +1,3 @@ - -ALTER TABLE credentials - ADD CONSTRAINT fk2_assign FOREIGN KEY (user_id) REFERENCES users (user_id); + +ALTER TABLE credentials + ADD CONSTRAINT fk2_assign FOREIGN KEY (user_id) REFERENCES users (user_id); diff --git a/user-service/src/main/resources/db/migration/V11__create_verification_tokens_credential_id_fk.sql b/user-service/src/main/resources/db/migration/V11__create_verification_tokens_credential_id_fk.sql index 7be81d327..00dfabbbc 100644 --- a/user-service/src/main/resources/db/migration/V11__create_verification_tokens_credential_id_fk.sql +++ b/user-service/src/main/resources/db/migration/V11__create_verification_tokens_credential_id_fk.sql @@ -1,3 +1,3 @@ - -ALTER TABLE verification_tokens - ADD CONSTRAINT fk3_assign FOREIGN KEY (credential_id) REFERENCES credentials (credential_id); + +ALTER TABLE verification_tokens + ADD CONSTRAINT fk3_assign FOREIGN KEY (credential_id) REFERENCES credentials (credential_id); diff --git a/user-service/src/main/resources/db/migration/V1__create_users_table.sql b/user-service/src/main/resources/db/migration/V1__create_users_table.sql index 9c67721da..25b917a90 100644 --- a/user-service/src/main/resources/db/migration/V1__create_users_table.sql +++ b/user-service/src/main/resources/db/migration/V1__create_users_table.sql @@ -1,14 +1,14 @@ - -CREATE TABLE users ( - user_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - first_name VARCHAR(255), - last_name VARCHAR(255), - image_url VARCHAR(255) DEFAULT 'https://bootdey.com/img/Content/avatar/avatar7.png', - email VARCHAR(255) DEFAULT 'springxyzabcboot@gmail.com', - phone VARCHAR(255) DEFAULT '+21622125144', - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - - - + +CREATE TABLE users ( + user_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + first_name VARCHAR(255), + last_name VARCHAR(255), + image_url VARCHAR(255) DEFAULT 'https://bootdey.com/img/Content/avatar/avatar7.png', + email VARCHAR(255) DEFAULT 'springxyzabcboot@gmail.com', + phone VARCHAR(255) DEFAULT '+21622125144', + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP +); + + + diff --git a/user-service/src/main/resources/db/migration/V2__insert_users_table.sql b/user-service/src/main/resources/db/migration/V2__insert_users_table.sql index a55243d3a..9a08206e9 100644 --- a/user-service/src/main/resources/db/migration/V2__insert_users_table.sql +++ b/user-service/src/main/resources/db/migration/V2__insert_users_table.sql @@ -1,9 +1,9 @@ - -INSERT INTO users -(first_name, last_name) VALUES -('selim', 'horri'), -('amine', 'ladjimi'), -('omar', 'derouiche'), -('admin', 'admin'); - - + +INSERT INTO users +(first_name, last_name) VALUES +('selim', 'horri'), +('amine', 'ladjimi'), +('omar', 'derouiche'), +('admin', 'admin'); + + diff --git a/user-service/src/main/resources/db/migration/V3__create_address_table.sql b/user-service/src/main/resources/db/migration/V3__create_address_table.sql index 945ca67b4..9abd77bac 100644 --- a/user-service/src/main/resources/db/migration/V3__create_address_table.sql +++ b/user-service/src/main/resources/db/migration/V3__create_address_table.sql @@ -1,12 +1,12 @@ - -CREATE TABLE address ( - address_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - user_id INT(11), - full_address VARCHAR(255), - postal_code VARCHAR(255), - city VARCHAR(255), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - - + +CREATE TABLE address ( + address_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + user_id INT(11), + full_address VARCHAR(255), + postal_code VARCHAR(255), + city VARCHAR(255), + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP +); + + diff --git a/user-service/src/main/resources/db/migration/V4__insert_address_table.sql b/user-service/src/main/resources/db/migration/V4__insert_address_table.sql index d8fdd3626..62379eda2 100644 --- a/user-service/src/main/resources/db/migration/V4__insert_address_table.sql +++ b/user-service/src/main/resources/db/migration/V4__insert_address_table.sql @@ -1,11 +1,11 @@ - -INSERT INTO address -(user_id, full_address, postal_code, city) VALUES -(1, 'carthage byrsa', '2016', 'carthage'), -(2, 'carthage byrsa', '2016', 'carthage'), -(3, 'carthage byrsa', '2016', 'carthage'), -(4, 'carthage byrsa', '2016', 'carthage'), -(2, 'kram', '2015', 'kram'), -(1, 'kram', '2015', 'kram'); - - + +INSERT INTO address +(user_id, full_address, postal_code, city) VALUES +(1, 'carthage byrsa', '2016', 'carthage'), +(2, 'carthage byrsa', '2016', 'carthage'), +(3, 'carthage byrsa', '2016', 'carthage'), +(4, 'carthage byrsa', '2016', 'carthage'), +(2, 'kram', '2015', 'kram'), +(1, 'kram', '2015', 'kram'); + + diff --git a/user-service/src/main/resources/db/migration/V5__create_credentials_table.sql b/user-service/src/main/resources/db/migration/V5__create_credentials_table.sql index 61cc4ffbd..a67efade7 100644 --- a/user-service/src/main/resources/db/migration/V5__create_credentials_table.sql +++ b/user-service/src/main/resources/db/migration/V5__create_credentials_table.sql @@ -1,15 +1,15 @@ - -CREATE TABLE credentials ( - credential_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - user_id INT(11), - username VARCHAR(255), - password VARCHAR(255), - role VARCHAR(255), - is_enabled BOOLEAN DEFAULT false, - is_account_non_expired BOOLEAN DEFAULT true, - is_account_non_locked BOOLEAN DEFAULT true, - is_credentials_non_expired BOOLEAN DEFAULT true, - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - + +CREATE TABLE credentials ( + credential_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + user_id INT(11), + username VARCHAR(255), + password VARCHAR(255), + role VARCHAR(255), + is_enabled BOOLEAN DEFAULT false, + is_account_non_expired BOOLEAN DEFAULT true, + is_account_non_locked BOOLEAN DEFAULT true, + is_credentials_non_expired BOOLEAN DEFAULT true, + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP +); + diff --git a/user-service/src/main/resources/db/migration/V6__insert_credentials_table.sql b/user-service/src/main/resources/db/migration/V6__insert_credentials_table.sql index cdc5f6623..a2a1568a4 100644 --- a/user-service/src/main/resources/db/migration/V6__insert_credentials_table.sql +++ b/user-service/src/main/resources/db/migration/V6__insert_credentials_table.sql @@ -1,8 +1,8 @@ - -INSERT INTO credentials -(user_id, username, password, role, is_enabled) VALUES -(1, 'selimhorri', '$2a$04$/S7cWjHPZul03sPEivycWeKTBvLyjYdaRWmeaFbiqKy9es/3W4QB6', 'ROLE_USER', true), -(2, 'amineladjimi', '$2a$04$8D8OuqPbE4LhRckvtBAHrOmpeWmE92xNNVtyK8Z/lrJFjsImpjBkm', 'ROLE_USER', true), -(3, 'omarderouiche', '$2a$04$jelNGcF4wFHJirT5Pm7jPO8812QE/3tIWIs1DNnajS68iG4aKUqvS', 'ROLE_USER', true), -(4, 'admin', '$2a$04$1G4TwSzwf5JwZ4dKCXG1Zu1Qh3WIY9JNaM9vF6Ff05QDfyPg7nSxO', 'ROLE_USER', true); - + +INSERT INTO credentials +(user_id, username, password, role, is_enabled) VALUES +(1, 'selimhorri', '$2a$04$/S7cWjHPZul03sPEivycWeKTBvLyjYdaRWmeaFbiqKy9es/3W4QB6', 'ROLE_USER', true), +(2, 'amineladjimi', '$2a$04$8D8OuqPbE4LhRckvtBAHrOmpeWmE92xNNVtyK8Z/lrJFjsImpjBkm', 'ROLE_USER', true), +(3, 'omarderouiche', '$2a$04$jelNGcF4wFHJirT5Pm7jPO8812QE/3tIWIs1DNnajS68iG4aKUqvS', 'ROLE_USER', true), +(4, 'admin', '$2a$04$1G4TwSzwf5JwZ4dKCXG1Zu1Qh3WIY9JNaM9vF6Ff05QDfyPg7nSxO', 'ROLE_USER', true); + diff --git a/user-service/src/main/resources/db/migration/V7__create_verification_tokens_table.sql b/user-service/src/main/resources/db/migration/V7__create_verification_tokens_table.sql index 064573806..27485652a 100644 --- a/user-service/src/main/resources/db/migration/V7__create_verification_tokens_table.sql +++ b/user-service/src/main/resources/db/migration/V7__create_verification_tokens_table.sql @@ -1,10 +1,10 @@ - -CREATE TABLE verification_tokens ( - verification_token_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - credential_id INT(11), - verif_token VARCHAR(255), - expire_date DATE, - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - + +CREATE TABLE verification_tokens ( + verification_token_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + credential_id INT(11), + verif_token VARCHAR(255), + expire_date DATE, + created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, + updated_at TIMESTAMP +); + diff --git a/user-service/src/main/resources/db/migration/V8__insert_verification_tokens_table.sql b/user-service/src/main/resources/db/migration/V8__insert_verification_tokens_table.sql index 2327e19ed..4479b83c0 100644 --- a/user-service/src/main/resources/db/migration/V8__insert_verification_tokens_table.sql +++ b/user-service/src/main/resources/db/migration/V8__insert_verification_tokens_table.sql @@ -1,8 +1,8 @@ - -INSERT INTO verification_tokens -(credential_id, verif_token, expire_date) VALUES -(1, '', '2021-12-31'), -(2, '', '2021-12-31'), -(3, '', '2021-12-31'), -(4, '', '2021-12-31'); - + +INSERT INTO verification_tokens +(credential_id, verif_token, expire_date) VALUES +(1, '', '2021-12-31'), +(2, '', '2021-12-31'), +(3, '', '2021-12-31'), +(4, '', '2021-12-31'); + diff --git a/user-service/src/main/resources/db/migration/V9__create_address_user_id_fk.sql b/user-service/src/main/resources/db/migration/V9__create_address_user_id_fk.sql index 3d48409c0..d3a00cbec 100644 --- a/user-service/src/main/resources/db/migration/V9__create_address_user_id_fk.sql +++ b/user-service/src/main/resources/db/migration/V9__create_address_user_id_fk.sql @@ -1,3 +1,3 @@ - -ALTER TABLE address - ADD CONSTRAINT fk1_assign FOREIGN KEY (user_id) REFERENCES users (user_id); + +ALTER TABLE address + ADD CONSTRAINT fk1_assign FOREIGN KEY (user_id) REFERENCES users (user_id); diff --git a/user-service/src/test/java/com/selimhorri/app/UserServiceApplicationTests.java b/user-service/src/test/java/com/selimhorri/app/UserServiceApplicationTests.java index 76d266a00..22f69dc17 100644 --- a/user-service/src/test/java/com/selimhorri/app/UserServiceApplicationTests.java +++ b/user-service/src/test/java/com/selimhorri/app/UserServiceApplicationTests.java @@ -1,16 +1,16 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class UserServiceApplicationTests { - - - -} - - - - - - +package com.selimhorri.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class UserServiceApplicationTests { + + + +} + + + + + + From 3e894c8f024feddd22ccc4ee92dbe536eda70a57 Mon Sep 17 00:00:00 2001 From: Barcino44 Date: Sun, 16 Nov 2025 23:18:07 -0500 Subject: [PATCH 2/5] feat: Making it compile in Kubernetes --- helm/ecommerce/Chart.yaml | 6 ++ helm/ecommerce/README.md | 46 +++++++++++++++ helm/ecommerce/charts/api-gateway/Chart.yaml | 6 ++ .../api-gateway/templates/configmap.yaml | 17 ++++++ .../api-gateway/templates/deployment.yaml | 47 +++++++++++++++ .../charts/api-gateway/templates/service.yaml | 13 +++++ helm/ecommerce/charts/api-gateway/values.yaml | 17 ++++++ helm/ecommerce/charts/cloud-config/Chart.yaml | 6 ++ .../cloud-config/templates/configmap.yaml | 13 +++++ .../cloud-config/templates/deployment.yaml | 33 +++++++++++ .../cloud-config/templates/service.yaml | 13 +++++ .../ecommerce/charts/cloud-config/values.yaml | 18 ++++++ .../charts/favourite-service/Chart.yaml | 6 ++ .../templates/configmap.yaml | 16 ++++++ .../templates/deployment.yaml | 55 ++++++++++++++++++ .../favourite-service/templates/service.yaml | 13 +++++ .../charts/favourite-service/values.yaml | 19 +++++++ .../ecommerce/charts/order-service/Chart.yaml | 6 ++ .../order-service/templates/configmap.yaml | 15 +++++ .../order-service/templates/deployment.yaml | 57 +++++++++++++++++++ .../order-service/templates/service.yaml | 13 +++++ .../charts/order-service/values.yaml | 19 +++++++ .../charts/payment-service/Chart.yaml | 6 ++ .../payment-service/templates/configmap.yaml | 12 ++++ .../payment-service/templates/deployment.yaml | 55 ++++++++++++++++++ .../payment-service/templates/service.yaml | 13 +++++ .../charts/payment-service/values.yaml | 16 ++++++ .../charts/product-service/Chart.yaml | 6 ++ .../product-service/templates/configmap.yaml | 13 +++++ .../product-service/templates/deployment.yaml | 55 ++++++++++++++++++ .../product-service/templates/service.yaml | 13 +++++ .../charts/product-service/values.yaml | 18 ++++++ helm/ecommerce/charts/proxy-client/Chart.yaml | 6 ++ .../proxy-client/templates/configmap.yaml | 12 ++++ .../proxy-client/templates/deployment.yaml | 55 ++++++++++++++++++ .../proxy-client/templates/service.yaml | 13 +++++ .../ecommerce/charts/proxy-client/values.yaml | 14 +++++ .../charts/service-discovery/Chart.yaml | 6 ++ .../templates/configmap.yaml | 10 ++++ .../templates/deployment.yaml | 27 +++++++++ .../service-discovery/templates/service.yaml | 14 +++++ .../charts/service-discovery/values.yaml | 16 ++++++ .../charts/shipping-service/Chart.yaml | 6 ++ .../shipping-service/templates/configmap.yaml | 13 +++++ .../templates/deployment.yaml | 55 ++++++++++++++++++ .../shipping-service/templates/service.yaml | 13 +++++ .../charts/shipping-service/values.yaml | 16 ++++++ helm/ecommerce/charts/user-service/Chart.yaml | 6 ++ .../user-service/templates/configmap.yaml | 12 ++++ .../user-service/templates/deployment.yaml | 55 ++++++++++++++++++ .../user-service/templates/service.yaml | 13 +++++ .../ecommerce/charts/user-service/values.yaml | 16 ++++++ helm/ecommerce/charts/zipkin/Chart.yaml | 6 ++ .../charts/zipkin/templates/configmap.yaml | 10 ++++ .../charts/zipkin/templates/deployment.yaml | 27 +++++++++ .../charts/zipkin/templates/service.yaml | 16 ++++++ helm/ecommerce/charts/zipkin/values.yaml | 14 +++++ helm/ecommerce/values.yaml | 0 58 files changed, 1112 insertions(+) create mode 100644 helm/ecommerce/Chart.yaml create mode 100644 helm/ecommerce/README.md create mode 100644 helm/ecommerce/charts/api-gateway/Chart.yaml create mode 100644 helm/ecommerce/charts/api-gateway/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/api-gateway/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/api-gateway/templates/service.yaml create mode 100644 helm/ecommerce/charts/api-gateway/values.yaml create mode 100644 helm/ecommerce/charts/cloud-config/Chart.yaml create mode 100644 helm/ecommerce/charts/cloud-config/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/cloud-config/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/cloud-config/templates/service.yaml create mode 100644 helm/ecommerce/charts/cloud-config/values.yaml create mode 100644 helm/ecommerce/charts/favourite-service/Chart.yaml create mode 100644 helm/ecommerce/charts/favourite-service/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/favourite-service/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/favourite-service/templates/service.yaml create mode 100644 helm/ecommerce/charts/favourite-service/values.yaml create mode 100644 helm/ecommerce/charts/order-service/Chart.yaml create mode 100644 helm/ecommerce/charts/order-service/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/order-service/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/order-service/templates/service.yaml create mode 100644 helm/ecommerce/charts/order-service/values.yaml create mode 100644 helm/ecommerce/charts/payment-service/Chart.yaml create mode 100644 helm/ecommerce/charts/payment-service/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/payment-service/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/payment-service/templates/service.yaml create mode 100644 helm/ecommerce/charts/payment-service/values.yaml create mode 100644 helm/ecommerce/charts/product-service/Chart.yaml create mode 100644 helm/ecommerce/charts/product-service/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/product-service/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/product-service/templates/service.yaml create mode 100644 helm/ecommerce/charts/product-service/values.yaml create mode 100644 helm/ecommerce/charts/proxy-client/Chart.yaml create mode 100644 helm/ecommerce/charts/proxy-client/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/proxy-client/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/proxy-client/templates/service.yaml create mode 100644 helm/ecommerce/charts/proxy-client/values.yaml create mode 100644 helm/ecommerce/charts/service-discovery/Chart.yaml create mode 100644 helm/ecommerce/charts/service-discovery/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/service-discovery/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/service-discovery/templates/service.yaml create mode 100644 helm/ecommerce/charts/service-discovery/values.yaml create mode 100644 helm/ecommerce/charts/shipping-service/Chart.yaml create mode 100644 helm/ecommerce/charts/shipping-service/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/shipping-service/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/shipping-service/templates/service.yaml create mode 100644 helm/ecommerce/charts/shipping-service/values.yaml create mode 100644 helm/ecommerce/charts/user-service/Chart.yaml create mode 100644 helm/ecommerce/charts/user-service/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/user-service/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/user-service/templates/service.yaml create mode 100644 helm/ecommerce/charts/user-service/values.yaml create mode 100644 helm/ecommerce/charts/zipkin/Chart.yaml create mode 100644 helm/ecommerce/charts/zipkin/templates/configmap.yaml create mode 100644 helm/ecommerce/charts/zipkin/templates/deployment.yaml create mode 100644 helm/ecommerce/charts/zipkin/templates/service.yaml create mode 100644 helm/ecommerce/charts/zipkin/values.yaml create mode 100644 helm/ecommerce/values.yaml diff --git a/helm/ecommerce/Chart.yaml b/helm/ecommerce/Chart.yaml new file mode 100644 index 000000000..0c201c7b2 --- /dev/null +++ b/helm/ecommerce/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: ecommerce +description: "Umbrella Helm chart to deploy the ecommerce microservices" +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/README.md b/helm/ecommerce/README.md new file mode 100644 index 000000000..2ab3221cd --- /dev/null +++ b/helm/ecommerce/README.md @@ -0,0 +1,46 @@ +# Ecommerce Helm chart + +This umbrella Helm chart packages the microservices in this repository as subcharts. It provides a minimal, opinionated set of manifests to deploy each Spring Boot microservice. + +Quick start +1. Build and push Docker images for each microservice (the repo contains Dockerfiles per module). +2. Update `helm/ecommerce/values.yaml` with your image repository and tags, or use `--set` to override per-service values. +3. Install the chart: + +```bash +# example +helm install my-ecommerce ./helm/ecommerce -f helm/ecommerce/values.yaml +``` + +Environments and namespaces +- The chart supports three environments: `dev`, `qa`, `prod` via `global.targetEnvironment` in `values.yaml`. +- By default the chart will create namespaces defined in `global.namespaces` (dev/qa/prod). The subcharts will place resources in the namespace selected by `global.targetEnvironment`. + +Example: install to `qa` namespace set in the chart values: + +```bash +helm upgrade --install my-ecommerce ./helm/ecommerce -f helm/ecommerce/values.yaml --set global.targetEnvironment=qa +``` + +ConfigMaps and Secrets +- Each subchart reads `config` (non-sensitive) and `secrets` (sensitive) keys under its values and will create a ConfigMap and/or Secret. +- Example override in `values.yaml`: + +```yaml +product-service: + config: + SPRING_PROFILES_ACTIVE: dev + PRODUCT_DB_URL: jdbc:postgresql://db:5432/products + secrets: + PRODUCT_DB_PASSWORD: s3cr3t +``` + +The deployment will load these as environment variables (via envFrom). + +Notes +- Default container ports are set per service in `values.yaml`. Adjust if necessary. +- This is a minimal scaffold. Customize health checks, liveness/readiness probes, resource requests/limits and configmaps as needed. + +Suggested next steps +- Add `Ingress` resources or an ingress controller chart to expose `api-gateway` externally. +- Integrate with your CI to build images and run `helm upgrade --install`. diff --git a/helm/ecommerce/charts/api-gateway/Chart.yaml b/helm/ecommerce/charts/api-gateway/Chart.yaml new file mode 100644 index 000000000..00c0d285e --- /dev/null +++ b/helm/ecommerce/charts/api-gateway/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: api-gateway +description: API Gateway service +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/api-gateway/templates/configmap.yaml b/helm/ecommerce/charts/api-gateway/templates/configmap.yaml new file mode 100644 index 000000000..26c8a592c --- /dev/null +++ b/helm/ecommerce/charts/api-gateway/templates/configmap.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} + EUREKA_CLIENT_REGION: {{ .Values.config.eurekaClientRegion | quote }} + EUREKA_CLIENT_AVAILABILITY_ZONES_DEFAULT: {{ .Values.config.eurekaClientAvailabilityZonesDefault | quote }} + EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: {{ .Values.config.eurekaClientServiceUrlDefaultZone | quote }} + EUREKA_CLIENT_SERVICE_URL_MYZONE: {{ .Values.config.eurekaClientServiceUrlMyZone | quote }} + EUREKA_INSTANCE_PREFER_IP_ADDRESS: {{ .Values.config.eurekaInstancePreferIpAddress | quote }} + EUREKA_CLIENT_REGISTER_WITH_EUREKA: "true" + EUREKA_CLIENT_FETCH_REGISTRY: "true" diff --git a/helm/ecommerce/charts/api-gateway/templates/deployment.yaml b/helm/ecommerce/charts/api-gateway/templates/deployment.yaml new file mode 100644 index 000000000..c3ae0bb78 --- /dev/null +++ b/helm/ecommerce/charts/api-gateway/templates/deployment.yaml @@ -0,0 +1,47 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + initContainers: + - name: wait-for-dependencies + image: busybox:1.28 + command: + - sh + - -c + - | + echo "⏳ Waiting for Cloud Config..." + until wget -qO- http://my-ecommerce-cloud-config:9296/actuator/health > /dev/null 2>&1; do + echo "Cloud Config not ready yet..." + sleep 5 + done + echo "✔ Cloud Config is UP!" + + echo "⏳ Waiting for Eureka..." + until nc -z my-ecommerce-service-discovery 8761; do + echo "Eureka not ready yet..." + sleep 5 + done + echo "✔ Eureka is UP!" + + echo "✔ All dependencies are ready!" + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + envFrom: + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config diff --git a/helm/ecommerce/charts/api-gateway/templates/service.yaml b/helm/ecommerce/charts/api-gateway/templates/service.yaml new file mode 100644 index 000000000..cf9ba692d --- /dev/null +++ b/helm/ecommerce/charts/api-gateway/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + selector: + app: {{ .Chart.Name }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} diff --git a/helm/ecommerce/charts/api-gateway/values.yaml b/helm/ecommerce/charts/api-gateway/values.yaml new file mode 100644 index 000000000..2e591ac9a --- /dev/null +++ b/helm/ecommerce/charts/api-gateway/values.yaml @@ -0,0 +1,17 @@ +replicaCount: 1 +image: + repository: "selimhorri/api-gateway-ecommerce-boot" + tag: "0.1.0" +service: + type: ClusterIP + port: 8080 +# Configuración no sensible +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" + eurekaClientRegion: default + eurekaClientAvailabilityZonesDefault: myzone + eurekaClientServiceUrlMyZone: "http://my-ecommerce-service-discovery:8761/eureka" + eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka" + eurekaInstancePreferIpAddress: "true" \ No newline at end of file diff --git a/helm/ecommerce/charts/cloud-config/Chart.yaml b/helm/ecommerce/charts/cloud-config/Chart.yaml new file mode 100644 index 000000000..c6ee94706 --- /dev/null +++ b/helm/ecommerce/charts/cloud-config/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: cloud-config +description: Spring Cloud Config Server +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/cloud-config/templates/configmap.yaml b/helm/ecommerce/charts/cloud-config/templates/configmap.yaml new file mode 100644 index 000000000..6faa1fb96 --- /dev/null +++ b/helm/ecommerce/charts/cloud-config/templates/configmap.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + EUREKA_CLIENT_REGION: {{ .Values.config.eurekaClientRegion | quote }} + EUREKA_CLIENT_AVAILABILITYZONES_DEFAULT: {{ .Values.config.eurekaClientAvailabilityZonesDefault | quote }} + EUREKA_CLIENT_SERVICEURL_MYZONE: {{ .Values.config.eurekaClientServiceUrlMyZone | quote }} + EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: {{ .Values.config.eurekaClientServiceUrlDefaultZone | quote }} diff --git a/helm/ecommerce/charts/cloud-config/templates/deployment.yaml b/helm/ecommerce/charts/cloud-config/templates/deployment.yaml new file mode 100644 index 000000000..508f619ba --- /dev/null +++ b/helm/ecommerce/charts/cloud-config/templates/deployment.yaml @@ -0,0 +1,33 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + {{- if or .Values.config .Values.secrets }} + envFrom: + {{- if .Values.config }} + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} + {{- if .Values.secrets }} + - secretRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-secret + {{- end }} + {{- end }} diff --git a/helm/ecommerce/charts/cloud-config/templates/service.yaml b/helm/ecommerce/charts/cloud-config/templates/service.yaml new file mode 100644 index 000000000..cf9ba692d --- /dev/null +++ b/helm/ecommerce/charts/cloud-config/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + selector: + app: {{ .Chart.Name }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} diff --git a/helm/ecommerce/charts/cloud-config/values.yaml b/helm/ecommerce/charts/cloud-config/values.yaml new file mode 100644 index 000000000..54c3b01f1 --- /dev/null +++ b/helm/ecommerce/charts/cloud-config/values.yaml @@ -0,0 +1,18 @@ +replicaCount: 1 +image: + repository: "selimhorri/cloud-config-ecommerce-boot" + tag: "0.1.0" + imagePullPolicy: IfNotPresent +service: + type: ClusterIP + port: 9296 + +# Configuración no sensible +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + eurekaClientRegion: default + eurekaClientAvailabilityZonesDefault: myzone + eurekaClientServiceUrlMyZone: "http://my-ecommerce-service-discovery:8761/eureka" + eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka" + diff --git a/helm/ecommerce/charts/favourite-service/Chart.yaml b/helm/ecommerce/charts/favourite-service/Chart.yaml new file mode 100644 index 000000000..135158d93 --- /dev/null +++ b/helm/ecommerce/charts/favourite-service/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: favourite-service +description: Favourite microservice +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/favourite-service/templates/configmap.yaml b/helm/ecommerce/charts/favourite-service/templates/configmap.yaml new file mode 100644 index 000000000..d9a4e9185 --- /dev/null +++ b/helm/ecommerce/charts/favourite-service/templates/configmap.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} + EUREKA_CLIENT_REGION: {{ .Values.config.eurekaClientRegion | quote }} + EUREKA_CLIENT_AVAILABILITY_ZONES_DEFAULT: {{ .Values.config.eurekaClientAvailabilityZonesDefault | quote }} + EUREKA_CLIENT_SERVICE_URL_MYZONE: {{ .Values.config.eurekaClientServiceUrlMyZone | quote }} + EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: {{ .Values.config.eurekaClientServiceUrlDefaultZone | quote }} + EUREKA_INSTANCE_PREFER_IP_ADDRESS: {{ .Values.config.eurekaInstancePreferIpAddress | quote }} + diff --git a/helm/ecommerce/charts/favourite-service/templates/deployment.yaml b/helm/ecommerce/charts/favourite-service/templates/deployment.yaml new file mode 100644 index 000000000..a00022dc7 --- /dev/null +++ b/helm/ecommerce/charts/favourite-service/templates/deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + initContainers: + - name: wait-for-dependencies + image: busybox:1.28 + command: + - sh + - -c + - | + echo "⏳ Waiting for Cloud Config..." + until wget -qO- http://my-ecommerce-cloud-config:9296/actuator/health > /dev/null 2>&1; do + echo "Cloud Config not ready yet..." + sleep 5 + done + echo "✔ Cloud Config is UP!" + + echo "⏳ Waiting for Eureka..." + until nc -z my-ecommerce-service-discovery 8761; do + echo "Eureka not ready yet..." + sleep 5 + done + echo "✔ Eureka is UP!" + + echo "✔ All dependencies are ready!" + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + {{- if or .Values.config .Values.secrets }} + envFrom: + {{- if .Values.config }} + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} + {{- if .Values.secrets }} + - secretRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-secret + {{- end }} + {{- end }} diff --git a/helm/ecommerce/charts/favourite-service/templates/service.yaml b/helm/ecommerce/charts/favourite-service/templates/service.yaml new file mode 100644 index 000000000..cf9ba692d --- /dev/null +++ b/helm/ecommerce/charts/favourite-service/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + selector: + app: {{ .Chart.Name }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} diff --git a/helm/ecommerce/charts/favourite-service/values.yaml b/helm/ecommerce/charts/favourite-service/values.yaml new file mode 100644 index 000000000..e18df83b3 --- /dev/null +++ b/helm/ecommerce/charts/favourite-service/values.yaml @@ -0,0 +1,19 @@ +replicaCount: 1 +image: + repository: "selimhorri/favourite-service-ecommerce-boot" + tag: "0.1.0" + imagePullPolicy: IfNotPresent +service: + type: ClusterIP + port: 8800 + +# Configuración no sensible +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" + eurekaClientRegion: default + eurekaClientAvailabilityZonesDefault: myzone + eurekaClientServiceUrlMyZone: "http://my-ecommerce-service-discovery:8761/eureka" + eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka" + eurekaInstancePreferIpAddress: "true" \ No newline at end of file diff --git a/helm/ecommerce/charts/order-service/Chart.yaml b/helm/ecommerce/charts/order-service/Chart.yaml new file mode 100644 index 000000000..4118d529d --- /dev/null +++ b/helm/ecommerce/charts/order-service/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: order-service +description: Order microservice +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/order-service/templates/configmap.yaml b/helm/ecommerce/charts/order-service/templates/configmap.yaml new file mode 100644 index 000000000..9ee1d5a86 --- /dev/null +++ b/helm/ecommerce/charts/order-service/templates/configmap.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} + EUREKA_CLIENT_REGION: {{ .Values.config.eurekaClientRegion | quote }} + EUREKA_CLIENT_AVAILABILITY_ZONES_DEFAULT: {{ .Values.config.eurekaClientAvailabilityZonesDefault | quote }} + EUREKA_CLIENT_SERVICE_URL_MYZONE: {{ .Values.config.eurekaClientServiceUrlMyZone | quote }} + EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: {{ .Values.config.eurekaClientServiceUrlDefaultZone | quote }} + EUREKA_INSTANCE_PREFER_IP_ADDRESS: {{ .Values.config.eurekaInstancePreferIpAddress | quote }} diff --git a/helm/ecommerce/charts/order-service/templates/deployment.yaml b/helm/ecommerce/charts/order-service/templates/deployment.yaml new file mode 100644 index 000000000..bc060aba8 --- /dev/null +++ b/helm/ecommerce/charts/order-service/templates/deployment.yaml @@ -0,0 +1,57 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + initContainers: + - name: wait-for-dependencies + image: busybox:1.28 + command: + - sh + - -c + - | + echo "⏳ Waiting for Cloud Config..." + until wget -qO- http://my-ecommerce-cloud-config:9296/actuator/health > /dev/null 2>&1; do + echo "Cloud Config not ready yet..." + sleep 5 + done + echo "✔ Cloud Config is UP!" + + echo "⏳ Waiting for Eureka..." + until nc -z my-ecommerce-service-discovery 8761; do + echo "Eureka not ready yet..." + sleep 5 + done + echo "✔ Eureka is UP!" + + echo "✔ All dependencies are ready!" + + echo "✔ Dependencies UP!" + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + {{- if or .Values.config .Values.secrets }} + envFrom: + {{- if .Values.config }} + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} + {{- if .Values.secrets }} + - secretRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-secret + {{- end }} + {{- end }} diff --git a/helm/ecommerce/charts/order-service/templates/service.yaml b/helm/ecommerce/charts/order-service/templates/service.yaml new file mode 100644 index 000000000..cf9ba692d --- /dev/null +++ b/helm/ecommerce/charts/order-service/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + selector: + app: {{ .Chart.Name }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} diff --git a/helm/ecommerce/charts/order-service/values.yaml b/helm/ecommerce/charts/order-service/values.yaml new file mode 100644 index 000000000..a25f0cba4 --- /dev/null +++ b/helm/ecommerce/charts/order-service/values.yaml @@ -0,0 +1,19 @@ +replicaCount: 1 +image: + repository: "selimhorri/order-service-ecommerce-boot" + tag: "0.1.0" + imagePullPolicy: IfNotPresent +service: + type: ClusterIP + port: 8300 + +# Configuración no sensible +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" + eurekaClientRegion: default + eurekaClientAvailabilityZonesDefault: myzone + eurekaClientServiceUrlMyZone: "http://my-ecommerce-service-discovery:8761/eureka" + eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka" + eurekaInstancePreferIpAddress: "true" \ No newline at end of file diff --git a/helm/ecommerce/charts/payment-service/Chart.yaml b/helm/ecommerce/charts/payment-service/Chart.yaml new file mode 100644 index 000000000..17c2347c0 --- /dev/null +++ b/helm/ecommerce/charts/payment-service/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: payment-service +description: Payment microservice +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/payment-service/templates/configmap.yaml b/helm/ecommerce/charts/payment-service/templates/configmap.yaml new file mode 100644 index 000000000..39725f239 --- /dev/null +++ b/helm/ecommerce/charts/payment-service/templates/configmap.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} + EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: {{ .Values.config.eurekaClientServiceUrlDefaultZone | quote }} + EUREKA_INSTANCE_PREFER_IP_ADDRESS: {{ .Values.config.eurekaInstancePreferIpAddress | quote }} diff --git a/helm/ecommerce/charts/payment-service/templates/deployment.yaml b/helm/ecommerce/charts/payment-service/templates/deployment.yaml new file mode 100644 index 000000000..a00022dc7 --- /dev/null +++ b/helm/ecommerce/charts/payment-service/templates/deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + initContainers: + - name: wait-for-dependencies + image: busybox:1.28 + command: + - sh + - -c + - | + echo "⏳ Waiting for Cloud Config..." + until wget -qO- http://my-ecommerce-cloud-config:9296/actuator/health > /dev/null 2>&1; do + echo "Cloud Config not ready yet..." + sleep 5 + done + echo "✔ Cloud Config is UP!" + + echo "⏳ Waiting for Eureka..." + until nc -z my-ecommerce-service-discovery 8761; do + echo "Eureka not ready yet..." + sleep 5 + done + echo "✔ Eureka is UP!" + + echo "✔ All dependencies are ready!" + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + {{- if or .Values.config .Values.secrets }} + envFrom: + {{- if .Values.config }} + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} + {{- if .Values.secrets }} + - secretRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-secret + {{- end }} + {{- end }} diff --git a/helm/ecommerce/charts/payment-service/templates/service.yaml b/helm/ecommerce/charts/payment-service/templates/service.yaml new file mode 100644 index 000000000..cf9ba692d --- /dev/null +++ b/helm/ecommerce/charts/payment-service/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + selector: + app: {{ .Chart.Name }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} diff --git a/helm/ecommerce/charts/payment-service/values.yaml b/helm/ecommerce/charts/payment-service/values.yaml new file mode 100644 index 000000000..db04d152b --- /dev/null +++ b/helm/ecommerce/charts/payment-service/values.yaml @@ -0,0 +1,16 @@ +replicaCount: 1 +image: + repository: "selimhorri/payment-service-ecommerce-boot" + tag: "0.1.0" + imagePullPolicy: IfNotPresent +service: + type: ClusterIP + port: 8400 + +# Configuración no sensible +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" + eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka/" + eurekaInstancePreferIpAddress: "true" diff --git a/helm/ecommerce/charts/product-service/Chart.yaml b/helm/ecommerce/charts/product-service/Chart.yaml new file mode 100644 index 000000000..0b38b62f8 --- /dev/null +++ b/helm/ecommerce/charts/product-service/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: product-service +description: Product microservice +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/product-service/templates/configmap.yaml b/helm/ecommerce/charts/product-service/templates/configmap.yaml new file mode 100644 index 000000000..610cf135e --- /dev/null +++ b/helm/ecommerce/charts/product-service/templates/configmap.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} + EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: {{ .Values.config.eurekaClientServiceUrlDefaultZone | quote }} + EUREKA_INSTANCE_HOSTNAME: {{ .Values.config.eurekaInstanceHostname | quote }} + EUREKA_INSTANCE_PREFER_IP_ADDRESS: {{ .Values.config.eurekaInstancePreferIpAddress | quote }} diff --git a/helm/ecommerce/charts/product-service/templates/deployment.yaml b/helm/ecommerce/charts/product-service/templates/deployment.yaml new file mode 100644 index 000000000..a00022dc7 --- /dev/null +++ b/helm/ecommerce/charts/product-service/templates/deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + initContainers: + - name: wait-for-dependencies + image: busybox:1.28 + command: + - sh + - -c + - | + echo "⏳ Waiting for Cloud Config..." + until wget -qO- http://my-ecommerce-cloud-config:9296/actuator/health > /dev/null 2>&1; do + echo "Cloud Config not ready yet..." + sleep 5 + done + echo "✔ Cloud Config is UP!" + + echo "⏳ Waiting for Eureka..." + until nc -z my-ecommerce-service-discovery 8761; do + echo "Eureka not ready yet..." + sleep 5 + done + echo "✔ Eureka is UP!" + + echo "✔ All dependencies are ready!" + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + {{- if or .Values.config .Values.secrets }} + envFrom: + {{- if .Values.config }} + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} + {{- if .Values.secrets }} + - secretRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-secret + {{- end }} + {{- end }} diff --git a/helm/ecommerce/charts/product-service/templates/service.yaml b/helm/ecommerce/charts/product-service/templates/service.yaml new file mode 100644 index 000000000..cf9ba692d --- /dev/null +++ b/helm/ecommerce/charts/product-service/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + selector: + app: {{ .Chart.Name }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} diff --git a/helm/ecommerce/charts/product-service/values.yaml b/helm/ecommerce/charts/product-service/values.yaml new file mode 100644 index 000000000..32ba57e0a --- /dev/null +++ b/helm/ecommerce/charts/product-service/values.yaml @@ -0,0 +1,18 @@ +replicaCount: 1 +image: + repository: "selimhorri/product-service-ecommerce-boot" + tag: "0.1.0" + imagePullPolicy: IfNotPresent +service: + type: ClusterIP + port: 8500 + +# Configuración no sensible +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" + eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka/" + eurekaInstanceHostname: product-service-container + eurekaInstancePreferIpAddress: "false" + diff --git a/helm/ecommerce/charts/proxy-client/Chart.yaml b/helm/ecommerce/charts/proxy-client/Chart.yaml new file mode 100644 index 000000000..0218fb9b3 --- /dev/null +++ b/helm/ecommerce/charts/proxy-client/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: proxy-client +description: Proxy client microservice +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/proxy-client/templates/configmap.yaml b/helm/ecommerce/charts/proxy-client/templates/configmap.yaml new file mode 100644 index 000000000..39725f239 --- /dev/null +++ b/helm/ecommerce/charts/proxy-client/templates/configmap.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} + EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: {{ .Values.config.eurekaClientServiceUrlDefaultZone | quote }} + EUREKA_INSTANCE_PREFER_IP_ADDRESS: {{ .Values.config.eurekaInstancePreferIpAddress | quote }} diff --git a/helm/ecommerce/charts/proxy-client/templates/deployment.yaml b/helm/ecommerce/charts/proxy-client/templates/deployment.yaml new file mode 100644 index 000000000..a00022dc7 --- /dev/null +++ b/helm/ecommerce/charts/proxy-client/templates/deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + initContainers: + - name: wait-for-dependencies + image: busybox:1.28 + command: + - sh + - -c + - | + echo "⏳ Waiting for Cloud Config..." + until wget -qO- http://my-ecommerce-cloud-config:9296/actuator/health > /dev/null 2>&1; do + echo "Cloud Config not ready yet..." + sleep 5 + done + echo "✔ Cloud Config is UP!" + + echo "⏳ Waiting for Eureka..." + until nc -z my-ecommerce-service-discovery 8761; do + echo "Eureka not ready yet..." + sleep 5 + done + echo "✔ Eureka is UP!" + + echo "✔ All dependencies are ready!" + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + {{- if or .Values.config .Values.secrets }} + envFrom: + {{- if .Values.config }} + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} + {{- if .Values.secrets }} + - secretRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-secret + {{- end }} + {{- end }} diff --git a/helm/ecommerce/charts/proxy-client/templates/service.yaml b/helm/ecommerce/charts/proxy-client/templates/service.yaml new file mode 100644 index 000000000..cf9ba692d --- /dev/null +++ b/helm/ecommerce/charts/proxy-client/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + selector: + app: {{ .Chart.Name }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} diff --git a/helm/ecommerce/charts/proxy-client/values.yaml b/helm/ecommerce/charts/proxy-client/values.yaml new file mode 100644 index 000000000..4b2301974 --- /dev/null +++ b/helm/ecommerce/charts/proxy-client/values.yaml @@ -0,0 +1,14 @@ +replicaCount: 1 +image: + repository: "selimhorri/proxy-client-ecommerce-boot" + tag: "0.1.0" +service: + type: ClusterIP + port: 8900 + +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" + eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka/" + eurekaInstancePreferIpAddress: "true" \ No newline at end of file diff --git a/helm/ecommerce/charts/service-discovery/Chart.yaml b/helm/ecommerce/charts/service-discovery/Chart.yaml new file mode 100644 index 000000000..8a8bfcd02 --- /dev/null +++ b/helm/ecommerce/charts/service-discovery/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: service-discovery +description: Eureka service-discovery +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/service-discovery/templates/configmap.yaml b/helm/ecommerce/charts/service-discovery/templates/configmap.yaml new file mode 100644 index 000000000..002478556 --- /dev/null +++ b/helm/ecommerce/charts/service-discovery/templates/configmap.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} diff --git a/helm/ecommerce/charts/service-discovery/templates/deployment.yaml b/helm/ecommerce/charts/service-discovery/templates/deployment.yaml new file mode 100644 index 000000000..583726342 --- /dev/null +++ b/helm/ecommerce/charts/service-discovery/templates/deployment.yaml @@ -0,0 +1,27 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.targetPort }} + {{- if .Values.config }} + envFrom: + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} diff --git a/helm/ecommerce/charts/service-discovery/templates/service.yaml b/helm/ecommerce/charts/service-discovery/templates/service.yaml new file mode 100644 index 000000000..247a2c532 --- /dev/null +++ b/helm/ecommerce/charts/service-discovery/templates/service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + type: {{ .Values.service.type }} + selector: + app: {{ .Chart.Name }} + ports: + - protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.targetPort }} diff --git a/helm/ecommerce/charts/service-discovery/values.yaml b/helm/ecommerce/charts/service-discovery/values.yaml new file mode 100644 index 000000000..34c237ed5 --- /dev/null +++ b/helm/ecommerce/charts/service-discovery/values.yaml @@ -0,0 +1,16 @@ +replicaCount: 1 + +image: + repository: "selimhorri/service-discovery-ecommerce-boot" + tag: "0.1.0" + imagePullPolicy: IfNotPresent + +service: + type: LoadBalancer + port: 8761 + targetPort: 8761 + +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" diff --git a/helm/ecommerce/charts/shipping-service/Chart.yaml b/helm/ecommerce/charts/shipping-service/Chart.yaml new file mode 100644 index 000000000..30b7bd7a2 --- /dev/null +++ b/helm/ecommerce/charts/shipping-service/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: shipping-service +description: Shipping microservice +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/shipping-service/templates/configmap.yaml b/helm/ecommerce/charts/shipping-service/templates/configmap.yaml new file mode 100644 index 000000000..75b2fbcec --- /dev/null +++ b/helm/ecommerce/charts/shipping-service/templates/configmap.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} + EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: {{ .Values.config.eurekaClientServiceUrlDefaultZone | quote }} + EUREKA_INSTANCE_PREFER_IP_ADDRESS: {{ .Values.config.eurekaInstancePreferIpAddress | quote }} + diff --git a/helm/ecommerce/charts/shipping-service/templates/deployment.yaml b/helm/ecommerce/charts/shipping-service/templates/deployment.yaml new file mode 100644 index 000000000..a00022dc7 --- /dev/null +++ b/helm/ecommerce/charts/shipping-service/templates/deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + initContainers: + - name: wait-for-dependencies + image: busybox:1.28 + command: + - sh + - -c + - | + echo "⏳ Waiting for Cloud Config..." + until wget -qO- http://my-ecommerce-cloud-config:9296/actuator/health > /dev/null 2>&1; do + echo "Cloud Config not ready yet..." + sleep 5 + done + echo "✔ Cloud Config is UP!" + + echo "⏳ Waiting for Eureka..." + until nc -z my-ecommerce-service-discovery 8761; do + echo "Eureka not ready yet..." + sleep 5 + done + echo "✔ Eureka is UP!" + + echo "✔ All dependencies are ready!" + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + {{- if or .Values.config .Values.secrets }} + envFrom: + {{- if .Values.config }} + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} + {{- if .Values.secrets }} + - secretRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-secret + {{- end }} + {{- end }} diff --git a/helm/ecommerce/charts/shipping-service/templates/service.yaml b/helm/ecommerce/charts/shipping-service/templates/service.yaml new file mode 100644 index 000000000..cf9ba692d --- /dev/null +++ b/helm/ecommerce/charts/shipping-service/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + selector: + app: {{ .Chart.Name }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} diff --git a/helm/ecommerce/charts/shipping-service/values.yaml b/helm/ecommerce/charts/shipping-service/values.yaml new file mode 100644 index 000000000..b54896f40 --- /dev/null +++ b/helm/ecommerce/charts/shipping-service/values.yaml @@ -0,0 +1,16 @@ +replicaCount: 1 +image: + repository: "selimhorri/shipping-service-ecommerce-boot" + tag: "0.1.0" + imagePullPolicy: IfNotPresent +service: + type: ClusterIP + port: 8600 + +# Configuración no sensible +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" + eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka/" + eurekaInstancePreferIpAddress: "true" \ No newline at end of file diff --git a/helm/ecommerce/charts/user-service/Chart.yaml b/helm/ecommerce/charts/user-service/Chart.yaml new file mode 100644 index 000000000..37aa651d0 --- /dev/null +++ b/helm/ecommerce/charts/user-service/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: user-service +description: User microservice +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/user-service/templates/configmap.yaml b/helm/ecommerce/charts/user-service/templates/configmap.yaml new file mode 100644 index 000000000..39725f239 --- /dev/null +++ b/helm/ecommerce/charts/user-service/templates/configmap.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} + EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: {{ .Values.config.eurekaClientServiceUrlDefaultZone | quote }} + EUREKA_INSTANCE_PREFER_IP_ADDRESS: {{ .Values.config.eurekaInstancePreferIpAddress | quote }} diff --git a/helm/ecommerce/charts/user-service/templates/deployment.yaml b/helm/ecommerce/charts/user-service/templates/deployment.yaml new file mode 100644 index 000000000..a00022dc7 --- /dev/null +++ b/helm/ecommerce/charts/user-service/templates/deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + initContainers: + - name: wait-for-dependencies + image: busybox:1.28 + command: + - sh + - -c + - | + echo "⏳ Waiting for Cloud Config..." + until wget -qO- http://my-ecommerce-cloud-config:9296/actuator/health > /dev/null 2>&1; do + echo "Cloud Config not ready yet..." + sleep 5 + done + echo "✔ Cloud Config is UP!" + + echo "⏳ Waiting for Eureka..." + until nc -z my-ecommerce-service-discovery 8761; do + echo "Eureka not ready yet..." + sleep 5 + done + echo "✔ Eureka is UP!" + + echo "✔ All dependencies are ready!" + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + {{- if or .Values.config .Values.secrets }} + envFrom: + {{- if .Values.config }} + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} + {{- if .Values.secrets }} + - secretRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-secret + {{- end }} + {{- end }} diff --git a/helm/ecommerce/charts/user-service/templates/service.yaml b/helm/ecommerce/charts/user-service/templates/service.yaml new file mode 100644 index 000000000..cf9ba692d --- /dev/null +++ b/helm/ecommerce/charts/user-service/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + selector: + app: {{ .Chart.Name }} + ports: + - name: http + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} diff --git a/helm/ecommerce/charts/user-service/values.yaml b/helm/ecommerce/charts/user-service/values.yaml new file mode 100644 index 000000000..f3652675b --- /dev/null +++ b/helm/ecommerce/charts/user-service/values.yaml @@ -0,0 +1,16 @@ +replicaCount: 1 +image: + repository: "selimhorri/user-service-ecommerce-boot" + tag: "0.1.0" + imagePullPolicy: IfNotPresent +service: + type: ClusterIP + port: 8700 + +# Configuración no sensible +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" + eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka/" + eurekaInstancePreferIpAddress: "true" diff --git a/helm/ecommerce/charts/zipkin/Chart.yaml b/helm/ecommerce/charts/zipkin/Chart.yaml new file mode 100644 index 000000000..328c26da2 --- /dev/null +++ b/helm/ecommerce/charts/zipkin/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: zipkin +description: User microservice +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/ecommerce/charts/zipkin/templates/configmap.yaml b/helm/ecommerce/charts/zipkin/templates/configmap.yaml new file mode 100644 index 000000000..002478556 --- /dev/null +++ b/helm/ecommerce/charts/zipkin/templates/configmap.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + labels: + app: {{ .Chart.Name }} +data: + SPRING_PROFILES_ACTIVE: {{ .Values.config.springProfilesActive | quote }} + SPRING_ZIPKIN_BASE_URL: {{ .Values.config.springZipkinBaseUrl | quote }} + SPRING_CONFIG_IMPORT: {{ .Values.config.springConfigImport | quote }} diff --git a/helm/ecommerce/charts/zipkin/templates/deployment.yaml b/helm/ecommerce/charts/zipkin/templates/deployment.yaml new file mode 100644 index 000000000..fcd32a5a2 --- /dev/null +++ b/helm/ecommerce/charts/zipkin/templates/deployment.yaml @@ -0,0 +1,27 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount | default 1 }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy | default "IfNotPresent" }} + ports: + - containerPort: {{ .Values.service.port }} + {{- if .Values.config }} + envFrom: + - configMapRef: + name: {{ .Release.Name }}-{{ .Chart.Name }}-config + {{- end }} \ No newline at end of file diff --git a/helm/ecommerce/charts/zipkin/templates/service.yaml b/helm/ecommerce/charts/zipkin/templates/service.yaml new file mode 100644 index 000000000..a74b23741 --- /dev/null +++ b/helm/ecommerce/charts/zipkin/templates/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + type: {{ .Values.service.type | default "ClusterIP" }} + ports: + - port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} + protocol: TCP + name: http + selector: + app: {{ .Chart.Name }} + diff --git a/helm/ecommerce/charts/zipkin/values.yaml b/helm/ecommerce/charts/zipkin/values.yaml new file mode 100644 index 000000000..0355287ae --- /dev/null +++ b/helm/ecommerce/charts/zipkin/values.yaml @@ -0,0 +1,14 @@ +replicaCount: 1 +image: + repository: "openzipkin/zipkin" + tag: "latest" + imagePullPolicy: IfNotPresent +service: + type: ClusterIP + port: 9411 + +# Configuración no sensible +config: + springProfilesActive: dev + springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" + springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" diff --git a/helm/ecommerce/values.yaml b/helm/ecommerce/values.yaml new file mode 100644 index 000000000..e69de29bb From bac0777af369fa5d80cffc0af8bc2b1d6ad64baf Mon Sep 17 00:00:00 2001 From: Barcino44 Date: Sun, 16 Nov 2025 23:28:11 -0500 Subject: [PATCH 3/5] fix: Documentation --- README.md | 621 ------------------------------------------------------ 1 file changed, 621 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index bbb5346d2..000000000 --- a/README.md +++ /dev/null @@ -1,621 +0,0 @@ -# e-Commerce-boot μServices - -## Important Note: This project's new milestone is to move The whole system to work on Kubernetes, so stay tuned. - - -## Introduction -- This project is a development of a small set of **Spring Boot** and **Cloud** based Microservices projects that implement cloud-native intuitive, Reactive Programming, Event-driven, Microservices design patterns, and coding best practices. -- The project follows **CloudNative** recommendations and The [**twelve-factor app**](https://12factor.net/) methodology for building *software-as-a-service apps* to show how μServices should be developed and deployed. -- This project uses cutting edge technologies like Docker, Kubernetes, Elasticsearch Stack for - logging and monitoring, Java SE 11, H2, and MySQL databases, all components developed with TDD in mind, covering integration & performance testing, and many more. - - This project is going to be developed as stages, and all such stage steps are documented under - the project **e-Commerce-boot μServices** **README** file . ---- -## Getting started -### System components Structure -Let's explain first the system structure to understand its components: -``` -ecommerce-microservice-backend-app [μService] --> Parent folder. -|- docs --> All docs and diagrams. -|- k8s --> All **Kubernetes** config files. - |- proxy-client --> Authentication & Authorization µService, exposing all - |- api-gateway --> API Gateway server - |- service-discovery --> Service Registery server - |- cloud-config --> Centralized Configuration server - |- user-service --> Manage app users (customers & admins) as well as their credentials - |- product-service --> Manage app products and their respective categories - |- favourite-service --> Manage app users' favourite products added to their own favourite list - |- order-service --> Manage app orders based on carts - |- shipping-service --> Manage app order-shipping products - |- payment-service --> Manage app order payments -|- compose.yml --> contains all services landscape with Kafka -|- run-em-all.sh --> Run all microservices in separate mode. -|- setup.sh --> Install all shared POMs and shared libraries. -|- stop-em-all.sh --> Stop all services runs in standalone mode. -|- test-em-all.sh --> This will start all docker compose landscape and test them, then shutdown docker compose containers with test finishes (use switch start stop) -``` -Now, as we have learned about different system components, then let's start. - -### System Boundary *Architecture* - μServices Landscape - -![System Boundary](app-architecture.drawio.png) - -### Required software - -The following are the initially required software pieces: - -1. **Java 11**: JDK 11 LTS can be downloaded and installed from https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html - -1. **Git**: it can be downloaded and installed from https://git-scm.com/downloads - -1. **Maven**: Apache Maven is a software project management and comprehension tool, it can be downloaded from here https://maven.apache.org/download.cgi - -1. **curl**: this command-line tool for testing HTTP-based APIs can be downloaded and installed from https://curl.haxx.se/download.html - -1. **jq**: This command-line JSON processor can be downloaded and installed from https://stedolan.github.io/jq/download/ - -1. **Spring Boot Initializer**: This *Initializer* generates *spring* boot project with just what you need to start quickly! Start from here https://start.spring.io/ - -1. **Docker**: The fastest way to containerize applications on your desktop, and you can download it from here [https://www.docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop) - -1. **Kubernetes**: We can install **minikube** for testing puposes https://minikube.sigs.k8s.io/docs/start/ - - > For each future stage, I will list the newly required software. - -Follow the installation guide for each software website link and check your software versions from the command line to verify that they are all installed correctly. - -## Using an IDE - -I recommend that you work with your Java code using an IDE that supports the development of Spring Boot applications such as Spring Tool Suite or IntelliJ IDEA Ultimate Edition. So you can use the Spring Boot Dashboard to run the services, run each microservice test case, and many more. - -All that you want to do is just fire up your IDE **->** open or import the parent folder `ecommerce-microservice-backend-app`, and everything will be ready for you. - -## Data Model -### Entity-Relationship-Diagram -![System Boundary](ecommerce-ERD.drawio.png) - -## Playing With e-Commerce-boot Project - -### Cloning It - -The first thing to do is to open **git bash** command line, and then simply you can clone the project under any of your favorite places as the following: - -```bash -> git clone https://github.com/SelimHorri/ecommerce-microservice-backend-app.git -``` - -### Build & Test Them In Isolation - -To build and run the test cases for each service & shared modules in the project, we need to do the following: - -#### Build & Test µServices -Now it is the time to build our **10 microservices** and run each service integration test in - isolation by running the following commands: - -```bash -selim@:~/ecommerce-microservice-backend-app$ ./mvnw clean package -``` - -All build commands and test suite for each microservice should run successfully, and the final output should be like this: - -```bash ----------------< com.selimhorri.app:ecommerce-microservice-backend >----------- -[INFO] ------------------------------------------------------------------------ -[INFO] Reactor Summary for ecommerce-microservice-backend 0.1.0: -[INFO] -[INFO] ecommerce-microservice-backend ..................... SUCCESS [ 0.548 s] -[INFO] service-discovery .................................. SUCCESS [ 3.126 s] -[INFO] cloud-config ....................................... SUCCESS [ 1.595 s] -[INFO] api-gateway ........................................ SUCCESS [ 1.697 s] -[INFO] proxy-client ....................................... SUCCESS [ 3.632 s] -[INFO] user-service ....................................... SUCCESS [ 2.546 s] -[INFO] product-service .................................... SUCCESS [ 2.214 s] -[INFO] favourite-service .................................. SUCCESS [ 2.072 s] -[INFO] order-service ...................................... SUCCESS [ 2.241 s] -[INFO] shipping-service ................................... SUCCESS [ 2.197 s] -[INFO] payment-service .................................... SUCCESS [ 2.006 s] -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 24.156 s -[INFO] Finished at: 2021-12-29T19:52:57+01:00 -[INFO] ------------------------------------------------------------------------ -``` - -### Running Them All -Now it's the time to run all of our Microservices, and it's straightforward just run the following `docker-compose` commands: - -```bash -selim@:~/ecommerce-microservice-backend-app$ docker-compose -f compose.yml up -``` - -All the **services**, **databases**, and **messaging service** will run in parallel in detach mode (option `-d`), and command output will print to the console the following: - -```bash -Creating network "ecommerce-microservice-backend-app_default" with the default driver -Creating ecommerce-microservice-backend-app_api-gateway-container_1 ... done -Creating ecommerce-microservice-backend-app_favourite-service-container_1 ... done -Creating ecommerce-microservice-backend-app_service-discovery-container_1 ... done -Creating ecommerce-microservice-backend-app_shipping-service-container_1 ... done -Creating ecommerce-microservice-backend-app_order-service-container_1 ... done -Creating ecommerce-microservice-backend-app_user-service-container_1 ... done -Creating ecommerce-microservice-backend-app_payment-service-container_1 ... done -Creating ecommerce-microservice-backend-app_product-service-container_1 ... done -Creating ecommerce-microservice-backend-app_proxy-client-container_1 ... done -Creating ecommerce-microservice-backend-app_zipkin-container_1 ... done -Creating ecommerce-microservice-backend-app_cloud-config-container_1 ... done -``` -### Access proxy-client APIs -You can manually test `proxy-client` APIs throughout its **Swagger** interface at the following - URL [https://localhost:8900/swagger-ui.html](https://localhost:8900/swagger-ui.html). -### Access Service Discovery Server (Eureka) -If you would like to access the Eureka service discovery point to this URL [http://localhosts:8761/eureka](https://localhost:8761/eureka) to see all the services registered inside it. - -### Access user-service APIs - URL [https://localhost:8700/swagger-ui.html](https://localhost:8700/swagger-ui.html). - - -The **API Gateway** and **Store Service** both act as a *resource server*. - -#### Check all **Spring Boot Actuator** exposed metrics http://localhost:8080/app/actuator/metrics: - -```bash -{ - "names": [ - "http.server.requests", - "jvm.buffer.count", - "jvm.buffer.memory.used", - "jvm.buffer.total.capacity", - "jvm.classes.loaded", - "jvm.classes.unloaded", - "jvm.gc.live.data.size", - "jvm.gc.max.data.size", - "jvm.gc.memory.allocated", - "jvm.gc.memory.promoted", - "jvm.gc.pause", - "jvm.memory.committed", - "jvm.memory.max", - "jvm.memory.used", - "jvm.threads.daemon", - "jvm.threads.live", - "jvm.threads.peak", - "jvm.threads.states", - "logback.events", - "process.cpu.usage", - "process.files.max", - "process.files.open", - "process.start.time", - "process.uptime", - "resilience4j.circuitbreaker.buffered.calls", - "resilience4j.circuitbreaker.calls", - "resilience4j.circuitbreaker.failure.rate", - "resilience4j.circuitbreaker.not.permitted.calls", - "resilience4j.circuitbreaker.slow.call.rate", - "resilience4j.circuitbreaker.slow.calls", - "resilience4j.circuitbreaker.state", - "system.cpu.count", - "system.cpu.usage", - "system.load.average.1m", - "tomcat.sessions.active.current", - "tomcat.sessions.active.max", - "tomcat.sessions.alive.max", - "tomcat.sessions.created", - "tomcat.sessions.expired", - "tomcat.sessions.rejected", - "zipkin.reporter.messages", - "zipkin.reporter.messages.dropped", - "zipkin.reporter.messages.total", - "zipkin.reporter.queue.bytes", - "zipkin.reporter.queue.spans", - "zipkin.reporter.spans", - "zipkin.reporter.spans.dropped", - "zipkin.reporter.spans.total" - ] -} -``` - -#### Prometheus exposed metrics at http://localhost:8080/app/actuator/prometheus - -```bash -# HELP resilience4j_circuitbreaker_not_permitted_calls_total Total number of not permitted calls -# TYPE resilience4j_circuitbreaker_not_permitted_calls_total counter -resilience4j_circuitbreaker_not_permitted_calls_total{kind="not_permitted",name="proxyService",} 0.0 -# HELP jvm_gc_live_data_size_bytes Size of long-lived heap memory pool after reclamation -# TYPE jvm_gc_live_data_size_bytes gauge -jvm_gc_live_data_size_bytes 3721880.0 -# HELP jvm_gc_pause_seconds Time spent in GC pause -# TYPE jvm_gc_pause_seconds summary -jvm_gc_pause_seconds_count{action="end of minor GC",cause="Metadata GC Threshold",} 1.0 -jvm_gc_pause_seconds_sum{action="end of minor GC",cause="Metadata GC Threshold",} 0.071 -jvm_gc_pause_seconds_count{action="end of minor GC",cause="G1 Evacuation Pause",} 6.0 -jvm_gc_pause_seconds_sum{action="end of minor GC",cause="G1 Evacuation Pause",} 0.551 -# HELP jvm_gc_pause_seconds_max Time spent in GC pause -# TYPE jvm_gc_pause_seconds_max gauge -jvm_gc_pause_seconds_max{action="end of minor GC",cause="Metadata GC Threshold",} 0.071 -jvm_gc_pause_seconds_max{action="end of minor GC",cause="G1 Evacuation Pause",} 0.136 -# HELP system_cpu_usage The "recent cpu usage" for the whole system -# TYPE system_cpu_usage gauge -system_cpu_usage 0.4069206655413552 -# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool -# TYPE jvm_buffer_total_capacity_bytes gauge -jvm_buffer_total_capacity_bytes{id="mapped",} 0.0 -jvm_buffer_total_capacity_bytes{id="direct",} 24576.0 -# HELP zipkin_reporter_spans_dropped_total Spans dropped (failed to report) -# TYPE zipkin_reporter_spans_dropped_total counter -zipkin_reporter_spans_dropped_total 4.0 -# HELP zipkin_reporter_spans_bytes_total Total bytes of encoded spans reported -# TYPE zipkin_reporter_spans_bytes_total counter -zipkin_reporter_spans_bytes_total 1681.0 -# HELP tomcat_sessions_active_current_sessions -# TYPE tomcat_sessions_active_current_sessions gauge -tomcat_sessions_active_current_sessions 0.0 -# HELP jvm_classes_loaded_classes The number of classes that are currently loaded in the Java virtual machine -# TYPE jvm_classes_loaded_classes gauge -jvm_classes_loaded_classes 13714.0 -# HELP process_files_open_files The open file descriptor count -# TYPE process_files_open_files gauge -process_files_open_files 17.0 -# HELP resilience4j_circuitbreaker_slow_call_rate The slow call of the circuit breaker -# TYPE resilience4j_circuitbreaker_slow_call_rate gauge -resilience4j_circuitbreaker_slow_call_rate{name="proxyService",} -1.0 -# HELP system_cpu_count The number of processors available to the Java virtual machine -# TYPE system_cpu_count gauge -system_cpu_count 8.0 -# HELP jvm_threads_daemon_threads The current number of live daemon threads -# TYPE jvm_threads_daemon_threads gauge -jvm_threads_daemon_threads 21.0 -# HELP zipkin_reporter_messages_total Messages reported (or attempted to be reported) -# TYPE zipkin_reporter_messages_total counter -zipkin_reporter_messages_total 2.0 -# HELP zipkin_reporter_messages_dropped_total -# TYPE zipkin_reporter_messages_dropped_total counter -zipkin_reporter_messages_dropped_total{cause="ResourceAccessException",} 2.0 -# HELP zipkin_reporter_messages_bytes_total Total bytes of messages reported -# TYPE zipkin_reporter_messages_bytes_total counter -zipkin_reporter_messages_bytes_total 1368.0 -# HELP http_server_requests_seconds -# TYPE http_server_requests_seconds summary -http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 1.0 -http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 1.339804427 -http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 1.0 -http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.053689381 -# HELP http_server_requests_seconds_max -# TYPE http_server_requests_seconds_max gauge -http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 1.339804427 -http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.053689381 -# HELP resilience4j_circuitbreaker_slow_calls The number of slow successful which were slower than a certain threshold -# TYPE resilience4j_circuitbreaker_slow_calls gauge -resilience4j_circuitbreaker_slow_calls{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_slow_calls{kind="failed",name="proxyService",} 0.0 -# HELP jvm_classes_unloaded_classes_total The total number of classes unloaded since the Java virtual machine has started execution -# TYPE jvm_classes_unloaded_classes_total counter -jvm_classes_unloaded_classes_total 0.0 -# HELP process_files_max_files The maximum file descriptor count -# TYPE process_files_max_files gauge -process_files_max_files 1048576.0 -# HELP resilience4j_circuitbreaker_calls_seconds Total number of successful calls -# TYPE resilience4j_circuitbreaker_calls_seconds summary -resilience4j_circuitbreaker_calls_seconds_count{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_sum{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_count{kind="failed",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_sum{kind="failed",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_count{kind="ignored",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_sum{kind="ignored",name="proxyService",} 0.0 -# HELP resilience4j_circuitbreaker_calls_seconds_max Total number of successful calls -# TYPE resilience4j_circuitbreaker_calls_seconds_max gauge -resilience4j_circuitbreaker_calls_seconds_max{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_max{kind="failed",name="proxyService",} 0.0 -resilience4j_circuitbreaker_calls_seconds_max{kind="ignored",name="proxyService",} 0.0 -# HELP zipkin_reporter_spans_total Spans reported -# TYPE zipkin_reporter_spans_total counter -zipkin_reporter_spans_total 5.0 -# HELP zipkin_reporter_queue_bytes Total size of all encoded spans queued for reporting -# TYPE zipkin_reporter_queue_bytes gauge -zipkin_reporter_queue_bytes 0.0 -# HELP tomcat_sessions_expired_sessions_total -# TYPE tomcat_sessions_expired_sessions_total counter -tomcat_sessions_expired_sessions_total 0.0 -# HELP tomcat_sessions_alive_max_seconds -# TYPE tomcat_sessions_alive_max_seconds gauge -tomcat_sessions_alive_max_seconds 0.0 -# HELP process_uptime_seconds The uptime of the Java virtual machine -# TYPE process_uptime_seconds gauge -process_uptime_seconds 224.402 -# HELP tomcat_sessions_active_max_sessions -# TYPE tomcat_sessions_active_max_sessions gauge -tomcat_sessions_active_max_sessions 0.0 -# HELP process_cpu_usage The "recent cpu usage" for the Java Virtual Machine process -# TYPE process_cpu_usage gauge -process_cpu_usage 5.625879043600563E-4 -# HELP jvm_gc_memory_promoted_bytes_total Count of positive increases in the size of the old generation memory pool before GC to after GC -# TYPE jvm_gc_memory_promoted_bytes_total counter -jvm_gc_memory_promoted_bytes_total 1.7851088E7 -# HELP logback_events_total Number of error level events that made it to the logs -# TYPE logback_events_total counter -logback_events_total{level="warn",} 5.0 -logback_events_total{level="debug",} 79.0 -logback_events_total{level="error",} 0.0 -logback_events_total{level="trace",} 0.0 -logback_events_total{level="info",} 60.0 -# HELP tomcat_sessions_created_sessions_total -# TYPE tomcat_sessions_created_sessions_total counter -tomcat_sessions_created_sessions_total 0.0 -# HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads -# TYPE jvm_threads_live_threads gauge -jvm_threads_live_threads 25.0 -# HELP jvm_threads_states_threads The current number of threads having NEW state -# TYPE jvm_threads_states_threads gauge -jvm_threads_states_threads{state="runnable",} 6.0 -jvm_threads_states_threads{state="blocked",} 0.0 -jvm_threads_states_threads{state="waiting",} 8.0 -jvm_threads_states_threads{state="timed-waiting",} 11.0 -jvm_threads_states_threads{state="new",} 0.0 -jvm_threads_states_threads{state="terminated",} 0.0 -# HELP tomcat_sessions_rejected_sessions_total -# TYPE tomcat_sessions_rejected_sessions_total counter -tomcat_sessions_rejected_sessions_total 0.0 -# HELP process_start_time_seconds Start time of the process since unix epoch. -# TYPE process_start_time_seconds gauge -process_start_time_seconds 1.64088634006E9 -# HELP resilience4j_circuitbreaker_buffered_calls The number of buffered failed calls stored in the ring buffer -# TYPE resilience4j_circuitbreaker_buffered_calls gauge -resilience4j_circuitbreaker_buffered_calls{kind="successful",name="proxyService",} 0.0 -resilience4j_circuitbreaker_buffered_calls{kind="failed",name="proxyService",} 0.0 -# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management -# TYPE jvm_memory_max_bytes gauge -jvm_memory_max_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.22908672E8 -jvm_memory_max_bytes{area="heap",id="G1 Survivor Space",} -1.0 -jvm_memory_max_bytes{area="heap",id="G1 Old Gen",} 5.182062592E9 -jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0 -jvm_memory_max_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 5836800.0 -jvm_memory_max_bytes{area="heap",id="G1 Eden Space",} -1.0 -jvm_memory_max_bytes{area="nonheap",id="Compressed Class Space",} 1.073741824E9 -jvm_memory_max_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 1.22912768E8 -# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use -# TYPE jvm_memory_committed_bytes gauge -jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.6646144E7 -jvm_memory_committed_bytes{area="heap",id="G1 Survivor Space",} 2.4117248E7 -jvm_memory_committed_bytes{area="heap",id="G1 Old Gen",} 1.7301504E8 -jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 7.6857344E7 -jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 2555904.0 -jvm_memory_committed_bytes{area="heap",id="G1 Eden Space",} 2.71581184E8 -jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 1.0354688E7 -jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 6619136.0 -# HELP jvm_memory_used_bytes The amount of used memory -# TYPE jvm_memory_used_bytes gauge -jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.6585088E7 -jvm_memory_used_bytes{area="heap",id="G1 Survivor Space",} 2.4117248E7 -jvm_memory_used_bytes{area="heap",id="G1 Old Gen",} 2.0524392E7 -jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 7.4384552E7 -jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 1261696.0 -jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 2.5165824E7 -jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 9365664.0 -jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 6604416.0 -# HELP system_load_average_1m The sum of the number of runnable entities queued to available processors and the number of runnable entities running on the available processors averaged over a period of time -# TYPE system_load_average_1m gauge -system_load_average_1m 8.68 -# HELP resilience4j_circuitbreaker_state The states of the circuit breaker -# TYPE resilience4j_circuitbreaker_state gauge -resilience4j_circuitbreaker_state{name="proxyService",state="forced_open",} 0.0 -resilience4j_circuitbreaker_state{name="proxyService",state="closed",} 1.0 -resilience4j_circuitbreaker_state{name="proxyService",state="disabled",} 0.0 -resilience4j_circuitbreaker_state{name="proxyService",state="open",} 0.0 -resilience4j_circuitbreaker_state{name="proxyService",state="half_open",} 0.0 -resilience4j_circuitbreaker_state{name="proxyService",state="metrics_only",} 0.0 -# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool -# TYPE jvm_buffer_memory_used_bytes gauge -jvm_buffer_memory_used_bytes{id="mapped",} 0.0 -jvm_buffer_memory_used_bytes{id="direct",} 24576.0 -# HELP resilience4j_circuitbreaker_failure_rate The failure rate of the circuit breaker -# TYPE resilience4j_circuitbreaker_failure_rate gauge -resilience4j_circuitbreaker_failure_rate{name="proxyService",} -1.0 -# HELP zipkin_reporter_queue_spans Spans queued for reporting -# TYPE zipkin_reporter_queue_spans gauge -zipkin_reporter_queue_spans 0.0 -# HELP jvm_gc_memory_allocated_bytes_total Incremented for an increase in the size of the (young) heap memory pool after one GC to before the next -# TYPE jvm_gc_memory_allocated_bytes_total counter -jvm_gc_memory_allocated_bytes_total 1.402994688E9 -# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool -# TYPE jvm_buffer_count_buffers gauge -jvm_buffer_count_buffers{id="mapped",} 0.0 -jvm_buffer_count_buffers{id="direct",} 3.0 -# HELP jvm_threads_peak_threads The peak live thread count since the Java virtual machine started or peak was reset -# TYPE jvm_threads_peak_threads gauge -jvm_threads_peak_threads 25.0 -# HELP jvm_gc_max_data_size_bytes Max size of long-lived heap memory pool -# TYPE jvm_gc_max_data_size_bytes gauge -jvm_gc_max_data_size_bytes 5.182062592E9 -``` - -#### Check All Services Health -From ecommerce front Service proxy we can check all the core services health when you have all the - microservices up and running using Docker Compose, -```bash -selim@:~/ecommerce-microservice-backend-app$ curl -k https://localhost:8443/actuator/health -s | jq .components."\"Core Microservices\"" -``` -This will result in the following response: -```json -{ - "status": "UP", - "components": { - "circuitBreakers": { - "status": "UP", - "details": { - "proxyService": { - "status": "UP", - "details": { - "failureRate": "-1.0%", - "failureRateThreshold": "50.0%", - "slowCallRate": "-1.0%", - "slowCallRateThreshold": "100.0%", - "bufferedCalls": 0, - "slowCalls": 0, - "slowFailedCalls": 0, - "failedCalls": 0, - "notPermittedCalls": 0, - "state": "CLOSED" - } - } - } - }, - "clientConfigServer": { - "status": "UNKNOWN", - "details": { - "error": "no property sources located" - } - }, - "discoveryComposite": { - "status": "UP", - "components": { - "discoveryClient": { - "status": "UP", - "details": { - "services": [ - "proxy-client", - "api-gateway", - "cloud-config", - "product-service", - "user-service", - "favourite-service", - "order-service", - "payment-service", - "shipping-service" - ] - } - }, - "eureka": { - "description": "Remote status from Eureka server", - "status": "UP", - "details": { - "applications": { - "FAVOURITE-SERVICE": 1, - "PROXY-CLIENT": 1, - "API-GATEWAY": 1, - "PAYMENT-SERVICE": 1, - "ORDER-SERVICE": 1, - "CLOUD-CONFIG": 1, - "PRODUCT-SERVICE": 1, - "SHIPPING-SERVICE": 1, - "USER-SERVICE": 1 - } - } - } - } - }, - "diskSpace": { - "status": "UP", - "details": { - "total": 981889826816, - "free": 325116776448, - "threshold": 10485760, - "exists": true - } - }, - "ping": { - "status": "UP" - }, - "refreshScope": { - "status": "UP" - } - } -} -``` -### Testing Them All -Now it's time to test all the application functionality as one part. To do so just run - the following automation test script: - -```bash -selim@:~/ecommerce-microservice-backend-app$ ./test-em-all.sh start -``` -> You can use `stop` switch with `start`, that will ->1. start docker, ->2. run the tests, ->3. stop the docker instances. - -The result will look like this: - -```bash -Starting 'ecommerce-microservice-backend-app' for [Blackbox] testing... - -Start Tests: Tue, May 31, 2020 2:09:36 AM -HOST=localhost -PORT=8080 -Restarting the test environment... -$ docker-compose -p -f compose.yml down --remove-orphans -$ docker-compose -p -f compose.yml up -d -Wait for: curl -k https://localhost:8080/actuator/health... , retry #1 , retry #2, {"status":"UP"} DONE, continues... -Test OK (HTTP Code: 200) -... -Test OK (actual value: 1) -Test OK (actual value: 3) -Test OK (actual value: 3) -Test OK (HTTP Code: 404, {"httpStatus":"NOT_FOUND","message":"No product found for productId: 13","path":"/app/api/products/20","time":"2020-04-12@12:34:25.144+0000"}) -... -Test OK (actual value: 3) -Test OK (actual value: 0) -Test OK (HTTP Code: 422, {"httpStatus":"UNPROCESSABLE_ENTITY","message":"Invalid productId: -1","path":"/app/api/products/-1","time":"2020-04-12@12:34:26.243+0000"}) -Test OK (actual value: "Invalid productId: -1") -Test OK (HTTP Code: 400, {"timestamp":"2020-04-12T12:34:26.471+00:00","path":"/app/api/products/invalidProductId","status":400,"error":"Bad Request","message":"Type mismatch.","requestId":"044dcdf2-13"}) -Test OK (actual value: "Type mismatch.") -Test OK (HTTP Code: 401, ) -Test OK (HTTP Code: 200) -Test OK (HTTP Code: 403, ) -Start Circuit Breaker tests! -Test OK (actual value: CLOSED) -Test OK (HTTP Code: 500, {"timestamp":"2020-05-26T00:09:48.784+00:00","path":"/app/api/products/2","status":500,"error":"Internal Server Error","message":"Did not observe any item or terminal signal within 2000ms in 'onErrorResume' (and no fallback has been configured)","requestId":"4aa9f5e8-119"}) -... -Test OK (actual value: Did not observe any item or terminal signal within 2000ms) -Test OK (HTTP Code: 200) -Test OK (actual value: Fallback product2) -Test OK (HTTP Code: 200) -Test OK (actual value: Fallback product2) -Test OK (HTTP Code: 404, {"httpStatus":"NOT_FOUND","message":"Product Id: 14 not found in fallback cache!","path":"/app/api/products/14","timestamp":"2020-05-26@00:09:53.998+0000"}) -... -Test OK (actual value: product name C) -Test OK (actual value: CLOSED) -Test OK (actual value: CLOSED_TO_OPEN) -Test OK (actual value: OPEN_TO_HALF_OPEN) -Test OK (actual value: HALF_OPEN_TO_CLOSED) -End, all tests OK: Tue, May 31, 2020 2:10:09 AM -``` -### Tracking the services with Zipkin -Now, you can now track Microservices interactions throughout Zipkin UI from the following link: -[http://localhost:9411/zipkin/](http://localhost:9411/zipkin/) -![Zipkin UI](zipkin-dash.png) - -### Closing The Story - -Finally, to close the story, we need to shut down Microservices manually service by service, hahaha just kidding, run the following command to shut them all: - -```bash -selim@:~/ecommerce-microservice-backend-app$ docker-compose -f compose.yml down --remove-orphans -``` - And you should see output like the following: - -```bash -Removing ecommerce-microservice-backend-app_payment-service-container_1 ... done -Removing ecommerce-microservice-backend-app_zipkin-container_1 ... done -Removing ecommerce-microservice-backend-app_service-discovery-container_1 ... done -Removing ecommerce-microservice-backend-app_product-service-container_1 ... done -Removing ecommerce-microservice-backend-app_cloud-config-container_1 ... done -Removing ecommerce-microservice-backend-app_proxy-client-container_1 ... done -Removing ecommerce-microservice-backend-app_order-service-container_1 ... done -Removing ecommerce-microservice-backend-app_user-service-container_1 ... done -Removing ecommerce-microservice-backend-app_shipping-service-container_1 ... done -Removing ecommerce-microservice-backend-app_api-gateway-container_1 ... done -Removing ecommerce-microservice-backend-app_favourite-service-container_1 ... done -Removing network ecommerce-microservice-backend-app_default -``` -### The End -In the end, I hope you enjoyed the application and find it useful, as I did when I was developing it. -If you would like to enhance, please: -- **Open PRs**, -- Give **feedback**, -- Add **new suggestions**, and -- Finally, give it a 🌟. - -*Happy Coding ...* 🙂 From 48e511a4fd8f4b1cd7551a971efd610440ac14bd Mon Sep 17 00:00:00 2001 From: Barcino44 Date: Sun, 16 Nov 2025 23:29:38 -0500 Subject: [PATCH 4/5] fix: Documentation --- helm/ecommerce/README.md | 46 ---------------------------------------- 1 file changed, 46 deletions(-) delete mode 100644 helm/ecommerce/README.md diff --git a/helm/ecommerce/README.md b/helm/ecommerce/README.md deleted file mode 100644 index 2ab3221cd..000000000 --- a/helm/ecommerce/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Ecommerce Helm chart - -This umbrella Helm chart packages the microservices in this repository as subcharts. It provides a minimal, opinionated set of manifests to deploy each Spring Boot microservice. - -Quick start -1. Build and push Docker images for each microservice (the repo contains Dockerfiles per module). -2. Update `helm/ecommerce/values.yaml` with your image repository and tags, or use `--set` to override per-service values. -3. Install the chart: - -```bash -# example -helm install my-ecommerce ./helm/ecommerce -f helm/ecommerce/values.yaml -``` - -Environments and namespaces -- The chart supports three environments: `dev`, `qa`, `prod` via `global.targetEnvironment` in `values.yaml`. -- By default the chart will create namespaces defined in `global.namespaces` (dev/qa/prod). The subcharts will place resources in the namespace selected by `global.targetEnvironment`. - -Example: install to `qa` namespace set in the chart values: - -```bash -helm upgrade --install my-ecommerce ./helm/ecommerce -f helm/ecommerce/values.yaml --set global.targetEnvironment=qa -``` - -ConfigMaps and Secrets -- Each subchart reads `config` (non-sensitive) and `secrets` (sensitive) keys under its values and will create a ConfigMap and/or Secret. -- Example override in `values.yaml`: - -```yaml -product-service: - config: - SPRING_PROFILES_ACTIVE: dev - PRODUCT_DB_URL: jdbc:postgresql://db:5432/products - secrets: - PRODUCT_DB_PASSWORD: s3cr3t -``` - -The deployment will load these as environment variables (via envFrom). - -Notes -- Default container ports are set per service in `values.yaml`. Adjust if necessary. -- This is a minimal scaffold. Customize health checks, liveness/readiness probes, resource requests/limits and configmaps as needed. - -Suggested next steps -- Add `Ingress` resources or an ingress controller chart to expose `api-gateway` externally. -- Integrate with your CI to build images and run `helm upgrade --install`. From 0a085e0d6bb0dd14692e833505cece42cc0402f4 Mon Sep 17 00:00:00 2001 From: Barcino44 Date: Mon, 17 Nov 2025 10:08:00 -0500 Subject: [PATCH 5/5] feat: Ingress controller done + deleting innecessary files --- .gitattributes | 14 - .gitignore | 33 -- .mvn/wrapper/MavenWrapperDownloader.java | 117 ------- .mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .mvn/wrapper/maven-wrapper.properties | 2 - api-gateway/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- api-gateway/.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - api-gateway/Dockerfile | 12 - api-gateway/compose.yml | 12 - api-gateway/mvnw | 310 ------------------ api-gateway/mvnw.cmd | 182 ---------- api-gateway/pom.xml | 93 ------ .../selimhorri/app/ApiGatewayApplication.java | 25 -- .../src/main/resources/application-dev.yml | 28 -- .../src/main/resources/application-prod.yml | 28 -- .../src/main/resources/application-stage.yml | 28 -- .../src/main/resources/application.yml | 95 ------ .../app/ApiGatewayApplicationTests.java | 17 - api-gateway/system.properties | 1 - app-architecture.drawio | 1 - app-architecture.drawio.png | Bin 1229773 -> 0 bytes azure-pipelines.yml | 22 -- cloud-config/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- cloud-config/.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - cloud-config/Dockerfile | 11 - cloud-config/compose.yml | 12 - cloud-config/mvnw | 310 ------------------ cloud-config/mvnw.cmd | 182 ---------- cloud-config/pom.xml | 72 ---- .../app/CloudConfigApplication.java | 25 -- .../src/main/resources/application.yml | 49 --- .../app/CloudConfigApplicationTests.java | 16 - cloud-config/system.properties | 1 - compose.yml | 120 ------- core.yml | 35 -- ecommerce-ERD.drawio | 1 - ecommerce-ERD.drawio.png | Bin 146852 -> 0 bytes favourite-service/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - favourite-service/Dockerfile | 12 - favourite-service/compose.yml | 12 - favourite-service/mvnw | 310 ------------------ favourite-service/mvnw.cmd | 182 ---------- favourite-service/pom.xml | 120 ------- .../app/FavouriteServiceApplication.java | 23 -- .../app/config/client/ClientConfig.java | 29 -- .../app/config/mapper/MapperConfig.java | 31 -- .../selimhorri/app/constant/AppConstant.java | 48 --- .../app/domain/AbstractMappedEntity.java | 48 --- .../com/selimhorri/app/domain/Favourite.java | 67 ---- .../selimhorri/app/domain/id/FavouriteId.java | 52 --- .../com/selimhorri/app/dto/FavouriteDto.java | 65 ---- .../com/selimhorri/app/dto/ProductDto.java | 41 --- .../java/com/selimhorri/app/dto/UserDto.java | 41 --- .../collection/DtoCollectionResponse.java | 28 -- .../app/exception/ApiExceptionHandler.java | 72 ---- .../app/exception/payload/ExceptionMsg.java | 48 --- .../wrapper/FavouriteNotFoundException.java | 35 -- .../app/helper/FavouriteMappingHelper.java | 46 --- .../app/repository/FavouriteRepository.java | 12 - .../app/resource/FavouriteResource.java | 113 ------- .../app/service/FavouriteService.java | 16 - .../service/impl/FavouriteServiceImpl.java | 99 ------ .../src/main/resources/application-dev.yml | 47 --- .../src/main/resources/application-prod.yml | 43 --- .../src/main/resources/application-stage.yml | 43 --- .../src/main/resources/application.yml | 46 --- .../migration/V1__create_favourites_table.sql | 10 - .../migration/V2__insert_favourites_table.sql | 7 - .../app/FavouriteServiceApplicationTests.java | 17 - favourite-service/system.properties | 1 - .../charts/api-gateway/templates/ingress.yaml | 21 ++ helm/ecommerce/charts/api-gateway/values.yaml | 14 +- .../charts/product-service/values.yaml | 3 +- .../charts/shipping-service/values.yaml | 3 +- mvnw | 310 ------------------ mvnw.cmd | 182 ---------- order-service/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- order-service/.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - order-service/Dockerfile | 12 - order-service/compose.yml | 12 - order-service/mvnw | 310 ------------------ order-service/mvnw.cmd | 182 ---------- order-service/pom.xml | 119 ------- .../app/OrderServiceApplication.java | 35 -- .../app/config/client/ClientConfig.java | 29 -- .../app/config/mapper/MapperConfig.java | 31 -- .../selimhorri/app/constant/AppConstant.java | 48 --- .../app/domain/AbstractMappedEntity.java | 48 --- .../java/com/selimhorri/app/domain/Cart.java | 57 ---- .../java/com/selimhorri/app/domain/Order.java | 75 ----- .../java/com/selimhorri/app/dto/CartDto.java | 43 --- .../java/com/selimhorri/app/dto/OrderDto.java | 56 ---- .../java/com/selimhorri/app/dto/UserDto.java | 42 --- .../collection/DtoCollectionResponse.java | 28 -- .../app/exception/ApiExceptionHandler.java | 75 ----- .../app/exception/payload/ExceptionMsg.java | 48 --- .../wrapper/CartNotFoundException.java | 36 -- .../wrapper/OrderNotFoundException.java | 36 -- .../app/helper/CartMappingHelper.java | 39 --- .../app/helper/OrderMappingHelper.java | 48 --- .../app/repository/CartRepository.java | 11 - .../app/repository/OrderRepository.java | 11 - .../selimhorri/app/resource/CartResource.java | 96 ------ .../app/resource/OrderResource.java | 96 ------ .../selimhorri/app/service/CartService.java | 16 - .../selimhorri/app/service/OrderService.java | 16 - .../app/service/impl/CartServiceImpl.java | 99 ------ .../app/service/impl/OrderServiceImpl.java | 85 ----- .../src/main/resources/application-dev.yml | 47 --- .../src/main/resources/application-prod.yml | 43 --- .../src/main/resources/application-stage.yml | 43 --- .../src/main/resources/application.yml | 51 --- .../db/migration/V1__create_carts_table.sql | 8 - .../db/migration/V2__insert_carts_table.sql | 8 - .../db/migration/V3__create_orders_table.sql | 11 - .../db/migration/V4__insert_orders_table.sql | 8 - .../V5__create_orders_cart_id_fk.sql | 3 - .../app/OrderServiceApplicationTests.java | 16 - order-service/system.properties | 1 - payment-service/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - payment-service/Dockerfile | 12 - payment-service/compose.yml | 12 - payment-service/mvnw | 310 ------------------ payment-service/mvnw.cmd | 182 ---------- payment-service/pom.xml | 115 ------- .../app/PaymentServiceApplication.java | 35 -- .../app/config/client/ClientConfig.java | 29 -- .../app/config/mapper/MapperConfig.java | 31 -- .../selimhorri/app/constant/AppConstant.java | 48 --- .../app/domain/AbstractMappedEntity.java | 48 --- .../com/selimhorri/app/domain/Payment.java | 56 ---- .../selimhorri/app/domain/PaymentStatus.java | 16 - .../java/com/selimhorri/app/dto/OrderDto.java | 49 --- .../com/selimhorri/app/dto/PaymentDto.java | 41 --- .../collection/DtoCollectionResponse.java | 28 -- .../app/exception/ApiExceptionHandler.java | 73 ----- .../app/exception/payload/ExceptionMsg.java | 48 --- .../wrapper/PaymentNotFoundException.java | 35 -- .../app/helper/PaymentMappingHelper.java | 42 --- .../app/repository/PaymentRepository.java | 11 - .../app/resource/PaymentResource.java | 84 ----- .../app/service/PaymentService.java | 15 - .../app/service/impl/PaymentServiceImpl.java | 90 ----- .../src/main/resources/application-dev.yml | 47 --- .../src/main/resources/application-prod.yml | 43 --- .../src/main/resources/application-stage.yml | 43 --- .../src/main/resources/application.yml | 63 ---- .../migration/V1__create_payments_table.sql | 10 - .../migration/V2__insert_payments_table.sql | 8 - .../app/PaymentServiceApplicationTests.java | 16 - payment-service/system.properties | 1 - pom.xml | 129 -------- product-service/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - product-service/Dockerfile | 12 - product-service/compose.yml | 12 - product-service/mvnw | 310 ------------------ product-service/mvnw.cmd | 182 ---------- product-service/pom.xml | 119 ------- .../app/ProductServiceApplication.java | 23 -- .../app/config/client/ClientConfig.java | 29 -- .../app/config/mapper/MapperConfig.java | 31 -- .../selimhorri/app/constant/AppConstant.java | 48 --- .../app/domain/AbstractMappedEntity.java | 48 --- .../com/selimhorri/app/domain/Category.java | 70 ---- .../com/selimhorri/app/domain/Product.java | 66 ---- .../com/selimhorri/app/dto/CategoryDto.java | 47 --- .../com/selimhorri/app/dto/ProductDto.java | 42 --- .../collection/DtoCollectionResponse.java | 28 -- .../app/exception/ApiExceptionHandler.java | 74 ----- .../app/exception/payload/ExceptionMsg.java | 48 --- .../wrapper/CategoryNotFoundException.java | 35 -- .../wrapper/ProductNotFoundException.java | 35 -- .../app/helper/CategoryMappingHelper.java | 58 ---- .../app/helper/ProductMappingHelper.java | 56 ---- .../app/repository/CategoryRepository.java | 11 - .../app/repository/ProductRepository.java | 11 - .../app/resource/CategoryResource.java | 96 ------ .../app/resource/ProductResource.java | 96 ------ .../app/service/CategoryService.java | 16 - .../app/service/ProductService.java | 16 - .../app/service/impl/CategoryServiceImpl.java | 83 ----- .../app/service/impl/ProductServiceImpl.java | 84 ----- .../src/main/resources/application-dev.yml | 47 --- .../src/main/resources/application-prod.yml | 43 --- .../src/main/resources/application-stage.yml | 43 --- .../src/main/resources/application.yml | 45 --- .../migration/V1__create_categories_table.sql | 10 - .../migration/V2__insert_categories_table.sql | 7 - .../migration/V3__create_products_table.sql | 13 - .../migration/V4__insert_products_table.sql | 8 - ...reate_categories_parent_category_id_fk.sql | 3 - .../V6__create_products_category_id_fk.sql | 3 - .../app/ProductServiceApplicationTests.java | 16 - product-service/system.properties | 1 - proxy-client/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- proxy-client/.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - proxy-client/Dockerfile | 12 - proxy-client/compose.yml | 12 - proxy-client/mvnw | 310 ------------------ proxy-client/mvnw.cmd | 182 ---------- proxy-client/pom.xml | 117 ------- .../app/ProxyClientApplication.java | 29 -- .../controller/AuthenticationController.java | 56 ---- .../model/request/AuthenticationRequest.java | 37 --- .../response/AuthenticationResponse.java | 29 -- .../auth/service/AuthenticationService.java | 11 - .../impl/AuthenticationServiceImpl.java | 61 ---- .../service/impl/UserDetailsServiceImpl.java | 42 --- .../controller/FavouriteController.java | 82 ----- .../favourite/model/FavouriteDto.java | 65 ---- .../business/favourite/model/FavouriteId.java | 52 --- .../business/favourite/model/ProductDto.java | 41 --- .../app/business/favourite/model/UserDto.java | 41 --- ...FavouriteServiceCollectionDtoResponse.java | 22 -- .../service/FavouriteClientService.java | 71 ---- .../order/controller/CartController.java | 78 ----- .../order/controller/OrderController.java | 78 ----- .../app/business/order/model/CartDto.java | 43 --- .../app/business/order/model/OrderDto.java | 56 ---- .../app/business/order/model/UserDto.java | 42 --- ...CartOrderServiceDtoCollectionResponse.java | 22 -- ...rderOrderServiceDtoCollectionResponse.java | 22 -- .../order/service/CartClientService.java | 65 ---- .../order/service/OrderClientService.java | 65 ---- .../controller/OrderItemController.java | 82 ----- .../business/orderItem/model/OrderDto.java | 55 ---- .../orderItem/model/OrderItemDto.java | 44 --- .../business/orderItem/model/OrderItemId.java | 29 -- .../business/orderItem/model/ProductDto.java | 41 --- ...OrderItemServiceDtoCollectionResponse.java | 22 -- .../service/OrderItemClientService.java | 69 ---- .../payment/controller/PaymentController.java | 63 ---- .../app/business/payment/model/OrderDto.java | 49 --- .../business/payment/model/PaymentDto.java | 40 --- .../business/payment/model/PaymentStatus.java | 16 - ...ntPaymentServiceDtoCollectionResponse.java | 22 -- .../payment/service/PaymentClientService.java | 56 ---- .../controller/CategoryController.java | 69 ---- .../product/controller/ProductController.java | 69 ---- .../business/product/model/CategoryDto.java | 47 --- .../business/product/model/ProductDto.java | 42 --- ...ryProductServiceCollectionDtoResponse.java | 22 -- ...ctProductServiceCollectionDtoResponse.java | 22 -- .../service/CategoryClientService.java | 65 ---- .../product/service/ProductClientService.java | 65 ---- .../user/controller/AddressController.java | 68 ---- .../user/controller/CredentialController.java | 73 ----- .../user/controller/UserController.java | 73 ----- .../VerificationTokenController.java | 68 ---- .../app/business/user/model/AddressDto.java | 44 --- .../business/user/model/CredentialDto.java | 43 --- .../user/model/RoleBasedAuthority.java | 15 - .../business/user/model/UserDetailsImpl.java | 65 ---- .../app/business/user/model/UserDto.java | 44 --- .../user/model/VerificationTokenDto.java | 45 --- ...dressUserServiceCollectionDtoResponse.java | 22 -- ...ntialUserServiceCollectionDtoResponse.java | 22 -- .../UserUserServiceCollectionDtoResponse.java | 22 -- ...UserTokenServiceCollectionDtoResponse.java | 22 -- .../user/service/AddressClientService.java | 64 ---- .../user/service/CredentialClientService.java | 70 ---- .../user/service/UserClientService.java | 70 ---- .../VerificationTokenClientService.java | 64 ---- .../app/config/encoder/EncoderConfig.java | 26 -- .../app/config/filter/JwtRequestFilter.java | 76 ----- .../app/config/template/TemplateConfig.java | 29 -- .../selimhorri/app/constant/AppConstant.java | 48 --- .../app/exception/ApiExceptionHandler.java | 101 ------ .../app/exception/payload/ExceptionMsg.java | 50 --- .../wrapper/CredentialNotFoundException.java | 35 -- .../wrapper/FavouriteNotFoundException.java | 35 -- ...galAuthenticationCredentialsException.java | 35 -- .../wrapper/UserObjectNotFoundException.java | 35 -- .../VerificationTokenNotFoundException.java | 35 -- .../app/jwt/service/JwtService.java | 28 -- .../app/jwt/service/impl/JwtServiceImpl.java | 65 ---- .../com/selimhorri/app/jwt/util/JwtUtil.java | 18 - .../app/jwt/util/impl/JwtUtilImpl.java | 82 ----- .../app/security/SecurityConfig.java | 83 ----- .../src/main/resources/application-dev.yml | 25 -- .../src/main/resources/application-prod.yml | 28 -- .../src/main/resources/application-stage.yml | 28 -- .../src/main/resources/application.yml | 45 --- .../app/ProxyClientApplicationTests.java | 10 - proxy-client/system.properties | 1 - service-discovery/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - service-discovery/Dockerfile | 12 - service-discovery/compose.yml | 12 - service-discovery/mvnw | 310 ------------------ service-discovery/mvnw.cmd | 182 ---------- service-discovery/pom.xml | 56 ---- .../app/ServiceDiscoveryApplication.java | 24 -- .../src/main/resources/application-dev.yml | 30 -- .../src/main/resources/application-prod.yml | 28 -- .../src/main/resources/application-stage.yml | 28 -- .../src/main/resources/application.yml | 39 --- .../app/ServiceDiscoveryApplicationTests.java | 16 - service-discovery/system.properties | 1 - shipping-service/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - shipping-service/Dockerfile | 12 - shipping-service/compose.yml | 12 - shipping-service/mvnw | 310 ------------------ shipping-service/mvnw.cmd | 182 ---------- shipping-service/pom.xml | 120 ------- .../app/ShippingServiceApplication.java | 35 -- .../app/config/client/ClientConfig.java | 29 -- .../app/config/mapper/MapperConfig.java | 31 -- .../selimhorri/app/constant/AppConstant.java | 48 --- .../app/domain/AbstractMappedEntity.java | 48 --- .../com/selimhorri/app/domain/OrderItem.java | 52 --- .../selimhorri/app/domain/id/OrderItemId.java | 29 -- .../java/com/selimhorri/app/dto/OrderDto.java | 55 ---- .../com/selimhorri/app/dto/OrderItemDto.java | 44 --- .../com/selimhorri/app/dto/ProductDto.java | 41 --- .../collection/DtoCollectionResponse.java | 28 -- .../app/exception/ApiExceptionHandler.java | 71 ---- .../app/exception/payload/ExceptionMsg.java | 48 --- .../wrapper/OrderItemNotFoundException.java | 35 -- .../app/helper/OrderItemMappingHelper.java | 46 --- .../app/repository/OrderItemRepository.java | 12 - .../app/resource/OrderItemResource.java | 105 ------ .../app/service/OrderItemService.java | 16 - .../service/impl/OrderItemServiceImpl.java | 96 ------ .../src/main/resources/application-dev.yml | 47 --- .../src/main/resources/application-prod.yml | 43 --- .../src/main/resources/application-stage.yml | 43 --- .../src/main/resources/application.yml | 45 --- .../V1__create_order_items_table.sql | 10 - .../V2__insert_order_items_table.sql | 8 - .../app/ShippingServiceApplicationTests.java | 16 - shipping-service/system.properties | 1 - ...ceMicroserviceBackendApplicationTests.java | 10 - system.properties | 1 - user-service/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ------- user-service/.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - user-service/Dockerfile | 12 - user-service/compose.yml | 12 - user-service/mvnw | 310 ------------------ user-service/mvnw.cmd | 182 ---------- user-service/pom.xml | 118 ------- .../app/UserServiceApplication.java | 23 -- .../app/config/client/ClientConfig.java | 29 -- .../app/config/mapper/MapperConfig.java | 31 -- .../selimhorri/app/constant/AppConstant.java | 48 --- .../app/domain/AbstractMappedEntity.java | 48 --- .../com/selimhorri/app/domain/Address.java | 58 ---- .../com/selimhorri/app/domain/Credential.java | 81 ----- .../app/domain/RoleBasedAuthority.java | 15 - .../java/com/selimhorri/app/domain/User.java | 73 ----- .../app/domain/VerificationToken.java | 65 ---- .../com/selimhorri/app/dto/AddressDto.java | 44 --- .../com/selimhorri/app/dto/CredentialDto.java | 57 ---- .../java/com/selimhorri/app/dto/UserDto.java | 52 --- .../app/dto/VerificationTokenDto.java | 50 --- .../collection/DtoCollectionResponse.java | 28 -- .../app/exception/ApiExceptionHandler.java | 78 ----- .../app/exception/payload/ExceptionMsg.java | 47 --- .../wrapper/AddressNotFoundException.java | 25 -- .../wrapper/CredentialNotFoundException.java | 35 -- .../wrapper/UserObjectNotFoundException.java | 35 -- .../VerificationTokenNotFoundException.java | 35 -- .../app/helper/AddressMappingHelper.java | 58 ---- .../app/helper/CredentialMappingHelper.java | 62 ---- .../app/helper/UserMappingHelper.java | 62 ---- .../VerificationTokenMappingHelper.java | 56 ---- .../app/repository/AddressRepository.java | 11 - .../app/repository/CredentialRepository.java | 13 - .../app/repository/UserRepository.java | 13 - .../VerificationTokenRepository.java | 11 - .../app/resource/AddressResource.java | 95 ------ .../app/resource/CredentialResource.java | 107 ------ .../selimhorri/app/resource/UserResource.java | 103 ------ .../resource/VerificationTokenResource.java | 97 ------ .../app/service/AddressService.java | 16 - .../app/service/CredentialService.java | 27 -- .../selimhorri/app/service/UserService.java | 27 -- .../app/service/VerificationTokenService.java | 26 -- .../app/service/impl/AddressServiceImpl.java | 82 ----- .../service/impl/CredentialServiceImpl.java | 89 ----- .../app/service/impl/UserServiceImpl.java | 89 ----- .../impl/VerificationTokenServiceImpl.java | 85 ----- .../src/main/resources/application-dev.yml | 47 --- .../src/main/resources/application-prod.yml | 43 --- .../src/main/resources/application-stage.yml | 43 --- .../src/main/resources/application.yml | 45 --- .../V10__create_credentials_user_id_fk.sql | 3 - ...e_verification_tokens_credential_id_fk.sql | 3 - .../db/migration/V1__create_users_table.sql | 14 - .../db/migration/V2__insert_users_table.sql | 9 - .../db/migration/V3__create_address_table.sql | 12 - .../db/migration/V4__insert_address_table.sql | 11 - .../V5__create_credentials_table.sql | 15 - .../V6__insert_credentials_table.sql | 8 - .../V7__create_verification_tokens_table.sql | 10 - .../V8__insert_verification_tokens_table.sql | 8 - .../V9__create_address_user_id_fk.sql | 3 - .../app/UserServiceApplicationTests.java | 16 - user-service/system.properties | 1 - zipkin-dash.png | Bin 93822 -> 0 bytes 424 files changed, 37 insertions(+), 21529 deletions(-) delete mode 100644 .gitattributes delete mode 100644 .gitignore delete mode 100644 .mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 .mvn/wrapper/maven-wrapper.jar delete mode 100644 .mvn/wrapper/maven-wrapper.properties delete mode 100644 api-gateway/.gitignore delete mode 100644 api-gateway/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 api-gateway/.mvn/wrapper/maven-wrapper.jar delete mode 100644 api-gateway/.mvn/wrapper/maven-wrapper.properties delete mode 100644 api-gateway/Dockerfile delete mode 100644 api-gateway/compose.yml delete mode 100755 api-gateway/mvnw delete mode 100644 api-gateway/mvnw.cmd delete mode 100644 api-gateway/pom.xml delete mode 100644 api-gateway/src/main/java/com/selimhorri/app/ApiGatewayApplication.java delete mode 100644 api-gateway/src/main/resources/application-dev.yml delete mode 100644 api-gateway/src/main/resources/application-prod.yml delete mode 100644 api-gateway/src/main/resources/application-stage.yml delete mode 100644 api-gateway/src/main/resources/application.yml delete mode 100644 api-gateway/src/test/java/com/selimhorri/app/ApiGatewayApplicationTests.java delete mode 100644 api-gateway/system.properties delete mode 100644 app-architecture.drawio delete mode 100644 app-architecture.drawio.png delete mode 100644 azure-pipelines.yml delete mode 100644 cloud-config/.gitignore delete mode 100644 cloud-config/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 cloud-config/.mvn/wrapper/maven-wrapper.jar delete mode 100644 cloud-config/.mvn/wrapper/maven-wrapper.properties delete mode 100644 cloud-config/Dockerfile delete mode 100644 cloud-config/compose.yml delete mode 100755 cloud-config/mvnw delete mode 100644 cloud-config/mvnw.cmd delete mode 100644 cloud-config/pom.xml delete mode 100644 cloud-config/src/main/java/com/selimhorri/app/CloudConfigApplication.java delete mode 100644 cloud-config/src/main/resources/application.yml delete mode 100644 cloud-config/src/test/java/com/selimhorri/app/CloudConfigApplicationTests.java delete mode 100644 cloud-config/system.properties delete mode 100644 compose.yml delete mode 100644 core.yml delete mode 100644 ecommerce-ERD.drawio delete mode 100644 ecommerce-ERD.drawio.png delete mode 100644 favourite-service/.gitignore delete mode 100644 favourite-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 favourite-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 favourite-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 favourite-service/Dockerfile delete mode 100644 favourite-service/compose.yml delete mode 100755 favourite-service/mvnw delete mode 100644 favourite-service/mvnw.cmd delete mode 100644 favourite-service/pom.xml delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/FavouriteServiceApplication.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/constant/AppConstant.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/domain/Favourite.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/domain/id/FavouriteId.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/dto/FavouriteDto.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/dto/ProductDto.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/dto/UserDto.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/helper/FavouriteMappingHelper.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/repository/FavouriteRepository.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/resource/FavouriteResource.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/service/FavouriteService.java delete mode 100644 favourite-service/src/main/java/com/selimhorri/app/service/impl/FavouriteServiceImpl.java delete mode 100644 favourite-service/src/main/resources/application-dev.yml delete mode 100644 favourite-service/src/main/resources/application-prod.yml delete mode 100644 favourite-service/src/main/resources/application-stage.yml delete mode 100644 favourite-service/src/main/resources/application.yml delete mode 100644 favourite-service/src/main/resources/db/migration/V1__create_favourites_table.sql delete mode 100644 favourite-service/src/main/resources/db/migration/V2__insert_favourites_table.sql delete mode 100644 favourite-service/src/test/java/com/selimhorri/app/FavouriteServiceApplicationTests.java delete mode 100644 favourite-service/system.properties create mode 100644 helm/ecommerce/charts/api-gateway/templates/ingress.yaml delete mode 100755 mvnw delete mode 100644 mvnw.cmd delete mode 100644 order-service/.gitignore delete mode 100644 order-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 order-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 order-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 order-service/Dockerfile delete mode 100644 order-service/compose.yml delete mode 100755 order-service/mvnw delete mode 100644 order-service/mvnw.cmd delete mode 100644 order-service/pom.xml delete mode 100644 order-service/src/main/java/com/selimhorri/app/OrderServiceApplication.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/constant/AppConstant.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/domain/Cart.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/domain/Order.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/dto/CartDto.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/dto/OrderDto.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/dto/UserDto.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/exception/wrapper/CartNotFoundException.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderNotFoundException.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/helper/CartMappingHelper.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/helper/OrderMappingHelper.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/repository/CartRepository.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/repository/OrderRepository.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/resource/CartResource.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/resource/OrderResource.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/service/CartService.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/service/OrderService.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/service/impl/CartServiceImpl.java delete mode 100644 order-service/src/main/java/com/selimhorri/app/service/impl/OrderServiceImpl.java delete mode 100644 order-service/src/main/resources/application-dev.yml delete mode 100644 order-service/src/main/resources/application-prod.yml delete mode 100644 order-service/src/main/resources/application-stage.yml delete mode 100644 order-service/src/main/resources/application.yml delete mode 100644 order-service/src/main/resources/db/migration/V1__create_carts_table.sql delete mode 100644 order-service/src/main/resources/db/migration/V2__insert_carts_table.sql delete mode 100644 order-service/src/main/resources/db/migration/V3__create_orders_table.sql delete mode 100644 order-service/src/main/resources/db/migration/V4__insert_orders_table.sql delete mode 100644 order-service/src/main/resources/db/migration/V5__create_orders_cart_id_fk.sql delete mode 100644 order-service/src/test/java/com/selimhorri/app/OrderServiceApplicationTests.java delete mode 100644 order-service/system.properties delete mode 100644 payment-service/.gitignore delete mode 100644 payment-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 payment-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 payment-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 payment-service/Dockerfile delete mode 100644 payment-service/compose.yml delete mode 100755 payment-service/mvnw delete mode 100644 payment-service/mvnw.cmd delete mode 100644 payment-service/pom.xml delete mode 100644 payment-service/src/main/java/com/selimhorri/app/PaymentServiceApplication.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/constant/AppConstant.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/domain/Payment.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/domain/PaymentStatus.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/dto/OrderDto.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/dto/PaymentDto.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/exception/wrapper/PaymentNotFoundException.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/helper/PaymentMappingHelper.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/repository/PaymentRepository.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/resource/PaymentResource.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/service/PaymentService.java delete mode 100644 payment-service/src/main/java/com/selimhorri/app/service/impl/PaymentServiceImpl.java delete mode 100644 payment-service/src/main/resources/application-dev.yml delete mode 100644 payment-service/src/main/resources/application-prod.yml delete mode 100644 payment-service/src/main/resources/application-stage.yml delete mode 100644 payment-service/src/main/resources/application.yml delete mode 100644 payment-service/src/main/resources/db/migration/V1__create_payments_table.sql delete mode 100644 payment-service/src/main/resources/db/migration/V2__insert_payments_table.sql delete mode 100644 payment-service/src/test/java/com/selimhorri/app/PaymentServiceApplicationTests.java delete mode 100644 payment-service/system.properties delete mode 100644 pom.xml delete mode 100644 product-service/.gitignore delete mode 100644 product-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 product-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 product-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 product-service/Dockerfile delete mode 100644 product-service/compose.yml delete mode 100755 product-service/mvnw delete mode 100644 product-service/mvnw.cmd delete mode 100644 product-service/pom.xml delete mode 100644 product-service/src/main/java/com/selimhorri/app/ProductServiceApplication.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/constant/AppConstant.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/domain/Category.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/domain/Product.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/dto/CategoryDto.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/dto/ProductDto.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/exception/wrapper/CategoryNotFoundException.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/exception/wrapper/ProductNotFoundException.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/helper/CategoryMappingHelper.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/helper/ProductMappingHelper.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/repository/CategoryRepository.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/repository/ProductRepository.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/resource/CategoryResource.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/resource/ProductResource.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/service/CategoryService.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/service/ProductService.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/service/impl/CategoryServiceImpl.java delete mode 100644 product-service/src/main/java/com/selimhorri/app/service/impl/ProductServiceImpl.java delete mode 100644 product-service/src/main/resources/application-dev.yml delete mode 100644 product-service/src/main/resources/application-prod.yml delete mode 100644 product-service/src/main/resources/application-stage.yml delete mode 100644 product-service/src/main/resources/application.yml delete mode 100644 product-service/src/main/resources/db/migration/V1__create_categories_table.sql delete mode 100644 product-service/src/main/resources/db/migration/V2__insert_categories_table.sql delete mode 100644 product-service/src/main/resources/db/migration/V3__create_products_table.sql delete mode 100644 product-service/src/main/resources/db/migration/V4__insert_products_table.sql delete mode 100644 product-service/src/main/resources/db/migration/V5__create_categories_parent_category_id_fk.sql delete mode 100644 product-service/src/main/resources/db/migration/V6__create_products_category_id_fk.sql delete mode 100644 product-service/src/test/java/com/selimhorri/app/ProductServiceApplicationTests.java delete mode 100644 product-service/system.properties delete mode 100644 proxy-client/.gitignore delete mode 100644 proxy-client/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 proxy-client/.mvn/wrapper/maven-wrapper.jar delete mode 100644 proxy-client/.mvn/wrapper/maven-wrapper.properties delete mode 100644 proxy-client/Dockerfile delete mode 100644 proxy-client/compose.yml delete mode 100755 proxy-client/mvnw delete mode 100644 proxy-client/mvnw.cmd delete mode 100644 proxy-client/pom.xml delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/ProxyClientApplication.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/auth/controller/AuthenticationController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/auth/model/request/AuthenticationRequest.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/auth/model/response/AuthenticationResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/auth/service/AuthenticationService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/AuthenticationServiceImpl.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/UserDetailsServiceImpl.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/favourite/controller/FavouriteController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteId.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/ProductDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/UserDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/response/FavouriteFavouriteServiceCollectionDtoResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/favourite/service/FavouriteClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/order/controller/CartController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/order/controller/OrderController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/order/model/CartDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/order/model/OrderDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/order/model/UserDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/CartOrderServiceDtoCollectionResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/OrderOrderServiceDtoCollectionResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/order/service/CartClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/order/service/OrderClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/orderItem/controller/OrderItemController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemId.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/ProductDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/response/OrderItemOrderItemServiceDtoCollectionResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/orderItem/service/OrderItemClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/payment/controller/PaymentController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/payment/model/OrderDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentStatus.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/payment/model/response/PaymentPaymentServiceDtoCollectionResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/payment/service/PaymentClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/product/controller/CategoryController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/product/controller/ProductController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/product/model/CategoryDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/product/model/ProductDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/CategoryProductServiceCollectionDtoResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/ProductProductServiceCollectionDtoResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/product/service/CategoryClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/product/service/ProductClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/controller/AddressController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/controller/CredentialController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/controller/UserController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/controller/VerificationTokenController.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/AddressDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/CredentialDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/RoleBasedAuthority.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDetailsImpl.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/VerificationTokenDto.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/AddressUserServiceCollectionDtoResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/CredentialUserServiceCollectionDtoResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/UserUserServiceCollectionDtoResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/VerificationUserTokenServiceCollectionDtoResponse.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/service/AddressClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/service/CredentialClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/service/UserClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/business/user/service/VerificationTokenClientService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/config/encoder/EncoderConfig.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/config/filter/JwtRequestFilter.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/config/template/TemplateConfig.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/constant/AppConstant.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/IllegalAuthenticationCredentialsException.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/jwt/service/JwtService.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/jwt/service/impl/JwtServiceImpl.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/jwt/util/JwtUtil.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/jwt/util/impl/JwtUtilImpl.java delete mode 100644 proxy-client/src/main/java/com/selimhorri/app/security/SecurityConfig.java delete mode 100644 proxy-client/src/main/resources/application-dev.yml delete mode 100644 proxy-client/src/main/resources/application-prod.yml delete mode 100644 proxy-client/src/main/resources/application-stage.yml delete mode 100644 proxy-client/src/main/resources/application.yml delete mode 100644 proxy-client/src/test/java/com/selimhorri/app/ProxyClientApplicationTests.java delete mode 100644 proxy-client/system.properties delete mode 100644 service-discovery/.gitignore delete mode 100644 service-discovery/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 service-discovery/.mvn/wrapper/maven-wrapper.jar delete mode 100644 service-discovery/.mvn/wrapper/maven-wrapper.properties delete mode 100644 service-discovery/Dockerfile delete mode 100644 service-discovery/compose.yml delete mode 100755 service-discovery/mvnw delete mode 100644 service-discovery/mvnw.cmd delete mode 100644 service-discovery/pom.xml delete mode 100644 service-discovery/src/main/java/com/selimhorri/app/ServiceDiscoveryApplication.java delete mode 100644 service-discovery/src/main/resources/application-dev.yml delete mode 100644 service-discovery/src/main/resources/application-prod.yml delete mode 100644 service-discovery/src/main/resources/application-stage.yml delete mode 100644 service-discovery/src/main/resources/application.yml delete mode 100644 service-discovery/src/test/java/com/selimhorri/app/ServiceDiscoveryApplicationTests.java delete mode 100644 service-discovery/system.properties delete mode 100644 shipping-service/.gitignore delete mode 100644 shipping-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 shipping-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 shipping-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 shipping-service/Dockerfile delete mode 100644 shipping-service/compose.yml delete mode 100755 shipping-service/mvnw delete mode 100644 shipping-service/mvnw.cmd delete mode 100644 shipping-service/pom.xml delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/ShippingServiceApplication.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/constant/AppConstant.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/domain/OrderItem.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/domain/id/OrderItemId.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/dto/OrderDto.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/dto/OrderItemDto.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/dto/ProductDto.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderItemNotFoundException.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/helper/OrderItemMappingHelper.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/repository/OrderItemRepository.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/resource/OrderItemResource.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/service/OrderItemService.java delete mode 100644 shipping-service/src/main/java/com/selimhorri/app/service/impl/OrderItemServiceImpl.java delete mode 100644 shipping-service/src/main/resources/application-dev.yml delete mode 100644 shipping-service/src/main/resources/application-prod.yml delete mode 100644 shipping-service/src/main/resources/application-stage.yml delete mode 100644 shipping-service/src/main/resources/application.yml delete mode 100644 shipping-service/src/main/resources/db/migration/V1__create_order_items_table.sql delete mode 100644 shipping-service/src/main/resources/db/migration/V2__insert_order_items_table.sql delete mode 100644 shipping-service/src/test/java/com/selimhorri/app/ShippingServiceApplicationTests.java delete mode 100644 shipping-service/system.properties delete mode 100644 src/test/java/com/selimhorri/app/EcommerceMicroserviceBackendApplicationTests.java delete mode 100644 system.properties delete mode 100644 user-service/.gitignore delete mode 100644 user-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 user-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 user-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 user-service/Dockerfile delete mode 100644 user-service/compose.yml delete mode 100755 user-service/mvnw delete mode 100644 user-service/mvnw.cmd delete mode 100644 user-service/pom.xml delete mode 100644 user-service/src/main/java/com/selimhorri/app/UserServiceApplication.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/constant/AppConstant.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/domain/Address.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/domain/Credential.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/domain/RoleBasedAuthority.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/domain/User.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/domain/VerificationToken.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/dto/AddressDto.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/dto/CredentialDto.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/dto/UserDto.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/dto/VerificationTokenDto.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/exception/wrapper/AddressNotFoundException.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/helper/AddressMappingHelper.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/helper/CredentialMappingHelper.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/helper/UserMappingHelper.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/helper/VerificationTokenMappingHelper.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/repository/AddressRepository.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/repository/CredentialRepository.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/repository/UserRepository.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/repository/VerificationTokenRepository.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/resource/AddressResource.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/resource/CredentialResource.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/resource/UserResource.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/resource/VerificationTokenResource.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/service/AddressService.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/service/CredentialService.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/service/UserService.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/service/VerificationTokenService.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/service/impl/AddressServiceImpl.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/service/impl/CredentialServiceImpl.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/service/impl/UserServiceImpl.java delete mode 100644 user-service/src/main/java/com/selimhorri/app/service/impl/VerificationTokenServiceImpl.java delete mode 100644 user-service/src/main/resources/application-dev.yml delete mode 100644 user-service/src/main/resources/application-prod.yml delete mode 100644 user-service/src/main/resources/application-stage.yml delete mode 100644 user-service/src/main/resources/application.yml delete mode 100644 user-service/src/main/resources/db/migration/V10__create_credentials_user_id_fk.sql delete mode 100644 user-service/src/main/resources/db/migration/V11__create_verification_tokens_credential_id_fk.sql delete mode 100644 user-service/src/main/resources/db/migration/V1__create_users_table.sql delete mode 100644 user-service/src/main/resources/db/migration/V2__insert_users_table.sql delete mode 100644 user-service/src/main/resources/db/migration/V3__create_address_table.sql delete mode 100644 user-service/src/main/resources/db/migration/V4__insert_address_table.sql delete mode 100644 user-service/src/main/resources/db/migration/V5__create_credentials_table.sql delete mode 100644 user-service/src/main/resources/db/migration/V6__insert_credentials_table.sql delete mode 100644 user-service/src/main/resources/db/migration/V7__create_verification_tokens_table.sql delete mode 100644 user-service/src/main/resources/db/migration/V8__insert_verification_tokens_table.sql delete mode 100644 user-service/src/main/resources/db/migration/V9__create_address_user_id_fk.sql delete mode 100644 user-service/src/test/java/com/selimhorri/app/UserServiceApplicationTests.java delete mode 100644 user-service/system.properties delete mode 100644 zipkin-dash.png diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index ca02a0960..000000000 --- a/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ - -*.sql linguist-detectable=true -*.sql linguist-language=sql -*.yml linguist-detectable=true -*.yml linguist-language=yml -*.yaml linguist-detectable=true -*.yaml linguist-language=yaml -*.json linguist-detectable=true -*.json linguist-language=json -*.xml linguist-detectable=true -*.xml linguist-language=xml - - - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/api-gateway/.gitignore b/api-gateway/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/api-gateway/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/api-gateway/.mvn/wrapper/MavenWrapperDownloader.java b/api-gateway/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/api-gateway/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/api-gateway/.mvn/wrapper/maven-wrapper.jar b/api-gateway/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/api-gateway/.mvn/wrapper/maven-wrapper.properties b/api-gateway/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/api-gateway/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/api-gateway/Dockerfile b/api-gateway/Dockerfile deleted file mode 100644 index 76b4a0ed1..000000000 --- a/api-gateway/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY api-gateway/ . -ADD api-gateway/target/api-gateway-v${PROJECT_VERSION}.jar api-gateway.jar -EXPOSE 8080 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "api-gateway.jar"] - - diff --git a/api-gateway/compose.yml b/api-gateway/compose.yml deleted file mode 100644 index 69734befc..000000000 --- a/api-gateway/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - api-gateway-container: - image: selimhorri/api-gateway-ecommerce-boot:0.1.0 - ports: - - 8080:8080 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/api-gateway/mvnw b/api-gateway/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/api-gateway/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/api-gateway/mvnw.cmd b/api-gateway/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/api-gateway/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/api-gateway/pom.xml b/api-gateway/pom.xml deleted file mode 100644 index cfd395d28..000000000 --- a/api-gateway/pom.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - api-gateway - api-gateway - Spring Boot microservice! - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.cloud - spring-cloud-starter-gateway - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - org.projectlombok - lombok - true - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - - diff --git a/api-gateway/src/main/java/com/selimhorri/app/ApiGatewayApplication.java b/api-gateway/src/main/java/com/selimhorri/app/ApiGatewayApplication.java deleted file mode 100644 index cecbca6fe..000000000 --- a/api-gateway/src/main/java/com/selimhorri/app/ApiGatewayApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -public class ApiGatewayApplication { - - public static void main(String[] args) { - SpringApplication.run(ApiGatewayApplication.class, args); - } - - - -} - - - - - - - - diff --git a/api-gateway/src/main/resources/application-dev.yml b/api-gateway/src/main/resources/application-dev.yml deleted file mode 100644 index 37c01f410..000000000 --- a/api-gateway/src/main/resources/application-dev.yml +++ /dev/null @@ -1,28 +0,0 @@ - -server: - port: 8080 - error: - whitelabel: - enabled: false - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/api-gateway/src/main/resources/application-prod.yml b/api-gateway/src/main/resources/application-prod.yml deleted file mode 100644 index 026bc31f5..000000000 --- a/api-gateway/src/main/resources/application-prod.yml +++ /dev/null @@ -1,28 +0,0 @@ - -server: - port: 8080 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - diff --git a/api-gateway/src/main/resources/application-stage.yml b/api-gateway/src/main/resources/application-stage.yml deleted file mode 100644 index 7e74ec0bd..000000000 --- a/api-gateway/src/main/resources/application-stage.yml +++ /dev/null @@ -1,28 +0,0 @@ - -server: - port: 8080 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/api-gateway/src/main/resources/application.yml b/api-gateway/src/main/resources/application.yml deleted file mode 100644 index bb925016b..000000000 --- a/api-gateway/src/main/resources/application.yml +++ /dev/null @@ -1,95 +0,0 @@ - -server: - servlet: - context-path: / - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: API-GATEWAY - profiles: - active: - - dev - cloud: - gateway: - default-filters: - - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - globalcors: - add-to-simple-url-handler-mapping: true - cors-configurations: - '[/**]': - allowed-origins: "${CLIENT_HOST:http://localhost:4200}" - allowed-headers: "*" - exposed-headers: "*" - allow-credentials: true - allowed-methods: - - GET - - POST - - PUT - - DELETE - - PATCH - - OPTIONS - routes: - - id: ORDER-SERVICE - uri: lb://ORDER-SERVICE - predicates: - - Path=/order-service/** - - id: PAYMENT-SERVICE - uri: lb://PAYMENT-SERVICE - predicates: - - Path=/payment-service/** - - id: PRODUCT-SERVICE - uri: lb://PRODUCT-SERVICE - predicates: - - Path=/product-service/** - - id: SHIPPING-SERVICE - uri: lb://SHIPPING-SERVICE - predicates: - - Path=/shipping-service/** - - id: USER-SERVICE - uri: lb://USER-SERVICE - predicates: - - Path=/user-service/** - - id: FAVOURITE-SERVICE - uri: lb://FAVOURITE-SERVICE - predicates: - - Path=/favourite-service/** - - id: PROXY-CLIENT - uri: lb://PROXY-CLIENT - predicates: - - Path=/app/** - -resilience4j: - circuitbreaker: - instances: - apiGateway: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - - - diff --git a/api-gateway/src/test/java/com/selimhorri/app/ApiGatewayApplicationTests.java b/api-gateway/src/test/java/com/selimhorri/app/ApiGatewayApplicationTests.java deleted file mode 100644 index b25fc9c25..000000000 --- a/api-gateway/src/test/java/com/selimhorri/app/ApiGatewayApplicationTests.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ApiGatewayApplicationTests { - - - -} - - - - - - - diff --git a/api-gateway/system.properties b/api-gateway/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/api-gateway/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/app-architecture.drawio b/app-architecture.drawio deleted file mode 100644 index 89d7ed0a1..000000000 --- a/app-architecture.drawio +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/app-architecture.drawio.png b/app-architecture.drawio.png deleted file mode 100644 index acbd46133c89ebded7f3981b413996b56466e2aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1229773 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 z z(mlw1IE?#6J=;@Xfd|@@M4OlJdDX$dfsmHu98xyT_DqZP2KV&5sJ;sVkpTQq=#xie zcd`DXIFX!gd!}AOuFg*Q(`F-BOLs*~?avSg)L)wiJNa_HJgZ}g31d}`xLHZjom?K1 zq7*+$Op0pra~ZEO_VvnB`1Ap%%E7mJb(1Chyr>uTx{vpV7pvoVT>8rc0Zc82RXj<` zZXy8jDCG-?x6R&i=4Lr5oK5n`_WqL1mvL?H?7TYOVE+`ySG78x+4m*==85&HSX3WD zUJ6mQrK?{V9w{iU7~%SjW74$P8ag)#sNaz3^yC ztE!XVCAPn>^lO;V-{AId7j~s-Co^t{GxfG3hO^B8# z(sI*|wtQT1_vP*I~aHht-E_|E8Sr`=+wJ22=H7+7mnV7-<|jk1Pb_ z23n8S-i>vgx)8zrerXb}z58|7|4FrV58}=!&RZM1n!MlX<)BTY-f|yi_W+i%5CM=m z_A|mJ6t2nTaU4Xvp^iFw5Y#4p*9>w@N2TTC(qT>)K1a%9BFM!mTH*4kkoTL z`%LYVVpH0wBC_LSa8vVBhCwEjHUuoiZg3xQ`{g8`f!W3Vr(H373%5tB-6y@^t;bPV z8EPZ1i93}&}wHh5vbML){5Uts(R;Si$ zZK}1}$8T#1-MpY_=ilti`h2z)LJXG)70j~zdddRfS1O~Wmk%4g$I~i5--(AbnjOsP zXORcAP_e(l_sW-?jCAxq9A*P&+q#Xm`H1KZGzGK-o;C+v0*j1gx?`wH`^0wfn3Ni|vcL)LO1Zr_qLv62^a3)15lDvj$6!mnRoTr6ROn)?sFbO7ZYzPkPf)>g z0}|gQl{s<6%lZ}WbH4sgd94f8>FT7xrbqF<7NIhYrQhL&<{-$XEcaIyQ&uB>+)WT~G*nPhE zPA7}QzsvWn7Q1e#G(4k$I=}Mya};R*3X5tFYc`Lxz8e>kG~=I$_&}QL7(g5DVP-!^ zoR)zPWV23Ge#O3q#EzQChL#Kn@C{%@>^@Oi3dKB#{Un|Zrv;ez*&97&(*n-s&1F?u z>2oO|P0(8doJRaQU!+8WsNL~hZzzLxwWbkYLsPnrSEe)LgJa!LGpEDZ?%R|}k}vg_ zS*inp>oM?L=C-;-=}NF)sQZwx(={+s45&#xp4PsLD=8~pV9Vt)`CKN|Z@EP<58?EF z5qkFXIOmM!{p|tuarV8a_v!N3hS%&`(lL$s?~B$02j|J@W|vF9FQx_^07vf716@Zy z&X4n)_2q@X@^PfDR{P!`6H-iRcbPb<{$2ggp{3sQ`SY-gJ9`q=Wlyz&r?ZrQt8>B^ zQVaOjQ)^Yv_54?Vb&6!9!F#-YT*_V^0~Mzqdq$>QE7#>t@k#`;;gj8O!gf_e_{*Ca zSjfu~t5tNcV2Hjy2r$6h$T$yeEzNDd*#a{ zG;AY%Hk5wJy(->OJnBBZ(3G6sHuzBGo*%ygR2&ijFYb zT4spEh=tr)^flk`FA^<*ezMB%O?}_>0-Ukl%tu9k7W);){`tY!EY)04?lS^>#&>>j2fxU74bs6khUaoLFBl{Nc^TK~&1Q&$;nBA> zsRpQ(X4)eK67Dm>W7D^>BmrtXkE|zq9n%#`o@duD)l_;%5B#}-EY68ZeteG~Z z2A!6BzNOYLKjho*ZNVP^L^qjygaOE>nMNQ>FVyj@(m!%|7;-vXy2^*dL_@oYYGAia zzK2NBoEN(A_o+ntW9{u(f8B~1%l|ooaGK261YF2q72DRIb^LKQzm8UV8bM8jMD5S_ z7kVy=9qsA_2SK|WDf}9h$Dj+-_4EEkT~vllk75W8t0E!YkNb4{o@Jm(qD%OmDhU8k zFx8oLKCs%J)Fezh5U96Ik%r51zH!isOkNO{0p%6M=ZAw2?b@7DNeRRGuzWpzczE2c z{6+(q1vP{07Ky8X>zcXGzvQxC-2)UY(L*^{TAX4S}_-DC1>lyXBBI&bL@f`*A`d)i?- zjskontlUKX0OtrgUck&bE2HgXR?^AWZCX{~v6m^$3YO&ex8n+Q|+N5N2|a zzP}}Lu=ss`N(YTCPG|STY(92)WoJ3=A9%y_ONTFzS^PyKy%yd*L*G!$gdWvZD}!$N z0%m8*S7VvJ&ULyee{{soG|)uTH^BW?+l%#k+jrhIIY}d zbsOLvmUxDxTJU5byQ#S5Q0~E{eJ^u5KCdw_nd^Ei9LL3EE+zO+@9BrzeNP|87KXK; z&RggJ{dXeEuQ$|Y-@@C|uiTd`1McxcgZuVK5IFIbQ!0baw8yd+A506+s&nE=^68^8 zIvyn32N?+-f84Uo1$XxYl_O4kAI@89+ zEK()XLl$`p@v&xjxJVO$$EpuI3^wS%zm|v>sa&7~xR73tP{IFER1U8PRr$Gf#Vw!1 z@q`seZt75fssx>mdfAtQ$LX4(77*^yC8A6RtToom(P|&Jt!P11!0RwXIs$VEOV;A; z?#bY*0otOu>{DQMyw~_wP2=JY^(0fvZDU zr;*F6PHUOl$#5*mntSU&dl@^&nt1tKp;3Mnl`D7ogxPhCnX@d)=kA_sm{LBTvfbS? z!cB6l)|kLapWr?S*YoZBNQ#Uj8W^LDr9z~zYiZ9Dw8Ji&vVXbLo+#EauT@%gmaEcQ zIwVeg6tFW#HEhdM+mjnK@c(2l(PwCt7^N$DNLU!+R0bVFi$N$k}0i zR+m#%-t6K-H0)y!Uf*IqxarS-y~T4Ze^J6HPwwXoD%-vferEJ-UH~xf#A=DeI@0Ny zyhu0J%}*um1ubPw>Iyx7)KNgxg%3;SxdTzZ-j6DPFuudEy^ZW-GQtfC7gCLfeJof5FHMjd(whiF*SENR6)1w zt?Sl4LF)mAs}-M-uDRerI@(20r?BMd)14gi!*9Rj1Ltkqo~CsVt6Ag2JOOm{Gkogy zLTr~drx3;@HSc1keV`MXF6&8&_9;3&jN45OkPw8vn$MwqF!za`)R8Sn5jTruTcvC$rg?8r(>q01>K?NJaQ%&LfDKGG5R7ed%0OT_b0MZ1ZcG#2!LdbIqA#^!qKz_G%VATc?Ec#*uJ|^W^ zL}Xl*370IBi@M%cI6RZ9+*qeK6ql@v3+<#evsqY6Ec_m>?q5SB2>)(_!gRJsRJk9P zK8%dbsjfmh!DpSW^b7@^yC+7o_k`2ZSR|b>pD*=z=;o?n4wTRv-x(PR$AA^_I_(R2 zt{b|sQ=df@vYI4rXZjC50&2wlPz$FKKIxJrue2m2fgv+n_@x*@7_t1e5cAbe-^!eX zVQiqKZKi}!oV#g1yn!DLl!O{oE&`3U?I>MOD+$0(d+;I0IUW=30U39&LHEmXt5UuC zu1C9O_hc4CJ~7X?PiQm{xAlBYg@^T51-k)nx|J0{2Z>|QOrG$4Ldz<4tnaVv+ntz-v32npFMV{(P62(q~&Qf zRYlg8k|lB2SMY#G*9OMDfVH^v`oYso43yi-eFJ2Hi^3K5?lZlw%$&M?8F%wiKT4GFGa=6hz3;LwM^2h+FSzjWF@~}{)Sy))->_;r?uPl{mw;d(Na7oNAQG{hfoWhG*O4Fy5CoD zFAIn!5y$tD9V7Cp<#|5UfO~x7KS+QbQwJQ2l}_~@1sx>@4{*FJPjB!Vh;hKeH;A5| zI-%1E7u7c)1aasq2QJ#nh0?8h$4WK5&$WrPvHZ+j>UFALPrg{@);TQf@MThCb@)+Z zqL+8Y@QIHbAM_=e&Q^G0Qf*(!OmK;Eqx8~>Uieg%dPx4BIyx67qlOmrl#V&0PA^fY z`q3#r&0VYQpY(I2lK(isi^J`U6Y@a^ody!&6y_ zk3Nd4D2Dheni(v|y-)MrBoGMaRm#E8KuqQ_Ut{ZT93q=mnvO2r#W)uj#`wxZ=CI3t z(z5?@E}>V#m5G|_eer2(9f%{z+W`VqA?;**mL+dhC9&lcMx+GEB0LY$0m6jM4b?zt zI{_^4oqs?n?Bycu%xrpCmS!?6bN&km-&`vR$CAvaKwqZvBr|Y?%ksl)pReM8LB@5X z((o{I{(uaFU0hL(LZ%~euAWEu*ME1_cNc#FY^sF_ZTWO@B>ej6r_9?@4YAXTc210QZ9%dPoxWs^~&it4) z^%JV=H19mGjafc^CG@s)%SG2nN}fe3U{EWg2U+XBM%JVD90B00UO z{QcAaqLe&qi}2<(MQh9ghOZ0G&^}uAmWaRKu+WS{dwr|RPd~{MUsa)eXo-$Oor@fC z+Ba5^v-fer6IemE2QJ!s{$`>#$t)=esPT0Hui7NqZ<(KcOX`i5R_h^I5Mj2@S9?5> ztuUXthwY`t6{i75@2b5H-kn#|KMh!UcpLM54x}*?2DbYn%|!{Bg37az58kAU>Wh zoO=noPnq0lW~tFWUAx&>S%=*|MBbE4D7Hb%yov6->^N;bd;NeV11Ye3&M3TEa9jQ% z4#A5a?L5}Mpy$ZRd_u9-W(KFU-ZThYlB{`mLi+jFb+->9Vg2so2knjXt<>jzqx{mF zjeOY|K3AZ8L>Mx?`|fY>Lm2aBmP5P(mn5PG5Y5mGlxLakV1&k4v6T=i63vRno|D5* z#IpLR&r;m>kU`rJkQ0utIP)%lLb-P**nakU!Q&SQ)x2#}aVlffp&eFA{SiWcn3z^# z&+!jsHOW_3>l4>Z9uLCM>D*S2cbz6e;m*i&^w#0CK5vLT)h!nXi300CultQFnz$_> zY=6z732Qb0YACTwr@O#Lo!7mFYX|>d&QJhG?>PWf+H*PbHA_Rzp#kDc0`1jDrvBk2 zY`kToiuyN73+EB4+Z7VyZA7VwvV0f=MRquVaeDll^{}hC!kt)bPe05FIK^>FvhyW5 z+??la2b2ow$`-|Wq<;sn+V*kH-r$)E=Ms*cd~gARuK}!BzNNq51?4c!zq$xXdZ~Ik z*7cl_ZzMeJngpc#_`Q_%+k7&C7hMD}^ZiqNg!*3@69lgn^W``sC7K}$8by3KTNoO@ zPG_f~GO#I^shfxPBej2!ZJjc%4i?_pq8z2NU!G3=u0fpeShe3b>G_pA&3p~RVrN<3 z^FT!&UWcwHMAOM;Df93fyni+Hd;gN+s5yROY-?>!-tZ0&bV@2=0e30qa;G*Bpsh`#( z1SxRVh`GO-VpE5a*}d2>OELOnk=3*$Y7}%v<3->zi8N;55DPoho2yzYzAg|idP;%K zb?rql$$ik7i|swm&)mrmYWs1JJ>#?k%T0SeUwGP6Bpf{zqeh_pAaQHEAeiHJg&xK4 z_=^@`wF+AI2F+;ZmX;qzNCRZiHMMUe@hMYh2vW5^{TS$U7o$cw&}n~)PlP_R6m&E; zhmz6-M;ep$`P}&TouTVzup5N?Qw@`QB0pk8k=Q`jLwYOKhzJKI;3lceiHDsZ0gyZc zO8CNRCZEoG&A$BkQF!pI!$el~zFlXH*Q`_FjbaFtr0wla7opehDSAKyl?vPgG+?hs z2Sea$a%khblD{i^F}(9&-8x0{pQ1^65ksSK%DRCmQS6&`gV)hLISu;tke{$Cq;8~iV5r~nUs-K?LXGosB_oreL@l*fn z%(vdqbTDt8saYJJTzxGLgvDh-OJ7J=_gM>WIDM@&TirK-3N9eia;3W+#`7X zZi<33&Cs9x(Jl|gz8b$L&hth4!Ja&gZV35cA?=5D#P=Qw?#{9F;7#uv_(eKvN(>Rv z?u172+sT*0tzJ7_YUdpzpvldNO#mz+#=#y>9MeyvS>jH=_7Le1H@ z^+IXhn8=jGcNrw{lTzMrIzp@j=d(*47&U3D-wI z)W?1ASPC8wNiGrgQCNv*8|MN<*U>A!?ko{GE8X^I0scu!yG;T#{&0kx@{O;KUK?sM zfu4=H%6=;f2M%JepJkRV?*;m!<~gnQNCD}J$tO)J=nk!t;@K)<$=EZCho;vU=^C`g zz(A8wQA*(hqmAEe-+P4jdvgCBx98j9Hl4#O zJYQQR+`Z3_UT2d=>km3%sOuC<4&)^b254EI`ozrdY z1%5>t==af{=kN6ZEG>-U_3}P^x5sCG3Pt!y_!-?va*oXA{Iv`E+->as4c6Ek{aXvG(i>Jv7-_>tSwyYGD;cY}J9 zUKwPY;)hE#jB%Tu<1qaeawkX$m@0N_@Ef*hHdmjVvbiZJs;P#t$098&Ae4yxXf_j+ z+i-Xuf6yftAMsW@4BK42d0U4baox0N34fV^ck?OE5Wm6)9-F>@!fh>zD6GRGk4)-ZWx^PV-U=4(FUk%CMQ8RC)W@pz&88AvC~DTs>K=x_vXs$Z1zOV%4Hh*N zd5GXnXh7oql>^q)`P9fog`I zZ3{*#)?U9W$J*a80TcFVy*)3Q^>y$$y1Ls>=|@2``yxKjStfw4pvr)UQA`xZgycEi_HD(72Y4Hk31p&jpwW(KR! z)a@!*goVOk(GKFNr3$nnOZ(94Q9p}{^Qu^CqhxD7!-STX%6`{-;hLd4_u=Y-3xg_8 z5h8nbadkn3-sWs zGhZy9?-{u_I13QYd60u}tHeg`%wYFr{u;{Ai7R!n&Ggp4cYD1W;f|gzkHS`Fi9BPl2%`a@p^h(@qEe@O&m6ED7n~2(4ihb0YE?qz z49@L5Bz3i$)`(yn1iQZ*>V~pbXe;tsn*0Lujvy|OS(?*&DH$j1l=*8r0GVc@(g6Kz zIfCo0DB(%4Ur7`1YTkw@Y_IK~i! z80-SUEjvdESaDc{aLAe60nx?k-p6y-YDQjh&qZhNXKHSb=xUY8OC_d<(3cN;E#iQq zpKoBP@3-t(20uyl#3%cZ4!_@iJ8&Uuw0n%Ybo|f^TV`m@F7ZSALvONhX)c*~iHGRG z^1ts?Jo9vqItYnBWcw7rfqV(;2)UBlR+agv*He7{N{BBB-K!br>HCOre-R-~MEf%j zJs|mCd(NMTA}2Heq)U^&9lx6O@AM}d^_*#M-ydp13y{F~;XqGv{x1|G@iU0EUHB{$ z{;IV$kK|}Hbfk#N6z##HE9aU1%y&gNWHhpk-Jv7%u@LK%4msjdN)ABiSwwS>sa?fz zTg#YN#V3Dw8&VA6jd)+o@#oZ@F2+wx^iGb@BdbkXqkogok?q>=Czhg+6thsgp6Zoj@*I><9|Uke<+5o% zk=o;OXpw*vF>a_}c#Ph(SX;<}A(k0eG(%+W%tKahe^LazP9b(;;sZpN&lP#-uUU%M z&L2HIO8zo=`QHwCUo(GLpK$_){FH{7o%VXbU`z7@Fx|j~?he~k%F(2Lr~y&?I7Y)m z#1yYmwwZaxtrJaxI?h+41EQlh)Caa5G0zN3u+MYjih7vg({QG1h=Dq;%>@2L(0L{7cFx?Q@@;b$ z>ws=x`rzu)NZ7T*xb{Varuk3t?MI$ppYOq>}jzwiR@{=j#25m;Am zJS%$ixC4w@5{TP|1VOHU%L5tRzTZxHJFEpZl8>CbPYns$HvV{l!|CTtVDJ3^T|hI; z^}9QvtKfzM0eL>go|jk5=3SQbg%&#p9!2nXCkGLC>Z6Wufjf7UYtYqt!dK19Ie9H{ zK6F(^ARO{m&?vbtTg82X#-Mp3P@9q?>nf(Lcv)9dIHhC(h9aEjuV2Qhp}E9^O%-at zh`viM4B9TgxAl6nD#tH0@|t$!R1lB#v2zs5`jx{uTr!Wjcmxq-qZy@top30?{yk51 zaLiKUb$jA$wk!1L)DJ&sJO{(CIg{Dv_JLes9{+iI_wuE#n;Ts&)UdYK)BsJ!`o2%Q zwPE!i???MCrhnY`iIec(ZLB`}4)Bm)&{tirUldQL(XH{F%uGJJU*_anI9=PtM!O#Q zXbvS}zWCYDJ5}2a@0+pZFLOEH7zd)Ho8GlFVmscx{0=hx7^U?@^8S-OTVF=AqQm?C zLGJb1*-UNBqivpW4)SY%d7N~5UG_OgOqVVG7^SF?x3ALAEY=c1E*9p%$h+AF4~WYI z@En!XC_kePUZanm@5ak>6mFN(sG&>?(v*kU`{^4qRZ8~GE-8Ceo7Z1$7tt=KKFwpB zrMnT-YMDDi6Y%Yf5Z=c5w^1`Lns&0A8g1en+}CtNGtk0=LV&_QA2{Pa z#wB*s?rBfu%kEOWaZEWa_H{qk?Q%F*7reszV<0N~)Z2{fYbL34Dtjz_hXf;DQ-k$G z-g4~6uU9A?s^5zWZ%Zg=f-(B+n2;8NPh)eGv=f3TB-*4EpZ#w-lB&ht}V=6X3T15wS^j5}` zL!yRe4OVUUtp^M7i6g!2+aa4Ev-|GFylqHWkj04sBUlsmjqa&hhV%-Rg!7uh`#%Dr+w?tBWqQu4bD zSE$f^PGdKY*~209S9rf%e7ERWE=PmsCfyW(Bj{?R5S)ABK?(Y9hT)Zk>LUkd@0>V6!nnH}p{O`ydSM^iSsAhd=#2hFwlEI#aY7WjQxg3@45n#%<) zo?vkN&$D4d(SHZ+EQ5CG;GleZ{$@+k*p)y_eZAm*jZpF`9DH&&OS}IHpOJZ!M%=IN zc{rFKCc5Ca5xQy27uILy26@n&@fNauNTL_gV*m1>R<1v!y~|l(+cMgS-EyO7HQzTk z01Muq?~Zd%0Z$pv-Q!3bRGIe!nYHL4I-f2k7(o-EZHBo)H=Xjj$N5bg?)$^q1^SqI z>QGfxf8{?eaRW&QGf-YxZ3bheaiqN{aNhx;ACADnma5VA7O7OQVGLwI)vtbIe(qkc zW{nnOK(M^E5Ndm{9~>mA<>W&vTzokYXB@8NUq1+B4~Z}RIJR};I(H8%lMs%bYkXzB zRQjk6IEhJL*DJgPw3Jei&C9%U#$mGY;@0Pzr*FOgV$a=EO20N8vx>jZMeGQ0rmHbO zUZL7Ws3(CMRHisxx6HGCLqGTvw9_7YDD;*fyMu$VJ;=$RCvsM@PIp%yO)l6aAhh7O zrl$H;9^Aww)x7T8i+*`O-6A%q^x$(!^^l?cj9q+6RhPTB8))2V(y-PP!qC#E(?Bw;CL4`O~l#&>@Y-$zbU$}{JvZy8|BX(;7p0RWJ<2^TG}`{JrEpYX>*`w^CR@9-AXttG5Re3E1gzx(Z>Sgq~$s*HU+ zf~d0po3sXcBx4C-?Qx$LKUq&@a3EvqJ<_g&;!gU*v{OUlXtd`9Omuy$fAeQaudiqD zHkGfPJpEjP(Ix|B;R~8asq7hDe{-k%@F+`L`sX_A5#MaKZqg zqgBZ|0V!R!R?hkJ9LG~-&EbjK*aI&_p|~$v&&O6>SSPsa`BUD6{NgZ&{UZ+7+?|E6 z-S&*^9^HWuA%%Ll@=FmLIrpDbwi+%5SD%&EJI1T*=i0u$ELnRx&ig79%@^`L{~$24 zC(Q)};fa##@s$FLC#T^Y6IOZW$V*$Ly+>;oYTwBdW)nR)lq*xG6>$T+f))Tt>Z3W- z>Ng5MId^GT5MjIKYP~h0u=Yx7fyp%5zEJZe_E4Jth#@ix3(B@~3uHW4rWB*Z-f5#7 zO;yhC={DafqwCsJq72WbK0-bknpNIDdC2!vD<%Qng;e)WSc83o2<;?WC4JKk;${x* z^1hru{2k8Bmij+1XwLQ?WpMq!PL>cAfBKu+H>}4`BWBsnAv)cBK#J+;Q!x~wYj3}) zAEgef`JVS*J}AhQ< zdyk)$nX|`y-?uo~vJnmCHQRwGe4!@pyV=i4TKiJwdBNf)+(rUinKXBqVYfhopF}y7 z^ZNYdM#vaUyst>t%RT*T-V2Di@O(w2g<2t%kB51@|fb)=lbhbU#$-eC0gIb6J+*-HMeJ?Q{IP3qa@tB zX1}RFAKkBUy-V%=;~-3~b(|oPzK*sS4eqc2g>c9Luw+`$%G?+}u1pPp(}_oPsm z1xODX@g*B;FbG#13M z`x2J^(g+H~AA-PCkvpfyA0CXdeH{*@VeT@7kE#I%p@Y+R(@UtcRGEphIQj^ zJk)QoiTU)TbgMi7oa?14iyX`EMu`x%o|te8Ad7=*l5c!XI^QC~Y9ojaD1DrUOfQ!_ z_}0A8v~u}MKiwYtPUfN0dG;Zc_PQrmtGLW}ss5Z*WC3q4?N)}{cNgUWzOdW<#V+xE z#rboPgp2F}1T$vStN%&64J@CAeu~ob{bDatX9Q{WyLn*FrH*E_1K-kR`G^yg=?rUu z{njwJ5Me&=+&;lkSgKPZ12=Mxpplg~5T$evxdW?7dG#+%6NhD{+!QpaEKIKHxhjEN zm(d7XvU`Mo%NQqfmL8n+Ga;-GuU+S85*cdSuT6@+HVS~bZDFC_SJ)GR_BwN+JSz=P zKlp~_bfp^Lq~B-gUbrFH70*mF?x~@r>UX(Y2gtJJ&8l#KZQj1Yiyihr5|zx2H4x70 z&udQj1Lc_=RB17kF**?`X9n@OeU%1~1Br%%+ljeF@XK6X?O#uaYnyLrCJ(P8_J%SO zBuA~kjm#PNywBg{!K-f*Rdo5$)(`kSANae^=2s<~r{OxDhhRT$JEE@d$MGlY1lGgr z?JDqW9`6s{g3SdA7x{P3Z;qYvxfZ*Zv)FWMa4C9% z3A&L6N<2ei_x2_ekG=j5T{N#pk1_Y<5?daNtM=9R797g%?K8z+z%n}8W(Q#axGNWq z{X7U-@2uU^#gS-hkm`W}xh>brw~{IrbIIX8p_b)0yvC9|JNJ@gIo3Gh1`C71I)6Iu zs~{bx@o>9*OGu*-btEJb$iGDqB+6oGv4=*T*~7X~D1RK4(wS;zd+d3D?VAUHUIf1cJa>m?o+SCldhp1~fZ z$s>nX_c7&Dk~m6v8JzR5MuUjCSU|ZluC!lw7BZNlpBpN2DuKMFw-C zCg?`hAX>DO2jr~k@xu3|@NIb(4=>PXWAr0~jfx9~GA98T=8-9+0X6P8^$pUi_q%-$ z0V`&hbtaXdu(kV5_=@6r!#a-YJG#3tUU5gYMfdzls3{fSGYi6*e%R-wi2TCxfT*sr zoq2Be%`OTz(g$n5p9jx$&3jf+(=wY1f1yuEMC~7Yxv$x7I?P2&*YMm^8HcuC^YJ^f zXYYH_=a|>sB1mC~gqP>xR1YZa)V%Aw*>9jf(3dhI#F9>1F>h@9cpTej{L}a@O6~)2 z%=odsKIp-2nCn_U^x~Fre1xH%Pdpty_2;^v%>I71ZUvsL-Rzcc$W`jmj^S{62UH0k z<o+TLwmX0M z+d1q(1wQVM6ZrPbkbe1`h$Y*#W@S3H1FA(9y@?M`B=il7+jlB5#EgUExSXeB1@PZ) zN=}V}e<8lJ8x3^?rczbx{nu;ab9P+i4POd!WJ#A>IlKNJ7+)a4wFCnf6q~a*&-lUT zp=7uxe~E+FN7C8@5CBgfJe+Vkm}LLmy$#g*cqM6FCgF9unox=flGMWM(gixXF>R(y z*=BUoo>H+yE=fk^IDwA6+MquldVlE2Fo|*ZS4WIzEmI2Ulr^<~dYOT@Oi?=sltqHE zR+#ct84U2|!<_EyPeiMe&3Z7TDEWaZeBH8k%e#^FP; zL?A8RNE|Rk1bTWuM8Kfcl-9>)d;}j+(MY;Q{S$t;p3!_P`1E;yKB(+5DC)41zazMw z-zxm8aObHIcr{e+(&^k?Yh+99aGm!p1*k2Y5vib2&U83dv}Yv@O^5q~QT!mT<&Hl? zWWy%+b-lKU*1rdZo4o7551(4B$dspq=XeF-R^h;t+Qdb^iDE;9^ta zXm-09R`Ruy5kI@1|J`i0ehF@sd^TQgcG?F30g>*l-XDum)>OVbpTYa#iA9tz&2S07 zn!#UvKD&DqN8=}8qt;QRMaKmY+%ab`#9MHR1#zI!;5Wt>V%?UjayKwWFcys`vwYjRYxWq5`TCyE#k@4yZBf%%r z?X@KvJfi0dFktt>vpUsOU*B|E3J}p-&&9`-n2r`N-YzK`DdseLA%Oh-u!oWi z-cJp@n@pCs#_SJcx*Sr{BUbKS%y2TD&xh~SkN-=i?>au#{qfFVO;GyhK$_$|5TtjO zWpOtj!*Col)sK;LM;8Ert~IPs zvcDJ(;WCGFt1t=QBakKg&_sF_WNEpGnb&(A0wPeCLpO=<>L#CxJFv0V&vzpQ%=VRB zSREHA?D$@;3|?!{Q&y9=b=E-|>vY3-kxfv^4rk&t#W~t(Q0wzXd-9>Y%GfMCw1U!< zu5765;iUv<<@}3S*7_;UvWC;hDI`{~CtW!jyfM92PvWcG@PQaA@~hn)VIO}(K%_E`G75C2bY;e2j>{5lM%3&RoXh+CEO&bKX##SLPD!e{Q+BrTlh&3>yrLLm?uMYrI+HWiE`2GrIcSVYmjeys!|~#It3P2azP?M_%^)kej|LW@cV(_jgJp^xj_8CrC^88QgL8) z7YbtatC_?Ku^(rj(TG(oTAm?cg(LTb>fy|g_UQ1=P;zQrGTLOKcNeKa4sW*kf#mgP z9DRecIG{*TDfCbD-kDVheIWP|Ns?y=PxKP=2hXFLpfsBnYn(0WfBbJYn0qNU4p=Cy3v-Aq(P zkaR8M{1e$GQhzO$V5?pn#21q{`38`0MvZG8O&tzimgc4&f$o1Ee*3BM$Ak(3tg2kt z{Ji+}1uMS11ylBk1C>g(-dq%rt(C*v>=(6`8+9&?V+ znVG&WVdP-Iqvj0f8{^}2yAp%;A(_z}7_<`XIEQchcYJ@t{>VX0D7kj|eWgpV*gf?-7j~R(P9jE@OXKIO8)d%9&F!MbKe=YU`_^{7*eO1!f+C$8YZ2X*F`%v~QOi2C8-qVz z?N_JwuGnu~RD8_R<$mMCB)L1xzOXdaP%%yb{5I4b{T8^YEJjM7I+FVayBM}izgdWIun#%Vbp@{bwIsu8O*Uo_d>*D;hd)@t~7?3~1p_HqRfl*%X}&bO-Kg zELzgnba8ODyBah=;#8cOB*7BP-tE|mY&s+!%}b+tK7)`NN@l|*Q{T;#3%~}Vwzho# zlk2dLvxnN;!It0FZf+0zfc8YqV|U8>Q*>CvRhkexF^YY;%3{Ktz&l4M+uhfV3|mC7cMnW;0foV27A9y)h8VDN zD-UIZn5KrK&hgjKIIppeKE>rkm!T_vg4MMYl}_23kKHMF;L1ud$$wtNiSrg_X*K zJIa`1fXLv4`=wF)Y^)tIlb+^feMJ{LS8o?(KmurRD`lT?9bqdK5P>gdkvHvn5rKCUr||7dj%y(IDVD9+ASNUGune!9 znpV8G`$eh8f4)@r{M$B~&U;#yMjeRtd^R1QMZI+MQ-H1dz8dcpO|M`zP7rXo*{c+V z5Qx4buiosgF}LHNLBsc&-WSxTrKQSD8hCsX3qH+bx@bV@h%qy%4m*gjhL1!kt&`WaX+|KepDS z)G92yWsiP?34Hi52~<(QcGizQh_2TA{3M%(iBc2l*|i>XTLCO6(?h# zyR9!=z%HIbVu7aXJ>GZ6RziwM;NLp4 z@+R8m1wntgfxE5QzHVqEvE^a(mw6<2!-GHVm_Rx;U6kpuZ=KQ1Ee|pO`T-BNun+s< z=#kYpfBfZHOLrHCr$`f`h|)$+!BHQEhyx!TrxNmEx8(T3=X(Q1v7S@V%@#`BcFmZI zOdm3xt8~qyYQ3rdCficfI9aY8W{lu z7u-~S$#ZW1Fq37rg*uI=;H;?Pj4}@ts3T$lvgB{U?>AImx++q9|HZ_X^V=uT3MDI` zk!DXDy(yX{*b_wWVz%XV=E$0#rpk`W;|4g4{e-=c4T1Y55|zOnmJVzQ=t!YU*sSidLm!q>Hkm?Zs5Dm zN*)t&_j2}JJ|MPv@(M5aLa+YvOe3nlvt&31GWAs{Q?f6) z+SD18-P7W7sJjQqJmIqe9F@T|kPGn7nsYGLy{S=PW>{avuwC9F5*jV6kX=!Br2~8p z|Kqa$l%MYUPzv?_tE>vHQq;o2drr>j&is6+5PVw9FVDH&rs)KIhwb#^jsrD*%&+TR z;YPiinltL>M?l7q$vE@MiqvXvDmK`@d4VKv?Dd?1F4mmnm_ly6wAUS+U>Z;uV%~-) zgfU!=P}S%ZAeyyu+Z!2D=Tt&9>3%cC7DWkr`=J2(0R7Oci9Zn=XV9{9v(_=cL&)!h zNqE>VghWkd6hnG^qF zYl~)c?8Eq*bV!6jdXq;j7wORb>lz)AzW%%6s80>{B{L-Xb5gp_y!~F(dcr&sjAi5A z&39%cWjL%43*B0yxk5`5@A1#LE_*(&6QBI68dPxuQ$>SNt#J#|BMIpY%8!mMP_O`R z6C+)5UoOAwB2bL-Mr7&RA2R4$Kusn(S7wI37>0^mNS`?9&2LU!hu^`??h}XZQ68as zua-(pa?*S=z2*HnLhV!R@&%jyeb|rPjbpZ?_$d!9w62Y#G+0^$Jr>pp3?)t-(&N+q z9;><{re|IXirAlD(s;cuRBM^$a=(xlXcF?|3l>?XHY6knC%kFbihi^WIDzcglj;fQ zd|1q1XhkV*XT3ZX$s(g< z*!Lf>v0st=S5He_^n%=No}5o-eN{T!(rJ5unmZs{QsozFC6vn>t?e9O32cmg%I&=7Jyug3{O18)cHG0MA zvq;g<2ft5Gd3f`-uHIed4=x(=A<~NSIkt;vf);S0bVxKNbsc)fzd@E>Cw>yvje~MX zFLgcjV(zs`Te#NSTQO+eNq)@(zC);4_kr)*fr-E#6T(SGf%{ve zXfP}gJ-_jOdxI|z=~|#f>7H}HZ=bfBv>R>RzCNoJ{?edL=VoHJ8?;G|p%2kSb3z@b zVnpCB1DXr&y2-;1sDo z3iu@DTOEV7-2-`#w<_kqsBpB9lFDbe5g2|5!GYX$yY#BL)CZ>|a~gL>1n`NhsG2En z@);Md-Q;OiF^=w^rIv=fyy6of!lorr_DOyy3c919-m4v-8cGhuAP9NB2;aC zYWP_DgxWvEDPKcQR;?>xKtWf@Zqg%yBSq>S-beoa)&k07nJ-mk+3A_b+krt{(hxeI zf|EeLYJKe&Pj7M`F8(txet>Vj=zhGNIy9VSjM{Sp`j8-URP600>2vnU>vI$>4d%uh zmcK2#`VKE}f5LsuA{eW)KJi+b!fvwnO;GlQbN9j*waeTF=^ebhl)ys~R3J?xT=Un$iS~@5*p(W>J-QZFPa=NVs z*YRtwWR6)*sC`!TUA26`4ER95DCv4$^%GiV1Jx!)9 z3O5+YE4Y^2OoTz|uZ0@#I-Ni}3eJE`ftN75tIyBXEUdcB_?T=ZD0aG^MV zaS{Ckw$wa5u5)#Qwi9cj-UR%xQIqK3-Ah{Phc;<+=9`duzMZ*~0sz?YrB12I-WQie zaJe$bYsMyGJ}XIK9XHhZ?$_Ad-3bbiG(79*@_?l2@7ycbg6osnp?v>vIQXJ@(!VCL zi?;}&B)6LT7lg1NTJbDDm2@T#Z7k0kfi}ENGw51>kLRX1LoD)ayEdVL^szuD{1?Ci z3D3)e0iRTbESO{+W*LJ`_-a(9+r%s3VY*$^=Z%E6V`>b@A-#+ zxf9`yhxTI#*Sg>c6Z%F@`*o0$#8_52jImLdIFpeE%nAqo?K5YQJJV|)q@tem>)DosYFeO2W`J` z^96ZXKQ=_gce7#ybX}=IfeHxhA>!RPDar6bULQDc;CR_)v5;Vw_-*f`ikNG&3VdDpQ{G9`1&0Xx<2cE^@DS!VnBBo;1Y8$xpvWH+Lj<%WD<0Y0!!;G^ z8HwRFhvu?y5YR{P;7g@6lVp!xBd!|zyQ`e$Y?bp*0F3Wce%?2nj8X4XVL@;4;g&@; z9aCQg90N#9)(V)+C*d+9RULkgx64SR@LiHfji39PD2E0wKCssjAWk%ys#-G(nuyA{ zJWe1VlSuj~$RJ;F=+*S>U-dG^>o&fOp9C<`vA6h)GJS!4fwa91?C;DYRmFK&M;7L0k06iKOdPC}3higl>Ugx?&wQ z+qBNF)7L1j0crN6hK|kio&3%7^QN#8;<3HMsuz#iD_w-Ld_wzCX!J+5ZQwR}$Cv)L zH-RaQ0nYSicMH_7>e6+?gu3nQHbyYBgz?5EcMvxqMHiI1eT>xmT=$=ciAE;b8Z0z= ze!6Fvh4t=WB<%yYPUBQ#EzznndVuzO*w&nz3xK`5x77W9y01^{JYZk7d=}cb55?{N zqmLQ)aI`Xgu8VS}17_s-(l-(OJT;(AB*9N19^>;j8>G)O;fjbavo zB=8z!l1>aG#%PRWEbJ79#+f*-0dy5V+=pWd#8cK8;AzlQKY8*)kG-$i9TK!8{Sy#|1kgDv1^%4Kn$8A^W zl8M0{hy4q~;1qB96D6GKqD(}6AGX&A%^WH9T9g@=!|`mZ zt@d<@lL}}}_BsW@$qE0_bY5GkYC#nJC6N3`5K%xt5QH~Ll2o$5*WX2-amVO$I;e<* zy=zyknu~X14l1}Rxt%G;Eq!N$&*K+5Us=pdCh}@f9`~!l*gsDkqxQG&uJqW9-@zM= zUVemD4#`nwx96Sg5apZh1Xj=RM6^q&6Ef?wodd;%yFJ0YT5J~TqM#G$Bt z_oBZvedB-KER9rQm-q8Syn7AnQdMY|gc^?UTz6Dr`rSnI{~UuWRRJ-1)g{V1o_335 zwYc9X^nA;Q<;)MHG%A*U1AXHg@VCADT8exTJr$UJsuk$M3 zi|}PR8x{ES=F9|3#QRccIa}Ki5n-dJELCQ|R@e^yH$zJ@5JUcP25@u>L(D=dAkT04 zK^>)37DpcXX1qFiXYG{wH~+wmp8QMY&~Lq_1W4KB?~0;8rYRY8*4Jp)gV19H=U&?( z+52lpYaWtQLkY2E3ntfQJi{B;dx3F=dM4fTF?dfI>t}VZNGcoG^YmoQ{u2&3b}&rX zLY_^p>EJGD;4>zg>gfI09#Dwg#QZpDVa$PxX9(e)4Sl@%9XGt=BEq6*p?z1+Y@Qbz(f;_nlG>t{BRw2!G zzRsTvke1-RO(IHmze}s}1Q82QIyk(>6XUjz>&Hy*wH^gNA1dg;nKMV#N9x>LBRbcSNkB3Eg)9U#?esAQB`x(g3 zcW8R#J|g!Tevh+BZN z;-DKRB8Coz8n-PxrBlo&XkU1m@0e(h?GZ94ovoEGYjm2Ux8Mf2pH|Cd>*S)>aM-3( zD`)a_OO9z_h(;O4GQ%G%he5;1h!=$h@j3Xx*&_`4T9L17Q-fCEH+M77rzEh_GD ziY?2qbCaj0S*<5)=WJ0mlpc{0d4i84C_Nz z1})%r4pNDDiuN=4&Fatrb)aX50LO2+z#u37x{no${m?o4ymudFlZrp~2qj5XL21_$vRNUvRm1>E6ei>Z!|4W< z^5>K32aoz3KJVwDL{v77jeFPXfDMcR=MRTIKW7A$IPw0rt0r&rHbKVYzi(K6=8`?v&U>O&kv;UUdKa7Wtu*bj9H22C(Srgq}O-jJDP-+qD96>BqjrPc``9r4C-~YAc%tj5*Pe{UPgdzevKn_6H>AB z;^W6-o{+DN?$Y0SbN`K)XI3a??`3_Z7heV*JSO3pgB(QOxC_%SaK0f7Q&DJoIsZC% z=_=~uEPOdITqSsS!j$KJ=Ep*(E6^nhjE$!Q@=wRZXQgp~Y8m)gO}cG1sRBYrEXH_z ztNtF`;H%I8Pgi}}6pTBo9Q4Qd#gwEHB?)Svpq!`ryq~Qq<*mmGh+ueT1gjz8L2rCl zbmm9l%>q98DPRQ(-oM{6YGA@~S?pfiWdgCUnv$u7R#3X!qhth8Am9wu(02#H|ZCsIMwnuk-)9YgV*xyMx9~|6(J4az=t!Q7rEC+nf*3 zT;*sCrfYjzK5rkT^3wdJg8tiV)7dZ8*q#^)cC!5v1;yc~Uk8cV(%|BisgnDI3)8^} z)DGQheteFq$o=%bMm8-m+JteETg7M2>ugxVD26O;tM&9eV@elEnmgvPJd8<1(wqs&`E?k411+C zg*(-Frf5B#Lwl<}R^IA`95c$1F-2za{_K9!Hte#iK*QxKIe6Ee*AiIg%*HHLwHDap zXgWlZNk&$op1H43@r63bRD}`b<~aJ2$rAXZZc1#X5o zJ}1~7Xq6B?beWI$vCErEyf~KkT9Q(1=W>*`rP-zv)J6h}u|1kCqKt@*nRJ zZzZ8Q)&oV@P)oU>x5M*B6<%Rx0~&%1+`rQKdCPzRMB`O^d1$3L-BnAoh$4j0_naPC z#qzmNF76}344X>q6YZ|(he^`}_-xUwT48=2ME%?_C|!u1mfV97M@R*o$G_)Y1aT|N zwb%W^9LCUP4lxu1)Lpc`Q}SH$GZxDcnp%8V&Z8)Ky!qC0I!ViHLj;`gnG4i!Qmc0< z#~y5K863{`Pbifr+`UlMXVDc}7_)GHi}v+O@guwaOtMF`38n-o@%+6X;Q?9PRaWdh zRH_5?C&ZDx?t4V8DNQ{p#xc72NTC(enL@+!1R{?%w=)nz)&6o_scpZ~J<$p&9oB6e zY8$JokxvxWTIOXNzph%!B)CMWDQNQJviQLF`3_`EpC2XFN@AKtyTBCs zJ~0e+E-YIQt~!kiUX6~ID`BtIQYZT*ccS8@xM%zFI7PED(1xT&B$Ed|UHPytuUB%v zNHZQ4B&EbLn9g%w3}+a62K*=NaVil#(N7szE&*LNv8M*Z_%$cAPm_-$+(Bb(Yx~duYZ>kpPQ%Cw zf4_dn^e&n@@R)@}T-cEeA+|F~kwj4_`ZR0N?Y*%TX-?l5CNfz^)iY#O{8YPcgMEW^skbK?t zk;SI(^@kK+S7(ku{8Hf;p>{9R^WZNL4pLvi)3Hgotv7C542oX8+8JEVk8{=KIzUj^ z8nyyILpch8O#MP%Dh^r9<#`33Tfi&xTs<0o$h`-_E3whN##J*0l=1od!wi<-5mQ|< z%X=*Kn^D0Cofe7jew|_j?a?Mlz@N>SC$Wehj@EY%Ubv|rZ+cdq2 z%do#*2;ticuiIwI^(Orc`cmdk=73c9&#@Yd12X8Bo`UYx&F(2>(tC$q)Cvf}hJ#r6 zDl6R}i)&_B+crEP9ddO&Qb27`Z&-Z1><`{-AF#${a^}xr8Vc5s0yK}O7h$;|xOh<*S zOxCHLd*xDFAL5G5LPROa3*b+2p-bj-3Zi1dEBZqVAC~ZEtou}ruh%E&V2*$bN>NaP zPle~bAuYm$#u{3%-PnG=C8kra*N_SVZpz|UvL{jozy;x+dXJ~H+kH!LytIo)JA|JM zi?YwprrFn#V{~`F3EvM87SI+QzU!xr(CU4FW_aO!MyKstn$s)QFxLl{(%8l8Ni@#3 zebDK@wHZ8eg#Gpc(A{uRG#`YPbz&e^jPKVPO7EgMJVlvF_Sr{Var|QXS2K7Xbg7MZ zF6>X-uZ+BG{>eBW8-U7g1iGcls3dxd-1mGu2=r4q^QV{t!_boySwWzrqF{VnKF{5} zSB1%a1MA1N#NVT zSxEX&psNR5r5(Xl+3m+7agolKI8v?61Hf8PyjX|Z`ZwEeWb69F4z5acx`RB)5AIJus&U?ijb4Qpp*tx{P!(IJ}4(G z9UzE4ZxKf$ftXV4b$)&-PVx#bJlH@Ep3~_G2XQitexKDjeuV`|B0cAES4%CW#cvqL ztnKN1EckP8iT?1_r0FW=_vI}|n*OkEfIi>a{$jr&CF%2LGt|CE?CVLk`K&?$e{D4m z;9^ch5bhWnz+9l{K8R309}`hmDBdM$Aq<**) zLorH9tJfe<{xOvQsA1hZj%X=k{t&Ztf*viF>;wYkEz?^QE9{>f)ShqQGu1SKO{?R( z;d*s*klP&gIaM|1U7Re`RI-rpI0 z$D^j|U7joCLZlG?WK)}g;@>*{e(m2ap-yMVd!UOFPamRp`K~^@bG`aX>+pUK8pEiM zV1PPf>~0D*uvX{8hH+3k@Pd^6+I$r5jZ{y$5j~(^ymhS!MblA#r4#Y9+wb9Xf>&Og zKEKmkH9FdX$EDT!(!Bq*cl100^ud_k~& zp*VhZlFGtS7oRW%y2jQLp@|W|6+`Q=ILG2TXWUJKol4RLxI4J5-6x&*8~DAn$5gH+ zCnJ1L-ciWZv$v028AGMt+ly}2y`ezr%G^@_;aHpYhl4x`K0}Oh0|HaL=S-?PiJy;W z{d{(p1G<@6CgL3W>YrGD--CJtc4Cj{mBM>;!vhenSY7)c_&De4^P78UU%FWUIM@@F zo_-%f^%DNLn^h+9$3t?&?~cujwX&mR=%n``(-*dS-lErBw>M(mPq#G2PnW5Dc|849 zzp1KTA6!&j=ybZQ$T-yL%GB{+UJFR)WenI!1HC+f2~HN?P-wb$VpckKG#UGWwytz9 zU$j1?_dDBsD#{a|6rOTt=xP%Gb&DVc+n>n2>(jgAe%4Bv5)G6Y3PI2MK~He&y1HDf zR_2K==>0Y=f6$w*+Q$Du&#qkdxjfqWy?7RXgvd+To1dgTnKtI)GV*MVj;qC#UZS~A zruaMeZlf8ikor}7@>zq2qpy&n{`zYJvN47Y7#1b$=mNpEmGk~JRRo-uZ=gb&K6VBBZEuKDv)6FZa zd>80v?ixED%CM=Nsx^_v+9PC0XOD*}X8Xn{oPyjY3~HKNz2*l52nGZc+DV$=u8OCA zpUFAN_p2lLmf`WD@%y6RXSmY|2F~=l9)8vPx}+MhC$t3g>p?2plfb{`IG*+P=rSCu z_Hal4i)Dw=t0=TFi!H}s;uR7+@*)==ON@Ds2aI_96g?vjCYlDH|0;G zKQwHX7q9GRR3bsOetw&Z3;iS3x8i?vo$4z+;u-C+U50E9RVIdR`aI+JT7OXAO`Jw;5}>?fNqr->K0 z?N3wUKKRy3?lE2dsB^%;a^~~AoR@vj;Lf7rASeZ-n6Ko8g#RK2X$ktEGQa+Y{bmuQ zQXK&%A^0||f9=jXv?g)0^3xG=;X7}0+^Py`JzOsrG||?f{PfL%h6VB=wm#`apN|6h z(MhY0QkQs}&&oWw!rI3q$*dBfYDE!3qsJw^v%VqdS@@BZ}C0|OD(o>ATs!gn-(b;#8|4=$y7}&tH$ZS<)>PqwbVWl6T zZ;~FFD2NWF3r*cXhVoh?Uaa|dwfkX0pAt4y!fkRNPzq@f&s=V^pk%#1VOo}4p|FKD zzJ7VJ+Mve-i|c%D%-0k75Drfg`3_7KPGI#ggzeI;J;D=3DKu8`avOzAy1s4zsS8GGlj&-&pjm#S|FXK_k-iU zyF4ktXd&&ln7Dnu1w5pLOKYz2wcMw_HBAHN^X}G2HA_>wq5Xqd&*vAq*w(k**S95Q zMxgzu#DInrUndj2~>uUOhe$o1M{ZV~XXi8upqv0kO)Ccc#p zjhxtn)uE$#Mn@M8m3(Qzey`!g@?*(vt zo$RAhf__;}V9r2Nf#_%mRn-krgSv&nej0x+>=_0q+jY+RJ52U+z@N36mgCpg*uF*p z<_DDvkK8*e-;_}g04n6@urnXQErTFcaBqTf{>`K1pHxqhjA9P2DrxeR1``t^WQQC1 zN8W%Y^74dp3+$q{iCf^28E@6?#oF?fky!Xg!(E2oS}%DyV`VqV(@(|hnk;A#QC<5B zEfxqY&<*ALT=V5g@+aKk4#0!a{@YiE-j_YFlwqT~>-$0y=1spZ?zW}2c-VvbX;D|X zd)_a`$7sItnn#?i9#G+Zi)d@P@t=KEU@3lh(8}c8;8z$FOb;EjrpD3}vd z&A-;i97d9_NlT2$lDZz#k6liC;IU;cMlyiPS1WZ=+sm$*aJrD1Z9=#$9yfK5ZG>1- z>-tKOSO!AO+%R_U$gm568*(>t?E=lTlYR*px~Gi-OM_=tQRRpZ+It|@UFDLT1%gCd`>)7npGi1)ZQvTLdAG=%wWEp+Z}^s9VGT`48z!!bF$>lHQ)`Gp{V-JE{Z z*9@mBT)%th)``?tg9%ODs3MUH8?|Xb24S2=A?^3H%}VKgF%5eI&&4Q&OUtM+IrNL0 zGOu@XY2F}Gk{LYrjsVVy`m_&=QTAdwbHGrBSA78UtGwR>qA=%vJmsz`U}I_<8!#-x z4;TEa%1X*BA25+uTd*GatGgViOT0QUzY3NGa425<^Z%mN(u2#qk6QEG;so zkK$!ieD@In+I$8Ezm?>Hm_?1{#7)opJ}?r(eq_F8`cq)th#w7MdhBMXQkc8lcS}4Q znUuG4ew?IQ?XbK8WoA?~+)WaCD3CW7lxhhj&eKoI4|CcT4vE5x^EY>?hV(NG>XEU_ zC46~fskLMO1L(OdnszmYWD%f5h9~f1f9aY4`lz>V9660(!5d zEYRfV$C~U%E+a;hLK91AmUzh@*!~KJemFD_2O!LV#oAHo9>o=ktKul0>B7fehtw5j zsURaup8`n$xPJ3T&IqI@SkPCAozSYRvz2}>zCsg6*VVq<&<223BYG@%;+B_na(Zzx6+_jCsK+qkMc{;w#XO^(I&{DdgD& z*S6Fnu#&Xm`=FcDKC#_K5P-*=OsdGQHPGGcJ~CWUFz8Z|&}U6Ng4Vt-hk&KTD+hMg zEA&In=LZaH=F-rUHYp8qQ<)QUI~z-UgRmRaU@sJe`-s;$=1n9|EQzd-JNyheII02z z!3A$rGRXRSq}VQv(`h^ss7T8Spqbm6b|Koldt@3npSonCO2d?hUvN_5R_knpW?!~~KcaqQuo z8cknG?*6XEJ}gm}s%;8Sl33wr8oVvZyk5cg)>`i!{N*!fNw5;-(AV0#B8Ltm~~XQ+s8N6$Up+l82|%M4;<~94cL^OlN-=SA(EYVEhY4$2GGAisP58n42ZBu<%a@5}CY2s$rS^8`X( zX}lAQ_MTWbSNO$A#7{(h(3d4mi}^QkFoh1Yd;9^G6mTRG3)i+kP4QN7mqNSZT+!Zp zZG`W2pUOI|%_5Od96UcTQn=2Ye z#x(6F^V7Y>p9#zT-K9uX$`Y`4h+f2f+Fb{-`a8z6k2W^D z`@llhrT01Ec6|Ckh~cLa!uD{FdEjP!FE*7h|4tx8OU=xDUotN&+|9TV4BM{jFtroo zUgr994e}$z$XN)$JBlgR=^4X1Cxf?SBX8T19qeA)Kf?CljJ%AL`E&8Y>Y&*QNQ7)J zK5hUE=CMZmUv30`Ts`{zez3B4^AHgWVuvn&q&T@Uq&;t?id38(+D;Me#^~`l{O-Vi z#{>TB*eRD!#f$5c51+wxXj0hQzOztMYW8X%%d~=m%ZXSIsHjtXkIzsN7G4w9CA=LV z3%-KMiN~aW-du{ZJ54Ac{=dd4xC}Z=0(ZhYP-!N2Fv?mdQT`uAatG ztXC)=$+G+Oqp!m{t^F9?8Zg@_{w728kR7`Jk^|OBUr9Zl0=cDe`AOMus6X>sD=rCF zToFAOQ5CFhWsHb_YiKs{9JsU~FuBGTokHH?^|c;U4x?MHf7tL1fx@Ja5485gAb$X4 zf3EHV*fcMD3YK+yBu|t#=-zY2)a*f^KI8;0F}qQl!|!l*%~`7ZnlB=~ zTzl_>}hB%8=e1=w+XlU?^g~RhRc>6Z8_npN!8^*@&=@LT2-*4qFnF@u6 z#9IrRHv=pp2{)okrO}=vG`S0V^+!P%byJzo5iO<-7fO-@aq4`Me9X<#$}4tC9h7bL z>HCAuBPG-iFW?ETXvKqJ2Av5E)haiwelefw=5TG@E3eyq7WDlX{e4Lw7o&HDeiEM@ zb$H?2Yc^PwexOmhNNU+kwr>erMT#pw#)h7aWSnz#F$nP-6DkK~8`7r_#aSf40I|g{ z3p<}*L6f@nGTWax%}?@cA<%_|qXqT)xZiefBwgwEr9s&rhY7ZqAvRS z__Q8T+WUwa!oh~d-{V-W4*IoG%GaEc-uOMWFKx>nXtyBPy~ zJZ>Q31xvJ4;1rCHJLD&3bJ$doMYIMpCGs&{PPA6^Ka-{bkP~kJU5|Rr5D9PQk6{XG zLY-=F=m+D(-BygWv~ea9bX-FdU)1)msRDt18t75-E1F0TwWjC9@T zV3IDUGO8^Q*HvK0NV85|h`Vr~fLii+8SrD#{(^|s#tFrq7KpOVXKzX5@UrZjqv&rH zKErZHbse~lIS3M@{kQP)|mB4x>GM> ziu+N!ey`8dc;Msi1GdV8DBd6O%8nDJczJCqFl8SXsv=&qdKR+-@LKsEx5Dr0xUTI= zZhNv=@*#Y|_n(-jYIT-P5#8gwiwf7B`U2==y!Pe3d`!k4rG}p=wNi8-vIpVxeo?su zWs7idfj<6n!ebE4c(Wyy-7_H;Ae*Z?Thi@HVxh$EXDM-(eK~eON%Yu1U}Y#^zJ%)z zk-zjeOyd%FNOE?C=86atn8bPez3YKKAVk}C#+)ya>esYPCA>6f0w}N zu|C_snjh%OR-%5NeGgOti)_&5dRz+AMRr-NeSPsca>WIKvq~Hu^ZxtK5O`%j87F-# zh<@Ko@qGe7Qe@+C7cxtleNmPDt^oWrz<2c%p@@Cok6qorUk96a=#sC?9fR|iA~{Ys zbLuNVa+o&IApzj{&#@D2vtRk{_p&dWKPqXBM$Zge9gF9|Pv6qz7o?KAEh3DGb^ivu z+5@moCZ|3hND^xERFt*BLzbv~neOV8zsDoLSICFDkd0dXD#+`HIjgLth1j#ZE{}7N z4g|&4@+81^I%G%`p?-4IUF>i>!R(6|pCX6CRv2aVebOC7psMo3f8Eg6)_(RYnKYbM z9IxdE*(tWp8=iH6-P;e~pUk44ba6(itOuk2wbsj8-!LUW#?qY698{S^zCUyN$(PAv zVV)Ag0_0;XX>p@jK(9@lKC-~Q*ORE|H1!ykRD;%dX#$CuCU&8SWvdmn8; zKy;$%{%1%C-Nw-tMuz>UITy>RS?m6XF#O@;rpNqK&$mp4`1O`NPM=O+pxu|8M?`-b2Y^~`XJK!^m2l+R}WtwmIpgbB32B1l8X^oCHECijnjn5 zK>FC{Ug(&8mc4#w1>ZK{bSQu(T>rVR9Vs`>ok!^4;*i9r|1n?BAlc4`#Z6-V5pIJT z?vY}1Ss%>v(?e*aqGn+0C%OkQuC-vczMq0DF;B0TRG8vhd~5gd?K4-C%$|pdzU?0{ zkmt7^-j`*}+;`@X^78cC#YfxI;(^xDQ=-=j4X%0#{kfi;XnzZvJM}Kx1^NibBvvFZ zD${X)HXL1ebSvZ&y$2?zXJ>UW(r9w}LrZ)#GD0a{`q%I|Oz3Gjhw?khaa`cueaDU@ z_=mJ;%o0|`%e==!csvD2E1zf7!aOVTo#_202{C=VAfSY^qHhZkOhuOX8nqRA=DY7g zGG@MC3dt1SI3&OT$?OcsRWD}vJ@xNB#8BHC@IrW!aY!SQ(beE_D7WRZkB-~JkKn#=X0l-)9G7u^udVI zp-R~~(y-`+wlg=xsUG<&5MPkTh1R{_UGJyG>!KTlQqH|^}>0#|WnW3oKA zqHbd9h+iZMToAS)2-wn}q8=ZUqxJ0<8Mn_K1zbw1Evx6AHBr-b6l`YLa18(%<36bu z;F5Swj$uLifEh~sI^(m$?IoiTIvWMp)iHz_f^FO`U}vQhx3CEr+14uuc~x|MVrrR{DHKk?)CU-;F7yH(>hMf)Uy~L z@gDc%ZHI)b!J&+o%dOL2_-gEk);Wy=8*bw2L;WGS`Y4 zced~>LcGk@9?~_2nTOyXCN+R|#UyJt>^Lv;v@NkYACWD2POC+uDnx5qpYP>yfd;+e@9;Wplt>xPNI&< z9#E>}g2c$$VUj{)a(hCmi5&&A8t5o+ICQ@6LqFST@Z>Q);KN~+w9k}Hzl|{&Uw$^= z^S?6;m|O!k!y`KP=C(m=WW2P=89hIEH)=n3k2(8>bG&r}+zh>M6X%WivLRkJ+|2Eb zwwYk_w~uk3Dr6RZO@AkI-%UBb*ss4#=9Q222Y`K3*O-stf>BoW%)Q**m$vVrG-X-c zpNi32xr6RTh^V0zJpACMn}@?2PAW`}j#)6uo5dD*?%26j4~52!2m9>gx2DJ3-;{5w zqiqw^MCPpZx+LN|W6m$I|@d%+c40tzx64c6*e=_q}t)>H}BzWd>^aOOX`B!qFH+ZOX zym)SL`Mx)XoIWlb9kdX)!%?-*f(a1ad7e2g`XU{!8F=#x(myv5xjo*|HpWuX4VF|8 z)dZ3XEN=p!vU8H%_gEIZsEkn`UVnb;h_<@k4#6G-Re6p6h>tt+lTh;#1Vl(Lv9m*U@_fzp z*J&R+1in8XPbZ@C$Lq2WPWQ}51-TP$cE3qrt=r)QK{(|; z5yfUH5$cb%dv+bRA)SqeGY%CfcBXCscnrK1y%GxR0rY0QgjWw>Ix_&i+?xi;AGLw` z%XM_s)jzVgfQ~a-km+vE!+Yn)!!^99yyAA~p2mj25AW-T=YoE>`z43pczFBhZHrnh z^{w_*M1D(5u<_J(-yN91;X|hqaBj0J3B-Jl2_Kkg#PsSLBACPPRR&SWI$(<0Gq9ZB z-82H1%svOJ(p^nJO@X=gzxT?_sQ=9~oMlTyzbCZU?3?+t`e8%swJcxB{WA3K!YED) zTtUkz1WYs<#*6c9^X%TmUeW#0_DAZ(&>a<@6WqpH{ zJh1+j7X?Q7I_s1B=t4jzu)%}ZnK8=kBz{KY7aXAN;MU+9}3w3OVD@^ zFs7`vZZ5EdQ~FU>6|PUhaGJRJel6lcb&nKU*ZfRw*h7_b)$wusy8U&xAW@q-y@x3( z%J&=Ic}f#}I`w`3E2=(C&Tvji@hEzREP;C6lQ;B59v7kTK|IkbWdOH)2u)dyL@DcK z+zu+OpwW7gIwnnjMgouK;`)6q`q9g#fZtD5G2`T^TRnZ>M$|wy+*Ub*{-W@Tj%_N( zV-4;piE+Dh7OJTTA5i|HTJGYJS5x9jfdS{y6&L#`elz&J2fm!%07b3uY4*`C3G+;D z!GoM0&L`@<7ZMsVa~4mI-JI{=`g6)L91rCd<+_70;f-#CyBD~Z0M{q#S>G6G+L~ZW zmrWZKsJ z>lGcr`=vggf2aFAgQL-<@?J(#fef|zPYf^9_I*$;OI>>?b8L1!G}nR(vf%Xe9w4H} z*CVU}4ryI%!L`3JVJUD2>Y55(Y+lvz7%OOngHhsqiv{1Moj|Zh`^fL(fB;M0`77P1 zUqxRD8I~z=)hsZVEDs+9?HZiM)HxlWvOm1U^Y_kjuhV{@N0#T`U(IGLXE{ zyK^T)E`HP$+OqNjpX~j<-@T+*tu0LIE~(Hv+m9eR+lu1g)x9v&T#sss@r$M{eGzeZeE9FhX8rvtY(Lfor7-VlsFtPhk0_GP*ZtgG=c;|9 z(g}VCed?GnN<=6R8CCDI-tIV0yEK6EGeA5h-fOuF1f_svc+$o1vXSqZ>jF@422Kke zf^)dEE6Af`M@F4=aAr^vzryy@k5+RYE6{r>G|C;O+Wo=~xkVWMIVY~aw1sc;?_7k| zgjuoJkn)b6AvUSq=XF zJ}Xzd)gz8U$!2`;j33k)CNqhrPm;X#<$l|qRrsPR_FOcKI^HTR^^0E_m*muLILanM@tlO(d$F5AX*XE+diEcdrZ%mxX!$3cHTU~Anj0+V=U zanv@V$8`ujWPIAddJ;`=L_7sHYsQ?{VgAVDkze96lGvOfZaLkzuyd(eo!ubBeI?#r zuqqzg3cQK4yD_Nbz5t9sFa37;Ie?QGbqK4o1JxPBm?YX1;ih3MN8wpg%-;6|aa;#q z*b!Y|nZOB!U`GQ9Byaxq+^uvXJj2;^D3b0nPzUJFS7XUeufhfGH}v+$x%qtR^Vj1B zK6SeS$lvIvkimEupU*@dfz9qR{ zFyq058b>iYfJ~k^7jDp>LrCp$s=IDRt?q3&mbTA}_zLDX zMh3J$SEp7&S6jaMq*+*cE!8%HPKqc@4F>Ee&JE=6*SY;y;+50q4T8y`5~T>~(v}Nv z={#}aVAzZXQ10B)ozrCdeVyjvn4s7ghBQ@j)P|`?qB6&yx5F4+yP&mZu7;#O^Gnt} zzg=oX_F7~2$2`xLV94dW8tGhEi8n70fBCDi85BI~G?s3p4bBKhc~k^ahv z=x}?7_dNm$N$YlZzvWA(gE_0U3slWmrocUM-t!0#f2LLMVkq9P*zb#$)CQW1M##+2 z$YBZ&jd4{%-ha7K^bdgg@-lM)38VnTU5+Qmw(9TizLFnvp)48^E&3yJj2r0D+bYh` zb_SEx_>|kdR81MxuE%3iM$e$#B8?-rYT&2S`tkZ?O7bM~te*JhNu}S{AwMbDVS=+{ga|g zbvTL(=#WlRrqNRpMq6`k>Xq(4QanWtTJJu`pWMuY66E_Gf4wbzvcsWJwNA2^z z{+xF*X`MmzKleVdVMM^&x-{shpM`xGUE*O##VZijiJtW5^7`h!Z+~%C=kUu6M;Wqu z)p#X~*i2-Vi8M0%EYpM_`tK;&EB zv<&N(^+E-qOCZH~lU>%KRXjsw+I23S$zOy#{pMd&ydM2ANgf-MU@t8uCWptL)8+VB zYob$l{M9AOU+xTtus@$8BiHhbWdW6~+Wk6zH@SFii`OPS;1;4C>gIg)@2Bu!oM2Sj zo;_*5rSo%Ln=7UmzHdB0J9EvT zad5ww1?J#a-&p!2k(&Vxc`uLuk#t>4iULvemn6$0NET5M5qTr$AV~7-_b^*EwL7CE zrRl!m1P1C=J-q!6lndAr#XuqEj}uuEDkXP!=)Jc@3S9zqAEKijHLouKz*2m>HAVM2 zLo;fS$nYCI7J7i-Nv0$O%A1%n&!Jd9Z5B(20`@@;YvSyXfwCKPrwz)mkF-;bj;gYj zEbkEl%qG-sk zl!_zAT+l889Z{#jBAq!*DZX9%Sl2Fh2z|LZN7h5L{=iF>k6U!-0i(NLXXqO|pE}F~ z_Ho@?{ZV>P`#E=EF0oFfu)Was+zaNfLOm7r(xCd<0{)3Q8nGQ z8kdD!%L9clR`izZ>pF54quy&dG^s{u#%q4{h2WLm>XQjw(ufNI#8$7z{ZZK# z=J0g!Z9`1*?ZY2fZu#CBzNe|sm{vS$KM3?=Dk)q7*p)LmSSW>IKeBHpIUJzP%*=-i zqU8FL_|rz*eiH-F642@2FSo<wD7;$rx-sLPYFq3E}i7>;nUt1v>|@l zDOrBR5U!W$r^Qp5o{ifQy*Rqelb%)8V^9D;ag&Vxwl8a!{ae2VCm4>$0t)<7zWSQ9lm)B?#~SXr4AS@bqa6_c2(tuwMsX60xM%11Woa#Zm>8*GD7g>BvzMSjcPi ztv{z@x5l~n31XK+Vd&Jr*yT;vb7NKO*0nX3!IGBI#_l3})ejoN{U0hvtj))Ny zeuu!Vu-|&`U)(++)cY{uX2&h*!nBl;EoukyI{cobvOUCm)@m0Z7vK3tkT>b@IxTPu zc6r4~xidTkj_i-areorZY8zaU0UD3V&9Wg+2{mEATUnSOjA6+ZS9_1>`@3#kpFoGX z@!e5K&A-R4DWX>R1u}>i4XONWGn0v#eO)w#&>$N;Lc`A}MfHJrVZ36fiX*OCSsUlI zhv$m_M%i7~zYWzv;n|+7MtiV4fZzNToN$MgEt4o!++}n!MqAW~@?f{p5TIAYntTP~U~w z*d2~B;^j&A9<+6AfCjSzF#U24c@zO&ygQc;9adJiL>^b1os-jV6K_;g`Hk>6@!VTk z`iAa9HhjKy^J805-^Cu+zny0!OYjy$LmCw?ZP_;Z@*+^zJ8t{8Wm#v~JKV~*$Zoq{ zY&{anOOxO!FW-z;mQfz%k15v-r!f+G>>xXs3&ea9CFn(1>)*rCgzpE$PeK@bzy-8~ zxbts`O2JwszzKfLnu{JlNu+)@Khd$Mz7la*0x4ZD_tv2a@yP-SM=)P`iRL|ZZr*b8 zh4h)k4Nz1$qi{Y{(zwX*U?fzCG;5yAuBYGU;dxQ><&;WKjNU(Lm)X+E=O|cvN;MxW zck!vmZ4=JF7cYOPU$()k2K`~Y`>m#*rO_L#lD?_@hRuR&`JWHu?-!F(`7S+Be2uwM z*;o3~Gp*rmVhT`dO?LG@PMaG)93ET^qc-Pa#gHZ?H|Dt~JT-hVu53T#hO$Z7XW0js zB{!LNhf#og8X!WDh1b(&%b!Eac;XO&!f-E7Wjq+GHS7`N-i3#PQ&G}4#oo5Z?U^=d z5=|4Ce=KV`Bvq9CUQeImSri8KRj^>L)c4M|t+2g}Zya&JQ7W)j`L=13?sEQUL}s6^ z0~6h!CrD?q_FFejM!wI{DeIil<|17o7eX_*15(IG?ScMf@Xhv;!xhFSZ{+}1o}4Mf zIZAG$9#SKBQXO&qNMVI8S$rPVgUurNd}Jsair$M&(>;_G6{&Ry=gfc*<2(S7RBZ#2 zZ%{q)qip6w&C0@O2b;s05H)JMg-I;IxN2I_9&w@}t+UIvPsVRUk2-BGLFm>-_8mYy z7#LTOqhjDmVE@p^1yo}9k=YZdDpN#}(O1-)_19jm7-tAqi3fdOxvQVc?XSUW{S19t z|5FTK#^K}I8sW@@1Kke(RvGFl11YY7Z`Uiu2w(Vs zJV5ZbJ|{k+}=f(!R~kfR;hxJ%#(eKZ;JoE;b!NM#)y;8dD1D@KF`q%=`;`)ZlB*KOH z!$x^34LZo{SKGf&dVTM?4BlLHquU20%qb`=7NRBv zpUAMfuX%h8C=Y%h7ASY50@FWaB+3gGZ9z_gF`_)F{ z6CO_zc$l6Q*$bUZK&#_aoLWmxa865K34cjf@uqvEzRttF0)cUFtJ}eOU>R1zR3Oj& z_PKbFX@QxXB^(zMA4HTqI15H33hHmrofrP1ACIR@dclLexqVP4OPLV^Geno$L1*wF z(f33SuzCa|i`~gEl|0bAS>o+Z4|h}X$d)wS_Gui3cbqty2J7y`gXSK3fsdm!zQOF- zinj0O6noJmm1$sHnV{4Ssa}o8fjaX~Sw4*PIYGm$2Hru@=Si|E%V!1Y+1`LDr;3@q z?8?UCkmN>*z_Pq~sAa!mfEsv>D5)rYJ-xG-^N+;MK9%>B{LuPVTD%8eSHP>WlcZm#4I5Tc)1P zhW!hBFIUO#;c|bM%a17jAW}8*kX!OA9hk8n=$&|UYu5obUMPY3`KDwVZGN4+eAVAi z7{8XUv)3W`lARyxk7KB4emh+H#ZnB5m@H(VRPn%h=j5GzXU{(MD-;m|Nw&8xE)*cn zk78iz`B8JK`|)va`1v^D%T~;0(SP}a_UI&`35(wJl-hU?@q;4*uJy5_hx9wn zwQ?>7?NfDmuv<&$mIEh9A%zU}p~|4JoD1y!rL+(nq5&aW4Bw^aE`4P4=bW3bHJG0O z-ooeMYga}7SRs$k_!8WN&#wdBM-FBd2ECh2f#wzbZe=*}qBWbN8Fd?YPjNf+$B+t{f4lk(AOl z)D+Uuea(koYBmXiV%%x`v!KFy008>I&5HIA--F127YLdy@7_Yd+|?C8%~?1BLY;h%;v8TB6s1#vR|ch6{{pMP#|i`E@XMKw{ay zVadLaEcL^v@Y{uXIxe`;@NhH$p5Fmr;)*(%wMS;@@Aw>RM}rCGhS%BJ=IRN`iH%h+ zLBbuT;R5D5|MY^RpJIdOa`h1Abc#dwR{Db2^EcFfs>b0T|`>^cn`3$m5edR&y^JJicl4uBvAaO}vjz2l=`O2=`z- zCyh(rPK@xK%J5V0(da}lH_T!ZUM;KEhs=#a`bRcb6Npb!?vv4nRvM1{Hf1XOT8Ufj zgLi&wUGmAPP=`UUTT>VkKCG2&Xk-ItafGH`1#QK!<)-|1-5*TILdJOj;=qnN6lZ!k z%ny3G2D9NoPRptWGRxRAhK54jVP$&x&`9s#4Ae7RbunLKY4M>cKlaZUc^9dkr1SW_ z7Vv*khVa{b6yIomLm3F*3o(0OLCspfOYdcKxvm?X-qnQQA5ZM>h)C-AVLAfx7)=3h ztrI(EOp`y`Zq&5eqIL3oKFGo=EwZLNW#nE+Qcj&(1?_r+JLeO`ygSR&@;)6}4I}9N z2dxHSS7yOns>~aQzHMJ+`(SC-lX8AkU7+SK_Gvf+In-~rfGR2GX>3fs6dW@3%!Y!j zh?6(n{6m)k3}H0IQ4+-=-g`+H1v5uDS#MZ+;xG1Ub=x`KQJLZoEW6=86b40;@GqMP znBuZ((xkHZ2YDVFy0{0iTug5^CFL7V>N_1|tixmcN~8z!)0bUZQ@zOt!a+Iks&+(v z$ZI6)3O(=(LIm_}#`W_%>sm(%ci&n;$ru5M#p!SBcx55LPV8eWRch}~2IlZs-rw=0 z`;be@rPoSS-(~1ISbgJQDcF)gQv`whS}9^x@~e8{jlZ4^$Rnnt5rq1xL{x@d_9z>d zD{w7)=rV|odd&GJ346b{|I|(zY(E63Pjs_V!mG4H>+96L%w=@NUp4nq z&_?91-18_eN5OATBIj)_eeEr;`}NDUGvKe8+nZ(Qk=hRX*09h$=kl+P%Dp<%ATUs> zMJ|Wny{QmCBb_~d=kE{4sKNE>7%TSyeNB}5zM<9@Ahf#;Gl_d|-le`5?#kLCW0okl&^+hJxLvnleT36MRz*Hjy$ zRlMEBo)${!z^RIs4RY4X1Nz{nPDXvdnkO6$^$48O;v4(T(+iQvT}UN!F`g6Ouq>0D|5Z zDNF!o2t*F1e8zmKi0n5EM`azxlcg{%|CJX=0wx4W1X5OxH^7ZO*ovD%$#5+`61g}rMADj2qX zuvC2oNtlm5cM!b4!3Lrh&p&!~Nv!2}-REQC`|jIRJsM@hQ!G`AuXGRlu(t?+trO1p zE>M_DNe2Go zt<}(vY#* zC*1yV?R{1Tvj*#H`Fbo$cLk~TLKi9jqGPYHdFl8IM1cF+larpU54`Z+uZq~mR`3eB zK&ZsGh>HB9DDR5@kc$y>VB1R~_;gJz?+fuukq>{ zcK6_NvPU=v)a}VT#`o*lxkVrfJ#`xg+ds(*qHNRJkrtET-YR10bm=;I51Uo@jzPLdQ#&)r57W%$#(PDNl{7`CELyK+bl+zb zr8<;Hxv7YoZLJl3yJ<@tKVEps#SNr>-mj~$WS*&|jcv`r^5Xl;?}rZQUvG{iH#wzy zTaT}!?^*i*`>pDMws@p3Ob z^aM6VTyYcSE;Wn<6x?JxHK`=SvpH)k9&!cu(oA5zeYkz{@CWr#qmWM!&&FMlo2LOm z(=|iHshEYv*M|OKSKq^3QedO-INlWXC}Z$yKj4jaG_T!6AQ`x(4R-bqTwJ&XhFHZ8~1NaX@PVwLs zv5=S6iLuWu8DEe68gtY2dmGe8GaiXAF*-^>wY$T^bvHP{wxkYMo$I)mr#%!WU zC2UL#Fq0`LlE!P`U1#a_+DEUtXvmFV`ip9)Cwo^!uy3!`{V(Scd&F?oeb-~jlwldw6O_~{%*7_bi!VrrcX0=jY1%R9e z>;;3bTpXddk5jUX%eQBTnjZ6VvJ_NCQE%|DH1_p3&OKD4UkilcgKV9w`1+}u$>|oD zVBSzhXM7Lx)2^+eU5T&G+$w^m{sO>161Zxh9s zpQ;$zpPDY)TK?obm=DiKfjO51K)-(qPEVP}tr1~)-rjdp)4Egg4P;wJe2>@J#A+*E z$&5LkIrFF4GQeW`&$>^PzeGn=-kQFgH=m{tt)gPQ zi@hU&L`NbE0$jZ#sS#rn0LHKOidIqZ4VkbO;}|}a8|A$ERph9eiw&bkLD5U5GxS4p zIep<W!e`?0WdSQ$;>a=EGNWx@49H!q^dEShnIW#DY=t!eQh948F8BA6wPWI zO5w2p|Ksc1c)*FlJUSnd#xk<6w(m>9e=d?I>rE{@u2Ck?YDI>3 zWq#hL^Yvi}TZ&(VJquDg>)KK;YZ09H$#CuGd7U-ic>z!I*2ZB!Y&C6`A2|9om>xpA zYDsB6ud%gBB8hkk2;3Y((#!RYfN2>bJ$$V6jpEg#zkK_Ueiw8XOZ$2$Lyxw-Ee~Xn z;;S6}>b2)q={_EAM+PNA=8qRMHO8*c4=pfNeLl&?hy5VUZu_Facn6VBZqI6K1m**Y zqjj(kY7_WIjK_XE6NXSTGP|~d&4|b8TsUbYz`eG8MSl{M3Ja>58L69!ZX%9{(|=;) z;NQuw#u1K^;5F*XrpHRAufp9mMDu<+*CMm8I-d#tEX!_cG=I(8hKC(-W(hI2jsj^64BLuaXZ9@v!!(RKdlC$AZRj$DminqTs?ze{ zPWo5ySeh`=t4$3-{3s-tl9V4^1={6JUQb^0wW8+@Qu;41spa_js(q~^sqH=X(@Ple z0Z;z`M?;R`1wZr3=j+D&!3@X7^QDlk`q|pe0al5(l@ZB|IEU6C`O%N15<)vwvB#z^`}*x4 zX#G@e_P$^}P`Adhx_iOsC@T-U{b`NV}f0RB2V=Eq8!;nQm?;xSwRGHHAF_~|Iwmk zSdeq;JD$0lL!tjx#iV|k@7s_CWJ^K4LeLzZ10IXJSi|K|N*4;%<02fyWiRs?*~?1N zgke-Sc~YKUJ#3=}-|b%DaTQ7a1SlVJcEbf~)4>Z*~);>NZxk!6G)7Bq*fzg04(SA$Fdq3D@5t!`8 z{<6J3z#PK*=FQ8VrYJKx-Vg2BPOkhmbNy{HW*{y1!6O_$LUicEJk&;^a_`xNZC7VM z>n&IBXw)XfyzuEqeI0phUZ=ZDqX>%(C2$)(xSy{-=Kl3<>9Btjf&K%Cf1g0`2l(?q zz`4SU2AOAt`ru<9=bC!(dnldjCi%`X4sIYsF~%!xCSHf))SlF&gOKS3eOzzxo$dAJ z`Q`LIERyebv$XIVdnE5YoAeIN-p==l69Y8|Ns%tclAlSAqvBK7hqswo1dK?SPtn-A z9Dna!Gg&cSNUZ!Afg(_Yj6fg5$yo)3U`ES1kKQJV- zEqQ@|IUm!ORAEq!myNl=64Fo+e&>HbM^Ig?{718sNckdtudloFw*tijP!RUz6vU6U z5`~Plo~b#U4QLAdl44(BM$(m7&X1Mmkk~SPE{88I(yj1r;;+uw4K&eOq5;TDCX-P_ zSS}HdyCvu?cd^x3G>DThTWE`krC-QTcpSJ@YS$Q^3W|UHJ6$siLiYR9o{?QtJ^m>v4w71nRlnnze>Z%-~ZHV>%Z<`?5&F`#gpkk6sY$se=L&Y`?_tbMP}Qw(&l;?8hChu2`=L_aOq~6d0)skR8Y2 z*}2P576kS^`+g~zRlms4m6wBJOUj@aEK2vbSiaqoVmXE8tO(f_2)*NM)=&*eb$FfI zi6e3y>PMfXf8aD1D865#$#Ze?-^+u(@pSm0zi|^&$I8B!XBiQPrzL);Lr0^ScQOH@$CZ&R2OF7j9F7!FWexrF1*HO?>|l zzW_rY+YvFJP}uekhhuD-Xa<$Dna%@uofxfN^$W>0sYtON9J^Aa;fkw$W60;latPQi zbkr<$B|Zio3-JO%5on)|Ryq6-E6YQB5Qjvj-wRpB8vqU7QPQ_5BUD0u8#%D*+~Z2Z zGaELgpBupl-HC&TP-su?_DXPPaiNgXTfXsW`_opLR=I-d{2cGIxN#w;JH_s6uOMfi zgm+I??qYfYd`Y$r$8OM@9n7n*6}FWCsq~o=Ya_~+o{_8p+4vFp>XKG4?G`)6xJT9Wh#Tf zEY#;ySOrZcNq^+-*DgIHO1AF5xGxz4oWy~gB8tAVz4vN{1hWF7mwrPsCKO=A68vtU zs@YxA`W`@FYl}x7u1^|llIwlAMmoc)@a?z>=q=8U0$f0& z_J>kep{57}g5u0sAm&A{zl#V8wcaFMjDDhpB$6tb%Kbnp{KxN;B=OCC%VK8qyygPb zul^|G)#w8x{_`MyN`upyecOH)993e9bzXTsH_C$z^ zPJg~bw)-oU9mx-LzS;yFD}O66B-i6DQiu`W?|;c2m%c^~K67L0D9^iix(t!8g#{Qc z_JYXgbCRVOd4D4dYkMA$5i7O+###DQjL6WGIxY`xx+p)*bH*zbgzWXy>Ts$%9qoe* zg_rwne);6M&pa)cGbGNeg-84)4lCqfh$*B{sd1F0fXZ-lZe^wW5+69cKC`JgKc_lY zhwgN^zWTEfJMC?#Et2|u0d2%VP+5fp+2)_y=PH7gphU_HuM)N5a>84M&Xi71!LKeW zX>Bqj8 zUJ`Q)o&|gV9V*oi`*=A)H-z+{ z^XhPiasuyVIM(C+clQhWwglcf6}BFIDzJH_Rt92~&Gq`E1j4qSTu43g_7{>Q!?^r1 za)1SHU(J!8wcRBoDgQWXCm`<;swe>P@6XUjLM=huKl~*&h`{)%MnukgelL@^4Ketq zKr|nzkh@u%!CcG_!xZD$vcF~SrOJDALL`ZyWH2Ph6XoZ`y4&SMBY}>o%DyjcgKK>o zR`85eI@SG~^84Mcq;mt@eyWNd%GT`*pzFNnM3Yz@DC`3|P6KqLacmHUv$h3JuWc{V zI|isANGa>jxo~{3bOg09_>Dn#ByBqaB{W?0@jUAJJ`Ih9^h0A4Fa4nYQSCRD65oL% zXOyu?vD$%E^oP1?zwFhQ%XF)IZ=W9c-_^r^G_Wm&bT3mhN@LC#TRb6{yV17|YCxFo zuoyNzv~G%Vm{zg_&#JExP+lM3eetPtxXHK9c%6{=i+KqY{^m5xXU~KM%Dl`6CrKK| zsxFri>fR=ISpTTZ{WrxH-~m@r95Fin5dRwH4K2RlSc*U4S|gNg*Q!24>+mlPKhyqc zqrhP;BtuW;4MSnLXkb(I`8qTXgz<$bUw*oK@e)Gufd2E$SglK%i~55=Kj(vcxNNB| zbYIMcuy*DT7bmUu+zj>a7PNHl&3+3IBS<%wYw`;E`BNo#8wW92>@Wn8cnKCKBm#D} z7m97S>~*){sYy)obUq{w$BcIzO?WQ(O2P;>`?}yr?Q=|O2L09Ajic!g6LsGO6h;|B z|F?VVdcVi6ivnOwkG(~E`n)=fOqL4IUACF~bUnS-EZ#$jus}4XC_(-eUZYit!p)+~ z?t|B|((d?oK5zKl_yn~=Z$LSf0g;Kt_jh~DMht^1LPFVuBJDF-k#y#*pSb>b#9EDO}C76vh z*g|_)-5kdG@qR!k&)u&cLU+Li>b@A~4&KEpd0%T{-dMJq6dKCNd+mZd2q;p1zj%t9 z0!XD|*4-;4?_}B9!pd0J;?w2Hz$zJ02QutP*>hCh3l>E6*#H^g#;0)k#DTuk$5#7* zKC3?iDklW09@(AS=TGozUbl*UChFVu%F%7yh~Mw7Z=+nJ{Ob2@)}q^)4`Bx%E){FW zf!+5l7?*fE-IU?D-1sEi6BV-QbRj-0VkjQjraDt91k6n6T8c)^rdy%|km%K07wW9K zq4se-a1uCM=Fjws875kAesW=U#XfDtKPiOgRYppHDt!s#J9h}-Wx1vM=l_0>M>usD3-P@6LZ55w;6#5Y-!^Do9c7kXCAhSq z$6Re+wugCiIWKjcVSG0c^cN#@V~z1E96Knr9iN+fh)%@L4ioD+D*aqdFzlyj#nBveHyGyHCXs|2*`1ehB*i~_c7(((bzSTMDSJ8LVaFyegRbm z0PyOlM8}GR4w;h@wEj8jhMVY7_AVx=x#;)V+pDb#2csm}O_ui2PTylXG)VUL*ZX-g zqJv0DZ?Y>4_!>VtY3>UhRKap3=`*MA3)$z8jNgj^r$@>SeSu3*2V@}84|w&vW&S+t z`|8tv`vx29TgPcfws6!i|NfbMbkAz+xI>0hM%tAwrtL*t?+zQ1YVn98-8U5N9c*9- zLHF8!RVHKl`^D{v$nQ^icj~=!4TIjHK3}5T5qemwsYPpS+uLN{7hk8r&d=?NIDvua zE=}j}QrMr{UDO8r_j`OyWDI>&C0DKN6eJA@_opKixx#?VbgtXaDOE zc9+`m?Q`1gi|lqZ_m%RvS^)Xk7X*uYECGB=bxMzK>+;wx#Wx)_Z^6qhL)RyXg8)Oy z3R7~py~WOE?khyx)1PnBbKQ%Q)Z%Dcnm^QDMAjfvOdX%PD*A_;-aCSE!q_|@Kj zqOMH9KJtYDOqOYN_p?u;SbPm9)T<6XcwvGT#Ba1u(Q#v>ivt7YBf9%uQS9#6G({o)DvjckQri8s?H%a}66ygB-%MaX?7~=>GE0l>`C+)}qFYDCbaO8hX7ewI}F-H&{s7mJ};*8Zt}`@@v>-RomL zuhqW1+%yaB#^$l~TL>_pqxx|pJdm4_Sw%?-(e+(LuaUipyj5`v+hxBfAGp@(=TKyP z5=(f(KA=Q35Gh*xcXqe}Yf)3zGzfyTGN?JH>(ATyy}9mrn>&|^CvI8ep4m@ulC9=zJM6c)8DLELKmw^uBTSdW`}pld&8sg@Lt@}cmDL*%=>zA2_*PV)86ejk!2<71KKSWfjobv$FF$w_PC>t zAq zX&#(nT7CZLR}}P}Uf&>mLP(osI{fi2aDhmInrG;I@nt#bRg=x}V9lL*J6v7&sN0Y8 z<%^R9f`QtSDY zconv_kQB9(iumU@8_&oxfq9d&;6q@$a2}ZhLRZ7&l5!?)XOv4)%wr`((FWy zz^0Hi>ocDk=gnOp(|_81eo<>J6zW2yp)fHkt-v&H)9)Kt{$_r7M)QZh{>~MQdP&)> z$vo1&8j)KWV|r)vO6+kP`0dX>{=zLg4Fj`3&@{ASkF^+XL+odH=!fL;c3I5Xm=<4U z{jC)Ea+%c~#fkW$K9J&ohqZ++A#B%mpF*ldf_xe-Px(N;{XkXW^zh9%3AqmbH+UKK z8Cx;?k&M#pN9vc4&SgQ;s8{I~O;4}0+XNFYs>P1nD$|YUU$dSbU!Pd37~3qA_=e|0 zpRq17Sb4&;gce;`=#B_fDEFJ)3lx`isj-}FP#C3Kn!r{a`@YHZYV^F- zy%z|G%}1ZLj>7FFXL%;q#vD*nbtJw*Wz@yh^wz^uTJ=^x&p)A=EXf*qMMCv1{d;j#}yO+NG9<2eZBl5js zAt01{J9DP;msE{WMaVue%g5jFjiev5KSId;;_xlNnyEB_4-R7ryh8b^+yW|4F9W1L zk{;`*vM>}OsJS&wD{8YDT>DJp><&>rN+dac=RJ^BUSGc&+4xJb@O%aoHn;x-!Q=Wk z;a&Qg1=NinhkVb3Tk+FB;k9eBOriyCkP|2A!h@DKTl+%xKp?SyPm~a&v`7b}OdVXz zN*c`CTK@f;Aw3i*><<>0z~YCMbR=_&b?^kV59SPC`H@E$ilsuihmkqokPpP)25j=DAb(c-BfbP1|V&g%Ky!!mwV*Y)& z8_1g9Tlh8c3|={Fpm1Qt5XU4Z5)^D8!Av_Sh`(|~{)%(E?I^(n_7K?z8T$@Kz^4H@3WmrSXD-Z~%nm>ub9YXf!C7T1*q| zEt$%0Z7wn?L{IUd$NHFBebJs{2B3P)z34ZsbPvNCcZNUnvdwSB8wSsT&rHx)^X4&X z)v2g1Hr>mGEy~U}Cs6qgt()*HIW2)<&2}66?HZMH3x^+Edbme%`B{ZOu~h~5HLgJ5 zU?yr)Sky45SslwNwJ#;zO%AL&~+CpsVFAbP=t7AV?g5Sdk-)-=WHK zz~kU-xyY>WMjKM&Sv@`>K)NQ&gE~0X5U1i3hEhzdO%W$fZE@X)64Bqlv?~r4tn~^$ z1a^Y-Wo{4x?LC~uXa6Lx{CXd-<$HTVb-9m6chg-|F7O3>lHzy5co9R`=AtE083=0- z1hixXTtHXfK`W3rh5x*X;60a6s0n7+owgT1J%YZOI2iKPE5zJ|VW<#hDNGx9GzG&B z<*+C2Vzzw!j8mut-dFu)W~&*|hr*oMcm9T1MF3XJ;je-Az0w-XWX=RVw?~s%V@v;} zM@HzQX>~e9R(HAAG>WVvk!A`5Ru0q0QMr6uo~%F~uu6HFd_B$Coru-y+@I19@jCZ8 zQvdVum^%23^PfT)etGZC1CZYRR+n?#0d5)?-aTf)Ky{Ot+)zFJJkBh59% zZwKlr;7l9(A=7+niVa1Ag{OZeNEeYLYdIAhdDe@z(V@wI`Jx6EP7-Z zHsUiXpG4JZyxNN9Bjy&md&U7jTmeGDDN-((ZsRJ^9l)$;x@kYEmfka<;Lha2HFlaF zMhk)Z&&?JTW)Fj4V06Ie6^*<1m3BJ>04UpA?U41TQwF6?U2%S{m_@|c>vuArlKAo| z=z0^;?EL7ZI_nkg1G8mKM+!D$= zKZr7Hj2?DnSS@S&C}t@1qT6{aw$3e^=9TBe^yp?=r2XkqP}(Uq%KP~XCzq@9zx*>Yk%WUvK;=C7Tce0(+Z4 zNz5@#gz=%m#e5Z!ysW%ERXj}DajkfN_R`BC(K;kaM~d>>)|XxR&P6i4-&i;~UpHSE z{0g1pn#L~L@IGkj=iAsOOFpoy!Ap&KU{gX`FS-Sh)5=hW_>a^Oqb4C1V`?k$0|-uF z?#fhZU2I%H9(L-?dYE8q>J7bh^Hp|^ZxghSfk(h@{oK^2zV+_SPe6b6sB5ls2bs5j z!wE@7*LxH@I9AA>^KeM0sh%kP!|59DkMAQIIjV8JpBdwM{1XGX0%)D=0n{5KSbV5` z4#U4g^pTa5!e#~Oztq}=DUML84@FRa%R&+R0!tq5@0v9Ii|=wv;Qf?E?TmTu9FFbtkHUVjr_&z@ih&6Q<;`Q6cLc1QM0 z^W-wbeFo{!KfHT2cA5iJL>boAk&={?HH@Y^^Uv1))gA$?FOA9=M1R)nF#SDBC?pl64iK@N5k&L4?F$1g zXy`T08(FjD$OOFY8%)rT29?%x+)Z~nt~qL)njOA@CEa~ixdyindZkCGUfl%qdH5J2 zn&BX=tZDjeP3Z#rVwrnrXJ76rWaBxEYJGxeB~;D@WLB&@bn8uOyIs_<}}4r@(muga)h?`?n**Co0|B6_6{@ z&O`-4nc9anhub~7%V32t?B&Am38D#W)h%^t9maT%2fy8X>|o`{@}2o3tOWp}@r-QH z`j*uDTF$UGupWgx5qIz;0~F+&+hod#W-h$S+8Xl2qVAb z8MuJX#n)IjW4+zhVq-k-3UIQ4+Eut*Z6GbAPf)yP^ErG?qHCHld#usLw#Y6hbx ze_kw82pJWqHMWDmV2u)fW0Ob+c(ZhO{=WDjM!&lROna_Ma;xg15lD^a&}tNxCizD3 zLWETP9*(@zX=l6rxue9=^SUs#&Z(e8U0~Y<`iS$&z2SbLmpz{|USmIl^bxY7nfnr~ zGY;hy(lRqd>|W**y-4jvKH=aCeYR1=REPsC7&7t2V2`iZAd=DxbKNHz%(-d z=Yo)+zfNQX?>q|7C|f(D#0CEY_G;hYF~L_K1$sEK=!B&g?#nE6s9-j6f3lP$f<2FK zQDnR($iTk53#a@hS;VmAW4ax7A1x*A@~UEpPM#{wgW}7rm@|&ZdhjNJ@h(IOXhbmh z&@5Kz#F9B^Q@o8|x>{IcKs}z1huN=~^ExQeT$-Ek)a&h0RIjJ;$-x3$#$p4j7s7F~ z5qkdlSrA_E=+=kU;{hp3x&iU! zcbB1|JaU&y|G9>|#3C+a6bNnK`S8}S9L@_TpnVCg6!%tIfZ$Tfez*J{*DG4cc11j^ z3Kasb#WA}_wa6a$3-X7ZDkXXa{KPxfMqd8CIdPb@)aCT-v5wz8FUdkd)}l`oCY=RL zS#d#pnyf$SPeml!=hQ!yiKB2a9*~DOWs)YJbO_2rNXuszy~)+)`-m=-He2_m#ahpA z`#OQk6Uv{)q#^x)5^HVXzUV7>3Qis#@7M*?v0&|_f*Te=s9F) zNWzC#D_)M_v6uUtl||8rO+ft~v#^rcT;0dZUlDZ?0X`GX`VVGmj|SV0k0Ca!!I* z>VUXUMcuYPwGuB=Bkq-)JtUaMGc*Gjpup1r;MG@O&&l&Lx?{1MwE%B~aHWecHzxG; z-!P6Ff4)&H^SW&n`q$~RdR;U|^Hzhb4jC(Ku1F-v4L|p|Kol>A_l|C!bsasQM;NC- zDOjAYTAwX{<_^L;9|4l#!lx7dR!zkUsT5ZGJS+s8ipldIOXs!ZC=x``U&5P5JP0{F z(ip4M=Z~V=a%f6Y92x}+E3UguYA0n50chRrjP+R6 zTEL}ot;R2pyqNQKh}f(4=v;A^=bDa{-kvnyJhqV+Ld}coJr&QkL7<>VO-);vFOs8R zM*#!V*-#4kFKGL96>tMQ$&Mrgv!HuuE_Vwm*eiiTx6NMd`3YP-qKuY!9{nu zS{)O5xL>48--VPrS)rX=sH=g@!rCiVu=!<) z_wBYW>1Zrx z2cz&$BSL-I1Y2((5G_-@3?mA=KiYc)Crxq+rP1RC&VrAu9dQcRYGDzeO*5bhoIM|d z2&l!DMYytX9*zh0008rA>iT3@O)_nDP2Yb}=UthfpkDXiL~6)P3J=y&!J1-Lidc;_ z)MerP<)mioIslXMdWH!~S3y?X>sb)wTu5O z!!qC&richcAO8{pITP+N&g~tP;4v~Z`Mnt%a?&)fNpkhUkkl&} zp~_#d-}Bu2527#5(U0CYaM6^7^z@Rvr{C92%$ml$_dv_Ib;5bOHVrVkNrbRPw=J6G zV&?X?w!&l58=YU&{hiR;WJ*Rk9s_9p-w4>VN0-)+;>TZY`FI(mCjDrs6(3G|I_(FO zJ`zwz?_b_jBjYD5=tgJ$YJ7kSW9zm1KQ#9E`Nr&inj_&96?KQTXH7 zSMH?y8Q5e9(cpz-i>rD^ni?-@>VyKI61VA1v^DCa>~oKMd$cc_TBrW&!b)s5tl{+V zBLtyhX`edyw`MV1hq~|#TPcJXAJA+FlQ^{>JKBq!wsn5MMgDzoQPp|P0ovb<{TCkj zTi`qlF7G@dg?$$&bdNRru<{W;wiF&6*@h*%mhq&l&$wn3goUPA=Cjy1aZ)Dy|VNsFU0FF=xljiIk4wjV$_2nL#B|1S_9` zLQVEKyP0iLs$O@Pzx`y`BGz+At?r#bdl0V)arAFlb$dGLw0^r!!Ub+5_$D+-v2zuT zdLh2@dFVx`yY{)^n)INEN#lCiM+KUn;Ib9)dt7d?ci7_MhctMw+^77qUjgKDypS~o zEMggmjvG6hd3ALZYv0y=FKNH@$T9o*kb#kUWt0%>m(!q!nN4-2Rw{Mo+Ck~Dr_mix zWf;@e|9UCZqCDQy9u&{#VZbVs)_r7+rSr>1zqngXa*8NypNH3{tju74e$m7qr36(Y zAcJ>G1+(&%s{;Yd`|`N&nW3=%1T+L!XYOgPrrx(&wolkJdjCs2*w$0EF6ZtDVDff2 z6iselN@&9p4f2FQsiZ9q^yuDmfGZGa_`g|3Me@a@y0EKSrA;u-D)JPe^|_2x$X)D` z*prJqH#5!F3nO*)>Yy85zpbBgej6QFj=7d9?+@h5tp6r4wG_l4|I!`DOB7>0l~vh3 zp8cI|JV`PL#=(%ke8QvvqvQw(S{qJP{h1a|@9KLDv=&9OH-HdtazSp;udZ}$N`-v< zuGPw9qsXw|)B(iudf?wvimm6p(@h50Z0$@bE8L>ITs7}m&&J_?^AYE0v~Q5dRU?O6 z3d7=k@;a>JVPEl31L*ds1e=IAn3+;5zIbUqrY|~vP?BWSzgN=vr|E+-X8kTG{ZUuuR1&f8cCEpcA#g}8 z-R%i_C@sw}!}>0J*gD%Q^K1nCr0xqyS7$OCW>05-vJR_wOU8=0e~s{ghW4B|<^(oo zkDpVz&pv_?QB@B!)roPdTPN_}vJmGltM%qR&Rh_Vjq)z()zRZBO3g6aP=aIL}>2E$Wq5LHfu^lP%7`MX?DE4_w%}uJ@d1X%@KMa zb@9SML;`)Epjt2~bU|b;tSLRtWTX6!yWzd;>xwuE^ySF2L9nZWWx5{kbbq3#W|s4b zQ>*~0FlL{}sr%QA;VU796#rJ?Rfl&!&@ZX{B22*d4JM0^vQIVc>nViwM&lCc|Qyrnnnt zBEF>o%uu_8!^ar+bqP*3mi&>A02}7r2xtell+jQ*G6=0+N}i&m zFoP+MfwytViI0CjLw$j9wqn%kmzeh-a3COU<;wE}UcqI)EuN{<>vdM3MME`Gp`WVH zp08$>@FF`~KyMIQVH@3^c)0Us+FM7a0EV^!!FAtP=I^5W%izbN)RxhHNH>khW9ZeD zUS7fSe5}XQxVR5G%Qx{;4`MgMHhp6J$XdcB7IYI0gtJq>+DP#TMC=Xm1|W z&AdmEsYe_XjGU0Z)6Q4D&a;QxdavBp6~`1{8+^XRRhBih#W9v+o3<9B3obvFE9X`% z3!%e<`YCV%yTBVLEhxjM_xMAb@I>0_h#x^UaNYXpkNXI{bGntPpJcjcwu7Kep7LO; zXugH>+^J(D6WI1WPjop1n(#bq^1dVXuC0d?W=m1@f1WrFrtR&MhsOw?Ck>0oe7IS* zM72RC(+m?mku^;pesTRa_LU>9M^Tm5{j8?ng9ON;R0Xd5qS3enU4gdb!$po5ZHX9WE4ESPu|CF2?}vU zUXD|B6`>n1>l7vP=!)d3#Gi;64lT%qSK}EH5<9Unex6f7gXQ1r)K(?;E-&Y0A;7qQ z?)%vX#D%&KE9(UtFK)k&xBI1hpPQ*<#jnKktB_IR-tR4&r+j!Gmi^Jtfqo7WU%Z=_ zW`fzvo@X&t!n{-B3~CXRdR6b8{2){J5#EYm3hsPX8Rz*5^w^0}ra!?-rkdBz?lML6D+VnN1BoMr-J?R+ zC4NGo)A><9)zS$U&u(;YZsTHt7+ufjyw)wp24frleWu^S&bVHwr*F=8D z=qot}tmw0Q1S8^V$UGn=<=iv3PRxsn86-q8`sTvRqFGmKJ-S!3%8ZIdlW+Iv4G290 zGNmlQ(TrD86Z;bBUV}`E=MxIQ{A0`+Hjn4^T&G$DkkI+LhmlwaEn9&j*ivA8=paVq zfi-YmPn3`A;=ct4W&wT>pgf0nN7b{fT%Hl~xH{b`Aj0#ahB&5HyW1YD!i<6IlH}Vm zL~Z4cYzC*#`=~^3bN^S&X1eqFlV3}=vfl;9{5b@1NYT zur|pAI`ZKXv9JB19}>?uph-XE5!lHm@>&Hhlm{0p}) z#{eAz3r~k8^F5?PGWCSu8`i0A8?i$rwW87^UF=;<*vb=J>uJdrtqgTqB{;y`?LU21 zX-|1)ae{<}7Z%PW-Dh%JdF7GrsCGFvd9M-SNr6w`EBT~qI327Iqfq~GS`BUt)#Cxg zDyi?WY_1$4^L(eVNFG$X0I|#Z5reb<7S*1&Iq2wn#$I=g?b6h~y zA(vq3(j5-RNnU~V1mdCm4km1vIM^^k4rgO;CGP{EC#-_Qb15$6P%x)HS_JRmMtIu* zUPDn1i1=_S4R%lvOyVc|_Eq;>%r-suJ*jvXe+jW<=0jsp*~k<#2J9}OHn<-i&OD*V zm<;q62^%r_XF<;o5zs!xHFzvq`IEqF`I#m2%U~Pm4@H}%zz05Fhmrm!8oP&x$xMg0 zSIU87HGiFTp9sF+Boma_UYss1-0ON@TPB7|x>ha7Bc8X=Mt*h=JMX%6>F7#%`t-A6 zMZ9wT?saK(d&?_vw80TQm*Thn8g7qJN5+W6pEv*E3W9n%yRKklSIac$_tUqZwd0bA*lR8sPC-jiYANqJgDl?F-*5}Co#!WFFWA6>}J+DqGzdzdY&!qRO zCY@sAY@E?F@3M@zt=OM|V+;FE+#j`MTYg?;Yxy|-lWcDLBr~{qn{bGo34RKg!VbyA zt}LUYy4Ue_Hkxnqp>DyeHt7)z=6wnT(IDhBm*c$Et_>2k{(hw^DzSe`EA0y68v#<%7HsCzJ>Cl_so0x-{QZg1 z1}xGtaj%20V6^;Rynd~}g>VCX4iT;uAna z&49U#zul*$y6CTq+TMrZJ|uI@)7=G)%a40D=JNagzC9s<%x1{3+aJw*PzskAn9tqL z41bk{Elrg#W3BUFr? zqH2PxLv)mb{b{1ozQqA-YKG^DdZYp~w$0)6&ZUoh?N}HDaaXohKN)(#Gt#CDiTu#L zD#HzoGKJI!cietqZ9YWD&hudDcZ|jdnP^TI?q>@C1mo|IA-O+ffcC+8W*;Y4wLoV) ze)zC2Tb-(yTj0EPMPc#E_8H8Nx34Z!??0Gnci)#LsW)JU*2E6M$~MJz@8rhqzZ4F8 zwIrs7Qbp2#>2VSfI9A)drt>IZ{m=nI4~O^hD!sKB_ffaWJ8i0c4zf#oZeD&Aqd0^> zYCn?Sv$OEcmRK(nu)V&Ksa<(Tr$Yvee&z_YGk}SWzulVD;Sw{GRBeN@ikOJyw{tc%rCY^+9Z>tJxE=FnRNfPnFf}3W zzFn0HeGb|u(wbd&aj+kdFGwA~xLc654eg@;w1b7=YIE)VWSjS@y>ag#m(dBTD-^3B zF#>a@S5l1qROWyHQMI)Iyvt9H>>T$)-(Zr3tmVeOzaxI1pQWJ) zhGhiZMhzDf>Yd#mck_+J4V-EVmG_oE8@7`@GtTpk=tw5zT0ntV_eJjd^A-9Qf6wp1 z%7_%*%-goy3fPrZ;JLe2{k|c&z(!MJazyl!_VhGlsFHNO8N%zNb>$D(Y#j6atNhzO z1O7Oq|6|513F8P;m|Za>=N;9adlt~9cA!15%c58peB&gFVH z_c`QHQ|4~!u-~@vl@2ccV(WbBP#DLGj$OU}%P)v5PsYYKE^GoC*=~u; zR~`@IMFU4yJ1Q%2PxbBFvr9}A+pz zRY@a_e9guw_oG~ATTQ~(7;nn)J#0i*f3!|R-Mua4iMaR?6c1ccSoKlKM6W3Q=%ziWLlr!EA)!}nSCv)Ni-H4+fF#gDO4bt zV2E58c_=;tXD;47e({Q~*@yY>SV+0y&FbP`GC%mm{P}`dM9!+(bDqhx)ZouMr6=>6 zS%Xue9F*rhP3wIoPP6oTyuJXP9P`bO4$b;=b>cMWsl#_RP7t2^n@K0E8A4YDRHN_M^b0#*nJI>qce_*gKp%*?Ut?6c&&%jGu>E?! zwgWvN&)33_7GjV=|#su3iC3F2k%*-%|={iFysWb`Nll=BZx9!cN?ygG*aQX5LC~19t=@IH_@ByC$9TyYU~4 z5E%pL(9ausf6EuJh9+Cge)?`{Q8ptJ&}a`}60?2Rp>Wmk5`)My{8jkNU%K|AD-^j{!*6`X8>cezy8Lz9+b^7%8ue+wO zelOqO+iRND8@e*&hU0?n%O5V(%3aU;7j9&L1$f9(D4UH@talv+ufDi$TPwIw1RLgX zc`md)s64KDoh#Fu2dwD9Ij_qM*wKURIr|hxelWf4eO3Ox^4Ikv()TZKa@8oGgDOU% z6qfX*$UK;3`LN46KwCI^TXJ4aO=HnIKhV*J@J`pLqkJokf(#5`xL7b&x#9wB<(@Fj z&u8wk6IO?UUik&{jtoWK3E9yC`u2N^@B>PzT6?<-)`~rFTw^EYp1;WNmID}Nth{XZ zIe`)MCxiRYwl3`nf@?TtZD%AD_G?;yZnp>MnZQJJ;tYAO^BR|04w)xS^*pds2Zn`T zBKi0#E%ZBw9tM9}b;V49scW>sUtve`_Myy!3j+n~po?+PpOpP+Tb>;lkMZjp$@SyQ zNP@&tTovBHfyJkhJg35Bk1ALYp}4ZNiFG#E%AI4b-pY2=c;^P|TQ8+yT+DTO3Wsap z<|q)4Dv7%|hFZ?H+xN#0)4WCs!oe`p{K7VPreHQ};J%?WgIh>!I z5k7k0pTl>b5!Z-;UnhR3eE8+;5et|8#)i5s;dm5JV<{f(>G!#gqgHIMv`WZiO6OO) zNHPD5q?5zbG^gytGZ_HZ$W|ZnOdIXT{&hYAIBkLLDR={dcX{%@`^Mv7XLmQeoZpuR zFxzDLn=PkcHOT)?w>`2Po?djEQ!)QaQS&apJD6PlZkE{YED#-s&_BlWfwsN-abVBk z>$#Vebn4G|LF|Q@h@-P3s0@r3y;xG=bdP;@4-XuFoWm|w*})9%?YW)`?6}&{dqjMr z8t|yk{=9Qg{#Ra>{44&7DIfkMR<}obkYA_s{VE^Yxj}yBw}fJ7~;+d zmRF8m_#`GX3nIen<7jP!7Jg-a{Taq#G_{I&9!~Kkw8=i;_r>hG5X-~1?xkqkI0jHHbrXKExjo z8Yoaf8Bd#DAsDou`KCVM)*R$i!P$P3U4e}`y_ftJ90wt~@FYXO`Ehcd3-Zvg09SJE z>hh2zrCAO1gbe~byD!Nx>UHk2#6eh9(jL5H9Lcxyi0@pTcUQPNy{~0nM(D60PYU~s zxVC?OD7<(-_?FkCTe+OkI}3-dsL?LI+89IEbR*pBu`$m;iu;{i+2B=dTU)=sIWUb~*Qoc5&C&ADf1|H8uqQx0l zNcQ|=AEaXx=5o>wpZh2r6ZTY}6zrEWr}J>;vMY>_^0Y}rs;!J?7WUYPBUcwE%$KzT zMRc>#bApOwi{EH?RS^qe)%V1AziZ95W2d}o&;8YSx)G1QN7^H1b+<2yT!KfN27KA?2g0@0;iv+ zp$8pm#N--cpL;5X*SZ;57hO`|Di3LWw8h-TK3*khPLIhjZ~45Gz(CAo)h3F8KQ) z_w0R@H+(dKZ^S-cZdd3&9sdTA;#rBs#D^%s?&sIKP<6tJ;1He8GQ9{B08r6ltWR3Z zppKN{JO~a1XYC8pDbzlePZN8<8NELO#RPyw;4e995cnU{8Q+g(^^MjkF%lgo;X?*h zd-@%|hw75St3bK8h`qK?ksi^2SCZL>j)kUA3a4^rx?c+8>HJ!Fl$rtcn|-JN>>ZDd z?(X?eAZ(yC_yBezCtMFV~Iyc1^N@C58S5 zT@CwyJsEpndiB}<`6WUkazuweT+H!)OmpPbpCKRG?Q8VcyFTK8GVuh#o1EAeUfVCE zbego#D}7ahX&j@KpNCik`$NlAEMZS2A0Oc1!dSp6aAzxJLo3CNm1AHTs65Sv69tDh zzP}94Cpw!O^4}&hfO4HaY@^5vy4XZ#ZQzHd7D)5K?O{2iBQFUgWAKi8klPWooxD@+ zgXF^1vL%x?5;rK5vE(8x{@pI^^2wzBiSPqxC&Uv$DP3;n}5!L z7bp_$=J;aqczOxj?!~@etBT`=94nI?2P|<9oOk-2#m?vsR7twg*irEwJ>N1k)sbkf zVmB7{yRHwy>yqn^{(NsPeuBNk{y?Bm% z(Hx7GKkAozztLG3y`xTxjv-t~UfECrqH`M5NLHxz8SL(xh!U^_A#tlCtt(z{*@1qR z*ZVfSVzIx!UX65{=lvp?%r^W`T&zWWDDIE+PjWtmQ4AbBOG$JY>na~SuZfh~0BC*= zx^&NCkLL2nyzc-$)kD8|>Pq62b?l&0?~wkUwwR2I1)9dAc|m^c&-T3V1+c%6@iQ3- zK6pIx5+)mc-Q8nl7$8&Q%iHXjze}4g9q(CP%FRMN$r}pd0ZXxG>%By!HlVkKVp5vH(UIqe<=_d=;2siYE zMzz^&5TV{O^0k)VG`x=w04)a4IpO?eehE4NOl$T>bUAtU%5V0Y_Z}azg-KLeGR@rah z^+d|U?+T6U+*h2Gob>2R)}|}Cw)>>S-}4#f=_NuQR!4LFGcEkFU3%1XX@R)U7b=E7 zb#`uFNS#oeNuFU@8c8#QE=K$&g$E?a-CK{B;pnz0n z?8`mGShvc&@8hCIJ-XqC6IX^d?12larH^i(vnV>s`(yM7OslWO*;Mv{BWKZ*7>!Hu zL(B4^;NdaaIzvnp2gG?{brznyF(01Z%|O0baVqVtekAUM5_Ry^t>-?a`6BxgGN&N4 z-+0+4pX65Z<`5W3_JMEX;ILqa@>CX4BKUFFahAp5CnGm$(B|nz@cUxGQaer{wXH*X zGcQ`qqUlT<9J9Q8(BSglJ1AV^#OUKKPAC<;y+uxdoMiJ;A!%zw66>Ufu@`^#xnij~ z9rKnhN|{@^Uj;QG^w$aprV%(WB4(edx(qi|FT%<@Emzn6_L$RT-vMu6?c37?^Jojr zfZ`3NfUbWSk*Agi`TQ0eRJKxIe8OU}N}}WS?*H2Q1G5->9VI4SLO;F_y#G&CcWH=N z>;Uylg2}oJG?2_hJOz3{NGt<8ifU6)n6cvf*9q`>GSRDGh6-VSB3JJ7%Pvo|4nV8F z%$m(6b)4A5cdviyO^5LMH!#9}{rB6rin?*Ju5ZsfJw3hP*{k*cm|f zQoS!b;}3SWos-_na=7iYsw79I7m847u4?8fi>t)lQMvdUC|t8$CG5c)GV_PLPHEoe z``CT&@A-+sWF#gpyWH012*%!ZpTM#9%OG%H;TiK`_!oi*?+TTy6`|AC-PDQuuKzEd z>R@2kEvHy2_A@eO5_Tc@ncogv_|j}>j$56k2KicDbMs4s9nRb};d2b(V*H|D0C&4e z+p8E-jzJC`hX5R0Kl+B4L+u6P-d#L^-)oMS-_pct$ZoE;1u6WC;x~ZmZ^_rrSO3g= zGXS>r=ElSMfnCVm)2=zx5Dyy$r;et@64(8;*cBO!r(p@@b*cd<)S=jotkucGf(u}N zogD7*5H86%Mqs>8W;1gXJyXctc7EYw412%Ke zxX-(LE?2sDJ@3NjnfkaaJ)(((qdx;!5Mm>8IVNFpGWVn1b>VTM=Zwf09xk|7PuTbM z%6o$+ENNf31yyjot%?_6Xuh`zsTH{~M)a@e$6gNW!Nkq@J?ugG>HI(y3*L+t&3&l7eIC5m7!z^EI zk0~DGx4ymN=u_>zhyIgYQqL#O2N-uEa0w3{>p$SPN}`ef#kP9k?>D^f+^R74YS$?` z635w2t`oFxK*T>kLwMzYQO@ff3aJ_<=ta9xo6O5IyC!JiS#nQqM)Ny3hm+`Lzv2kM z^L%T9@)3VAyX=Ae;k;#2!);1O!=D-c1fkVaFr-pc=Hzeg^O&T|I~4rD{QT5VWB_5| z>f^VY=x$rE1&i-~|HlEV2$;8k zn#-6eJSPVD zw}t(|zQFY<=bvX?vHeuXrc?IkfDtX{EWBuQBvO zRwTIe`|^AS+HlP7?}r?@ZtkDwpzuC5DnS7yeW&mCC-B69+}kQG=*OVYoDN@Pd|_Zc zo<%h^9h^k!rS&B3iWbWK@?X{Ct?6VaohT6=(>nXdK?kYoeNzYf0aKgc=?Llhmv3+0 zUOGkt_=1aIIE2>U<4aQ>z^hza^aG`T2#h*6b^pE>RVpO6L14Ae&Iu zH?7y%(||uMc?rgQ+#UuW*ByD&8H9*LauM9P|BQs~(U{A{kC5 zHG58`Apk(&hSyh5_v8{zOu4^WKrF@{Itb!FP#pB8vwF;}W66IF@SwKkvO3;XIKVj} zVvpaje0jF2&lUSqm6k+@ySZ;v_U1czZEFgpZTFLV!IA`D_VKDRQqPcDFoD*-P)RM* zwwykGFpGQXvq3i}l9^ia!16HaDJyY?(FUrYRe}}+)AP;fWhH5SxcmlwcW0G{S~y#K z6c`CJ_6RcM)%ePwjs!<;Pb0C)6!7qY z3qBy4zQlKVUu1e?6xRKj^d=O?>hBA^(I?_oYdy87^{X>Z*D(5Y$Knjv23}eFj(>aH zb4E9U^@1NE(x-+jW_^+RQ z++K%*)ko|XREoV!;MQ+2>&E)_ap6>+eH!$$WDblcJE)<_Qx)MUJt1-P8w>|qbh+LG zJeKk2T%Fc9bM^@hahrTSpGX>-<^GClG*kqUr=bd`cbD$l^ZN`* zlwW4Kba0S^rj8#_cYm{hLUIu4r%F@H{QNDE2r!Q+G)d9|kINh9VXp!0m%;c2NXwf4 zI%L6ofP-1y9O(YN&VA^7u4`{rvg(3YT%U9OB!(haddq zQBJe(is_%{L=f%~AZXNPt_7Y#*%r0CAUvc`_&ma93$>lg)A7n`e>%6ZcCVuQ z;L8JrVYO`^ELI(A(jbCk4C=_ZgEw>;t!+NFbizO*!FDb&atz!)XjKHuWbdnWnLEVJZSvIEPNPrZ)F4+e z$4mb?L0*IprDk5PYbxqVC^jf(ZR z_^=KL+%t;u!^jXD94Sr-ZiObiYxTshf|{ zf*}pZpfyd^7)HN3#xv_afqK#XX8)&+KQ?ob?$IR^{?kYF1h)^ghQ7pspUFe~aruW& z`m9SiOp0c^gtJa7BM&rzAlkuOX=C2=fO6LV9H}ZXBrk6d{W_tV9nUfMIr$zc&090lmw} zYkfP3bP&MT#I}HMJ@O}5UqRGWNI$gh-+CM%8Z);x1am=wgSTjhgOw}m*|UKEUnMUiU~y zyK6Sj0go{4F`gdlrw3XdUC!p+_;#0a;{_K-btub46IOX)EMLw@L5x{wsVUBbg2|kelcG*!!`ZgcGR(0GbOuta9%@k~g-d7bNps|HGSnNI_#5UVH zcD{W%g2za=q%`WeyvLqpxi?=~yJF_cvk@mRhjwB9_I@e(O_iOnY#dE2Lb5*)_vdl` zZZ1b+SAwOog(Vyqp0~FEM}_z5Q87gP_RYFs@g*cb#-ebzT8$)d&wx$QGI&s;KNo@O z{mA|H5Vns$JoWgL$mV--ez1}F@rZwPMssii=-D@^*1rInx-T+t3yqY8Kh{^9+Bbne zu5h1H?e*_2NDtNLSGgo80nfa}o8igweE+^eJuEo6SQjCXDS`Xp08gO1&jU`=D6$nwNucBfMcUVwf<0K z>(AD5$n6hDX|vpQ*6rqY1!arR2I&RkHkC2QVt=gPMljf?nPtUxJf6S4`{h})-Dl$m zW;*nZIg38kMLWU=^skjsEmYI11ukAo{+70xVWy=i6f=7~ij#QIh?MXsL@|%!qVA#4 zes*Zk3D5Ten4<_!l>Csg8#%RUM!wBJ&}(Z?K~$sAj^FPSCb~jsKwujDVCZ~>UI&G8 z^r9{HVX{){h{E3spKgFlv9J3`LC8k2W z68ZT?MW!?fW;OIoT?Cz<=2R=TPD4t;>IPm{ewT4cOlth;(NBCt&aLp2x-J1Lf+tJ>sg=#eXgcXf8!oMLOg{0>(+lRbGQzYZ+h9K{=qg~yMZ&Hy6fWI;i)~U z+j2)T@8Uo{@F}MKK=4Ml56AiXIx!ddy4ipgEJ;}p@r6&cIa8J5eOKp+EoV}PntX{D z^4fcDdp?GH1QOlg0J*s)n}XzO7A#-P^^7E-y1ZW8HYJmRI>t#VuJ`A5{^Ji}6Q9CF z9ShU3z_wWsQsW)N|3>>^6CP*ih(Xst2}bF57`iZV>YPTU5NG-TBezQ9U;W_ke|$pY z^VRk(Nvq^!cTW$myv+J*gI>%%Y^6WJm_S>A*mrn{&@Wh3A>RVHqy@bnT2r~bZ-t=2 zIScX}QdNOasv#iVJa&9d4p-7}SPI=(%ktM0ov1cL-q3cC3I3+O zSocD))6riH0=c9>Sws7DeVWs-IG9iXF8S`>tVfOs?o9jh7m(r?U*ur0>I>Kcp(`>nMbL zQDa)N8Li(WVzHZ^tDM6gO!t!EmVMfOyjWHJzCQTO+n?@thFDf!HxdR&zZW3d&BM(L zU-OM7iJx?#iF>M2Xl@4KI2XiXtlj4?v}A9q3PoM^(7co??6~55@Iv8|TL@L+H?isW zFJV73r?ABBv&U+VU)YorAq|*>Mp`~3P2_R^((9c|^}IhFob9K1fwhk2&#vGt`=I+9jq_E}hbK|ChY!+`eA<1m|zQs2*dZc;OQfOFlsQUvL zfp4ZBqeAH^t$*K!Y%Q)dU{Yqo8S1IdP)OXb`p+vI#~@yDzb&x2k#=z&IIr~R(F^+! z>?iS1XGut>b_Jfu@QDo;NqEaMZ}xa5d#IUDzrQs$a_6@`A7Rl^!kbq}70wL@@uf|3 zf^Z=_=5k3)5)3=$J`{s%_e_|Fy>-^-N&X`58vO~O`S3+mhvPvgM)r3fi=)p$x>UZF z^8V*?dj7RX;bGO{z5>P3208zJZZeihITW80}bz$AQkRNJF0J#iRz z#xujSzqm7tqr6{3OG$KT6!6c%-#Ur#7^vrS=L3_l-o!gI9pSR>q*2M!MBz^Gxy954 z?l<9tK1p|zm@Fd_V>m&Imf_oI{8pK3QNzixTlWU=eo7_}6mT6r+V^GL{e4>2D$|>Z zPi-2b*$-TKf2Ujcj`WY9d*nkE!u~#_22KqPLB;RqD8wj~i=+D%y%pSU)v#uT9y2mjQ#8F6{ z_4`e@A*J^#H34EQumohtS{`_K_M9P2C7)AkY*hi*2r_9llm@zuSK-2VTJFE;2#Hxx zE%EBMZ1W&rPJ0js9pr?Gfz+6>18A=~wNyOqq1!C5ayhnq`)|jQ{;P0ULNo1FRbT}$ zU+ZJ^0hgYBrqlk=AhmqSZ`(DEhIig5<4N^MuYE7zP+Tm^?j>$`1Rl;FG%y(S+}QBi z!6DWDN!NZO#ipS`*hxK4%;91h^6T;Ht{*g_(rkIy0w1u>1*pn!i+H#AOFeZYj7)3r zwCujwly;#obBS$S9HXd#iLlcFl!-M)tPF^@%fF)j6Ea|^Q~ z$HE@|0Lue?Fs#rn(ZRy)YyE@z?ho?~;k~Ji^(qX%!GpimMhWASXZ_}fhG~K)ZyhwZ zJ|if>$X&;3iAemmB07PRkheeMhevzf{=i4>qq?r`a;1eLk$zSj5T8!)0U9!-0WB-0 zb@DzR;#M3nDw-1`2BI`3f%>sOed^5NupvTy(f-M=(s>{AHVq?KA~-nqr=8%B7bZnd z7Y+{IBzgYeHOL!|XT`stZHKx#!AEj_p8-Z4mM!iRdoGsera7b(`(1DRWAP~B;0GBb zg1((e+)n}@?>gtw<^yg>x>I}M;9xMrAt!N!Hrtnlr3I?(_qZ=tbe0^{^oejdGev|HUGMmS23S!@64iO{8Dup-0|<8PlCNUHD;DO9iNti4Q(8~I{2BiMnL1dc@^UjPB~Vfp)> zNJPQ64VgiBYN=CN6mT`{*?&^E`5f!Wzs9IJ+L4ST!z%~j!J@0CROaHr5v7l=8We)Y zB(?}cxa>*fFXy~(n&CLDvcdh8zAB>@H%-dlG_pTmuGYHlYY5IAmmQt4lJ-8|q=O{+ za{=~giY#&R^e&eLo8+_FEq)Vx_oyS4XS3kb*`mQzy8saTPTWHAM36Sj z#Rt5Q{V?a@07r%nyH{4H`FYQQB^~kMO8B4&cYv|*0(qtmU7w+mzCqL{32_h)4St2T|NI9#V*9EDL)nYzM06M30ednn zg_JAh`}wL$MJwi(>Z@e<u??T*Gj+8l^R zc%k!m#_uWWFuJBjt3CxMyk$HXBP5QQAteNi!NE-UZ0X_X6!sbf(tKexFva@I)m7PB ze}rJG4uC?Lj1ziz!V9nqksB<;53%h89TF3C&_Okr`yBEJxDbZUB<}`Xo#KT}FnN0~ z>z$>E@r%j7&igtFlZtc8z*VUs1< z^teMI?I^45CU|+Jp9|BhO0y2f?+8|xN~O%-y!(6 zqX|by=lewJU&dbfgoJMktyQV#&!QpHNS@Xf8} zzmx&0ullT@ZZ6Ot^A))V{go(pHO6)BM&3B_cnhso#}W_&Z97t($J1expMjcGbV;nC zppUy%OXH{Iu>0-vwgmqZyz^$`{;r^@lmT`@*t99xlXScR!d1{*?&)djyx+UiEvT=6 z?SH?a;r0$swJ(|utDHaggS&a-@v-WnECDV7>$9PB7mmB4Jdlf%t3L5DmULm5C4Kn7 z?sg&jyI4M9$cj$M`|X;kiI2amNz`GiaBy=_)Q|EbERIsg-p*bI&CLv&7*Wc)pWlc> zU5JK8Fl>WAws)o4*oL(D#2K`I)eTkpdM&}8gkYBX1+bfT51X6}SRu~jIfR{rUH%PG z$=!nTUp31$)uSu`d46BGDMRXXnXPM6XCJ-p?-lpt$btodf8CD1PYmhtX5SC2Pm|Eb z#{crCOm)7F>cp^jJ;$bPybATKJ`rwj(N@)at-$Kp+0 zuJG?3NA{iqna$qVCiFNN3s<9a<$}4F?=-vwBsok{t%U}11PsRNI7#i@`dbmM`hgoV zi~3dDa}jI!9Bw>XpoyGAc(^23;v}+e!be`X*n4Dy`~W~#(UtU{WgUbsC~vWBKhB5! zsxC*L@5}4sjeJyU6Z#d1&^QW2vGr~j1ZJ3d!Eau!^4|H;_aY4@3>je*J-zFTP`2(n zYi$a;2_$x0i6kuJ=NDc~y+MEQ&3)r>fy3GhvpKcGO*$LLg!Sqob$M4;)@ zBo?4XCXViEbWne*kJ9Gl``$us-5$aBPy0}^-N0G%$E{E!@`k$)KN0isQkW@gGXlNG z(2H&`MR5244hF{o5d4O#MbLm}5nphGXLg}1dN=_(gCbP|sce%2l(5L{-smxip8-7V zuNNK=TQZNJmun;B7lLhrZokE*@&Ym>UmC&yhcUR^N|)G>p69SB-zr%M2VwY~B|!__ zePceimnM`3*SZ*jm&w;RO{FllRD$&?q#;SP%>oKR9HpTpZi)DQ zKD1G{2`%`PgtMG#@a*=xY^sXtK_BnIsY4kA156mUU=!Ov#AQ4lp~i0V)D!`bC_^KolXp&HTVWDKMuE}a8+KA45&%nG2gr48JK6ULH zc|fMp<&1&p8>^8fVU??v^r4{~yE}EL7+mEjsavP~iENGp43bBA{hdEjUw%(Hl!2VBHJkQl zSGsI9Qw`j5e7FDVW~P&@f3y}|mHnew(PS)ULf9x_wpV$M;9w`Qu2#mvN#|!b54z3J zjzuE`D!Myv!Df7z%DC6sQ+Pu>K2ay+H%Gm?K3j=P@a?ok9A{%lON>U_Ck&Af7V$x! ztPV1u9@KIniO%X0tO!x#WjDG1x*G%L{k61>F1k6XJ4g4=X_1*aZCmlaas>4n(fYq#qpTs!Fo^WA5aF6wU}^V{!f z3t}anu9mX)p&XzEz%EmmzE0BczP)ChQq!-I$6BjVfpX}MorV4EtF^0~R@OUAU>8&s zLCUebtJ@U#Q7=eZnN-8BM=JFGd>O_G3r?H9hwCeF79}!ms{Z|Mq4oF%L?J`j*y$bM z3_7;xR}h;6qXokZSusKJW~#b0zmM-A0nz4?zE1nCe*jR@(0ci!i$3cLcWT!U>y-t% zVLz1&;-7rDA2E5tp#=Df4Y#JYYD&NRv#Ia;oYl zv)8Q)xSrqb!J>h5JTXRy;1BFwE?*aK;i9S*lzngZJI?^19&5%bARC591md#CG+AaX z;Vp??T^RJg)VLle* zSP@UJxOR=N9c1>Mly~VYE0#H4+D2eG{`Tgg!_O!b*q`ELny3qZyyI&jxaBl#?N;><#2;$EXIjN=iOe*Ib&nn087l@WAz)&AJLdTFb~3y8qmfy zoRr?ZdL31zn5D4ZMpO90lH1BwtkPTYazlBi`v=p~MQ6G>l(JSoA-+b%XMC0ZH6B5t<8`-*Xub zx3O=}`^yW(3!{U(Q**xyHqO1KpzE?_{uGT*VxqIllh{6|gOH%z2aCv<%e2=%bMcIR z6Vp5a#G=l}1h#7KB9_Rtv{YPms5D(<>cT$*$SQuZy*hiVK{hRrd}j*$Sphe4##ZAE~~vYWcYZ;DR82X+HU0OZL$9Z%DZ*q3Swt zEJzKNJbeQAt%Rrcuy2Ry;>&^9hqpI2eb^jbTVl@@*z7f_&U23fNak$(wfxd1y^~4= zCMeV}8>2i+(w-<#@g=eMkJm}L|F|hxZfhLcRq8N5B~A2*514BAmXtbiS%&9i!lfK2 z>t;1554dPJ2;sR*bAOR6CdXY=)~?+*$xVj_|+2|IzbF^e`i zISB53INA1aQ?;cR$@g1KV^l>_t%tSH+XAq5NMW!0o&CIxUY>W?I&zJARe#elGhONg zr1ae?799zg#ypX38PfC&u zm2uS1w0N*H-m%QO3uZC6RjHD4!G%0-prhXMmd^H^Yg#7gxWcPUJRZP%%ER7V>uU?) z9_8&kUUs}X-~mFGv6ybPXSD91Ms zS5JF@YIfj*?WMHrtN$4XloX?pzQnAeDiJw(%(?tM(m zv+#e_wBWNkSC;KzBWV4Tbs{qJ5`8P|aE!CB*l@G;pZZ$g{Gi_6o1u3ndO$Oy+Ty2)n+e&V;SK$UCV061s%KJCR38+}=RZFu8dyjB+`p725hQf;X)oQQO$BL&F!Dww2k!m36P!Ew6l{Hx*# zW-C`9xrlTi4AJK8VXt2G9OJ9|?5ZLdX7VGk=%hU1R=T8|@NS+;{gWZ40I@}Ys}DB< za<-rGZPv|we(z^chxb!EZHR2BuivbBuWl*1k(XG;*PVxHO*JwHZ8=;8vpPAYkht*(HsTt%>BQ6kzUi-;6s_R_~NjUpBMvq`g$EeHY zhid~@cH2MFNG)M2S#BBq9v|F1C6-82oJE7WVSQ;Yi6=cYa<3$1!84i@$>?XZMu|29 zef%!wv^NUqH@S$n54PZBD!M%N_>0OI)kS*mO|D&~T3hLAg=*hNeIGAMmD~R34rH-g zoMXbCr!m`;LSBnr3wAc`vCvzZT-)>%OvW-A#Z%LL>EV z#p8<~fTyhYiX1Oc&&|Hrh6oP45zi9U<>YW108OiGhy#?J|2jT6;@6d%#8mDf+Ri+h zMtihf7z_)0cDO!!@?MdtGM> z&g+Muv&=(@#)HA!;lo8?u@M~9=F4hYH4ItO#u2E%bmyu5d4vAV-XtA=#pCi<5Ot@N zyTXB|j{!??@cDmTuNeMk57egDK#Qs5C~;pBL3>JWZRJ!+Yim}*B!w8A<7+kduLH{3ZzO9ftqrWMX(qh=kr%(Tyqx!UAlaYvxxs9+S z+g&jOR;nI8Yy%H8>YB!IVF^%7gwWgkIRWGyo3a!~cpS9~Bx;^-k zWNb=ZdhBuYO2=(nO58;8meDZp)YVr!TpYY&)RI>L z-uPRpyZ*a<@AXdQGeA$albI`s3Usj7J&b`Dp#NNa%Hm9Qz`gAqZ|V zQ*+>#vYKy))vXvMckTpUQX_wZ+Md=l@&DM3BwzIc1Ze#{jo9*W4SxxRR9e?>AtdKJ z{o1ad3@;1n+5SHGuSA%yecncBQpHD{J`U;*I1$FQk#U(b0`<@Wsr$4r_nfUUg z!R~s0ckjgSul6tt@#*-r;`8zAUXG{wb=p(5eY}9pP+O&vKYi}0W_n;;o`hlxy%$MpmY238wT^WkRJmd}Ej^_mtY0Mo2Y+}l6bva zCfT1)n8Bct!evXL<99p zXfN~E1Xt$%eR&V_lX8c+_Sl)b(ZO$I?nJqTs9hx$n+AO*SXE+&WO?89JuyL`maOHu z=M?_^5fS1icck{5x(`@=y6oh7;pgevM*bQfW=p@rt5gzynO;5qwP)@3s*rd#Yj2kR zB`&?u*_!SC`lj;-#mms}>QbXZog;aq%ARYm9dn)VjM7Sm?{*%?Ncj_ytxpbAJ~ome z9AKf$J9qym_lSNOw$>hvu1(1)d7d%c{^Xi)vaaYhwM#7Rpd;;`K>%+;4PnDVE7s-v zJ=YD}ou4;`>u7dx+xr=sRL7p%l>JiNLP<_fFcW1f=xTqhm-W7%;^lqK2Dr4oZ!uoe zEw!IJrc*5ZZZ>E2XeIArKoZA)=Qtyl>%D?EHMV@%KHDd1{4L!%GxeD}y?5e=7F}Xy zPqCnENXDFBJx8l}9efUE2}$q2Pu6&jvl~V(m@)i_HGQr)7)BO+Q=wdBsQ|aK<~`4g zQ$RYF?xE$yy#&bHYqH-wd@%l0^8_CR6Nj<6v~L~Ik=EOlZW$Jinh*&zpW4ax6viZy z%k@s5M5LXUBY>JmxzDRO5A>mf&G!L{?TOv>%)SCg13F86=Yev}n7!1Kw$O2%{i{SW zukGyPFMGP3R&va%l@8-#!VBRgncgl16AZ$bvG+qd193~~SJT}sA2cVCb$F!d>1*GB zd;mTR?a@a$!Vq?tgMXS;**x!F0uuP~IzSk@su0(XfOlrG{*v%9H{m zBOz+t)p!-nO=$*{cP{&SNPh$y6c2Ern2_&8^gA`sGF0z91~X2I=Cux89O91T;8`Mn zw$KHau^tRe@Q2@H!C0C|F9J)!bsxT1zHxn4*FY82LoZ3ny&>(tqwzFrL&8y@M3Vev&uGj|mh0rGd>ibh<}vhkd&7d0h!kc4*S!n5|9 z;kk66SN&z$`uQ*k>&uF#d(Fgkk5nJ>3F_ojSMY4y_L^O7+_UqZ#~wgeoz)ojo@a3H zjUQPFe2rvLBtAg2B2#Sxv;7J$(M zfC>=mpLAk$;dV3*@2ffp#;w@*5MeS65!wg%=Li$@BsoR0lIfsY=cBrbXy6N%w~BLZ zE_DlnR0mB%Rry?aKi%UDE*+Ese#{xEF3M$iz1!BRPwwg+#u>SJi%L9;9%IE9)^>wsM*{K)l}^UjIT|P49Px zOvb!+FmxKvpjn*iBpx*`zn^Xfv2Ss*?fI%7U!pk&Nd&L91IQ7pnjZk2_&s2)r-TXq zrlX`Wc@!SYHr>c*1(g^hO6yp#Flb+1Bh4hy`SCcPR3F))^!Id8f6z={w_BqtGDk}M(+u{y4Kr+0n+Hu;~U{F7=c!M zy`KqPEjTXgNVloYW;}0M=u)U0)$BB3QK^HLPj4sR~lZ^BW=yMP(0UF#BZkqYh~dzI*mm z4|BC|W_FnH!ZVnAS5f%ekx|aSO3u|v*6T(H#oRp+ES%si$d+~*!Gt)0 zvzWYAa#(Y}T_F}&+t$wX4m8~g%nvV!y?euQKg^^#A-_S0wn)Li0}YVirJP9{)tl_xq!+Ioat zP)-PDuYMR9TeW_gx_kddUBD$NXjng=&yurB!DgN4@wAx8Yl(7&QT!q_|+rUWRQ z;}fEnZ<9Q{hS)=ST4UIj+VLnO9ffwKDfZQ#6F{+gKE0cL+u-gE0?VXZ%P_$d6?|a| z8pFq@XwV__%&930UESx9hOz4Pis#}_T+(#_=Thsk=@49TT^%;RnX$pmX82{4N#Yie zSZg4&MT-F8d#pRcQ0lqp`l=xixcsWE0DIWO)xvz<^j7h#2^aSCrJRm1?1;ELnMUDL zJA49K)t|vL`4|RLZAOcXZQn)n{xvsWz_xAf&pvnw$HSegH>!qP;LJD?xa(k>x~BM7a$~=U`~JcnTC4Z@yf6* zx}ZIOYX;m8w{w)jsAA9e5@`7VOTJFYzKb#SiGz17Vz*StAxt_o?8nhdi*{fVRgvoU z{L71|kL33@^PHbAvHtl-M8DV2li@sQbP=5BT6-S8>EKYAS5GvC{@Y374&;NKP6}`_ z^Q$?csUm+=%2>&TFuVI_CYmrx&B4b!rzPT}A{RqOz?G}q7xKm#({I+hSiujB`P}n^ zGk0FrI`aV(8FuFw%`ag86uZF^^m4*SWyiR!uxpDUo-U$W$(baazZi6INjvS4P1SB z6;3X@!PDXDK!r-GR3gw@E~n@x$wzBQ5zn7B#rN-Dt$&K2a+|Opq3}0ju6Yh!3AB`x ziqF3?bib08m&d_6n~~zM`xgAuI`y{io@04I9G3#>(>JFlxPfSQ$#;N~>ihvUwL?-T z7kKw_6~U{JuExva=!5IZ?Q=Jekirs9VajHb47UfGIlIa1!|}Kn=)5d4rxBi&SK`{l z(1d7t@afe!jKBO;K`1f$M(OihngdLV1?e@4BiN)?qW>AYE{f^tj$ouyL$Do$1UwxW z8w;zD&xC#Vl3XJ~!nK|>)r(1vBC9m{j^{B2X#}ww`=fcAl=-aluA1ZXMYb2zrp0Zs|e&v{IQIP8dqfw zIBUP_j>6zxvgdvg%>C|p!PUl30dAAF#acpz+Vp!Dx_<^_`$@ni-^rQ=-@Q30kKtrt|TJ5Tt=X@Il0izc2EJe3*@u z%Q;;e>I92~>FG#7@cCqQq}$MXoge^pf%MIEdO|^&U2l`%q%f|;%G3rAy0rb_L0;Xb zKqAortO6ow%VG3w4F*lV73X)@wVu(^tODb!y;&Ty2gZTMz%k_dP6QR@#@>GS^f5fT zmHoz1^88(*{LSSUPU~~E&-8M`8Vk;b{eTLq2L&#mK+LcMzDH;nv2SlYaqx5jZ+c;? zgKB@=&+8!S)lG&T&?l$FxPNDV?7zDQ5wqpv8D@3g`%M}erW+xuXZx}jJjN~FOPA%v zS$hX${B7}@mzMXqu#*gLnC8drg~FboOr(J_l^d6lrOsq_7kv#r6hC5s0bTc9E1AIo z!JjTwTHRh&QW`R4e60dP;aQH-!)&JQ50HCFZnx%Vyj9a5x+R<@8T-`OP(PQM5c6j9V8t8^P&|==>n&SWr9r(pwsS||T*LG3!sE;?!Y2e>a8ZFe|B zX9gxR&J4=>H!H%sfIO6UYI%Qd_kcG_${GsqQVxJWf@YD(_ZVR8`4^10yeMktc`&v% z_w{-Yn|I$^-{o-I&%iN{a1DALpZ$uo^SSNPFp>zS-Ci12w#nE*wLa_;d~EhatKz;G z27*ZY<0@uwE@Au>NrEUHZi26(##$eplC*4WGI$+#wboosK77l2=YrguL)T*`b^8v} zw6&m?4C~Uv6~3`&lOBFi9PT$-@WX^rj9yiw?x#pyUq6oB`(00l&CXaN(%Z%$Y7f1W zcYY|fZ1MMNNq#BjAPp}(j6 z2#{CG`{wFQ?bvVlmn2zGe|i!|B!M6kGaij8NfDs=0!OdzGCs=z*`A;Pz^dsn`Bt6{ zCp2d+SDTuZaI0zt)gPWucWXC}gci1|l8pC$d_ou0^7Eb_CUe-^GgODyTccQ5snQDM zT}(6I+I-q-#MQ5MgL-WiGqC0v9N}}$o-vI&)=qmk2`;~T^l66E+#O|R&g3YL$0r*J zU(OG#h_nde+(jh5P0*X1{2KMKQYfn_;@r5T57rN9(2sjJV10Ka!(WziNOPuFp%kL& zpAYoN!22|2uYXXZ+;i0AF2MjPsq=$P0$}JO4=V$UW=14&Vg- z#NOWdEr$$Q4arYI)~4%H3g-FBhVt`M$9M8AZV}Y~wT~>h#oOFyuCRbqk3<24BjW`t zzaDRs-Hufap7Ws%o2oK8!i7Pf*TjWq`_?Z>4*<2D9QRZ^L%Qn5C4OC)TEDb-s=CJv z+&enKSb`lEZI}_NB&*6#R*eMS3V7yP#U)J zgRt%W?A8#VmGoiKuCZ}L%di;?50=oV2qlr1jg;+g`8AZp7mwXTi}9t{=a)If5s)ENmq3lNv>IW7+$^s zUASjC`$AmJLGe`w)8uePHQtV{?Y|GvMd@r?qkj%-j<|$u>oB6fq z`}#V|%TfFheKR}_yS+6t^Ls9>mgJ|(1H}Sl@L`N_V)halr)-4<`Kzb& zTfHM+DT{ecKedSRgL}sIs7))KYG&xngY8;d_f=k;ocm_9uTA`cewNxD`b^I4 zV{hdUEuf-3!2qsZT-wq!4*HU7{xnBMB+iBaD<)noZf+XRKjCG0!TwdxJ{ZUQTB28| zdAJ-Tct)^^@}yB|3>@L-`0|r_hnj&OU>@E?$xVeH`+at7&CARFHgfZ1In3R5B)PPA z$v|7msVn>%p$R%dKibxVW8|$){efl)98!%``Pk@@u*xTcQ`5Rah5LOrPM7hToD{8; z$?DSW$^IE=t%+ekhhceDAx$dn$hV+lU_0B&(6O(j;qRN|&IHWK zIwpM=$Mnci90|Ga<0L<7X36P*6w1AiAvx+E?rz&OL0`iO>?ild*TM(KgiMH%AK?}V zxy$=oI@@4j9W&arm-ar_H+YAz(pnx+l0Gv=KfieAC5yH>p7mKyVhehh5E#|mFPFUw z@uu2*DMaa1pff+l@R;2<)W`349;wm^_1B@qJ>z^=Z|vjBA%LyAnIK01rKe#c{-yZU zCTI-Z*VS11Q-Cwyv#t4we_$p4E|LO+<}Yvv5*!Tp^XK%*1@9%p?TAZ8gdvbO@o}|r zkGRHHq4UU<_1I6~-a(t^kM|Jx{Z~wJg16)z`Jc6QG(%H{Q8UCEga>notyVD}(|w8f z`EEJIIn;~YEl7*M$T2k5XWH*z*9wfcoAO~dXX^;@u5o|`34Xnzi1_hq-eMSjpj*w3 z;-%R07U$_ZKt5*FF$t*t1wAjFWj$^g?0A9(UUM3D=7DrBzy{A9)St}(qt0|B&p&~7 zZQ`3UhZg|BO_QQ6n7;qaa{>zDH5~j4jb10z8`)3&r`+K)@QF)s(f;MVhoT1jm29sZ z;;lOS*X0asBVj%?G*{8)8RpNth~m?KMLE$i%(1;3HfW$ULE*W?o|y)zNGJ?1y)|vm z?uE@og~%!O457@Tb1bYK7^M0d+}fT5!c?uitkguc&vVf2IdMOoHZMx9s3zR4YS{Q1lMc9t zUt4=_h$hmB9v;!zRIj{sE{=aXjYms|wIr-@qsjX<50C01^H@P%dK=1QRYTnkF%Z2+ zSBGhDPV@_D8iDf6hw zzuWK*GJ}q#Cyb+(TV3_>^-~c`=~|o#xNnzS-TZi9xWx{RpyKxVPpW>H41z0u?lrHE zFttn}?sc2zV!uRrH<26ymJvoVBj5q!X^%Jh{HEU{j7LF4!d?q7%GsLk`PE1d)^Wd& zKozcA^3xxWi|cms_0xo%8nj!o2R%m0;)EcPVVM20*MI`ZtMh>eZ@=WtFkW88A2@iB1FFOb1 zUK~7c_@8!qm|l>H4WJq7Q)x_leww@zp`YM=$dmH2^c>9{d?XI2OwjO#ix}Svcs>6x z34%QPXRgRkBx?&vos{w(;Mh$q(moXi0Ev3$Fe zYBHa%)wYkg_RS3Lr5@$8=sib+@=8zP)nU*Ct%O@Q*(>*hf=V^wxU*^@Nh!{H^$CxA z6g+R_qCyXt%4@N(rRxqU`#w78h6Q;9$;Sje9NrFVY2m_Cqt3e+aj?h0kkh#GRdj^< zgie+c$>AEFaCtSD(!3|*s;-Jz!qrll^=uV3G*zHTh+hLw5yJ(xhKRZZB2@&cq83w3isN|xSQRhD#aJY?z!;z z$rS38ovP`yp5dXxauK}J(G;EGQxr^>ZNDoP1AU1P;Ja5D#n1(Ckv*k5wGTmJPN)gh z(nibq8J=K@;U`12#fyoCUGCZJ*z!|<6CaSFZebL>DPNIMjjH+`_RZ2DPo4nphvd2~ zW%Gn$s8g&Y0Op@}Rwj=xV07z1U*;fr?k9T&W)0vl312+M8u(;9^=`rFh>W}r96=7g z3+etwB|APsiiR3z5^}M_8Q-V>8mXMz)>6#+bs(r~u8o(4?e-~g}PKK5c&Rq{GbR2ntD*6HYQ0^Pf2vpAe)oFefxp^eJ|b0XBGPW_5`@NLPPetLZ7NR zf`$K074N+bOGP=ltzPwQls zV#%Tv$1A+gB^P^-a5paiK`I<1mJz;0mWyN^PbqtVh(0sCUR0DSXUx-Zq@81HkpAFr zWolg74>WcUI?*#v^7b8J``Iz|#Mu|VlwMXV3@XnmQQ`Xs`Ne|kcn-_%a37tc z5W>)QIqa!0{)q7aGzr>hJ~O~jhId(*gps%6dzPP$tn_;nQqGUJ#=VuYhKViRbCv$C zH%4-y+LmB|eoW`{{MdX*zs3#OY0)=q4d%qZ7y^CR@Z-0)mA7jcEa)esd_CSUx<=5WbSoUI$pADCeIZxqegJgHVQqy*C3o4o-i(6D^FHWijX_HpsgldD{!yx4Uc~3X=izU2FPy ztWx;0f#avDa(gh#`PO+@K^lZ3dNeg8hI2EOzJ25Xo025mew0#pt!dmWKt3*L9}7!{ z9WY!zMnjhy=Cq!rEa><3JZO;t=dowC_L42%uZcl zO@Oa$r)>MZ=inQ%Ge6Z@O7tb#NgZYi)i5AL+ro>&?HxLbqjh4+x$U{(N{j zuW*aevUW9Kx+&8w#T9((c@TstNc{q);)+faCioBi>)|tMAM<_PHtTaP#Vag{W(%Ga zzI^$x57l03JAL|34T`7d6-q+6TWG}oR{MVlu@da98g#6$o^goJDi^ZMzGdSV%c1G7 zZ&KV+N}Rht*DEdQJvBaqgr#^eDc?tc!VgDVYu|=Tw>^DWT*`-&0dwhNpOO5Yt6+?I z@5=GqUFm`vtOk0jMDSb=W`Bp#`q7l4N?L`(Y>?Ol?T9*QrD|jM*RHR-ejb%%nZmsD z8fw9;PIGyj8rHkEK76GbSN%vB9~;~y7Q{chpD_n@d&`7~xVJ>tBm$6f>DB!cA1;;^ zQTpe%o%UhjZw;Sa6uZicVc8-T8AiOgsqiVOGW_!w0jUgRsE~OTig{aTaPv-Iw^><; zuI#fYVR(^yM-%b^S?(R1*X#W=uYvYH^Tk0V2hFrgmAMy7Sdlgk0{{xcWE*X(X}du# zk}LH7#XOf5qdhy!^*dF1` zPCB|a{__vqkw9`fbDnhi_Sky>c6zcV{P{{lgsie3YQ_UXgXysgH~?{aKW+~z@9bgf zqaqH!3RO&Nq#QQ*Pm~IJE-OBO^~H=^>&o8A_vKv4-)Ee~MQ2UP6c z8v>UTL)_N*q`Vb=6kIlGbckYDYSG^VOS%ZgYSSRVIt&dcPE@EC~GRas&jTeFcSi(AbLv;9-;4W#$8|g*3yR zuO!D?Rlh-~;1?W=lW?-0w zPO|Q9fkvCFHB7r=?nXTmVw|~drfaNdA9k@y8SM3SQeHL zEGFbFtS{mDl9iFvzbIcO=ig1YbxS?P4Ftn+P?fscdFoZ?0;ua>aPkfkaGm%}8afgu z-@WMb=RwcLcSv5dn!#yo)UYj1@2}pOI7_V(sqNEaHY8>@$El8AO}su#9oi|ENWTs@ zI03oIpB9@4&I?ZY`jR?WwU)g7yQ1-|Y2v0ls*xNn+K;_vdgltR#&$605Z65j_?8-dID%IE61eyF|=Zz zfyI3j(c!W>TBzRlS-W)b`Uu!C*Y-a^4?Y0G|(!=Ww|fqoCs@q>2|D)n~kd#t-nO$UdbNi)oLIh=zF# zUXUK3j-E(g)1UjJ1f`tldyUd-!p2Od2?9lv$84|I2ikAeM&(~0R4Y}tu6IsB$0ENetZHdp#rS0E%a}h}p?{_{KLG zog;h2k0eQ$s%oA6$bxDc%Kg=*za03~6v9jD3**+q24)T$ve&CIu+syUq-J1hL?dg{4C zf-KiJ7*+1Q7R*d#u~kuf9V0r$5mViGilWk~vE$k^@bB?m-X{uSLJNX*R|)|nY$=Yr zn0zWP`FJcn4*Jcks68S7dSRCrP$Ry16i$VA|U_QD;0 z4NQC4Yn!e7XkJjOLJLPu6^lpPEbz*v-&H^Zj}iEiJVHJ}Ki_QF3C!G?xKZgguO%6R z$5>{A`?d!0uh|f~VbqFHU2;-tT>!J#@83NQ6Yn+e2Tk%0R7);YeSa508)Ay14?`N- z**uHk!ogoq4?XZ%p8C2vOq_XJNphk)plLGS9NLC^@_98%I$Dh|n!m!nD>Ff7FLU$hxK~W*Nc3H%8rH2fF&$&Zx$ErLk-Q1!eJDYZ>2Odf zBKv`eL^QOz)a<7iZ_ul|(uA}$&11QNumH_G()|{se`Q(x`gwJrM5-+SKH;ZFxCg|; zp5Z_Ul)oJA>H~F*c8+PQEroW!b~bcJ*#7hrVWTDRLITm?&x!j&j-9IZOICyu??I=9 zU`HaD#y5-uZDJ6gmJ?J*c2BZ)?`+<>tz zUZfLyxLvLyYn@L(Fibd4cwBYt)KiY=+3{h9611DG}LDUz?y%Q{uM z+^ppOU103_Wjh-~x{kR!mR0^=twV_kv;OmFId6i@y!Y^;z@By2Nv=PFzOv01rI2P2 z`m4=eoBvzV0V79@njEyT2#25a8aI{pErx#OTrD$)HYrYuNL@&%Y@POVAqG0QkV3groroD{`rmCr2Sl#muz$lwlHooh~%>*UnYaX z%kYSyP(#(KxSaY<>!$MZX?^x7)sMn|3=>WUtiCRuyHr67ILnv#AvbhjD^{e+?sJUX4;1ASJgC-}i?jha^OlrI|;<6n`hl;~f%Pu6|I-IV)Be%({BQeLL7h}M6CxuGqz^?aQcc3aSiPzpdI;^0tpP2{iRg{X|AjNYhgW--Lf_A9SjtP3*I@`xibj?nUpxMN`ph zo)xL`OCSwDxzzyW)KAg9Tl_Z5+cnmMvuaHAk+pnJc?wL?0*FR5B3ZrmtwP^P$M_4g zoTCUU7(B2^jZ}WycC&LVCx8ljuOzj7YfQ;ge{lRWSyfL9KABPh?&)DjsY;#gO@9qr zkoqOsIF;(X?lH{*g0?GblVqTfb1wrEhP!t-B;CXc=L^k#>*`*LTlTf?ZzwOKGu=X! zW*r`;6wVqP9#*=J#Hq~bFztNl59i3jwxI)YlxfAXcm#$Wvq$Kh;`!0T-QxVY*L#M`RvdCG*66EoQ1gL|1k0qeFCcSxr1rj8Aq_UJPoAN#>Psv^T`WIX|zT z{eTT?0&rPkZ_-glqG;mkQG zDT#AJwqOG9uz(lWM|U&_m@oDX=Tll!S?=7|O7Q+p_u3w3YUWa<)lN$Vq|RgW2$=`deo^GR!;#x2-0=A67Xz=@bWS_?lEY;_zS6-xanS%X{IRiynGwo`yM5&6*k=wr*^I0jd&7r=KE9|?u@F9I% z{<^TYeUkXxt0UTA^YVSTH>B}9do-)fo*<>l1l!mC)59$ZUiVh}5!*vnAhu^jZr@+w z_WT-=Sy|E5kx~#vr_pS&<&aJLS)XF1YDCk~RAs;t|6kIP=J_32hR6`?#}ChrY12?>@7S_OW|5BpgJHsf`W(B78LWsdvi2NVyK z4TJsy&Eog7I^#kc=&^z`(JWrK0h6J;CYAIv{w$6|8XexkeXwBMnpLBewcNWs5zTD# zodE_sXMt-!Ww9gF_mJeoa@3&}z@A=4B2lBn{5D(uJtc>T-}g3()Y8BBe$7wHsoFHy zJ5^_Fuh%_~cuzSz-QD+2kbsZy7d3m!SkTHbJQ54Exs1EBL=xaI%~YmHFrR)o<7!&5 z2j@P?l>S;Qd)^$i(>67nl+=y81o-Ch4YTFLAYv-}^2W=dd6&yFFkOqu3Gb=RLp{f7 zjs(>{3Q-M^Vv~K@mj{74(1N;RiI+p8xqN@fOK8U_&aC+dYRgw2xHHu(Z#T^3CXXK4 z1bgnM%j@b8WTNPN78o_XruNR0Ea~qv+YImax0xKk26b3L+RYGg@I^e4Q1h79S)Ver zn}hkNk-x4iK*b=j8ty}WJuzemDWLr%ZhH1DjPL1Pj6j|5>u3zbb~7IJf;*mm7?_$g zmsfepuODFe`#gWAC^Qozqwy=4%W1qdvRB#7<=AQa7M1buMiMR8Z^)bZCS_ajBe^)d;b`R z{YGRcNQ-eeBQiXr#Pj_CP#WKABB-1u9pH$TzEc!k`W`M_9!9iA^GpH>&9O3X4>lZ+ zzJBco#wz{u46#n$v#g5>;8okVHBZ(!{ho_vA8}{CY@Tg@7HBZ;dQX{jo@X1t;`GaIdYt zxJ&PWHlMNW(}}+vG$gGs*~;?s7YfT`pCi*nh%$FCRl$vNI&SIgmuQ>7r3Q;{;0W0@W*@dJU`Fh?I)Setuim5 zF_moocJ`4#Dc8>xBueBnIDAAOFZI{G#ws;Th>ne@)f)(xR^%%~1ubvIuOrnIU4KJr zEwXje{Mulj4tE_^@6YJBmHP7nAOa4(Id#`9lRTpZZAuR@p{O`5MIN7L#P<#x-fk9b zh=_=6qD}m%m1wh_G2Vm)G}8rvl4kyXSngXbgeceBQ1p+Yvoc8H;A%(p!|oSJb(6uu zQ|@S#OGJ6!Lh6*)F{r9k-|}di;fP{Kj>PZ38E6YvW&NKG)`Rng%wp99i2B34eJvIRHG=>@0nCb!?>kUcx zwH5=Ppi+yU@pSf^2P@a;dEenYnMos|_F+xC9CAR)p~C#rGv76{YF*G4 z?fXpSeHaKFHdXJ(?+xE^RxV<_f2x`LB6sp6P{Yq7fo#uVpMP^uM_ssIG0kh^6_v@t z@6{;me6!FD57GURygkW3sAm$Epvt;W3!v&)7oxDY=?BP6H{obY2V=fZu6I#wxN#UN zSS-8m?#?ip;68KK%>?^ds<@*GiA-MN2Vc2%TO$79tn$VMkBd?O(54>& z-1}n-WF_|PR%|LfU%4qy(ehpOXF8E+#1~% zA&z!1T>FKf&!2P7#R*&SfXe9O)}7&p-f|CYnva7z>bdn!WQ|V>vYWSZqLU~-yR*U!QSaKH)`Bs8g|7k7_6vRCyt%YF+k;cnXR^b|jn zU*3G#4L0u3K}LW&ZsR_f)oU<+t5#D?7W?^H*FzBnqW){o^<;u4i{|b9yV?Tfa9MX3MlgtBV6+80;0SR_}N$2+cnJ z${~}wE1FrkyWr)|SAXpv8S}cnb!$ML=ehxonUd;IO zP4xX^BF1Iopo@B4hfDOeHyK9aLBA5h{?eyFd~+n$;QpX9V^aCB{uH3XM4H%9;DZry zf89-ta)s;Y-G_xzw|{HX&wrTE9jDMvt;$Wqxsb2KdlJ%La|O!{;gMznu~t&LWe1_93KfaIA9FTZnulG>bG=&G z2IVZU-tbf=?Zn<++2YLn#Dg?v7?KRD41|>j(q2SQchHUYkeyXr-sBIM8771nfhPeg z+>YDI+h{13RrvM3ARW68`}<0znEIJGsP@#Rda?I`RrK(Qnc5fpF>$YH^6T_^{fwsq zuBl?q>cQQai`sIvMxNW(3ZTyipO8-6(w!@(rFeyy^`HP_vUD>nj0bPuEbPbt$X{@X zwz`9#ihCz-!ouWCF@E0T2=>E0UwIfrXW}J&S-5#w+>^*Vv?|{(F8s=&@Qkm0U$F7@ z0q-J`hM~f1!v)&!W9lUIA8>~#F!KxD+Gv)+gX>50A%JTNjcblS|`%y zn}JK;tv;Z%(`~+jXzFn_G})=3bQ1dCvbsmW%3yRUn#v5o()(iH_Omr>v4N8yqsb2! zt2;Q&sU?_~ViiF#uv6{uP5T4-k=lY*5g61#e=Ar+HDUZd?fvoPY^keAa8viAsSpA^ z5#z|i`}iBAzV=3*P|z|9S<&I~**_3Y znT%2=JPp1r#)Wp=7iiwNS2mjp%5XHQ=cjA;xMi17$m?x*a`7H1q}Z(yCKrJ)=4GpG z!bNP~b~s=2DIP${_tif*~KP=eAFHXY3fY zE2@|5#b&dtr;P!97UaV+Q0tswosmi+Z<{4G$RoW8Jc}^`g9pRYt8r(oDYi2?>nK z;7p1BILli)$~f-RF`k%AaIAdKh9R&Dl(Sc%{opCP=X-==Bv8C+Blz$4g~XSv1#PIa zw&J+?<5e41QcmdUa2ay+q)up0ziTR5-pjDhEXneYFL)iFI?szu@eK72{Se6_!m!YQ z`t~KOy`0hbIvO)l8z4|J{=N;<$6Bj(1D3X%psImH!x*uk$+)U^%}}}!R5<526X*)D45UP;H5MVpCjW8x14XSFdc)xWZelu%1LPtMC+X4 zyvyz1x7;fE_O6)>9J6uLV}gE5_cbLQY5pzj=42*+6ZcW~(>- z>Ko@oPD--HP?r5(B(}Gh8>j3M(u@9++?aiK>}7v9;rRI2QILI+Ds!!0L?8CF>O^EN zd;qC1Fr&Z=4duDkD< zr2<|tFZgY?MU(OWW$+wF3&I$rO!zo)m4a(5l5}ajt(ef+D9U2#~NXT%)k}< zer`g%7i&5uFNf_C^CKNT6wwu?imN+{iw{(bdjq~qBb$LZSKF`gJqDBg?^kt0R76(< zra%TlQ|4Vp1vulfE{|A`Bb&koVBspwF`d_P%gg>8ULMiF+->`J{r(P}Chk#H8S)o2PVYDH5w7RVw|vX^dsqUs4hx>qM}2Pnq&j~XNMs)?a?#{Ud%UlN+S8hz_~_Qf|fi{?Cz zDvo62+Ur67Wyx~-_U^v)YDd2$`akPZA{ezB(a?#(OI2Fpe<3WmN zVpW2fz1=`Mv4`}hsJa5#;PTE=%0A@B6UMKW4}3qu*gB`lDX|{D0hXC(o8Y7K#b2N3 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

Q8=pU?#TK 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�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 z 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 G;Qs??^I0MQ diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 19bbe1bb8..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,22 +0,0 @@ - -trigger: -- develop -- stage -- master - -pool: - vmImage: ubuntu-latest - -steps: -- task: Maven@3 - inputs: - mavenPomFile: 'pom.xml' - mavenOptions: '-Xmx3072m' - javaHomeOption: 'JDKVersion' - jdkVersionOption: '11' - jdkArchitectureOption: 'x64' - publishJUnitResults: true - testResultsFiles: '**/surefire-reports/TEST-*.xml' - goals: 'package' - - diff --git a/cloud-config/.gitignore b/cloud-config/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/cloud-config/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/cloud-config/.mvn/wrapper/MavenWrapperDownloader.java b/cloud-config/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/cloud-config/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/cloud-config/.mvn/wrapper/maven-wrapper.jar b/cloud-config/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/cloud-config/.mvn/wrapper/maven-wrapper.properties b/cloud-config/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/cloud-config/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/cloud-config/Dockerfile b/cloud-config/Dockerfile deleted file mode 100644 index 8d8aa3e4e..000000000 --- a/cloud-config/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -COPY cloud-config/ . -ADD cloud-config/target/cloud-config-v${PROJECT_VERSION}.jar cloud-config.jar -EXPOSE 9296 -ENTRYPOINT ["java", "-jar", "cloud-config.jar"] - - diff --git a/cloud-config/compose.yml b/cloud-config/compose.yml deleted file mode 100644 index 139a9d028..000000000 --- a/cloud-config/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - cloud-config-container: - image: selimhorri/cloud-config-ecommerce-boot:0.1.0 - ports: - - 9296:9296 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/cloud-config/mvnw b/cloud-config/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/cloud-config/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/cloud-config/mvnw.cmd b/cloud-config/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/cloud-config/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/cloud-config/pom.xml b/cloud-config/pom.xml deleted file mode 100644 index 498bd493c..000000000 --- a/cloud-config/pom.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - cloud-config - cloud-config - Spring Boot microservice! - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - org.springframework.cloud - spring-cloud-config-server - - - org.springframework.cloud - spring-cloud-starter - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - ${project.artifactId}-v${project.version} - - - - - - - - diff --git a/cloud-config/src/main/java/com/selimhorri/app/CloudConfigApplication.java b/cloud-config/src/main/java/com/selimhorri/app/CloudConfigApplication.java deleted file mode 100644 index 79ea2e42d..000000000 --- a/cloud-config/src/main/java/com/selimhorri/app/CloudConfigApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.config.server.EnableConfigServer; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -@EnableConfigServer -public class CloudConfigApplication { - - public static void main(String[] args) { - SpringApplication.run(CloudConfigApplication.class, args); - } - - - -} - - - - - - diff --git a/cloud-config/src/main/resources/application.yml b/cloud-config/src/main/resources/application.yml deleted file mode 100644 index e87eca664..000000000 --- a/cloud-config/src/main/resources/application.yml +++ /dev/null @@ -1,49 +0,0 @@ - -server: - port: 9296 - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - application: - name: CLOUD-CONFIG - cloud: - config: - server: - git: - uri: https://github.com/SelimHorri/cloud-config-server - clone-on-start: true - -resilience4j: - circuitbreaker: - instances: - cloudConfig: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - endpoints: - web: - exposure: - include: "*" - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - diff --git a/cloud-config/src/test/java/com/selimhorri/app/CloudConfigApplicationTests.java b/cloud-config/src/test/java/com/selimhorri/app/CloudConfigApplicationTests.java deleted file mode 100644 index eb1b9195a..000000000 --- a/cloud-config/src/test/java/com/selimhorri/app/CloudConfigApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class CloudConfigApplicationTests { - - - -} - - - - - - diff --git a/cloud-config/system.properties b/cloud-config/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/cloud-config/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/compose.yml b/compose.yml deleted file mode 100644 index 1dc07dadd..000000000 --- a/compose.yml +++ /dev/null @@ -1,120 +0,0 @@ -version: '3' -services: - api-gateway-container: - image: selimhorri/api-gateway-ecommerce-boot:0.1.0 - ports: - - 8080:8080 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 - - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ - - EUREKA_CLIENT_REGION=default - - EUREKA_CLIENT_AVAILABILITYZONES_DEFAULT=myzone - - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ - - EUREKA_INSTANCE_HOSTNAME=api-gateway-container - - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false - - proxy-client-container: - image: selimhorri/proxy-client-ecommerce-boot:0.1.0 - ports: - - 8900:8900 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 - - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ - - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ - - EUREKA_INSTANCE_HOSTNAME=proxy-client-container - - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false - - order-service-container: - image: selimhorri/order-service-ecommerce-boot:0.1.0 - ports: - - 8300:8300 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 - - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ - - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ - - EUREKA_INSTANCE_HOSTNAME=order-service-container - - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false - - payment-service-container: - image: selimhorri/payment-service-ecommerce-boot:0.1.0 - ports: - - 8400:8400 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 - - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ - - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ - - EUREKA_INSTANCE_HOSTNAME=payment-service-container - - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false - - product-service-container: - image: selimhorri/product-service-ecommerce-boot:0.1.0 - ports: - - 8500:8500 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 - - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ - - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ - - EUREKA_INSTANCE_HOSTNAME=product-service-container - - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false - - shipping-service-container: - image: selimhorri/shipping-service-ecommerce-boot:0.1.0 - ports: - - 8600:8600 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 - - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ - - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ - - EUREKA_INSTANCE_HOSTNAME=shipping-service-container - - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false - - user-service-container: - image: selimhorri/user-service-ecommerce-boot:0.1.0 - ports: - - 8700:8700 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 - - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ - - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ - - EUREKA_INSTANCE_HOSTNAME=user-service-container - - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false - - favourite-service-container: - image: selimhorri/favourite-service-ecommerce-boot:0.1.0 - ports: - - 8800:8800 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 - - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ - - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ - - EUREKA_INSTANCE_HOSTNAME=favourite-service-container - - EUREKA_INSTANCE_PREFER_IP_ADDRESS=false - -networks: - microservices_network: - external: true - name: microservices_network diff --git a/core.yml b/core.yml deleted file mode 100644 index 23dc6c5be..000000000 --- a/core.yml +++ /dev/null @@ -1,35 +0,0 @@ -version: '3' -services: - zipkin-container: - image: openzipkin/zipkin - ports: - - 9411:9411 - networks: - - microservices_network - service-discovery-container: - image: selimhorri/service-discovery-ecommerce-boot:0.1.0 - ports: - - 8761:8761 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE_URL=http://zipkin-container:9411 - - SPRING_CONFIG_IMPORT=optional:configserver:http://cloud-config-container:9296/ - cloud-config-container: - image: selimhorri/cloud-config-ecommerce-boot:0.1.0 - ports: - - 9296:9296 - networks: - - microservices_network - environment: - - SPRING_PROFILES_ACTIVE=dev - - SPRING_ZIPKIN_BASE-URL=http://zipkin-container:9411 - - EUREKA_CLIENT_REGION=default - - EUREKA_CLIENT_AVAILABILITYZONES_DEFAULT=myzone - - EUREKA_CLIENT_SERVICEURL_MYZONE=http://service-discovery-container:8761/eureka - - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://service-discovery-container:8761/eureka/ -networks: - microservices_network: - driver: bridge - name: microservices_network \ No newline at end of file diff --git a/ecommerce-ERD.drawio b/ecommerce-ERD.drawio deleted file mode 100644 index 827e64a5e..000000000 --- a/ecommerce-ERD.drawio +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/ecommerce-ERD.drawio.png b/ecommerce-ERD.drawio.png deleted file mode 100644 index f48ce191700afe3a7e968403b4ae160ae03a4873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146852 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 diff --git a/favourite-service/.gitignore b/favourite-service/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/favourite-service/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/favourite-service/.mvn/wrapper/MavenWrapperDownloader.java b/favourite-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/favourite-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/favourite-service/.mvn/wrapper/maven-wrapper.jar b/favourite-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/favourite-service/.mvn/wrapper/maven-wrapper.properties b/favourite-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/favourite-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/favourite-service/Dockerfile b/favourite-service/Dockerfile deleted file mode 100644 index 0bb9a8267..000000000 --- a/favourite-service/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY favourite-service/ . -ADD favourite-service/target/favourite-service-v${PROJECT_VERSION}.jar favourite-service.jar -EXPOSE 8800 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "favourite-service.jar"] - - diff --git a/favourite-service/compose.yml b/favourite-service/compose.yml deleted file mode 100644 index 24393608d..000000000 --- a/favourite-service/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - favourite-service-container: - image: selimhorri/favourite-service-ecommerce-boot:0.1.0 - ports: - - 8800:8800 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/favourite-service/mvnw b/favourite-service/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/favourite-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/favourite-service/mvnw.cmd b/favourite-service/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/favourite-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/favourite-service/pom.xml b/favourite-service/pom.xml deleted file mode 100644 index 1e9de2ab9..000000000 --- a/favourite-service/pom.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - favourite-service - favourite-service - Spring Boot Microservice! - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/FavouriteServiceApplication.java b/favourite-service/src/main/java/com/selimhorri/app/FavouriteServiceApplication.java deleted file mode 100644 index 01d48965a..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/FavouriteServiceApplication.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -public class FavouriteServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(FavouriteServiceApplication.class, args); - } - - - -} - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/favourite-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java deleted file mode 100644 index 27021f387..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/favourite-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java deleted file mode 100644 index f7de593a7..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/favourite-service/src/main/java/com/selimhorri/app/constant/AppConstant.java deleted file mode 100644 index 2e051c4b5..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/favourite-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java deleted file mode 100644 index b19764968..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/domain/Favourite.java b/favourite-service/src/main/java/com/selimhorri/app/domain/Favourite.java deleted file mode 100644 index 2b25dbce9..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/domain/Favourite.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.Table; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.domain.id.FavouriteId; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "favourites") -@IdClass(FavouriteId.class) -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -@Data -@Builder -public final class Favourite extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @Column(name = "user_id", nullable = false) - private Integer userId; - - @Id - @Column(name = "product_id", nullable = false) - private Integer productId; - - @Id - @Column(name = "like_date", nullable = false) - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/domain/id/FavouriteId.java b/favourite-service/src/main/java/com/selimhorri/app/domain/id/FavouriteId.java deleted file mode 100644 index e310306db..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/domain/id/FavouriteId.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.selimhorri.app.domain.id; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -public class FavouriteId implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull - private Integer userId; - - @NotNull - private Integer productId; - - @NotNull - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/dto/FavouriteDto.java b/favourite-service/src/main/java/com/selimhorri/app/dto/FavouriteDto.java deleted file mode 100644 index e31a0e52c..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/dto/FavouriteDto.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class FavouriteDto implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull(message = "Field must not be NULL") - private Integer userId; - - @NotNull(message = "Field must not be NULL") - private Integer productId; - - @NotNull(message = "Field must not be NULL") - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - - @JsonProperty("user") - @JsonInclude(Include.NON_NULL) - private UserDto userDto; - - @JsonProperty("product") - @JsonInclude(Include.NON_NULL) - private ProductDto productDto; - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/dto/ProductDto.java b/favourite-service/src/main/java/com/selimhorri/app/dto/ProductDto.java deleted file mode 100644 index f9da75e58..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/dto/ProductDto.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonInclude(Include.NON_NULL) - private Set favouriteDtos; - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/dto/UserDto.java b/favourite-service/src/main/java/com/selimhorri/app/dto/UserDto.java deleted file mode 100644 index 3c881af98..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/dto/UserDto.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonInclude(Include.NON_NULL) - private Set favouriteDtos; - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/favourite-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java deleted file mode 100644 index ecee30efd..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/favourite-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java deleted file mode 100644 index a22066cf2..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.FavouriteNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - FavouriteNotFoundException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/favourite-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java deleted file mode 100644 index 77429c9d1..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java b/favourite-service/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java deleted file mode 100644 index d7d68c9af..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class FavouriteNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public FavouriteNotFoundException() { - super(); - } - - public FavouriteNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public FavouriteNotFoundException(String message) { - super(message); - } - - public FavouriteNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/helper/FavouriteMappingHelper.java b/favourite-service/src/main/java/com/selimhorri/app/helper/FavouriteMappingHelper.java deleted file mode 100644 index b06edd8f4..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/helper/FavouriteMappingHelper.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Favourite; -import com.selimhorri.app.dto.FavouriteDto; -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.dto.UserDto; - -public interface FavouriteMappingHelper { - - public static FavouriteDto map(final Favourite favourite) { - return FavouriteDto.builder() - .userId(favourite.getUserId()) - .productId(favourite.getProductId()) - .likeDate(favourite.getLikeDate()) - .userDto( - UserDto.builder() - .userId(favourite.getUserId()) - .build()) - .productDto( - ProductDto.builder() - .productId(favourite.getProductId()) - .build()) - .build(); - } - - public static Favourite map(final FavouriteDto favouriteDto) { - return Favourite.builder() - .userId(favouriteDto.getUserId()) - .productId(favouriteDto.getProductId()) - .likeDate(favouriteDto.getLikeDate()) - .build(); - } - - - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/repository/FavouriteRepository.java b/favourite-service/src/main/java/com/selimhorri/app/repository/FavouriteRepository.java deleted file mode 100644 index 0cf4161b4..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/repository/FavouriteRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Favourite; -import com.selimhorri.app.domain.id.FavouriteId; - -public interface FavouriteRepository extends JpaRepository { - - - -} diff --git a/favourite-service/src/main/java/com/selimhorri/app/resource/FavouriteResource.java b/favourite-service/src/main/java/com/selimhorri/app/resource/FavouriteResource.java deleted file mode 100644 index 18dd8b5fd..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/resource/FavouriteResource.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.selimhorri.app.resource; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.domain.id.FavouriteId; -import com.selimhorri.app.dto.FavouriteDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.FavouriteService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/favourites") -@Slf4j -@RequiredArgsConstructor -public class FavouriteResource { - - private final FavouriteService favouriteService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** FavouriteDto List, controller; fetch all favourites *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.favouriteService.findAll())); - } - - @GetMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity findById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate) { - log.info("*** FavouriteDto, resource; fetch favourite by id *"); - return ResponseEntity.ok(this.favouriteService.findById( - new FavouriteId(Integer.parseInt(userId), Integer.parseInt(productId), - LocalDateTime.parse(likeDate, DateTimeFormatter.ofPattern(AppConstant.LOCAL_DATE_TIME_FORMAT))))); - } - - @GetMapping("/find") - public ResponseEntity findById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteId favouriteId) { - log.info("*** FavouriteDto, resource; fetch favourite by id *"); - return ResponseEntity.ok(this.favouriteService.findById(favouriteId)); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteDto favouriteDto) { - log.info("*** FavouriteDto, resource; save favourite *"); - return ResponseEntity.ok(this.favouriteService.save(favouriteDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteDto favouriteDto) { - log.info("*** FavouriteDto, resource; update favourite *"); - return ResponseEntity.ok(this.favouriteService.update(favouriteDto)); - } - - @DeleteMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity deleteById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate) { - log.info("*** Boolean, resource; delete favourite by id *"); - this.favouriteService.deleteById(new FavouriteId(Integer.parseInt(userId), Integer.parseInt(productId), - LocalDateTime.parse(likeDate, DateTimeFormatter.ofPattern(AppConstant.LOCAL_DATE_TIME_FORMAT)))); - return ResponseEntity.ok(true); - } - - @DeleteMapping("/delete") - public ResponseEntity deleteById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteId favouriteId) { - log.info("*** Boolean, resource; delete favourite by id *"); - this.favouriteService.deleteById(favouriteId); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/favourite-service/src/main/java/com/selimhorri/app/service/FavouriteService.java b/favourite-service/src/main/java/com/selimhorri/app/service/FavouriteService.java deleted file mode 100644 index 01d50d7b2..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/service/FavouriteService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.domain.id.FavouriteId; -import com.selimhorri.app.dto.FavouriteDto; - -public interface FavouriteService { - - List findAll(); - FavouriteDto findById(final FavouriteId favouriteId); - FavouriteDto save(final FavouriteDto favouriteDto); - FavouriteDto update(final FavouriteDto favouriteDto); - void deleteById(final FavouriteId favouriteId); - -} diff --git a/favourite-service/src/main/java/com/selimhorri/app/service/impl/FavouriteServiceImpl.java b/favourite-service/src/main/java/com/selimhorri/app/service/impl/FavouriteServiceImpl.java deleted file mode 100644 index ca3658584..000000000 --- a/favourite-service/src/main/java/com/selimhorri/app/service/impl/FavouriteServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.domain.id.FavouriteId; -import com.selimhorri.app.dto.FavouriteDto; -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.dto.UserDto; -import com.selimhorri.app.exception.wrapper.FavouriteNotFoundException; -import com.selimhorri.app.helper.FavouriteMappingHelper; -import com.selimhorri.app.repository.FavouriteRepository; -import com.selimhorri.app.service.FavouriteService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class FavouriteServiceImpl implements FavouriteService { - - private final FavouriteRepository favouriteRepository; - private final RestTemplate restTemplate; - - @Override - public List findAll() { - log.info("*** FavouriteDto List, service; fetch all favourites *"); - return this.favouriteRepository.findAll() - .stream() - .map(FavouriteMappingHelper::map) - .map(f -> { - f.setUserDto(this.restTemplate - .getForObject(AppConstant.DiscoveredDomainsApi - .USER_SERVICE_API_URL + "/" + f.getUserId(), UserDto.class)); - f.setProductDto(this.restTemplate - .getForObject(AppConstant.DiscoveredDomainsApi - .PRODUCT_SERVICE_API_URL + "/" + f.getProductId(), ProductDto.class)); - return f; - }) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public FavouriteDto findById(final FavouriteId favouriteId) { - log.info("*** FavouriteDto, service; fetch favourite by id *"); - return this.favouriteRepository.findById(favouriteId) - .map(FavouriteMappingHelper::map) - .map(f -> { - f.setUserDto(this.restTemplate - .getForObject(AppConstant.DiscoveredDomainsApi - .USER_SERVICE_API_URL + "/" + f.getUserId(), UserDto.class)); - f.setProductDto(this.restTemplate - .getForObject(AppConstant.DiscoveredDomainsApi - .PRODUCT_SERVICE_API_URL + "/" + f.getProductId(), ProductDto.class)); - return f; - }) - .orElseThrow(() -> new FavouriteNotFoundException( - String.format("Favourite with id: [%s] not found!", favouriteId))); - } - - @Override - public FavouriteDto save(final FavouriteDto favouriteDto) { - return FavouriteMappingHelper.map(this.favouriteRepository - .save(FavouriteMappingHelper.map(favouriteDto))); - } - - @Override - public FavouriteDto update(final FavouriteDto favouriteDto) { - return FavouriteMappingHelper.map(this.favouriteRepository - .save(FavouriteMappingHelper.map(favouriteDto))); - } - - @Override - public void deleteById(final FavouriteId favouriteId) { - this.favouriteRepository.deleteById(favouriteId); - } - - - -} - - - - - - - - - - diff --git a/favourite-service/src/main/resources/application-dev.yml b/favourite-service/src/main/resources/application-dev.yml deleted file mode 100644 index 56f6d565e..000000000 --- a/favourite-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,47 +0,0 @@ - -server: - port: 8800 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/favourite-service/src/main/resources/application-prod.yml b/favourite-service/src/main/resources/application-prod.yml deleted file mode 100644 index c14fc2b8b..000000000 --- a/favourite-service/src/main/resources/application-prod.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - diff --git a/favourite-service/src/main/resources/application-stage.yml b/favourite-service/src/main/resources/application-stage.yml deleted file mode 100644 index e07e9b670..000000000 --- a/favourite-service/src/main/resources/application-stage.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/favourite-service/src/main/resources/application.yml b/favourite-service/src/main/resources/application.yml deleted file mode 100644 index df776ab6d..000000000 --- a/favourite-service/src/main/resources/application.yml +++ /dev/null @@ -1,46 +0,0 @@ - -server: - servlet: - context-path: /favourite-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: FAVOURITE-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - favouriteService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - - diff --git a/favourite-service/src/main/resources/db/migration/V1__create_favourites_table.sql b/favourite-service/src/main/resources/db/migration/V1__create_favourites_table.sql deleted file mode 100644 index 938196857..000000000 --- a/favourite-service/src/main/resources/db/migration/V1__create_favourites_table.sql +++ /dev/null @@ -1,10 +0,0 @@ - -CREATE TABLE favourites ( - user_id INT(11) NOT NULL, - product_id INT(11) NOT NULL, - like_date TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP, - PRIMARY KEY (user_id, product_id, like_date) -); - diff --git a/favourite-service/src/main/resources/db/migration/V2__insert_favourites_table.sql b/favourite-service/src/main/resources/db/migration/V2__insert_favourites_table.sql deleted file mode 100644 index b1ffe5433..000000000 --- a/favourite-service/src/main/resources/db/migration/V2__insert_favourites_table.sql +++ /dev/null @@ -1,7 +0,0 @@ - -INSERT INTO favourites -(user_id, product_id) VALUES -(1, 1), -(1, 2), -(2, 2); - diff --git a/favourite-service/src/test/java/com/selimhorri/app/FavouriteServiceApplicationTests.java b/favourite-service/src/test/java/com/selimhorri/app/FavouriteServiceApplicationTests.java deleted file mode 100644 index 7a42ca923..000000000 --- a/favourite-service/src/test/java/com/selimhorri/app/FavouriteServiceApplicationTests.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class FavouriteServiceApplicationTests { - - - -} - - - - - - - diff --git a/favourite-service/system.properties b/favourite-service/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/favourite-service/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/helm/ecommerce/charts/api-gateway/templates/ingress.yaml b/helm/ecommerce/charts/api-gateway/templates/ingress.yaml new file mode 100644 index 000000000..662d0953f --- /dev/null +++ b/helm/ecommerce/charts/api-gateway/templates/ingress.yaml @@ -0,0 +1,21 @@ +{{- if .Values.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }} + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + ingressClassName: nginx + rules: + - host: {{ .Values.ingress.host }} + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: {{ .Release.Name }}-{{ .Chart.Name }} + port: + number: {{ .Values.service.port }} +{{- end }} diff --git a/helm/ecommerce/charts/api-gateway/values.yaml b/helm/ecommerce/charts/api-gateway/values.yaml index 2e591ac9a..f1db7aa55 100644 --- a/helm/ecommerce/charts/api-gateway/values.yaml +++ b/helm/ecommerce/charts/api-gateway/values.yaml @@ -14,4 +14,16 @@ config: eurekaClientAvailabilityZonesDefault: myzone eurekaClientServiceUrlMyZone: "http://my-ecommerce-service-discovery:8761/eureka" eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka" - eurekaInstancePreferIpAddress: "true" \ No newline at end of file + eurekaInstancePreferIpAddress: "true" + +# Ingress +ingress: + enabled: true + ingressClassName: nginx + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / + hosts: + - host: gateway.local + paths: + - path: / + pathType: Prefix \ No newline at end of file diff --git a/helm/ecommerce/charts/product-service/values.yaml b/helm/ecommerce/charts/product-service/values.yaml index 32ba57e0a..a58948566 100644 --- a/helm/ecommerce/charts/product-service/values.yaml +++ b/helm/ecommerce/charts/product-service/values.yaml @@ -13,6 +13,5 @@ config: springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka/" - eurekaInstanceHostname: product-service-container - eurekaInstancePreferIpAddress: "false" + eurekaInstancePreferIpAddress: "true" diff --git a/helm/ecommerce/charts/shipping-service/values.yaml b/helm/ecommerce/charts/shipping-service/values.yaml index b54896f40..3b2bc2545 100644 --- a/helm/ecommerce/charts/shipping-service/values.yaml +++ b/helm/ecommerce/charts/shipping-service/values.yaml @@ -13,4 +13,5 @@ config: springZipkinBaseUrl: "http://my-ecommerce-zipkin:9411" springConfigImport: "optional:configserver:http://my-ecommerce-cloud-config:9296/" eurekaClientServiceUrlDefaultZone: "http://my-ecommerce-service-discovery:8761/eureka/" - eurekaInstancePreferIpAddress: "true" \ No newline at end of file + eurekaInstancePreferIpAddress: "true" + \ No newline at end of file diff --git a/mvnw b/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/order-service/.gitignore b/order-service/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/order-service/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/order-service/.mvn/wrapper/MavenWrapperDownloader.java b/order-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/order-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/order-service/.mvn/wrapper/maven-wrapper.jar b/order-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/order-service/.mvn/wrapper/maven-wrapper.properties b/order-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/order-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/order-service/Dockerfile b/order-service/Dockerfile deleted file mode 100644 index 21decc56f..000000000 --- a/order-service/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY order-service/ . -ADD order-service/target/order-service-v${PROJECT_VERSION}.jar order-service.jar -EXPOSE 8300 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "order-service.jar"] - - diff --git a/order-service/compose.yml b/order-service/compose.yml deleted file mode 100644 index 99f86dcc0..000000000 --- a/order-service/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - order-service-container: - image: selimhorri/order-service-ecommerce-boot:0.1.0 - ports: - - 8300:8300 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/order-service/mvnw b/order-service/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/order-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/order-service/mvnw.cmd b/order-service/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/order-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/order-service/pom.xml b/order-service/pom.xml deleted file mode 100644 index 6dfdd3d86..000000000 --- a/order-service/pom.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - order-service - order-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/OrderServiceApplication.java b/order-service/src/main/java/com/selimhorri/app/OrderServiceApplication.java deleted file mode 100644 index b38c416ab..000000000 --- a/order-service/src/main/java/com/selimhorri/app/OrderServiceApplication.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -@EnableEurekaClient -public class OrderServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(OrderServiceApplication.class, args); - } - - - -} - -@RestController -class OrderController { - - @GetMapping - public String msg() { - return "Order controller responding!!"; - } - -} - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/order-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java deleted file mode 100644 index 27021f387..000000000 --- a/order-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/order-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java deleted file mode 100644 index f7de593a7..000000000 --- a/order-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/order-service/src/main/java/com/selimhorri/app/constant/AppConstant.java deleted file mode 100644 index 2e051c4b5..000000000 --- a/order-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/order-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java deleted file mode 100644 index b19764968..000000000 --- a/order-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/domain/Cart.java b/order-service/src/main/java/com/selimhorri/app/domain/Cart.java deleted file mode 100644 index ed6a6ce84..000000000 --- a/order-service/src/main/java/com/selimhorri/app/domain/Cart.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "carts") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"orders"}) -@Data -@Builder -public final class Cart extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "cart_id", unique = true, nullable = false, updatable = false) - private Integer cartId; - - @Column(name = "user_id") - private Integer userId; - - @JsonIgnore - @OneToMany(mappedBy = "cart", fetch = FetchType.LAZY, cascade = CascadeType.ALL) - private Set orders; - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/domain/Order.java b/order-service/src/main/java/com/selimhorri/app/domain/Order.java deleted file mode 100644 index c57fe7212..000000000 --- a/order-service/src/main/java/com/selimhorri/app/domain/Order.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "orders") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"cart"}) -@Data -@Builder -public final class Order extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "order_id", unique = true, nullable = false, updatable = false) - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - @Column(name = "order_date") - private LocalDateTime orderDate; - - @Column(name = "order_desc") - private String orderDesc; - - @Column(name = "order_fee", columnDefinition = "decimal") - private Double orderFee; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "cart_id") - private Cart cart; - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/dto/CartDto.java b/order-service/src/main/java/com/selimhorri/app/dto/CartDto.java deleted file mode 100644 index 2cf9e4ef8..000000000 --- a/order-service/src/main/java/com/selimhorri/app/dto/CartDto.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CartDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer cartId; - private Integer userId; - - @JsonInclude(Include.NON_NULL) - private Set orderDtos; - - @JsonProperty("user") - @JsonInclude(Include.NON_NULL) - private UserDto userDto; - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/dto/OrderDto.java b/order-service/src/main/java/com/selimhorri/app/dto/OrderDto.java deleted file mode 100644 index ac5f5ec33..000000000 --- a/order-service/src/main/java/com/selimhorri/app/dto/OrderDto.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - - @JsonProperty("cart") - @JsonInclude(Include.NON_NULL) - private CartDto cartDto; - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/dto/UserDto.java b/order-service/src/main/java/com/selimhorri/app/dto/UserDto.java deleted file mode 100644 index 3454b6c57..000000000 --- a/order-service/src/main/java/com/selimhorri/app/dto/UserDto.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonProperty("cart") - @JsonInclude(Include.NON_NULL) - private CartDto cartDto; - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/order-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java deleted file mode 100644 index ecee30efd..000000000 --- a/order-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/order-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java deleted file mode 100644 index 6182c7bc4..000000000 --- a/order-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.CartNotFoundException; -import com.selimhorri.app.exception.wrapper.OrderNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - CartNotFoundException.class, - OrderNotFoundException.class, - IllegalStateException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/order-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java deleted file mode 100644 index 77429c9d1..000000000 --- a/order-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/exception/wrapper/CartNotFoundException.java b/order-service/src/main/java/com/selimhorri/app/exception/wrapper/CartNotFoundException.java deleted file mode 100644 index 7510f738f..000000000 --- a/order-service/src/main/java/com/selimhorri/app/exception/wrapper/CartNotFoundException.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class CartNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public CartNotFoundException() { - super(); - } - - public CartNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public CartNotFoundException(String message) { - super(message); - } - - public CartNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderNotFoundException.java b/order-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderNotFoundException.java deleted file mode 100644 index a4cbf9369..000000000 --- a/order-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderNotFoundException.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class OrderNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public OrderNotFoundException() { - super(); - } - - public OrderNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public OrderNotFoundException(String message) { - super(message); - } - - public OrderNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/helper/CartMappingHelper.java b/order-service/src/main/java/com/selimhorri/app/helper/CartMappingHelper.java deleted file mode 100644 index 4a5f3eba4..000000000 --- a/order-service/src/main/java/com/selimhorri/app/helper/CartMappingHelper.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Cart; -import com.selimhorri.app.dto.CartDto; -import com.selimhorri.app.dto.UserDto; - -public interface CartMappingHelper { - - public static CartDto map(final Cart cart) { - return CartDto.builder() - .cartId(cart.getCartId()) - .userId(cart.getUserId()) - .userDto( - UserDto.builder() - .userId(cart.getUserId()) - .build()) - .build(); - } - - public static Cart map(final CartDto cartDto) { - return Cart.builder() - .cartId(cartDto.getCartId()) - .userId(cartDto.getUserId()) - .build(); - } - - - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/helper/OrderMappingHelper.java b/order-service/src/main/java/com/selimhorri/app/helper/OrderMappingHelper.java deleted file mode 100644 index 0c4371c91..000000000 --- a/order-service/src/main/java/com/selimhorri/app/helper/OrderMappingHelper.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Cart; -import com.selimhorri.app.domain.Order; -import com.selimhorri.app.dto.CartDto; -import com.selimhorri.app.dto.OrderDto; - -public interface OrderMappingHelper { - - public static OrderDto map(final Order order) { - return OrderDto.builder() - .orderId(order.getOrderId()) - .orderDate(order.getOrderDate()) - .orderDesc(order.getOrderDesc()) - .orderFee(order.getOrderFee()) - .cartDto( - CartDto.builder() - .cartId(order.getCart().getCartId()) - .build()) - .build(); - } - - public static Order map(final OrderDto orderDto) { - return Order.builder() - .orderId(orderDto.getOrderId()) - .orderDate(orderDto.getOrderDate()) - .orderDesc(orderDto.getOrderDesc()) - .orderFee(orderDto.getOrderFee()) - .cart( - Cart.builder() - .cartId(orderDto.getCartDto().getCartId()) - .build()) - .build(); - } - - - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/repository/CartRepository.java b/order-service/src/main/java/com/selimhorri/app/repository/CartRepository.java deleted file mode 100644 index be9a2f082..000000000 --- a/order-service/src/main/java/com/selimhorri/app/repository/CartRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Cart; - -public interface CartRepository extends JpaRepository { - - - -} diff --git a/order-service/src/main/java/com/selimhorri/app/repository/OrderRepository.java b/order-service/src/main/java/com/selimhorri/app/repository/OrderRepository.java deleted file mode 100644 index 39d7f4c00..000000000 --- a/order-service/src/main/java/com/selimhorri/app/repository/OrderRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Order; - -public interface OrderRepository extends JpaRepository { - - - -} diff --git a/order-service/src/main/java/com/selimhorri/app/resource/CartResource.java b/order-service/src/main/java/com/selimhorri/app/resource/CartResource.java deleted file mode 100644 index 8ae187020..000000000 --- a/order-service/src/main/java/com/selimhorri/app/resource/CartResource.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.CartDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.CartService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/carts") -@Slf4j -@RequiredArgsConstructor -public class CartResource { - - private final CartService cartService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** CartDto List, controller; fetch all categories *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.cartService.findAll())); - } - - @GetMapping("/{cartId}") - public ResponseEntity findById( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank") - @Valid final String cartId) { - log.info("*** CartDto, resource; fetch cart by id *"); - return ResponseEntity.ok(this.cartService.findById(Integer.parseInt(cartId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto) { - log.info("*** CartDto, resource; save cart *"); - return ResponseEntity.ok(this.cartService.save(cartDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CartDto cartDto) { - log.info("*** CartDto, resource; update cart *"); - return ResponseEntity.ok(this.cartService.update(cartDto)); - } - - @PutMapping("/{cartId}") - public ResponseEntity update( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank") - @Valid final String cartId, - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CartDto cartDto) { - log.info("*** CartDto, resource; update cart with cartId *"); - return ResponseEntity.ok(this.cartService.update(Integer.parseInt(cartId), cartDto)); - } - - @DeleteMapping("/{cartId}") - public ResponseEntity deleteById(@PathVariable("cartId") final String cartId) { - log.info("*** Boolean, resource; delete cart by id *"); - this.cartService.deleteById(Integer.parseInt(cartId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/resource/OrderResource.java b/order-service/src/main/java/com/selimhorri/app/resource/OrderResource.java deleted file mode 100644 index 8a7a6a3d4..000000000 --- a/order-service/src/main/java/com/selimhorri/app/resource/OrderResource.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.OrderService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/orders") -@Slf4j -@RequiredArgsConstructor -public class OrderResource { - - private final OrderService orderService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** OrderDto List, controller; fetch all orders *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.orderService.findAll())); - } - - @GetMapping("/{orderId}") - public ResponseEntity findById( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank") - @Valid final String orderId) { - log.info("*** OrderDto, resource; fetch order by id *"); - return ResponseEntity.ok(this.orderService.findById(Integer.parseInt(orderId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderDto orderDto) { - log.info("*** OrderDto, resource; save order *"); - return ResponseEntity.ok(this.orderService.save(orderDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderDto orderDto) { - log.info("*** OrderDto, resource; update order *"); - return ResponseEntity.ok(this.orderService.update(orderDto)); - } - - @PutMapping("/{orderId}") - public ResponseEntity update( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank") - @Valid final String orderId, - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderDto orderDto) { - log.info("*** OrderDto, resource; update order with orderId *"); - return ResponseEntity.ok(this.orderService.update(Integer.parseInt(orderId), orderDto)); - } - - @DeleteMapping("/{orderId}") - public ResponseEntity deleteById(@PathVariable("orderId") final String orderId) { - log.info("*** Boolean, resource; delete order by id *"); - this.orderService.deleteById(Integer.parseInt(orderId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/service/CartService.java b/order-service/src/main/java/com/selimhorri/app/service/CartService.java deleted file mode 100644 index 759c4a3bb..000000000 --- a/order-service/src/main/java/com/selimhorri/app/service/CartService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.CartDto; - -public interface CartService { - - List findAll(); - CartDto findById(final Integer cartId); - CartDto save(final CartDto cartDto); - CartDto update(final CartDto cartDto); - CartDto update(final Integer cartId, final CartDto cartDto); - void deleteById(final Integer cartId); - -} diff --git a/order-service/src/main/java/com/selimhorri/app/service/OrderService.java b/order-service/src/main/java/com/selimhorri/app/service/OrderService.java deleted file mode 100644 index 28f44b2ef..000000000 --- a/order-service/src/main/java/com/selimhorri/app/service/OrderService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.OrderDto; - -public interface OrderService { - - List findAll(); - OrderDto findById(final Integer orderId); - OrderDto save(final OrderDto orderDto); - OrderDto update(final OrderDto orderDto); - OrderDto update(final Integer orderId, final OrderDto orderDto); - void deleteById(final Integer orderId); - -} diff --git a/order-service/src/main/java/com/selimhorri/app/service/impl/CartServiceImpl.java b/order-service/src/main/java/com/selimhorri/app/service/impl/CartServiceImpl.java deleted file mode 100644 index 21ef1b6bd..000000000 --- a/order-service/src/main/java/com/selimhorri/app/service/impl/CartServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.dto.CartDto; -import com.selimhorri.app.dto.UserDto; -import com.selimhorri.app.exception.wrapper.CartNotFoundException; -import com.selimhorri.app.helper.CartMappingHelper; -import com.selimhorri.app.repository.CartRepository; -import com.selimhorri.app.service.CartService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class CartServiceImpl implements CartService { - - private final CartRepository cartRepository; - private final RestTemplate restTemplate; - - @Override - public List findAll() { - log.info("*** CartDto List, service; fetch all carts *"); - return this.cartRepository.findAll() - .stream() - .map(CartMappingHelper::map) - .map(c -> { - c.setUserDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .USER_SERVICE_API_URL + "/" + c.getUserDto().getUserId(), UserDto.class)); - return c; - }) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public CartDto findById(final Integer cartId) { - log.info("*** CartDto, service; fetch cart by id *"); - return this.cartRepository.findById(cartId) - .map(CartMappingHelper::map) - .map(c -> { - c.setUserDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .USER_SERVICE_API_URL + "/" + c.getUserDto().getUserId(), UserDto.class)); - return c; - }) - .orElseThrow(() -> new CartNotFoundException(String - .format("Cart with id: %d not found", cartId))); - } - - @Override - public CartDto save(final CartDto cartDto) { - log.info("*** CartDto, service; save cart *"); - return CartMappingHelper.map(this.cartRepository - .save(CartMappingHelper.map(cartDto))); - } - - @Override - public CartDto update(final CartDto cartDto) { - log.info("*** CartDto, service; update cart *"); - return CartMappingHelper.map(this.cartRepository - .save(CartMappingHelper.map(cartDto))); - } - - @Override - public CartDto update(final Integer cartId, final CartDto cartDto) { - log.info("*** CartDto, service; update cart with cartId *"); - return CartMappingHelper.map(this.cartRepository - .save(CartMappingHelper.map(this.findById(cartId)))); - } - - @Override - public void deleteById(final Integer cartId) { - log.info("*** Void, service; delete cart by id *"); - this.cartRepository.deleteById(cartId); - } - - - -} - - - - - - - - - - diff --git a/order-service/src/main/java/com/selimhorri/app/service/impl/OrderServiceImpl.java b/order-service/src/main/java/com/selimhorri/app/service/impl/OrderServiceImpl.java deleted file mode 100644 index 69794628f..000000000 --- a/order-service/src/main/java/com/selimhorri/app/service/impl/OrderServiceImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.exception.wrapper.OrderNotFoundException; -import com.selimhorri.app.helper.OrderMappingHelper; -import com.selimhorri.app.repository.OrderRepository; -import com.selimhorri.app.service.OrderService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class OrderServiceImpl implements OrderService { - - private final OrderRepository orderRepository; - - @Override - public List findAll() { - log.info("*** OrderDto List, service; fetch all orders *"); - return this.orderRepository.findAll() - .stream() - .map(OrderMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public OrderDto findById(final Integer orderId) { - log.info("*** OrderDto, service; fetch order by id *"); - return this.orderRepository.findById(orderId) - .map(OrderMappingHelper::map) - .orElseThrow(() -> new OrderNotFoundException(String - .format("Order with id: %d not found", orderId))); - } - - @Override - public OrderDto save(final OrderDto orderDto) { - log.info("*** OrderDto, service; save order *"); - return OrderMappingHelper.map(this.orderRepository - .save(OrderMappingHelper.map(orderDto))); - } - - @Override - public OrderDto update(final OrderDto orderDto) { - log.info("*** OrderDto, service; update order *"); - return OrderMappingHelper.map(this.orderRepository - .save(OrderMappingHelper.map(orderDto))); - } - - @Override - public OrderDto update(final Integer orderId, final OrderDto orderDto) { - log.info("*** OrderDto, service; update order with orderId *"); - return OrderMappingHelper.map(this.orderRepository - .save(OrderMappingHelper.map(this.findById(orderId)))); - } - - @Override - public void deleteById(final Integer orderId) { - log.info("*** Void, service; delete order by id *"); - this.orderRepository.delete(OrderMappingHelper.map(this.findById(orderId))); - } - - - -} - - - - - - - - - - diff --git a/order-service/src/main/resources/application-dev.yml b/order-service/src/main/resources/application-dev.yml deleted file mode 100644 index 3f7ebab04..000000000 --- a/order-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,47 +0,0 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/order-service/src/main/resources/application-prod.yml b/order-service/src/main/resources/application-prod.yml deleted file mode 100644 index c14fc2b8b..000000000 --- a/order-service/src/main/resources/application-prod.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - diff --git a/order-service/src/main/resources/application-stage.yml b/order-service/src/main/resources/application-stage.yml deleted file mode 100644 index e07e9b670..000000000 --- a/order-service/src/main/resources/application-stage.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml deleted file mode 100644 index b262008eb..000000000 --- a/order-service/src/main/resources/application.yml +++ /dev/null @@ -1,51 +0,0 @@ - -server: - servlet: - context-path: /order-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: ORDER-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - orderService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - -eureka: - instance: - prefer-ip-address: true - metadata-map: - "management.port": 8300 - - - - - - - - diff --git a/order-service/src/main/resources/db/migration/V1__create_carts_table.sql b/order-service/src/main/resources/db/migration/V1__create_carts_table.sql deleted file mode 100644 index bd7cad572..000000000 --- a/order-service/src/main/resources/db/migration/V1__create_carts_table.sql +++ /dev/null @@ -1,8 +0,0 @@ - -CREATE TABLE carts ( - cart_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - user_id INT(11), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - diff --git a/order-service/src/main/resources/db/migration/V2__insert_carts_table.sql b/order-service/src/main/resources/db/migration/V2__insert_carts_table.sql deleted file mode 100644 index f28ac5246..000000000 --- a/order-service/src/main/resources/db/migration/V2__insert_carts_table.sql +++ /dev/null @@ -1,8 +0,0 @@ - -INSERT INTO carts -(user_id) VALUES -(1), -(2), -(3), -(4); - diff --git a/order-service/src/main/resources/db/migration/V3__create_orders_table.sql b/order-service/src/main/resources/db/migration/V3__create_orders_table.sql deleted file mode 100644 index e52d683ce..000000000 --- a/order-service/src/main/resources/db/migration/V3__create_orders_table.sql +++ /dev/null @@ -1,11 +0,0 @@ - -CREATE TABLE orders ( - order_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - cart_id INT(11), - order_date TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - order_desc VARCHAR(255), - order_fee DECIMAL(7, 2), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - diff --git a/order-service/src/main/resources/db/migration/V4__insert_orders_table.sql b/order-service/src/main/resources/db/migration/V4__insert_orders_table.sql deleted file mode 100644 index 3c788f050..000000000 --- a/order-service/src/main/resources/db/migration/V4__insert_orders_table.sql +++ /dev/null @@ -1,8 +0,0 @@ - -INSERT INTO orders -(cart_id, order_desc, order_fee) VALUES -(1, 'init', 5000), -(2, 'init', 5000), -(3, 'init', 5000), -(4, 'init', 5000); - diff --git a/order-service/src/main/resources/db/migration/V5__create_orders_cart_id_fk.sql b/order-service/src/main/resources/db/migration/V5__create_orders_cart_id_fk.sql deleted file mode 100644 index d65de6eee..000000000 --- a/order-service/src/main/resources/db/migration/V5__create_orders_cart_id_fk.sql +++ /dev/null @@ -1,3 +0,0 @@ - -ALTER TABLE orders - ADD CONSTRAINT fk5_assign FOREIGN KEY (cart_id) REFERENCES carts (cart_id); diff --git a/order-service/src/test/java/com/selimhorri/app/OrderServiceApplicationTests.java b/order-service/src/test/java/com/selimhorri/app/OrderServiceApplicationTests.java deleted file mode 100644 index 5d3771b1f..000000000 --- a/order-service/src/test/java/com/selimhorri/app/OrderServiceApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class OrderServiceApplicationTests { - - - -} - - - - - - diff --git a/order-service/system.properties b/order-service/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/order-service/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/payment-service/.gitignore b/payment-service/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/payment-service/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/payment-service/.mvn/wrapper/MavenWrapperDownloader.java b/payment-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/payment-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/payment-service/.mvn/wrapper/maven-wrapper.jar b/payment-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 zcmbTd1CVCTmM+|7+wQV$+qP}n>auOywyU~q+qUhh+uxis_~*a##hm*_WW?9E7Pb7N%LRFiwbEGCJ0XP=%-6oeT$XZcYgtzC2~q zk(K08IQL8oTl}>>+hE5YRgXTB@fZ4TH9>7=79e`%%tw*SQUa9~$xKD5rS!;ZG@ocK zQdcH}JX?W|0_Afv?y`-NgLum62B&WSD$-w;O6G0Sm;SMX65z)l%m1e-g8Q$QTI;(Q z+x$xth4KFvH@Bs6(zn!iF#nenk^Y^ce;XIItAoCsow38eq?Y-Auh!1in#Rt-_D>H^ z=EjbclGGGa6VnaMGmMLj`x3NcwA43Jb(0gzl;RUIRAUDcR1~99l2SAPkVhoRMMtN} zXvC<tOmX83grD8GSo_Lo?%lNfhD#EBgPo z*nf@ppMC#B!T)Ae0RG$mlJWmGl7CkuU~B8-==5i;rS;8i6rJ=PoQxf446XDX9g|c> zU64ePyMlsI^V5Jq5A+BPe#e73+kpc_r1tv#B)~EZ;7^67F0*QiYfrk0uVW;Qb=NsG zN>gsuCwvb?s-KQIppEaeXtEMdc9dy6Dfduz-tMTms+i01{eD9JE&h?Kht*$eOl#&L zJdM_-vXs(V#$Ed;5wyNWJdPNh+Z$+;$|%qR(t`4W@kDhd*{(7-33BOS6L$UPDeE_53j${QfKN-0v-HG z(QfyvFNbwPK%^!eIo4ac1;b>c0vyf9}Xby@YY!lkz-UvNp zwj#Gg|4B~?n?G^{;(W;|{SNoJbHTMpQJ*Wq5b{l9c8(%?Kd^1?H1om1de0Da9M;Q=n zUfn{f87iVb^>Exl*nZ0hs(Yt>&V9$Pg`zX`AI%`+0SWQ4Zc(8lUDcTluS z5a_KerZWe}a-MF9#Cd^fi!y3%@RFmg&~YnYZ6<=L`UJ0v={zr)>$A;x#MCHZy1st7 ztT+N07NR+vOwSV2pvWuN1%lO!K#Pj0Fr>Q~R40{bwdL%u9i`DSM4RdtEH#cW)6}+I-eE< z&tZs+(Ogu(H_;$a$!7w`MH0r%h&@KM+<>gJL@O~2K2?VrSYUBbhCn#yy?P)uF3qWU z0o09mIik+kvzV6w>vEZy@&Mr)SgxPzUiDA&%07m17udz9usD82afQEps3$pe!7fUf z0eiidkJ)m3qhOjVHC_M(RYCBO%CZKZXFb8}s0-+}@CIn&EF(rRWUX2g^yZCvl0bI} zbP;1S)iXnRC&}5-Tl(hASKqdSnO?ASGJ*MIhOXIblmEudj(M|W!+I3eDc}7t`^mtg z)PKlaXe(OH+q-)qcQ8a@!llRrpGI8DsjhoKvw9T;TEH&?s=LH0w$EzI>%u;oD@x83 zJL7+ncjI9nn!TlS_KYu5vn%f*@qa5F;| zEFxY&B?g=IVlaF3XNm_03PA)=3|{n-UCgJoTr;|;1AU9|kPE_if8!Zvb}0q$5okF$ zHaJdmO&gg!9oN|M{!qGE=tb|3pVQ8PbL$}e;NgXz<6ZEggI}wO@aBP**2Wo=yN#ZC z4G$m^yaM9g=|&!^ft8jOLuzc3Psca*;7`;gnHm}tS0%f4{|VGEwu45KptfNmwxlE~ z^=r30gi@?cOm8kAz!EylA4G~7kbEiRlRIzwrb~{_2(x^$-?|#e6Bi_**(vyr_~9Of z!n>Gqf+Qwiu!xhi9f53=PM3`3tNF}pCOiPU|H4;pzjcsqbwg*{{kyrTxk<;mx~(;; z1NMrpaQ`57yn34>Jo3b|HROE(UNcQash!0p2-!Cz;{IRv#Vp5!3o$P8!%SgV~k&Hnqhp`5eLjTcy93cK!3Hm-$`@yGnaE=?;*2uSpiZTs_dDd51U%i z{|Zd9ou-;laGS_x=O}a+ zB||za<795A?_~Q=r=coQ+ZK@@ zId~hWQL<%)fI_WDIX#=(WNl!Dm$a&ROfLTd&B$vatq!M-2Jcs;N2vps$b6P1(N}=oI3<3luMTmC|0*{ zm1w8bt7vgX($!0@V0A}XIK)w!AzUn7vH=pZEp0RU0p?}ch2XC-7r#LK&vyc2=-#Q2 z^L%8)JbbcZ%g0Du;|8=q8B>X=mIQirpE=&Ox{TiuNDnOPd-FLI^KfEF729!!0x#Es z@>3ursjFSpu%C-8WL^Zw!7a0O-#cnf`HjI+AjVCFitK}GXO`ME&on|^=~Zc}^LBp9 zj=-vlN;Uc;IDjtK38l7}5xxQF&sRtfn4^TNtnzXv4M{r&ek*(eNbIu!u$>Ed%` z5x7+&)2P&4>0J`N&ZP8$vcR+@FS0126s6+Jx_{{`3ZrIMwaJo6jdrRwE$>IU_JTZ} z(||hyyQ)4Z1@wSlT94(-QKqkAatMmkT7pCycEB1U8KQbFX&?%|4$yyxCtm3=W`$4fiG0WU3yI@c zx{wfmkZAYE_5M%4{J-ygbpH|(|GD$2f$3o_Vti#&zfSGZMQ5_f3xt6~+{RX=$H8at z?GFG1Tmp}}lmm-R->ve*Iv+XJ@58p|1_jRvfEgz$XozU8#iJS})UM6VNI!3RUU!{5 zXB(+Eqd-E;cHQ>)`h0(HO_zLmzR3Tu-UGp;08YntWwMY-9i^w_u#wR?JxR2bky5j9 z3Sl-dQQU$xrO0xa&>vsiK`QN<$Yd%YXXM7*WOhnRdSFt5$aJux8QceC?lA0_if|s> ze{ad*opH_kb%M&~(~&UcX0nFGq^MqjxW?HJIP462v9XG>j(5Gat_)#SiNfahq2Mz2 zU`4uV8m$S~o9(W>mu*=h%Gs(Wz+%>h;R9Sg)jZ$q8vT1HxX3iQnh6&2rJ1u|j>^Qf`A76K%_ubL`Zu?h4`b=IyL>1!=*%!_K)=XC z6d}4R5L+sI50Q4P3upXQ3Z!~1ZXLlh!^UNcK6#QpYt-YC=^H=EPg3)z*wXo*024Q4b2sBCG4I# zlTFFY=kQ>xvR+LsuDUAk)q%5pEcqr(O_|^spjhtpb1#aC& zghXzGkGDC_XDa%t(X`E+kvKQ4zrQ*uuQoj>7@@ykWvF332)RO?%AA&Fsn&MNzmFa$ zWk&&^=NNjxLjrli_8ESU)}U|N{%j&TQmvY~lk!~Jh}*=^INA~&QB9em!in_X%Rl1&Kd~Z(u z9mra#<@vZQlOY+JYUwCrgoea4C8^(xv4ceCXcejq84TQ#sF~IU2V}LKc~Xlr_P=ry zl&Hh0exdCbVd^NPCqNNlxM3vA13EI8XvZ1H9#bT7y*U8Y{H8nwGpOR!e!!}*g;mJ#}T{ekSb}5zIPmye*If(}}_=PcuAW#yidAa^9-`<8Gr0 z)Fz=NiZ{)HAvw{Pl5uu)?)&i&Us$Cx4gE}cIJ}B4Xz~-q7)R_%owbP!z_V2=Aq%Rj z{V;7#kV1dNT9-6R+H}}(ED*_!F=~uz>&nR3gb^Ce%+0s#u|vWl<~JD3MvS0T9thdF zioIG3c#Sdsv;LdtRv3ml7%o$6LTVL>(H`^@TNg`2KPIk*8-IB}X!MT0`hN9Ddf7yN z?J=GxPL!uJ7lqwowsl?iRrh@#5C$%E&h~Z>XQcvFC*5%0RN-Opq|=IwX(dq(*sjs+ zqy99+v~m|6T#zR*e1AVxZ8djd5>eIeCi(b8sUk)OGjAsKSOg^-ugwl2WSL@d#?mdl zib0v*{u-?cq}dDGyZ%$XRY=UkQwt2oGu`zQneZh$=^! zj;!pCBWQNtvAcwcWIBM2y9!*W|8LmQy$H~5BEx)78J`4Z0(FJO2P^!YyQU{*Al+fs z){!4JvT1iLrJ8aU3k0t|P}{RN)_^v%$$r;+p0DY7N8CXzmS*HB*=?qaaF9D@#_$SN zSz{moAK<*RH->%r7xX~9gVW$l7?b|_SYI)gcjf0VAUJ%FcQP(TpBs; zg$25D!Ry_`8xpS_OJdeo$qh#7U+cepZ??TII7_%AXsT$B z=e)Bx#v%J0j``00Zk5hsvv6%T^*xGNx%KN-=pocSoqE5_R)OK%-Pbu^1MNzfds)mL zxz^F4lDKV9D&lEY;I+A)ui{TznB*CE$=9(wgE{m}`^<--OzV-5V4X2w9j(_!+jpTr zJvD*y6;39&T+==$F&tsRKM_lqa1HC}aGL0o`%c9mO=fts?36@8MGm7Vi{Y z^<7m$(EtdSr#22<(rm_(l_(`j!*Pu~Y>>xc>I9M#DJYDJNHO&4=HM%YLIp?;iR&$m z#_$ZWYLfGLt5FJZhr3jpYb`*%9S!zCG6ivNHYzNHcI%khtgHBliM^Ou}ZVD7ehU9 zS+W@AV=?Ro!=%AJ>Kcy9aU3%VX3|XM_K0A+ZaknKDyIS3S-Hw1C7&BSW5)sqj5Ye_ z4OSW7Yu-;bCyYKHFUk}<*<(@TH?YZPHr~~Iy%9@GR2Yd}J2!N9K&CN7Eq{Ka!jdu; zQNB*Y;i(7)OxZK%IHGt#Rt?z`I|A{q_BmoF!f^G}XVeTbe1Wnzh%1g>j}>DqFf;Rp zz7>xIs12@Ke0gr+4-!pmFP84vCIaTjqFNg{V`5}Rdt~xE^I;Bxp4)|cs8=f)1YwHz zqI`G~s2~qqDV+h02b`PQpUE#^^Aq8l%y2|ByQeXSADg5*qMprEAE3WFg0Q39`O+i1 z!J@iV!`Y~C$wJ!5Z+j5$i<1`+@)tBG$JL=!*uk=2k;T<@{|s1$YL079FvK%mPhyHV zP8^KGZnp`(hVMZ;s=n~3r2y;LTwcJwoBW-(ndU-$03{RD zh+Qn$ja_Z^OuMf3Ub|JTY74s&Am*(n{J3~@#OJNYuEVVJd9*H%)oFoRBkySGm`hx! zT3tG|+aAkXcx-2Apy)h^BkOyFTWQVeZ%e2@;*0DtlG9I3Et=PKaPt&K zw?WI7S;P)TWED7aSH$3hL@Qde?H#tzo^<(o_sv_2ci<7M?F$|oCFWc?7@KBj-;N$P zB;q!8@bW-WJY9do&y|6~mEruZAVe$!?{)N9rZZxD-|oltkhW9~nR8bLBGXw<632!l z*TYQn^NnUy%Ds}$f^=yQ+BM-a5X4^GHF=%PDrRfm_uqC zh{sKwIu|O0&jWb27;wzg4w5uA@TO_j(1X?8E>5Zfma|Ly7Bklq|s z9)H`zoAGY3n-+&JPrT!>u^qg9Evx4y@GI4$n-Uk_5wttU1_t?6><>}cZ-U+&+~JE) zPlDbO_j;MoxdLzMd~Ew|1o^a5q_1R*JZ=#XXMzg?6Zy!^hop}qoLQlJ{(%!KYt`MK z8umEN@Z4w!2=q_oe=;QttPCQy3Nm4F@x>@v4sz_jo{4m*0r%J(w1cSo;D_hQtJs7W z><$QrmG^+<$4{d2bgGo&3-FV}avg9zI|Rr(k{wTyl3!M1q+a zD9W{pCd%il*j&Ft z5H$nENf>>k$;SONGW`qo6`&qKs*T z2^RS)pXk9b@(_Fw1bkb)-oqK|v}r$L!W&aXA>IpcdNZ_vWE#XO8X`#Yp1+?RshVcd zknG%rPd*4ECEI0wD#@d+3NbHKxl}n^Sgkx==Iu%}HvNliOqVBqG?P2va zQ;kRJ$J6j;+wP9cS za#m;#GUT!qAV%+rdWolk+)6kkz4@Yh5LXP+LSvo9_T+MmiaP-eq6_k;)i6_@WSJ zlT@wK$zqHu<83U2V*yJ|XJU4farT#pAA&@qu)(PO^8PxEmPD4;Txpio+2)#!9 z>&=i7*#tc0`?!==vk>s7V+PL#S1;PwSY?NIXN2=Gu89x(cToFm))7L;< z+bhAbVD*bD=}iU`+PU+SBobTQ%S!=VL!>q$rfWsaaV}Smz>lO9JXT#`CcH_mRCSf4%YQAw`$^yY z3Y*^Nzk_g$xn7a_NO(2Eb*I=^;4f!Ra#Oo~LLjlcjke*k*o$~U#0ZXOQ5@HQ&T46l z7504MUgZkz2gNP1QFN8Y?nSEnEai^Rgyvl}xZfMUV6QrJcXp;jKGqB=D*tj{8(_pV zqyB*DK$2lgYGejmJUW)*s_Cv65sFf&pb(Yz8oWgDtQ0~k^0-wdF|tj}MOXaN@ydF8 zNr={U?=;&Z?wr^VC+`)S2xl}QFagy;$mG=TUs7Vi2wws5zEke4hTa2)>O0U?$WYsZ z<8bN2bB_N4AWd%+kncgknZ&}bM~eDtj#C5uRkp21hWW5gxWvc6b*4+dn<{c?w9Rmf zIVZKsPl{W2vQAlYO3yh}-{Os=YBnL8?uN5(RqfQ=-1cOiUnJu>KcLA*tQK3FU`_bM zM^T28w;nAj5EdAXFi&Kk1Nnl2)D!M{@+D-}bIEe+Lc4{s;YJc-{F#``iS2uk;2!Zp zF9#myUmO!wCeJIoi^A+T^e~20c+c2C}XltaR!|U-HfDA=^xF97ev}$l6#oY z&-&T{egB)&aV$3_aVA51XGiU07$s9vubh_kQG?F$FycvS6|IO!6q zq^>9|3U^*!X_C~SxX&pqUkUjz%!j=VlXDo$!2VLH!rKj@61mDpSr~7B2yy{>X~_nc zRI+7g2V&k zd**H++P9dg!-AOs3;GM`(g<+GRV$+&DdMVpUxY9I1@uK28$az=6oaa+PutlO9?6#? zf-OsgT>^@8KK>ggkUQRPPgC7zjKFR5spqQb3ojCHzj^(UH~v+!y*`Smv)VpVoPwa6 zWG18WJaPKMi*F6Zdk*kU^`i~NNTfn3BkJniC`yN98L-Awd)Z&mY? zprBW$!qL-OL7h@O#kvYnLsfff@kDIegt~?{-*5A7JrA;#TmTe?jICJqhub-G@e??D zqiV#g{)M!kW1-4SDel7TO{;@*h2=_76g3NUD@|c*WO#>MfYq6_YVUP+&8e4|%4T`w zXzhmVNziAHazWO2qXcaOu@R1MrPP{t)`N)}-1&~mq=ZH=w=;-E$IOk=y$dOls{6sRR`I5>|X zpq~XYW4sd;J^6OwOf**J>a7u$S>WTFPRkjY;BfVgQst)u4aMLR1|6%)CB^18XCz+r ztkYQ}G43j~Q&1em(_EkMv0|WEiKu;z2zhb(L%$F&xWwzOmk;VLBYAZ8lOCziNoPw1 zv2BOyXA`A8z^WH!nXhKXM`t0;6D*-uGds3TYGrm8SPnJJOQ^fJU#}@aIy@MYWz**H zvkp?7I5PE{$$|~{-ZaFxr6ZolP^nL##mHOErB^AqJqn^hFA=)HWj!m3WDaHW$C)i^ z9@6G$SzB=>jbe>4kqr#sF7#K}W*Cg-5y6kun3u&0L7BpXF9=#7IN8FOjWrWwUBZiU zT_se3ih-GBKx+Uw0N|CwP3D@-C=5(9T#BH@M`F2!Goiqx+Js5xC92|Sy0%WWWp={$(am!#l~f^W_oz78HX<0X#7 zp)p1u~M*o9W@O8P{0Qkg@Wa# z2{Heb&oX^CQSZWSFBXKOfE|tsAm#^U-WkDnU;IowZ`Ok4!mwHwH=s|AqZ^YD4!5!@ zPxJj+Bd-q6w_YG`z_+r;S86zwXb+EO&qogOq8h-Ect5(M2+>(O7n7)^dP*ws_3U6v zVsh)sk^@*c>)3EML|0<-YROho{lz@Nd4;R9gL{9|64xVL`n!m$-Jjrx?-Bacp!=^5 z1^T^eB{_)Y<9)y{-4Rz@9_>;_7h;5D+@QcbF4Wv7hu)s0&==&6u)33 zHRj+&Woq-vDvjwJCYES@$C4{$?f$Ibi4G()UeN11rgjF+^;YE^5nYprYoJNoudNj= zm1pXSeG64dcWHObUetodRn1Fw|1nI$D9z}dVEYT0lQnsf_E1x2vBLql7NrHH!n&Sq z6lc*mvU=WS6=v9Lrl}&zRiu_6u;6g%_DU{9b+R z#YHqX7`m9eydf?KlKu6Sb%j$%_jmydig`B*TN`cZL-g!R)iE?+Q5oOqBFKhx z%MW>BC^(F_JuG(ayE(MT{S3eI{cKiwOtPwLc0XO*{*|(JOx;uQOfq@lp_^cZo=FZj z4#}@e@dJ>Bn%2`2_WPeSN7si^{U#H=7N4o%Dq3NdGybrZgEU$oSm$hC)uNDC_M9xc zGzwh5Sg?mpBIE8lT2XsqTt3j3?We8}3bzLBTQd639vyg^$0#1epq8snlDJP2(BF)K zSx30RM+{f+b$g{9usIL8H!hCO117Xgv}ttPJm9wVRjPk;ePH@zxv%j9k5`TzdXLeT zFgFX`V7cYIcBls5WN0Pf6SMBN+;CrQ(|EsFd*xtwr#$R{Z9FP`OWtyNsq#mCgZ7+P z^Yn$haBJ)r96{ZJd8vlMl?IBxrgh=fdq_NF!1{jARCVz>jNdC)H^wfy?R94#MPdUjcYX>#wEx+LB#P-#4S-%YH>t-j+w zOFTI8gX$ard6fAh&g=u&56%3^-6E2tpk*wx3HSCQ+t7+*iOs zPk5ysqE}i*cQocFvA68xHfL|iX(C4h*67@3|5Qwle(8wT&!&{8*{f%0(5gH+m>$tq zp;AqrP7?XTEooYG1Dzfxc>W%*CyL16q|fQ0_jp%%Bk^k!i#Nbi(N9&T>#M{gez_Ws zYK=l}adalV(nH}I_!hNeb;tQFk3BHX7N}}R8%pek^E`X}%ou=cx8InPU1EE0|Hen- zyw8MoJqB5=)Z%JXlrdTXAE)eqLAdVE-=>wGHrkRet}>3Yu^lt$Kzu%$3#(ioY}@Gu zjk3BZuQH&~7H+C*uX^4}F*|P89JX;Hg2U!pt>rDi(n(Qe-c}tzb0#6_ItoR0->LSt zR~UT<-|@TO%O`M+_e_J4wx7^)5_%%u+J=yF_S#2Xd?C;Ss3N7KY^#-vx+|;bJX&8r zD?|MetfhdC;^2WG`7MCgs>TKKN=^=!x&Q~BzmQio_^l~LboTNT=I zC5pme^P@ER``p$2md9>4!K#vV-Fc1an7pl>_|&>aqP}+zqR?+~Z;f2^`a+-!Te%V? z;H2SbF>jP^GE(R1@%C==XQ@J=G9lKX+Z<@5}PO(EYkJh=GCv#)Nj{DkWJM2}F&oAZ6xu8&g7pn1ps2U5srwQ7CAK zN&*~@t{`31lUf`O;2w^)M3B@o)_mbRu{-`PrfNpF!R^q>yTR&ETS7^-b2*{-tZAZz zw@q5x9B5V8Qd7dZ!Ai$9hk%Q!wqbE1F1c96&zwBBaRW}(^axoPpN^4Aw}&a5dMe+*Gomky_l^54*rzXro$ z>LL)U5Ry>~FJi=*{JDc)_**c)-&faPz`6v`YU3HQa}pLtb5K)u%K+BOqXP0)rj5Au$zB zW1?vr?mDv7Fsxtsr+S6ucp2l#(4dnr9sD*v+@*>g#M4b|U?~s93>Pg{{a5|rm2xfI z`>E}?9S@|IoUX{Q1zjm5YJT|3S>&09D}|2~BiMo=z4YEjXlWh)V&qs;*C{`UMxp$9 zX)QB?G$fPD6z5_pNs>Jeh{^&U^)Wbr?2D6-q?)`*1k@!UvwQgl8eG$r+)NnFoT)L6 zg7lEh+E6J17krfYJCSjWzm67hEth24pomhz71|Qodn#oAILN)*Vwu2qpJirG)4Wnv}9GWOFrQg%Je+gNrPl8mw7ykE8{ z=|B4+uwC&bpp%eFcRU6{mxRV32VeH8XxX>v$du<$(DfinaaWxP<+Y97Z#n#U~V zVEu-GoPD=9$}P;xv+S~Ob#mmi$JQmE;Iz4(){y*9pFyW-jjgdk#oG$fl4o9E8bo|L zWjo4l%n51@Kz-n%zeSCD`uB?T%FVk+KBI}=ve zvlcS#wt`U6wrJo}6I6Rwb=1GzZfwE=I&Ne@p7*pH84XShXYJRgvK)UjQL%R9Zbm(m zxzTQsLTON$WO7vM)*vl%Pc0JH7WhP;$z@j=y#avW4X8iqy6mEYr@-}PW?H)xfP6fQ z&tI$F{NNct4rRMSHhaelo<5kTYq+(?pY)Ieh8*sa83EQfMrFupMM@nfEV@EmdHUv9 z35uzIrIuo4#WnF^_jcpC@uNNaYTQ~uZWOE6P@LFT^1@$o&q+9Qr8YR+ObBkpP9=F+$s5+B!mX2~T zAuQ6RenX?O{IlLMl1%)OK{S7oL}X%;!XUxU~xJN8xk z`xywS*naF(J#?vOpB(K=o~lE;m$zhgPWDB@=p#dQIW>xe_p1OLoWInJRKbEuoncf; zmS1!u-ycc1qWnDg5Nk2D)BY%jmOwCLC+Ny>`f&UxFowIsHnOXfR^S;&F(KXd{ODlm z$6#1ccqt-HIH9)|@fHnrKudu!6B$_R{fbCIkSIb#aUN|3RM>zuO>dpMbROZ`^hvS@ z$FU-;e4W}!ubzKrU@R*dW*($tFZ>}dd*4_mv)#O>X{U@zSzQt*83l9mI zI$8O<5AIDx`wo0}f2fsPC_l>ONx_`E7kdXu{YIZbp1$(^oBAH({T~&oQ&1{X951QW zmhHUxd)t%GQ9#ak5fTjk-cahWC;>^Rg7(`TVlvy0W@Y!Jc%QL3Ozu# zDPIqBCy&T2PWBj+d-JA-pxZlM=9ja2ce|3B(^VCF+a*MMp`(rH>Rt6W1$;r{n1(VK zLs>UtkT43LR2G$AOYHVailiqk7naz2yZGLo*xQs!T9VN5Q>eE(w zw$4&)&6xIV$IO^>1N-jrEUg>O8G4^@y+-hQv6@OmF@gy^nL_n1P1-Rtyy$Bl;|VcV zF=p*&41-qI5gG9UhKmmnjs932!6hceXa#-qfK;3d*a{)BrwNFeKU|ge?N!;zk+kB! zMD_uHJR#%b54c2tr~uGPLTRLg$`fupo}cRJeTwK;~}A>(Acy4k-Xk&Aa1&eWYS1ULWUj@fhBiWY$pdfy+F z@G{OG{*v*mYtH3OdUjwEr6%_ZPZ3P{@rfbNPQG!BZ7lRyC^xlMpWH`@YRar`tr}d> z#wz87t?#2FsH-jM6m{U=gp6WPrZ%*w0bFm(T#7m#v^;f%Z!kCeB5oiF`W33W5Srdt zdU?YeOdPG@98H7NpI{(uN{FJdu14r(URPH^F6tOpXuhU7T9a{3G3_#Ldfx_nT(Hec zo<1dyhsVsTw;ZkVcJ_0-h-T3G1W@q)_Q30LNv)W?FbMH+XJ* zy=$@39Op|kZv`Rt>X`zg&at(?PO^I=X8d9&myFEx#S`dYTg1W+iE?vt#b47QwoHI9 zNP+|3WjtXo{u}VG(lLUaW0&@yD|O?4TS4dfJI`HC-^q;M(b3r2;7|FONXphw-%7~* z&;2!X17|05+kZOpQ3~3!Nb>O94b&ZSs%p)TK)n3m=4eiblVtSx@KNFgBY_xV6ts;NF;GcGxMP8OKV^h6LmSb2E#Qnw ze!6Mnz7>lE9u{AgQ~8u2zM8CYD5US8dMDX-5iMlgpE9m*s+Lh~A#P1er*rF}GHV3h z=`STo?kIXw8I<`W0^*@mB1$}pj60R{aJ7>C2m=oghKyxMbFNq#EVLgP0cH3q7H z%0?L93-z6|+jiN|@v>ix?tRBU(v-4RV`}cQH*fp|)vd3)8i9hJ3hkuh^8dz{F5-~_ zUUr1T3cP%cCaTooM8dj|4*M=e6flH0&8ve32Q)0dyisl))XkZ7Wg~N}6y`+Qi2l+e zUd#F!nJp{#KIjbQdI`%oZ`?h=5G^kZ_uN`<(`3;a!~EMsWV|j-o>c?x#;zR2ktiB! z);5rrHl?GPtr6-o!tYd|uK;Vbsp4P{v_4??=^a>>U4_aUXPWQ$FPLE4PK$T^3Gkf$ zHo&9$U&G`d(Os6xt1r?sg14n)G8HNyWa^q8#nf0lbr4A-Fi;q6t-`pAx1T*$eKM*$ z|CX|gDrk#&1}>5H+`EjV$9Bm)Njw&7-ZR{1!CJTaXuP!$Pcg69`{w5BRHysB$(tWUes@@6aM69kb|Lx$%BRY^-o6bjH#0!7b;5~{6J+jKxU!Kmi# zndh@+?}WKSRY2gZ?Q`{(Uj|kb1%VWmRryOH0T)f3cKtG4oIF=F7RaRnH0Rc_&372={_3lRNsr95%ZO{IX{p@YJ^EI%+gvvKes5cY+PE@unghjdY5#9A!G z70u6}?zmd?v+{`vCu-53_v5@z)X{oPC@P)iA3jK$`r zSA2a7&!^zmUiZ82R2=1cumBQwOJUPz5Ay`RLfY(EiwKkrx%@YN^^XuET;tE zmr-6~I7j!R!KrHu5CWGSChO6deaLWa*9LLJbcAJsFd%Dy>a!>J`N)Z&oiU4OEP-!Ti^_!p}O?7`}i7Lsf$-gBkuY*`Zb z7=!nTT;5z$_5$=J=Ko+Cp|Q0J=%oFr>hBgnL3!tvFoLNhf#D0O=X^h+x08iB;@8pXdRHxX}6R4k@i6%vmsQwu^5z zk1ip`#^N)^#Lg#HOW3sPI33xqFB4#bOPVnY%d6prwxf;Y-w9{ky4{O6&94Ra8VN@K zb-lY;&`HtxW@sF!doT5T$2&lIvJpbKGMuDAFM#!QPXW87>}=Q4J3JeXlwHys?!1^#37q_k?N@+u&Ns20pEoBeZC*np;i;M{2C0Z4_br2gsh6eL z#8`#sn41+$iD?^GL%5?cbRcaa-Nx0vE(D=*WY%rXy3B%gNz0l?#noGJGP728RMY#q z=2&aJf@DcR?QbMmN)ItUe+VM_U!ryqA@1VVt$^*xYt~-qvW!J4Tp<-3>jT=7Zow5M z8mSKp0v4b%a8bxFr>3MwZHSWD73D@+$5?nZAqGM#>H@`)mIeC#->B)P8T$zh-Pxnc z8)~Zx?TWF4(YfKuF3WN_ckpCe5;x4V4AA3(i$pm|78{%!q?|~*eH0f=?j6i)n~Hso zmTo>vqEtB)`%hP55INf7HM@taH)v`Fw40Ayc*R!T?O{ziUpYmP)AH`euTK!zg9*6Z z!>M=$3pd0!&TzU=hc_@@^Yd3eUQpX4-33}b{?~5t5lgW=ldJ@dUAH%`l5US1y_`40 zs(X`Qk}vvMDYYq+@Rm+~IyCX;iD~pMgq^KY)T*aBz@DYEB={PxA>)mI6tM*sx-DmGQHEaHwRrAmNjO!ZLHO4b;;5mf@zzlPhkP($JeZGE7 z?^XN}Gf_feGoG~BjUgVa*)O`>lX=$BSR2)uD<9 z>o^|nb1^oVDhQbfW>>!;8-7<}nL6L^V*4pB=>wwW+RXAeRvKED(n1;R`A6v$6gy0I(;Vf?!4;&sgn7F%LpM}6PQ?0%2Z@b{It<(G1CZ|>913E0nR2r^Pa*Bp z@tFGi*CQ~@Yc-?{cwu1 zsilf=k^+Qs>&WZG(3WDixisHpR>`+ihiRwkL(3T|=xsoNP*@XX3BU8hr57l3k;pni zI``=3Nl4xh4oDj<%>Q1zYXHr%Xg_xrK3Nq?vKX3|^Hb(Bj+lONTz>4yhU-UdXt2>j z<>S4NB&!iE+ao{0Tx^N*^|EZU;0kJkx@zh}S^P{ieQjGl468CbC`SWnwLRYYiStXm zOxt~Rb3D{dz=nHMcY)#r^kF8|q8KZHVb9FCX2m^X*(|L9FZg!5a7((!J8%MjT$#Fs)M1Pb zq6hBGp%O1A+&%2>l0mpaIzbo&jc^!oN^3zxap3V2dNj3x<=TwZ&0eKX5PIso9j1;e zwUg+C&}FJ`k(M|%%}p=6RPUq4sT3-Y;k-<68ciZ~_j|bt>&9ZLHNVrp#+pk}XvM{8 z`?k}o-!if>hVlCP9j%&WI2V`5SW)BCeR5>MQhF)po=p~AYN%cNa_BbV6EEh_kk^@a zD>4&>uCGCUmyA-c)%DIcF4R6!>?6T~Mj_m{Hpq`*(wj>foHL;;%;?(((YOxGt)Bhx zuS+K{{CUsaC++%}S6~CJ=|vr(iIs-je)e9uJEU8ZJAz)w166q)R^2XI?@E2vUQ!R% zn@dxS!JcOimXkWJBz8Y?2JKQr>`~SmE2F2SL38$SyR1^yqj8_mkBp)o$@+3BQ~Mid z9U$XVqxX3P=XCKj0*W>}L0~Em`(vG<>srF8+*kPrw z20{z(=^w+ybdGe~Oo_i|hYJ@kZl*(9sHw#Chi&OIc?w`nBODp?ia$uF%Hs(X>xm?j zqZQ`Ybf@g#wli`!-al~3GWiE$K+LCe=Ndi!#CVjzUZ z!sD2O*;d28zkl))m)YN7HDi^z5IuNo3^w(zy8 zszJG#mp#Cj)Q@E@r-=NP2FVxxEAeOI2e=|KshybNB6HgE^(r>HD{*}S}mO>LuRGJT{*tfTzw_#+er-0${}%YPe@CMJ1Ng#j#)i)SnY@ss3gL;g zg2D~#Kpdfu#G;q1qz_TwSz1VJT(b3zby$Vk&;Y#1(A)|xj`_?i5YQ;TR%jice5E;0 zYHg;`zS5{S*9xI6o^j>rE8Ua*XhIw{_-*&@(R|C(am8__>+Ws&Q^ymy*X4~hR2b5r zm^p3sw}yv=tdyncy_Ui7{BQS732et~Z_@{-IhHDXAV`(Wlay<#hb>%H%WDi+K$862nA@BDtM#UCKMu+kM`!JHyWSi?&)A7_ z3{cyNG%a~nnH_!+;g&JxEMAmh-Z}rC!o7>OVzW&PoMyTA_g{hqXG)SLraA^OP**<7 zjWbr7z!o2n3hnx7A=2O=WL;`@9N{vQIM@&|G-ljrPvIuJHYtss0Er0fT5cMXNUf1B z7FAwBDixt0X7C3S)mPe5g`YtME23wAnbU)+AtV}z+e8G;0BP=bI;?(#|Ep!vVfDbK zvx+|CKF>yt0hWQ3drchU#XBU+HiuG*V^snFAPUp-5<#R&BUAzoB!aZ+e*KIxa26V}s6?nBK(U-7REa573wg-jqCg>H8~>O{ z*C0JL-?X-k_y%hpUFL?I>0WV{oV`Nb)nZbJG01R~AG>flIJf)3O*oB2i8~;!P?Wo_ z0|QEB*fifiL6E6%>tlAYHm2cjTFE@*<);#>689Z6S#BySQ@VTMhf9vYQyLeDg1*F} zjq>i1*x>5|CGKN{l9br3kB0EHY|k4{%^t7-uhjd#NVipUZa=EUuE5kS1_~qYX?>hJ z$}!jc9$O$>J&wnu0SgfYods^z?J4X;X7c77Me0kS-dO_VUQ39T(Kv(Y#s}Qqz-0AH z^?WRL(4RzpkD+T5FG_0NyPq-a-B7A5LHOCqwObRJi&oRi(<;OuIN7SV5PeHU$<@Zh zPozEV`dYmu0Z&Tqd>t>8JVde9#Pt+l95iHe$4Xwfy1AhI zDM4XJ;bBTTvRFtW>E+GzkN)9k!hA5z;xUOL2 zq4}zn-DP{qc^i|Y%rvi|^5k-*8;JZ~9a;>-+q_EOX+p1Wz;>i7c}M6Nv`^NY&{J-> z`(mzDJDM}QPu5i44**2Qbo(XzZ-ZDu%6vm8w@DUarqXj41VqP~ zs&4Y8F^Waik3y1fQo`bVUH;b=!^QrWb)3Gl=QVKr+6sxc=ygauUG|cm?|X=;Q)kQ8 zM(xrICifa2p``I7>g2R~?a{hmw@{!NS5`VhH8+;cV(F>B94M*S;5#O`YzZH1Z%yD? zZ61w(M`#aS-*~Fj;x|J!KM|^o;MI#Xkh0ULJcA?o4u~f%Z^16ViA27FxU5GM*rKq( z7cS~MrZ=f>_OWx8j#-Q3%!aEU2hVuTu(7`TQk-Bi6*!<}0WQi;_FpO;fhpL4`DcWp zGOw9vx0N~6#}lz(r+dxIGZM3ah-8qrqMmeRh%{z@dbUD2w15*_4P?I~UZr^anP}DB zU9CCrNiy9I3~d#&!$DX9e?A});BjBtQ7oGAyoI$8YQrkLBIH@2;lt4E^)|d6Jwj}z z&2_E}Y;H#6I4<10d_&P0{4|EUacwFHauvrjAnAm6yeR#}f}Rk27CN)vhgRqEyPMMS7zvunj2?`f;%?alsJ+-K+IzjJx>h8 zu~m_y$!J5RWAh|C<6+uiCNsOKu)E72M3xKK(a9Okw3e_*O&}7llNV!=P87VM2DkAk zci!YXS2&=P0}Hx|wwSc9JP%m8dMJA*q&VFB0yMI@5vWoAGraygwn){R+Cj6B1a2Px z5)u(K5{+;z2n*_XD!+Auv#LJEM)(~Hx{$Yb^ldQmcYF2zNH1V30*)CN_|1$v2|`LnFUT$%-tO0Eg|c5$BB~yDfzS zcOXJ$wpzVK0MfTjBJ0b$r#_OvAJ3WRt+YOLlJPYMx~qp>^$$$h#bc|`g0pF-Ao43? z>*A+8lx>}L{p(Tni2Vvk)dtzg$hUKjSjXRagj)$h#8=KV>5s)J4vGtRn5kP|AXIz! zPgbbVxW{2o4s-UM;c#We8P&mPN|DW7_uLF!a|^0S=wr6Esx9Z$2|c1?GaupU6$tb| zY_KU`(_29O_%k(;>^|6*pZURH3`@%EuKS;Ns z1lujmf;r{qAN&Q0&m{wJSZ8MeE7RM5+Sq;ul_ z`+ADrd_Um+G37js6tKsArNB}n{p*zTUxQr>3@wA;{EUbjNjlNd6$Mx zg0|MyU)v`sa~tEY5$en7^PkC=S<2@!nEdG6L=h(vT__0F=S8Y&eM=hal#7eM(o^Lu z2?^;05&|CNliYrq6gUv;|i!(W{0N)LWd*@{2q*u)}u*> z7MQgk6t9OqqXMln?zoMAJcc zMKaof_Up})q#DzdF?w^%tTI7STI^@8=Wk#enR*)&%8yje>+tKvUYbW8UAPg55xb70 zEn5&Ba~NmOJlgI#iS8W3-@N%>V!#z-ZRwfPO1)dQdQkaHsiqG|~we2ALqG7Ruup(DqSOft2RFg_X%3w?6VqvV1uzX_@F(diNVp z4{I|}35=11u$;?|JFBEE*gb;T`dy+8gWJ9~pNsecrO`t#V9jW-6mnfO@ff9od}b(3s4>p0i30gbGIv~1@a^F2kl7YO;DxmF3? zWi-RoXhzRJV0&XE@ACc?+@6?)LQ2XNm4KfalMtsc%4!Fn0rl zpHTrHwR>t>7W?t!Yc{*-^xN%9P0cs0kr=`?bQ5T*oOo&VRRu+1chM!qj%2I!@+1XF z4GWJ=7ix9;Wa@xoZ0RP`NCWw0*8247Y4jIZ>GEW7zuoCFXl6xIvz$ezsWgKdVMBH> z{o!A7f;R-@eK9Vj7R40xx)T<2$?F2E<>Jy3F;;=Yt}WE59J!1WN367 zA^6pu_zLoZIf*x031CcwotS{L8bJE(<_F%j_KJ2P_IusaZXwN$&^t716W{M6X2r_~ zaiMwdISX7Y&Qi&Uh0upS3TyEIXNDICQlT5fHXC`aji-c{U(J@qh-mWl-uMN|T&435 z5)a1dvB|oe%b2mefc=Vpm0C%IUYYh7HI*;3UdgNIz}R##(#{(_>82|zB0L*1i4B5j-xi9O4x10rs_J6*gdRBX=@VJ+==sWb&_Qc6tSOowM{BX@(zawtjl zdU!F4OYw2@Tk1L^%~JCwb|e#3CC>srRHQ*(N%!7$Mu_sKh@|*XtR>)BmWw!;8-mq7 zBBnbjwx8Kyv|hd*`5}84flTHR1Y@@uqjG`UG+jN_YK&RYTt7DVwfEDXDW4U+iO{>K zw1hr{_XE*S*K9TzzUlJH2rh^hUm2v7_XjwTuYap|>zeEDY$HOq3X4Tz^X}E9z)x4F zs+T?Ed+Hj<#jY-`Va~fT2C$=qFT-5q$@p9~0{G&eeL~tiIAHXA!f6C(rAlS^)&k<- zXU|ZVs}XQ>s5iONo~t!XXZgtaP$Iau;JT%h)>}v54yut~pykaNye4axEK#5@?TSsQ zE;Jvf9I$GVb|S`7$pG)4vgo9NXsKr?u=F!GnA%VS2z$@Z(!MR9?EPcAqi5ft)Iz6sNl`%kj+_H-X`R<>BFrBW=fSlD|{`D%@Rcbu2?%>t7i34k?Ujb)2@J-`j#4 zLK<69qcUuniIan-$A1+fR=?@+thwDIXtF1Tks@Br-xY zfB+zblrR(ke`U;6U~-;p1Kg8Lh6v~LjW@9l2P6s+?$2!ZRPX`(ZkRGe7~q(4&gEi<$ch`5kQ?*1=GSqkeV z{SA1EaW_A!t{@^UY2D^YO0(H@+kFVzZaAh0_`A`f(}G~EP~?B|%gtxu&g%^x{EYSz zk+T;_c@d;+n@$<>V%P=nk36?L!}?*=vK4>nJSm+1%a}9UlmTJTrfX4{Lb7smNQn@T zw9p2%(Zjl^bWGo1;DuMHN(djsEm)P8mEC2sL@KyPjwD@d%QnZ$ zMJ3cnn!_!iP{MzWk%PI&D?m?C(y2d|2VChluN^yHya(b`h>~GkI1y;}O_E57zOs!{ zt2C@M$^PR2U#(dZmA-sNreB@z-yb0Bf7j*yONhZG=onhx>t4)RB`r6&TP$n zgmN*)eCqvgriBO-abHQ8ECN0bw?z5Bxpx z=jF@?zFdVn?@gD5egM4o$m`}lV(CWrOKKq(sv*`mNcHcvw&Xryfw<{ch{O&qc#WCTXX6=#{MV@q#iHYba!OUY+MGeNTjP%Fj!WgM&`&RlI^=AWTOqy-o zHo9YFt!gQ*p7{Fl86>#-JLZo(b^O`LdFK~OsZBRR@6P?ad^Ujbqm_j^XycM4ZHFyg ziUbIFW#2tj`65~#2V!4z7DM8Z;fG0|APaQ{a2VNYpNotB7eZ5kp+tPDz&Lqs0j%Y4tA*URpcfi z_M(FD=fRGdqf430j}1z`O0I=;tLu81bwJXdYiN7_&a-?ly|-j*+=--XGvCq#32Gh(=|qj5F?kmihk{%M&$}udW5)DHK zF_>}5R8&&API}o0osZJRL3n~>76nUZ&L&iy^s>PMnNcYZ|9*1$v-bzbT3rpWsJ+y{ zPrg>5Zlery96Um?lc6L|)}&{992{_$J&=4%nRp9BAC6!IB=A&=tF>r8S*O-=!G(_( zwXbX_rGZgeiK*&n5E;f=k{ktyA1(;x_kiMEt0*gpp_4&(twlS2e5C?NoD{n>X2AT# zY@Zp?#!b1zNq96MQqeO*M1MMBin5v#RH52&Xd~DO6-BZLnA6xO1$sou(YJ1Dlc{WF zVa%2DyYm`V#81jP@70IJ;DX@y*iUt$MLm)ByAD$eUuji|5{ptFYq(q)mE(5bOpxjM z^Q`AHWq44SG3`_LxC9fwR)XRVIp=B%<(-lOC3jI#bb@dK(*vjom!=t|#<@dZql%>O z15y^{4tQoeW9Lu%G&V$90x6F)xN6y_oIn;!Q zs)8jT$;&;u%Y>=T3hg34A-+Y*na=|glcStr5D;&5*t5*DmD~x;zQAV5{}Ya`?RRGa zT*t9@$a~!co;pD^!J5bo?lDOWFx%)Y=-fJ+PDGc0>;=q=s?P4aHForSB+)v0WY2JH z?*`O;RHum6j%#LG)Vu#ciO#+jRC3!>T(9fr+XE7T2B7Z|0nR5jw@WG)kDDzTJ=o4~ zUpeyt7}_nd`t}j9BKqryOha{34erm)RmST)_9Aw)@ zHbiyg5n&E{_CQR@h<}34d7WM{s{%5wdty1l+KX8*?+-YkNK2Be*6&jc>@{Fd;Ps|| z26LqdI3#9le?;}risDq$K5G3yoqK}C^@-8z^wj%tdgw-6@F#Ju{Sg7+y)L?)U$ez> zoOaP$UFZ?y5BiFycir*pnaAaY+|%1%8&|(@VB)zweR%?IidwJyK5J!STzw&2RFx zZV@qeaCB01Hu#U9|1#=Msc8Pgz5P*4Lrp!Q+~(G!OiNR{qa7|r^H?FC6gVhkk3y7=uW#Sh;&>78bZ}aK*C#NH$9rX@M3f{nckYI+5QG?Aj1DM)@~z_ zw!UAD@gedTlePB*%4+55naJ8ak_;))#S;4ji!LOqY5VRI){GMwHR~}6t4g>5C_#U# ztYC!tjKjrKvRy=GAsJVK++~$|+s!w9z3H4G^mACv=EErXNSmH7qN}%PKcN|8%9=i)qS5+$L zu&ya~HW%RMVJi4T^pv?>mw*Gf<)-7gf#Qj|e#w2|v4#t!%Jk{&xlf;$_?jW*n!Pyx zkG$<18kiLOAUPuFfyu-EfWX%4jYnjBYc~~*9JEz6oa)_R|8wjZA|RNrAp%}14L7fW zi7A5Wym*K+V8pkqqO-X#3ft{0qs?KVt^)?kS>AicmeO&q+~J~ zp0YJ_P~_a8j= zsAs~G=8F=M{4GZL{|B__UorX@MRNQLn?*_gym4aW(~+i13knnk1P=khoC-ViMZk+x zLW(l}oAg1H`dU+Fv**;qw|ANDSRs>cGqL!Yw^`; zv;{E&8CNJcc)GHzTYM}f&NPw<6j{C3gaeelU#y!M)w-utYEHOCCJo|Vgp7K6C_$14 zqIrLUB0bsgz^D%V%fbo2f9#yb#CntTX?55Xy|Kps&Xek*4_r=KDZ z+`TQuv|$l}MWLzA5Ay6Cvsa^7xvwXpy?`w(6vx4XJ zWuf1bVSb#U8{xlY4+wlZ$9jjPk)X_;NFMqdgq>m&W=!KtP+6NL57`AMljW+es zzqjUjgz;V*kktJI?!NOg^s_)ph45>4UDA!Vo0hn>KZ+h-3=?Y3*R=#!fOX zP$Y~+14$f66ix?UWB_6r#fMcC^~X4R-<&OD1CSDNuX~y^YwJ>sW0j`T<2+3F9>cLo z#!j57$ll2K9(%$4>eA7(>FJX5e)pR5&EZK!IMQzOfik#FU*o*LGz~7u(8}XzIQRy- z!U7AlMTIe|DgQFmc%cHy_9^{o`eD%ja_L>ckU6$O4*U**o5uR7`FzqkU8k4gxtI=o z^P^oGFPm5jwZMI{;nH}$?p@uV8FT4r=|#GziKXK07bHJLtK}X%I0TON$uj(iJ`SY^ zc$b2CoxCQ>7LH@nxcdW&_C#fMYBtTxcg46dL{vf%EFCZ~eErMvZq&Z%Lhumnkn^4A zsx$ay(FnN7kYah}tZ@0?-0Niroa~13`?hVi6`ndno`G+E8;$<6^gsE-K3)TxyoJ4M zb6pj5=I8^FD5H@`^V#Qb2^0cx7wUz&cruA5g>6>qR5)O^t1(-qqP&1g=qvY#s&{bx zq8Hc%LsbK1*%n|Y=FfojpE;w~)G0-X4i*K3{o|J7`krhIOd*c*$y{WIKz2n2*EXEH zT{oml3Th5k*vkswuFXdGDlcLj15Nec5pFfZ*0?XHaF_lVuiB%Pv&p7z)%38}%$Gup zVTa~C8=cw%6BKn_|4E?bPNW4PT7}jZQLhDJhvf4z;~L)506IE0 zX!tWXX(QOQPRj-p80QG79t8T2^az4Zp2hOHziQlvT!|H)jv{Ixodabzv6lBj)6WRB z{)Kg@$~~(7$-az?lw$4@L%I&DI0Lo)PEJJziWP33a3azb?jyXt1v0N>2kxwA6b%l> zZqRpAo)Npi&loWbjFWtEV)783BbeIAhqyuc+~>i7aQ8shIXt)bjCWT6$~ro^>99G} z2XfmT0(|l!)XJb^E!#3z4oEGIsL(xd; zYX1`1I(cG|u#4R4T&C|m*9KB1`UzKvho5R@1eYtUL9B72{i(ir&ls8g!pD ztR|25xGaF!4z5M+U@@lQf(12?xGy`!|3E}7pI$k`jOIFjiDr{tqf0va&3pOn6Pu)% z@xtG2zjYuJXrV)DUrIF*y<1O1<$#54kZ#2;=X51J^F#0nZ0(;S$OZDt_U2bx{RZ=Q zMMdd$fH|!s{ zXq#l;{`xfV`gp&C>A`WrQU?d{!Ey5(1u*VLJt>i27aZ-^&2IIk=zP5p+{$q(K?2(b z8?9h)kvj9SF!Dr zoyF}?V|9;6abHxWk2cEvGs$-}Pg}D+ZzgkaN&$Snp%;5m%zh1E#?Wac-}x?BYlGN#U#Mek*}kek#I9XaHt?mz3*fDrRTQ#&#~xyeqJk1QJ~E$7qsw6 z?sV;|?*=-{M<1+hXoj?@-$y+(^BJ1H~wQ9G8C0#^aEAyhDduNX@haoa=PuPp zYsGv8UBfQaRHgBgLjmP^eh>fLMeh{8ic)?xz?#3kX-D#Z{;W#cd_`9OMFIaJg-=t`_3*!YDgtNQ2+QUEAJB9M{~AvT$H`E)IKmCR21H532+ata8_i_MR@ z2Xj<3w<`isF~Ah$W{|9;51ub*f4#9ziKrOR&jM{x7I_7()O@`F*5o$KtZ?fxU~g`t zUovNEVKYn$U~VX8eR)qb`7;D8pn*Pp$(otYTqL)5KH$lUS-jf}PGBjy$weoceAcPp z&5ZYB$r&P$MN{0H0AxCe4Qmd3T%M*5d4i%#!nmBCN-WU-4m4Tjxn-%j3HagwTxCZ9 z)j5vO-C7%s%D!&UfO>bi2oXiCw<-w{vVTK^rVbv#W=WjdADJy8$khnU!`ZWCIU`># zyjc^1W~pcu>@lDZ{zr6gv%)2X4n27~Ve+cQqcND%0?IFSP4sH#yIaXXYAq^z3|cg` z`I3$m%jra>e2W-=DiD@84T!cb%||k)nPmEE09NC%@PS_OLhkrX*U!cgD*;;&gIaA(DyVT4QD+q_xu z>r`tg{hiGY&DvD-)B*h+YEd+Zn)WylQl}<4>(_NlsKXCRV;a)Rcw!wtelM2_rWX`j zTh5A|i6=2BA(iMCnj_fob@*eA;V?oa4Z1kRBGaU07O70fb6-qmA$Hg$ps@^ka1=RO zTbE_2#)1bndC3VuK@e!Sftxq4=Uux}fDxXE#Q5_x=E1h>T5`DPHz zbH<_OjWx$wy7=%0!mo*qH*7N4tySm+R0~(rbus`7;+wGh;C0O%x~fEMkt!eV>U$`i z5>Q(o z=t$gPjgGh0&I7KY#k50V7DJRX<%^X z>6+ebc9efB3@eE2Tr){;?_w`vhgF>`-GDY(YkR{9RH(MiCnyRtd!LxXJ75z+?2 zGi@m^+2hKJ5sB1@Xi@s_@p_Kwbc<*LQ_`mr^Y%j}(sV_$`J(?_FWP)4NW*BIL~sR>t6 zM;qTJZ~GoY36&{h-Pf}L#y2UtR}>ZaI%A6VkU>vG4~}9^i$5WP2Tj?Cc}5oQxe2=q z8BeLa$hwCg_psjZyC2+?yX4*hJ58Wu^w9}}7X*+i5Rjqu5^@GzXiw#SUir1G1`jY% zOL=GE_ENYxhcyUrEt9XlMNP6kx6h&%6^u3@zB8KUCAa18T(R2J`%JjWZ z!{7cXaEW+Qu*iJPu+m>QqW}Lo$4Z+!I)0JNzZ&_M%=|B1yejFRM04bGAvu{=lNPd+ zJRI^DRQ(?FcVUD+bgEcAi@o(msqys9RTCG#)TjI!9~3-dc`>gW;HSJuQvH~d`MQs86R$|SKXHh zqS9Qy)u;T`>>a!$LuaE2keJV%;8g)tr&Nnc;EkvA-RanHXsy)D@XN0a>h}z2j81R; zsUNJf&g&rKpuD0WD@=dDrPHdBoK42WoBU|nMo17o(5^;M|dB4?|FsAGVrSyWcI`+FVw^vTVC`y}f(BwJl zrw3Sp151^9=}B})6@H*i4-dIN_o^br+BkcLa^H56|^2XsT0dESw2 zMX>(KqNl=x2K5=zIKg}2JpGAZu{I_IO}0$EQ5P{4zol**PCt3F4`GX}2@vr8#Y)~J zKb)gJeHcFnR@4SSh%b;c%J`l=W*40UPjF#q{<}ywv-=vHRFmDjv)NtmC zQx9qm)d%0zH&qG7AFa3VAU1S^(n8VFTC~Hb+HjYMjX8r#&_0MzlNR*mnLH5hi}`@{ zK$8qiDDvS_(L9_2vHgzEQ${DYSE;DqB!g*jhJghE&=LTnbgl&Xepo<*uRtV{2wDHN z)l;Kg$TA>Y|K8Lc&LjWGj<+bp4Hiye_@BfU(y#nF{fpR&|Ltbye?e^j0}8JC4#xi% zv29ZR%8%hk=3ZDvO-@1u8KmQ@6p%E|dlHuy#H1&MiC<*$YdLkHmR#F3ae;bKd;@*i z2_VfELG=B}JMLCO-6UQy^>RDE%K4b>c%9ki`f~Z2Qu8hO7C#t%Aeg8E%+}6P7Twtg z-)dj(w}_zFK&86KR@q9MHicUAucLVshUdmz_2@32(V`y3`&Kf8Q2I)+!n0mR=rrDU zXvv^$ho;yh*kNqJ#r1}b0|i|xRUF6;lhx$M*uG3SNLUTC@|htC z-=fsw^F%$qqz4%QdjBrS+ov}Qv!z00E+JWas>p?z@=t!WWU3K*?Z(0meTuTOC7OTx zU|kFLE0bLZ+WGcL$u4E}5dB0g`h|uwv3=H6f+{5z9oLv-=Q45+n~V4WwgO=CabjM% zBAN+RjM65(-}>Q2V#i1Na@a0`08g&y;W#@sBiX6Tpy8r}*+{RnyGUT`?XeHSqo#|J z^ww~c;ou|iyzpErDtlVU=`8N7JSu>4M z_pr9=tX0edVn9B}YFO2y(88j#S{w%E8vVOpAboK*27a7e4Ekjt0)hIX99*1oE;vex z7#%jhY=bPijA=Ce@9rRO(Vl_vnd00!^TAc<+wVvRM9{;hP*rqEL_(RzfK$er_^SN; z)1a8vo8~Dr5?;0X0J62Cusw$A*c^Sx1)dom`-)Pl7hsW4i(r*^Mw`z5K>!2ixB_mu z*Ddqjh}zceRFdmuX1akM1$3>G=#~|y?eYv(e-`Qy?bRHIq=fMaN~fB zUa6I8Rt=)jnplP>yuS+P&PxeWpJ#1$F`iqRl|jF$WL_aZFZl@kLo&d$VJtu&w?Q0O zzuXK>6gmygq(yXJy0C1SL}T8AplK|AGNUOhzlGeK_oo|haD@)5PxF}rV+5`-w{Aag zus45t=FU*{LguJ11Sr-28EZkq;!mJO7AQGih1L4rEyUmp>B!%X0YemsrV3QFvlgt* z5kwlPzaiJ+kZ^PMd-RRbl(Y?F*m`4*UIhIuf#8q>H_M=fM*L_Op-<_r zBZagV=4B|EW+KTja?srADTZXCd3Yv%^Chfpi)cg{ED${SI>InNpRj5!euKv?=Xn92 zsS&FH(*w`qLIy$doc>RE&A5R?u zzkl1sxX|{*fLpXvIW>9d<$ePROttn3oc6R!sN{&Y+>Jr@yeQN$sFR z;w6A<2-0%UA?c8Qf;sX7>>uKRBv3Ni)E9pI{uVzX|6Bb0U)`lhLE3hK58ivfRs1}d zNjlGK0hdq0qjV@q1qI%ZFMLgcpWSY~mB^LK)4GZ^h_@H+3?dAe_a~k*;9P_d7%NEFP6+ zgV(oGr*?W(ql?6SQ~`lUsjLb%MbfC4V$)1E0Y_b|OIYxz4?O|!kRb?BGrgiH5+(>s zoqM}v*;OBfg-D1l`M6T6{K`LG+0dJ1)!??G5g(2*vlNkm%Q(MPABT$r13q?|+kL4- zf)Mi5r$sn;u41aK(K#!m+goyd$c!KPl~-&-({j#D4^7hQkV3W|&>l_b!}!z?4($OA z5IrkfuT#F&S1(`?modY&I40%gtroig{YMvF{K{>5u^I51k8RriGd${z)=5k2tG zM|&Bp5kDTfb#vfuTTd?)a=>bX=lokw^y9+2LS?kwHQIWI~pYgy7 zb?A-RKVm_vM5!9?C%qYdfRAw& zAU7`up~%g=p@}pg#b7E)BFYx3g%(J36Nw(Dij!b>cMl@CSNbrW!DBDbTD4OXk!G4x zi}JBKc8HBYx$J~31PXH+4^x|UxK~(<@I;^3pWN$E=sYma@JP|8YL`L(zI6Y#c%Q{6 z*APf`DU$S4pr#_!60BH$FGViP14iJmbrzSrOkR;f3YZa{#E7Wpd@^4E-zH8EgPc-# zKWFPvh%WbqU_%ZEt`=Q?odKHc7@SUmY{GK`?40VuL~o)bS|is$Hn=<=KGHOsEC5tB zFb|q}gGlL97NUf$G$>^1b^3E18PZ~Pm9kX%*ftnolljiEt@2#F2R5ah$zbXd%V_Ev zyDd{1o_uuoBga$fB@Fw!V5F3jIr=a-ykqrK?WWZ#a(bglI_-8pq74RK*KfQ z0~Dzus7_l;pMJYf>Bk`)`S8gF!To-BdMnVw5M-pyu+aCiC5dwNH|6fgRsIKZcF&)g zr}1|?VOp}I3)IR@m1&HX1~#wsS!4iYqES zK}4J{Ei>;e3>LB#Oly>EZkW14^@YmpbgxCDi#0RgdM${&wxR+LiX}B+iRioOB0(pDKpVEI;ND?wNx>%e|m{RsqR_{(nmQ z3ZS}@t!p4a(BKx_-CYwrcyJ5u1TO9bcXti$8sy>xcLKqKCc#~UOZYD{llKTSFEjJ~ zyNWt>tLU}*>^`TvPxtP%F`ZJQw@W0^>x;!^@?k_)9#bF$j0)S3;mH-IR5y82l|%=F z2lR8zhP?XNP-ucZZ6A+o$xOyF!w;RaLHGh57GZ|TCXhJqY~GCh)aXEV$1O&$c}La1 zjuJxkY9SM4av^Hb;i7efiYaMwI%jGy`3NdY)+mcJhF(3XEiSlU3c|jMBi|;m-c?~T z+x0_@;SxcoY=(6xNgO$bBt~Pj8`-<1S|;Bsjrzw3@zSjt^JC3X3*$HI79i~!$RmTz zsblZsLYs7L$|=1CB$8qS!tXrWs!F@BVuh?kN(PvE5Av-*r^iYu+L^j^m9JG^#=m>@ z=1soa)H*w6KzoR$B8mBCXoU;f5^bVuwQ3~2LKg!yxomG1#XPmn(?YH@E~_ED+W6mxs%x{%Z<$pW`~ON1~2XjP5v(0{C{+6Dm$00tsd3w=f=ZENy zOgb-=f}|Hb*LQ$YdWg<(u7x3`PKF)B7ZfZ6;1FrNM63 z?O6tE%EiU@6%rVuwIQjvGtOofZBGZT1Sh(xLIYt9c4VI8`!=UJd2BfLjdRI#SbVAX ziT(f*RI^T!IL5Ac>ql7uduF#nuCRJ1)2bdvAyMxp-5^Ww5p#X{rb5)(X|fEhDHHW{ zw(Lfc$g;+Q`B0AiPGtmK%*aWfQQ$d!*U<|-@n2HZvCWSiw^I>#vh+LyC;aaVWGbmkENr z&kl*8o^_FW$T?rDYLO1Pyi%>@&kJKQoH2E0F`HjcN}Zlnx1ddoDA>G4Xu_jyp6vuT zPvC}pT&Owx+qB`zUeR|4G;OH(<<^_bzkjln0k40t`PQxc$7h(T8Ya~X+9gDc8Z9{Z z&y0RAU}#_kQGrM;__MK9vwIwK^aoqFhk~dK!ARf1zJqHMxF2?7-8|~yoO@_~Ed;_wvT%Vs{9RK$6uUQ|&@#6vyBsFK9eZW1Ft#D2)VpQRwpR(;x^ zdoTgMqfF9iBl%{`QDv7B0~8{8`8k`C4@cbZAXBu00v#kYl!#_Wug{)2PwD5cNp?K^ z9+|d-4z|gZ!L{57>!Ogfbzchm>J1)Y%?NThxIS8frAw@z>Zb9v%3_3~F@<=LG%r*U zaTov}{{^z~SeX!qgSYow`_5)ij*QtGp4lvF`aIGQ>@3ZTkDmsl#@^5*NGjOuu82}o zzLF~Q9SW+mP=>88%eSA1W4_W7-Q>rdq^?t=m6}^tDPaBRGFLg%ak93W!kOp#EO{6& zP%}Iff5HZQ9VW$~+9r=|Quj#z*=YwcnssS~9|ub2>v|u1JXP47vZ1&L1O%Z1DsOrDfSIMHU{VT>&>H=9}G3i@2rP+rx@eU@uE8rJNec zij~#FmuEBj03F1~ct@C@$>y)zB+tVyjV3*n`mtAhIM0$58vM9jOQC}JJOem|EpwqeMuYPxu3sv}oMS?S#o6GGK@8PN59)m&K4Dc&X% z(;XL_kKeYkafzS3Wn5DD>Yiw{LACy_#jY4op(>9q>>-*9@C0M+=b#bknAWZ37^(Ij zq>H%<@>o4a#6NydoF{_M4i4zB_KG)#PSye9bk0Ou8h%1Dtl7Q_y#7*n%g)?m>xF~( zjqvOwC;*qvN_3(*a+w2|ao0D?@okOvg8JskUw(l7n`0fncglavwKd?~l_ryKJ^Ky! zKCHkIC-o7%fFvPa$)YNh022lakMar^dgL=t#@XLyNHHw!b?%WlM)R@^!)I!smZL@k zBi=6wE5)2v&!UNV(&)oOYW(6Qa!nUjDKKBf-~Da=#^HE4(@mWk)LPvhyN3i4goB$3K8iV7uh zsv+a?#c4&NWeK(3AH;ETrMOIFgu{_@%XRwCZ;L=^8Ts)hix4Pf3yJRQ<8xb^CkdmC z?c_gB)XmRsk`9ch#tx4*hO=#qS7={~Vb4*tTf<5P%*-XMfUUYkI9T1cEF;ObfxxI-yNuA=I$dCtz3ey znVkctYD*`fUuZ(57+^B*R=Q}~{1z#2!ca?)+YsRQb+lt^LmEvZt_`=j^wqig+wz@n@ z`LIMQJT3bxMzuKg8EGBU+Q-6cs5(@5W?N>JpZL{$9VF)veF`L5%DSYTNQEypW%6$u zm_~}T{HeHj1bAlKl8ii92l9~$dm=UM21kLemA&b$;^!wB7#IKWGnF$TVq!!lBlG4 z{?Rjz?P(uvid+|i$VH?`-C&Gcb3{(~Vpg`w+O);Wk1|Mrjxrht0GfRUnZqz2MhrXa zqgVC9nemD5)H$to=~hp)c=l9?#~Z_7i~=U-`FZxb-|TR9@YCxx;Zjo-WpMNOn2)z) zFPGGVl%3N$f`gp$gPnWC+f4(rmts%fidpo^BJx72zAd7|*Xi{2VXmbOm)1`w^tm9% znM=0Fg4bDxH5PxPEm{P3#A(mxqlM7SIARP?|2&+c7qmU8kP&iApzL|F>Dz)Ixp_`O zP%xrP1M6@oYhgo$ZWwrAsYLa4 z|I;DAvJxno9HkQrhLPQk-8}=De{9U3U%)dJ$955?_AOms!9gia%)0E$Mp}$+0er@< zq7J&_SzvShM?e%V?_zUu{niL@gt5UFOjFJUJ}L?$f%eU%jUSoujr{^O=?=^{19`ON zlRIy8Uo_nqcPa6@yyz`CM?pMJ^^SN^Fqtt`GQ8Q#W4kE7`V9^LT}j#pMChl!j#g#J zr-=CCaV%xyFeQ9SK+mG(cTwW*)xa(eK;_Z(jy)woZp~> zA(4}-&VH+TEeLzPTqw&FOoK(ZjD~m{KW05fiGLe@E3Z2`rLukIDahE*`u!ubU)9`o zn^-lyht#E#-dt~S>}4y$-mSbR8{T@}22cn^refuQ08NjLOv?JiEWjyOnzk<^R5%gO zhUH_B{oz~u#IYwVnUg8?3P*#DqD8#X;%q%HY**=I>>-S|!X*-!x1{^l#OnR56O>iD zc;i;KS+t$koh)E3)w0OjWJl_aW2;xF=9D9Kr>)(5}4FqUbk# zI#$N8o0w;IChL49m9CJTzoC!|u{Ljd%ECgBOf$}&jA^$(V#P#~)`&g`H8E{uv52pp zwto`xUL-L&WTAVREEm$0g_gYPL(^vHq(*t1WCH_6alhkeW&GCZ3hL)|{O-jiFOBrF z!EW=Jej|dqQitT6!B-7&io2K)WIm~Q)v@yq%U|VpV+I?{y0@Yd%n8~-NuuM*pM~KA z85YB};IS~M(c<}4Hxx>qRK0cdl&e?t253N%vefkgds>Ubn8X}j6Vpgs>a#nFq$osY z1ZRwLqFv=+BTb=i%D2Wv>_yE0z}+niZ4?rE|*a3d7^kndWGwnFqt+iZ(7+aln<}jzbAQ(#Z2SS}3S$%Bd}^ zc9ghB%O)Z_mTZMRC&H#)I#fiLuIkGa^`4e~9oM5zKPx?zjkC&Xy0~r{;S?FS%c7w< zWbMpzc(xSw?9tGxG~_l}Acq}zjt5ClaB7-!vzqnlrX;}$#+PyQ9oU)_DfePh2E1<7 ztok6g6K^k^DuHR*iJ?jw?bs_whk|bx`dxu^nC6#e{1*m~z1eq7m}Cf$*^Eua(oi_I zAL+3opNhJteu&mWQ@kQWPucmiP)4|nFG`b2tpC;h{-PI@`+h?9v=9mn|0R-n8#t=+Z*FD(c5 zjj79Jxkgck*DV=wpFgRZuwr%}KTm+dx?RT@aUHJdaX-ODh~gByS?WGx&czAkvkg;x zrf92l8$Or_zOwJVwh>5rB`Q5_5}ef6DjS*$x30nZbuO3dijS*wvNEqTY5p1_A0gWr znH<(Qvb!os14|R)n2Ost>jS2;d1zyLHu`Svm|&dZD+PpP{Bh>U&`Md;gRl64q;>{8MJJM$?UNUd`aC>BiLe>*{ zJY15->yW+<3rLgYeTruFDtk1ovU<$(_y7#HgUq>)r0{^}Xbth}V#6?%5jeFYt;SG^ z3qF)=uWRU;Jj)Q}cpY8-H+l_n$2$6{ZR?&*IGr{>ek!69ZH0ZoJ*Ji+ezzlJ^%qL3 zO5a`6gwFw(moEzqxh=yJ9M1FTn!eo&qD#y5AZXErHs%22?A+JmS&GIolml!)rZTnUDM3YgzYfT#;OXn)`PWv3Ta z!-i|-Wojv*k&bC}_JJDjiAK(Ba|YZgUI{f}TdEOFT2+}nPmttytw7j%@bQZDV1vvj z^rp{gRkCDmYJHGrE1~e~AE!-&6B6`7UxVQuvRrfdFkGX8H~SNP_X4EodVd;lXd^>eV1jN+Tt4}Rsn)R0LxBz0c=NXU|pUe!MQQFkGBWbR3&(jLm z%RSLc#p}5_dO{GD=DEFr=Fc% z85CBF>*t!6ugI?soX(*JNxBp+-DdZ4X0LldiK}+WWGvXV(C(Ht|!3$psR=&c*HIM=BmX;pRIpz@Ale{9dhGe(U2|Giv;# zOc|;?p67J=Q(kamB*aus=|XP|m{jN^6@V*Bpm?ye56Njh#vyJqE=DweC;?Rv7faX~ zde03n^I~0B2vUmr;w^X37tVxUK?4}ifsSH5_kpKZIzpYu0;Kv}SBGfI2AKNp+VN#z`nI{UNDRbo-wqa4NEls zICRJpu)??cj^*WcZ^MAv+;bDbh~gpN$1Cor<{Y2oyIDws^JsfW^5AL$azE(T0p&pP z1Mv~6Q44R&RHoH95&OuGx2srIr<@zYJTOMKiVs;Bx3py89I87LOb@%mr`0)#;7_~Z zzcZj8?w=)>%5@HoCHE_&hnu(n_yQ-L(~VjpjjkbT7e)Dk5??fApg(d>vwLRJ-x{um z*Nt?DqTSxh_MIyogY!vf1mU1`Gld-&L)*43f6dilz`Q@HEz;+>MDDYv9u!s;WXeao zUq=TaL$P*IFgJzrGc>j1dDOd zed+=ZBo?w4mr$2)Ya}?vedDopomhW1`#P<%YOJ_j=WwClX0xJH-f@s?^tmzs_j7t!k zK@j^zS0Q|mM4tVP5Ram$VbS6|YDY&y?Q1r1joe9dj08#CM{RSMTU}(RCh`hp_Rkl- zGd|Cv~G@F{DLhCizAm9AN!^{rNs8hu!G@8RpnGx7e`-+K$ffN<0qjR zGq^$dj_Tv!n*?zOSyk5skI7JVKJ)3jysnjIu-@VSzQiP8r6MzudCU=~?v-U8yzo^7 zGf~SUTvEp+S*!X9uX!sq=o}lH;r{pzk~M*VA(uyQ`3C8!{C;)&6)95fv(cK!%Cuz$ z_Zal57H6kPN>25KNiI6z6F)jzEkh#%OqU#-__Xzy)KyH};81#N6OfX$$IXWzOn`Q& z4f$Z1t>)8&8PcYfEwY5UadU1yg+U*(1m2ZlHoC-!2?gB!!fLhmTl))D@dhvkx#+Yj z1O=LV{(T%{^IeCuFK>%QR!VZ4GnO5tK8a+thWE zg4VytZrwcS?7^ zuZfhYnB8dwd%VLO?DK7pV5Wi<(`~DYqOXn8#jUIL^)12*Dbhk4GmL_E2`WX&iT16o zk(t|hok(Y|v-wzn?4x34T)|+SfZP>fiq!><*%vnxGN~ypST-FtC+@TPv*vYv@iU!_ z@2gf|PrgQ?Ktf*9^CnJ(x*CtZVB8!OBfg0%!wL;Z8(tYYre0vcnPGlyCc$V(Ipl*P z_(J!a=o@vp^%Efme!K74(Ke7A>Y}|sxV+JL^aYa{~m%5#$$+R1? zGaQhZTTX!#s#=Xtpegqero$RNt&`4xn3g$)=y*;=N=Qai)}~`xtxI_N*#MMCIq#HFifT zz(-*m;pVH&+4bixL&Bbg)W5FN^bH87pAHp)zPkWNMfTFqS=l~AC$3FX3kQUSh_C?-ZftyClgM)o_D7cX$RGlEYblux0jv5 zTr|i-I3@ZPCGheCl~BGhImF)K4!9@?pC(gi3ozX=a!|r1)LFxy_8c&wY0<^{2cm|P zv6Y`QktY*;I)IUd5y3ne1CqpVanlY45z8hf4&$EUBnucDj16pDa4&GI&TArYhf*xh zdj>*%APH8(h~c>o@l#%T>R$e>rwVx_WUB|~V`p^JHsg*y12lzj&zF}w6W09HwB2yb z%Q~`es&(;7#*DUC_w-Dmt7|$*?TA_m;zB+-u{2;Bg{O}nV7G_@7~<)Bv8fH^G$XG8$(&{A zwXJK5LRK%M34(t$&NI~MHT{UQ9qN-V_yn|%PqC81EIiSzmMM=2zb`mIwiP_b)x+2M z7Gd`83h79j#SItpQ}luuf2uOU`my_rY5T{6P#BNlb%h%<#MZb=m@y5aW;#o1^2Z)SWo+b`y0gV^iRcZtz5!-05vF z7wNo=hc6h4hc&s@uL^jqRvD6thVYtbErDK9k!;+a0xoE0WL7zLixjn5;$fXvT=O3I zT6jI&^A7k6R{&5#lVjz#8%_RiAa2{di{`kx79K+j72$H(!ass|B%@l%KeeKchYLe_ z>!(JC2fxsv>XVen+Y42GeYPxMWqm`6F$(E<6^s|g(slNk!lL*6v^W2>f6hh^mE$s= z3D$)}{V5(Qm&A6bp%2Q}*GZ5Qrf}n7*Hr51?bJOyA-?B4vg6y_EX<*-e20h{=0Mxs zbuQGZ$fLyO5v$nQ&^kuH+mNq9O#MWSfThtH|0q1i!NrWj^S}_P;Q1OkYLW6U^?_7G zx2wg?CULj7))QU(n{$0JE%1t2dWrMi2g-Os{v|8^wK{@qlj%+1b^?NI z$}l2tjp0g>K3O+p%yK<9!XqmQ?E9>z&(|^Pi~aSRwI5x$jaA62GFz9%fmO3t3a>cq zK8Xbv=5Ps~4mKN5+Eqw12(!PEyedFXv~VLxMB~HwT1Vfo51pQ#D8e$e4pFZ{&RC2P z5gTIzl{3!&(tor^BwZfR8j4k{7Rq#`riKXP2O-Bh66#WWK2w=z;iD9GLl+3 zpHIaI4#lQ&S-xBK8PiQ%dwOh?%BO~DCo06pN7<^dnZCN@NzY{_Z1>rrB0U|nC&+!2 z2y!oBcTd2;@lzyk(B=TkyZ)zy0deK05*Q0zk+o$@nun`VI1Er7pjq>8V zNmlW{p7S^Btgb(TA}jL(uR>`0w8gHP^T~Sh5Tkip^spk4SBAhC{TZU}_Z)UJw-}zm zPq{KBm!k)?P{`-(9?LFt&YN4s%SIZ-9lJ!Ws~B%exHOeVFk3~}HewnnH(d)qkLQ_d z6h>O)pEE{vbOVw}E+jdYC^wM+AAhaI(YAibUc@B#_mDss0Ji&BK{WG`4 zOk>vSNq(Bq2IB@s>>Rxm6Wv?h;ZXkpb1l8u|+_qXWdC*jjcPCixq;!%BVPSp#hP zqo`%cNf&YoQXHC$D=D45RiT|5ngPlh?0T~?lUf*O)){K@*Kbh?3RW1j9-T?%lDk@y z4+~?wKI%Y!-=O|_IuKz|=)F;V7ps=5@g)RrE;;tvM$gUhG>jHcw2Hr@fS+k^Zr~>G z^JvPrZc}_&d_kEsqAEMTMJw!!CBw)u&ZVzmq+ZworuaE&TT>$pYsd9|g9O^0orAe8 z221?Va!l1|Y5X1Y?{G7rt1sX#qFA^?RLG^VjoxPf63;AS=_mVDfGJKg73L zsGdnTUD40y(>S##2l|W2Cy!H(@@5KBa(#gs`vlz}Y~$ot5VsqPQ{{YtjYFvIumZzt zA{CcxZLJR|4#{j7k~Tu*jkwz8QA|5G1$Cl895R`Zyp;irp1{KN){kB30O8P1W5;@bG znvX74roeMmQlUi=v9Y%(wl$ZC#9tKNFpvi3!C}f1m6Ct|l2g%psc{TJp)@yu)*e2> z((p0Fg*8gJ!|3WZke9;Z{8}&NRkv7iP=#_y-F}x^y?2m%-D_aj^)f04%mneyjo_;) z6qc_Zu$q37d~X``*eP~Q>I2gg%rrV8v=kDfpp$=%Vj}hF)^dsSWygoN(A$g*E=Do6FX?&(@F#7pbiJ`;c0c@Ul zDqW_90Wm#5f2L<(Lf3)3TeXtI7nhYwRm(F;*r_G6K@OPW4H(Y3O5SjUzBC}u3d|eQ8*8d@?;zUPE+i#QNMn=r(ap?2SH@vo*m z3HJ%XuG_S6;QbWy-l%qU;8x;>z>4pMW7>R}J%QLf%@1BY(4f_1iixd-6GlO7Vp*yU zp{VU^3?s?90i=!#>H`lxT!q8rk>W_$2~kbpz7eV{3wR|8E=8**5?qn8#n`*(bt1xRQrdGxyx2y%B$qmw#>ZV$c7%cO#%JM1lY$Y0q?Yuo> ze9KdJoiM)RH*SB%^;TAdX-zEjA7@%y=!0=Zg%iWK7jVI9b&Dk}0$Af&08KHo+ zOwDhFvA(E|ER%a^cdh@^wLUlmIv6?_3=BvX8jKk92L=Y}7Jf5OGMfh` zBdR1wFCi-i5@`9km{isRb0O%TX+f~)KNaEz{rXQa89`YIF;EN&gN)cigu6mNh>?Cm zAO&Im2flv6D{jwm+y<%WsPe4!89n~KN|7}Cb{Z;XweER73r}Qp2 zz}WP4j}U0&(uD&9yGy6`!+_v-S(yG*iytsTR#x_Rc>=6u^vnRDnf1gP{#2>`ffrAC% zTZ5WQ@hAK;P;>kX{D)mIXe4%a5p=LO1xXH@8T?mz7Q@d)$3pL{{B!2{-v70L*o1AO+|n5beiw~ zk@(>m?T3{2k2c;NWc^`4@P&Z?BjxXJ@;x1qhn)9Mn*IFdt_J-dIqx5#d`NfyfX~m( zIS~5)MfZ2Uy?_4W`47i}u0ZgPh<{D|w_d#;D}Q&U$Q-G}xM1A@1f{#%A$jh6Qp&0hQ<0bPOM z-{1Wm&p%%#eb_?x7i;bol EfAhh=DF6Tf diff --git a/payment-service/.mvn/wrapper/maven-wrapper.properties b/payment-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/payment-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/payment-service/Dockerfile b/payment-service/Dockerfile deleted file mode 100644 index b09fc63ea..000000000 --- a/payment-service/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY payment-service/ . -ADD payment-service/target/payment-service-v${PROJECT_VERSION}.jar payment-service.jar -EXPOSE 8400 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "payment-service.jar"] - - diff --git a/payment-service/compose.yml b/payment-service/compose.yml deleted file mode 100644 index d6f9d9216..000000000 --- a/payment-service/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - payment-service-container: - image: selimhorri/payment-service-ecommerce-boot:0.1.0 - ports: - - 8400:8400 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/payment-service/mvnw b/payment-service/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/payment-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/payment-service/mvnw.cmd b/payment-service/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/payment-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/payment-service/pom.xml b/payment-service/pom.xml deleted file mode 100644 index 8f3632ebb..000000000 --- a/payment-service/pom.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - payment-service - payment-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/PaymentServiceApplication.java b/payment-service/src/main/java/com/selimhorri/app/PaymentServiceApplication.java deleted file mode 100644 index f01be6181..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/PaymentServiceApplication.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -@EnableEurekaClient -public class PaymentServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(PaymentServiceApplication.class, args); - } - - - -} - -@RestController -class PaymentController { - - @GetMapping - public String msg() { - return "Payment controller responding!!"; - } - -} - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/payment-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java deleted file mode 100644 index 27021f387..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/payment-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java deleted file mode 100644 index f7de593a7..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/payment-service/src/main/java/com/selimhorri/app/constant/AppConstant.java deleted file mode 100644 index 2e051c4b5..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/payment-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java deleted file mode 100644 index b19764968..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/domain/Payment.java b/payment-service/src/main/java/com/selimhorri/app/domain/Payment.java deleted file mode 100644 index 8455b8f1c..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/domain/Payment.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "payments") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -@Data -@Builder -public final class Payment extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "payment_id", unique = true, nullable = false, updatable = false) - private Integer paymentId; - - @Column(name = "order_id") - private Integer orderId; - - @Column(name = "is_payed") - private Boolean isPayed; - - @Enumerated(EnumType.STRING) - @Column(name = "payment_status") - private PaymentStatus paymentStatus; - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/domain/PaymentStatus.java b/payment-service/src/main/java/com/selimhorri/app/domain/PaymentStatus.java deleted file mode 100644 index 72834abbb..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/domain/PaymentStatus.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app.domain; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum PaymentStatus { - - NOT_STARTED("not_started"), - IN_PROGRESS("in_progress"), - COMPLETED("completed"); - - private final String status; - -} diff --git a/payment-service/src/main/java/com/selimhorri/app/dto/OrderDto.java b/payment-service/src/main/java/com/selimhorri/app/dto/OrderDto.java deleted file mode 100644 index a6dbaff7a..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/dto/OrderDto.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/dto/PaymentDto.java b/payment-service/src/main/java/com/selimhorri/app/dto/PaymentDto.java deleted file mode 100644 index e402223cc..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/dto/PaymentDto.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.domain.PaymentStatus; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class PaymentDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer paymentId; - private Boolean isPayed; - private PaymentStatus paymentStatus; - - @JsonProperty("order") - @JsonInclude(Include.NON_NULL) - private OrderDto orderDto; - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/payment-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java deleted file mode 100644 index ecee30efd..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/payment-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java deleted file mode 100644 index ef5bfe3b1..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.PaymentNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - IllegalStateException.class, - PaymentNotFoundException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/payment-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java deleted file mode 100644 index 77429c9d1..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/exception/wrapper/PaymentNotFoundException.java b/payment-service/src/main/java/com/selimhorri/app/exception/wrapper/PaymentNotFoundException.java deleted file mode 100644 index dd29e7250..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/exception/wrapper/PaymentNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class PaymentNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public PaymentNotFoundException() { - super(); - } - - public PaymentNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public PaymentNotFoundException(String message) { - super(message); - } - - public PaymentNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/helper/PaymentMappingHelper.java b/payment-service/src/main/java/com/selimhorri/app/helper/PaymentMappingHelper.java deleted file mode 100644 index 5fa48b5fa..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/helper/PaymentMappingHelper.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Payment; -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.PaymentDto; - -public interface PaymentMappingHelper { - - public static PaymentDto map(final Payment payment) { - return PaymentDto.builder() - .paymentId(payment.getPaymentId()) - .isPayed(payment.getIsPayed()) - .paymentStatus(payment.getPaymentStatus()) - .orderDto( - OrderDto.builder() - .orderId(payment.getOrderId()) - .build()) - .build(); - } - - public static Payment map(final PaymentDto paymentDto) { - return Payment.builder() - .paymentId(paymentDto.getPaymentId()) - .orderId(paymentDto.getOrderDto().getOrderId()) - .isPayed(paymentDto.getIsPayed()) - .paymentStatus(paymentDto.getPaymentStatus()) - .build(); - } - - - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/repository/PaymentRepository.java b/payment-service/src/main/java/com/selimhorri/app/repository/PaymentRepository.java deleted file mode 100644 index b6224c8fe..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/repository/PaymentRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Payment; - -public interface PaymentRepository extends JpaRepository { - - - -} diff --git a/payment-service/src/main/java/com/selimhorri/app/resource/PaymentResource.java b/payment-service/src/main/java/com/selimhorri/app/resource/PaymentResource.java deleted file mode 100644 index 227419d92..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/resource/PaymentResource.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.PaymentDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.PaymentService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/payments") -@Slf4j -@RequiredArgsConstructor -public class PaymentResource { - - private final PaymentService paymentService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** PaymentDto List, controller; fetch all payments *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.paymentService.findAll())); - } - - @GetMapping("/{paymentId}") - public ResponseEntity findById( - @PathVariable("paymentId") - @NotBlank(message = "Input must not be blank") - @Valid final String paymentId) { - log.info("*** PaymentDto, resource; fetch payment by id *"); - return ResponseEntity.ok(this.paymentService.findById(Integer.parseInt(paymentId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final PaymentDto paymentDto) { - log.info("*** PaymentDto, resource; save payment *"); - return ResponseEntity.ok(this.paymentService.save(paymentDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final PaymentDto paymentDto) { - log.info("*** PaymentDto, resource; update payment *"); - return ResponseEntity.ok(this.paymentService.update(paymentDto)); - } - - @DeleteMapping("/{paymentId}") - public ResponseEntity deleteById(@PathVariable("paymentId") final String paymentId) { - log.info("*** Boolean, resource; delete payment by id *"); - this.paymentService.deleteById(Integer.parseInt(paymentId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/payment-service/src/main/java/com/selimhorri/app/service/PaymentService.java b/payment-service/src/main/java/com/selimhorri/app/service/PaymentService.java deleted file mode 100644 index c6876008f..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/service/PaymentService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.PaymentDto; - -public interface PaymentService { - - List findAll(); - PaymentDto findById(final Integer paymentId); - PaymentDto save(final PaymentDto paymentDto); - PaymentDto update(final PaymentDto paymentDto); - void deleteById(final Integer paymentId); - -} diff --git a/payment-service/src/main/java/com/selimhorri/app/service/impl/PaymentServiceImpl.java b/payment-service/src/main/java/com/selimhorri/app/service/impl/PaymentServiceImpl.java deleted file mode 100644 index d14d6f0d9..000000000 --- a/payment-service/src/main/java/com/selimhorri/app/service/impl/PaymentServiceImpl.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.PaymentDto; -import com.selimhorri.app.exception.wrapper.PaymentNotFoundException; -import com.selimhorri.app.helper.PaymentMappingHelper; -import com.selimhorri.app.repository.PaymentRepository; -import com.selimhorri.app.service.PaymentService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class PaymentServiceImpl implements PaymentService { - - private final PaymentRepository paymentRepository; - private final RestTemplate restTemplate; - - @Override - public List findAll() { - log.info("*** PaymentDto List, service; fetch all payments *"); - return this.paymentRepository.findAll() - .stream() - .map(PaymentMappingHelper::map) - .map(p -> { - p.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .ORDER_SERVICE_API_URL + "/" + p.getOrderDto().getOrderId(), OrderDto.class)); - return p; - }) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public PaymentDto findById(final Integer paymentId) { - log.info("*** PaymentDto, service; fetch payment by id *"); - return this.paymentRepository.findById(paymentId) - .map(PaymentMappingHelper::map) - .map(p -> { - p.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .ORDER_SERVICE_API_URL + "/" + p.getOrderDto().getOrderId(), OrderDto.class)); - return p; - }) - .orElseThrow(() -> new PaymentNotFoundException(String.format("Payment with id: %d not found", paymentId))); - } - - @Override - public PaymentDto save(final PaymentDto paymentDto) { - log.info("*** PaymentDto, service; save payment *"); - return PaymentMappingHelper.map(this.paymentRepository - .save(PaymentMappingHelper.map(paymentDto))); - } - - @Override - public PaymentDto update(final PaymentDto paymentDto) { - log.info("*** PaymentDto, service; update payment *"); - return PaymentMappingHelper.map(this.paymentRepository - .save(PaymentMappingHelper.map(paymentDto))); - } - - @Override - public void deleteById(final Integer paymentId) { - log.info("*** Void, service; delete payment by id *"); - this.paymentRepository.deleteById(paymentId); - } - - - -} - - - - - - - - - diff --git a/payment-service/src/main/resources/application-dev.yml b/payment-service/src/main/resources/application-dev.yml deleted file mode 100644 index 3aedacf69..000000000 --- a/payment-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,47 +0,0 @@ - -server: - port: 8400 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/payment-service/src/main/resources/application-prod.yml b/payment-service/src/main/resources/application-prod.yml deleted file mode 100644 index be3e5eeb8..000000000 --- a/payment-service/src/main/resources/application-prod.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8400 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - diff --git a/payment-service/src/main/resources/application-stage.yml b/payment-service/src/main/resources/application-stage.yml deleted file mode 100644 index 9ab5e1c93..000000000 --- a/payment-service/src/main/resources/application-stage.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8400 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/payment-service/src/main/resources/application.yml b/payment-service/src/main/resources/application.yml deleted file mode 100644 index 8a8521980..000000000 --- a/payment-service/src/main/resources/application.yml +++ /dev/null @@ -1,63 +0,0 @@ - -server: - servlet: - context-path: /payment-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: PAYMENT-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - paymentService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - -spring: - cloud: - loadbalancer: - ribbon: - enabled: false - cache: - enabled: false # Deshabilita el caché temporalmente para debugging - -eureka: - instance: - prefer-ip-address: true - instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} - client: - service-url: - defaultZone: http://service-discovery-container:8761/eureka/ - registry-fetch-interval-seconds: 5 # Más frecuente para testing - instance-info-replication-interval-seconds: 5 - - - - - - - - diff --git a/payment-service/src/main/resources/db/migration/V1__create_payments_table.sql b/payment-service/src/main/resources/db/migration/V1__create_payments_table.sql deleted file mode 100644 index d41db4dbd..000000000 --- a/payment-service/src/main/resources/db/migration/V1__create_payments_table.sql +++ /dev/null @@ -1,10 +0,0 @@ - -CREATE TABLE payments ( - payment_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - order_id INT(11), - is_payed BOOLEAN, - payment_status VARCHAR(255), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - diff --git a/payment-service/src/main/resources/db/migration/V2__insert_payments_table.sql b/payment-service/src/main/resources/db/migration/V2__insert_payments_table.sql deleted file mode 100644 index 3d03177e4..000000000 --- a/payment-service/src/main/resources/db/migration/V2__insert_payments_table.sql +++ /dev/null @@ -1,8 +0,0 @@ - -INSERT INTO payments -(order_id, is_payed, payment_status) VALUES -(1, false, 'IN_PROGRESS'), -(2, false, 'IN_PROGRESS'), -(3, false, 'IN_PROGRESS'), -(4, false, 'IN_PROGRESS'); - diff --git a/payment-service/src/test/java/com/selimhorri/app/PaymentServiceApplicationTests.java b/payment-service/src/test/java/com/selimhorri/app/PaymentServiceApplicationTests.java deleted file mode 100644 index af8d26f2d..000000000 --- a/payment-service/src/test/java/com/selimhorri/app/PaymentServiceApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class PaymentServiceApplicationTests { - - - -} - - - - - - diff --git a/payment-service/system.properties b/payment-service/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/payment-service/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 27151c5b4..000000000 --- a/pom.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.5.7 - - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - ecommerce-microservice-backend - Ecommerce backend implemented in Spring Boot and Spring Cloud! - pom - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.cloud - spring-cloud-starter-circuitbreaker-resilience4j - - - io.micrometer - micrometer-registry-prometheus - - - org.springframework.cloud - spring-cloud-sleuth-zipkin - - - org.springframework.cloud - spring-cloud-starter-sleuth - - - org.springframework.boot - spring-boot-devtools - runtime - true - - - org.springframework.boot - spring-boot-configuration-processor - true - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - org.springdoc - springdoc-openapi-ui - 1.6.3 - - - org.springframework.boot - spring-boot-starter-test - test - - - org.testcontainers - junit-jupiter - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - service-discovery - cloud-config - api-gateway - proxy-client - user-service - product-service - favourite-service - order-service - shipping-service - payment-service - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - ${project.artifactId}-v${project.version} - - - - - - - diff --git a/product-service/.gitignore b/product-service/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/product-service/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/product-service/.mvn/wrapper/MavenWrapperDownloader.java b/product-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/product-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/product-service/.mvn/wrapper/maven-wrapper.jar b/product-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 zcmbTd1CVCTmM+|7+wQV$+qP}n>auOywyU~q+qUhh+uxis_~*a##hm*_WW?9E7Pb7N%LRFiwbEGCJ0XP=%-6oeT$XZcYgtzC2~q zk(K08IQL8oTl}>>+hE5YRgXTB@fZ4TH9>7=79e`%%tw*SQUa9~$xKD5rS!;ZG@ocK zQdcH}JX?W|0_Afv?y`-NgLum62B&WSD$-w;O6G0Sm;SMX65z)l%m1e-g8Q$QTI;(Q z+x$xth4KFvH@Bs6(zn!iF#nenk^Y^ce;XIItAoCsow38eq?Y-Auh!1in#Rt-_D>H^ z=EjbclGGGa6VnaMGmMLj`x3NcwA43Jb(0gzl;RUIRAUDcR1~99l2SAPkVhoRMMtN} zXvC<tOmX83grD8GSo_Lo?%lNfhD#EBgPo z*nf@ppMC#B!T)Ae0RG$mlJWmGl7CkuU~B8-==5i;rS;8i6rJ=PoQxf446XDX9g|c> zU64ePyMlsI^V5Jq5A+BPe#e73+kpc_r1tv#B)~EZ;7^67F0*QiYfrk0uVW;Qb=NsG zN>gsuCwvb?s-KQIppEaeXtEMdc9dy6Dfduz-tMTms+i01{eD9JE&h?Kht*$eOl#&L zJdM_-vXs(V#$Ed;5wyNWJdPNh+Z$+;$|%qR(t`4W@kDhd*{(7-33BOS6L$UPDeE_53j${QfKN-0v-HG z(QfyvFNbwPK%^!eIo4ac1;b>c0vyf9}Xby@YY!lkz-UvNp zwj#Gg|4B~?n?G^{;(W;|{SNoJbHTMpQJ*Wq5b{l9c8(%?Kd^1?H1om1de0Da9M;Q=n zUfn{f87iVb^>Exl*nZ0hs(Yt>&V9$Pg`zX`AI%`+0SWQ4Zc(8lUDcTluS z5a_KerZWe}a-MF9#Cd^fi!y3%@RFmg&~YnYZ6<=L`UJ0v={zr)>$A;x#MCHZy1st7 ztT+N07NR+vOwSV2pvWuN1%lO!K#Pj0Fr>Q~R40{bwdL%u9i`DSM4RdtEH#cW)6}+I-eE< z&tZs+(Ogu(H_;$a$!7w`MH0r%h&@KM+<>gJL@O~2K2?VrSYUBbhCn#yy?P)uF3qWU z0o09mIik+kvzV6w>vEZy@&Mr)SgxPzUiDA&%07m17udz9usD82afQEps3$pe!7fUf z0eiidkJ)m3qhOjVHC_M(RYCBO%CZKZXFb8}s0-+}@CIn&EF(rRWUX2g^yZCvl0bI} zbP;1S)iXnRC&}5-Tl(hASKqdSnO?ASGJ*MIhOXIblmEudj(M|W!+I3eDc}7t`^mtg z)PKlaXe(OH+q-)qcQ8a@!llRrpGI8DsjhoKvw9T;TEH&?s=LH0w$EzI>%u;oD@x83 zJL7+ncjI9nn!TlS_KYu5vn%f*@qa5F;| zEFxY&B?g=IVlaF3XNm_03PA)=3|{n-UCgJoTr;|;1AU9|kPE_if8!Zvb}0q$5okF$ zHaJdmO&gg!9oN|M{!qGE=tb|3pVQ8PbL$}e;NgXz<6ZEggI}wO@aBP**2Wo=yN#ZC z4G$m^yaM9g=|&!^ft8jOLuzc3Psca*;7`;gnHm}tS0%f4{|VGEwu45KptfNmwxlE~ z^=r30gi@?cOm8kAz!EylA4G~7kbEiRlRIzwrb~{_2(x^$-?|#e6Bi_**(vyr_~9Of z!n>Gqf+Qwiu!xhi9f53=PM3`3tNF}pCOiPU|H4;pzjcsqbwg*{{kyrTxk<;mx~(;; z1NMrpaQ`57yn34>Jo3b|HROE(UNcQash!0p2-!Cz;{IRv#Vp5!3o$P8!%SgV~k&Hnqhp`5eLjTcy93cK!3Hm-$`@yGnaE=?;*2uSpiZTs_dDd51U%i z{|Zd9ou-;laGS_x=O}a+ zB||za<795A?_~Q=r=coQ+ZK@@ zId~hWQL<%)fI_WDIX#=(WNl!Dm$a&ROfLTd&B$vatq!M-2Jcs;N2vps$b6P1(N}=oI3<3luMTmC|0*{ zm1w8bt7vgX($!0@V0A}XIK)w!AzUn7vH=pZEp0RU0p?}ch2XC-7r#LK&vyc2=-#Q2 z^L%8)JbbcZ%g0Du;|8=q8B>X=mIQirpE=&Ox{TiuNDnOPd-FLI^KfEF729!!0x#Es z@>3ursjFSpu%C-8WL^Zw!7a0O-#cnf`HjI+AjVCFitK}GXO`ME&on|^=~Zc}^LBp9 zj=-vlN;Uc;IDjtK38l7}5xxQF&sRtfn4^TNtnzXv4M{r&ek*(eNbIu!u$>Ed%` z5x7+&)2P&4>0J`N&ZP8$vcR+@FS0126s6+Jx_{{`3ZrIMwaJo6jdrRwE$>IU_JTZ} z(||hyyQ)4Z1@wSlT94(-QKqkAatMmkT7pCycEB1U8KQbFX&?%|4$yyxCtm3=W`$4fiG0WU3yI@c zx{wfmkZAYE_5M%4{J-ygbpH|(|GD$2f$3o_Vti#&zfSGZMQ5_f3xt6~+{RX=$H8at z?GFG1Tmp}}lmm-R->ve*Iv+XJ@58p|1_jRvfEgz$XozU8#iJS})UM6VNI!3RUU!{5 zXB(+Eqd-E;cHQ>)`h0(HO_zLmzR3Tu-UGp;08YntWwMY-9i^w_u#wR?JxR2bky5j9 z3Sl-dQQU$xrO0xa&>vsiK`QN<$Yd%YXXM7*WOhnRdSFt5$aJux8QceC?lA0_if|s> ze{ad*opH_kb%M&~(~&UcX0nFGq^MqjxW?HJIP462v9XG>j(5Gat_)#SiNfahq2Mz2 zU`4uV8m$S~o9(W>mu*=h%Gs(Wz+%>h;R9Sg)jZ$q8vT1HxX3iQnh6&2rJ1u|j>^Qf`A76K%_ubL`Zu?h4`b=IyL>1!=*%!_K)=XC z6d}4R5L+sI50Q4P3upXQ3Z!~1ZXLlh!^UNcK6#QpYt-YC=^H=EPg3)z*wXo*024Q4b2sBCG4I# zlTFFY=kQ>xvR+LsuDUAk)q%5pEcqr(O_|^spjhtpb1#aC& zghXzGkGDC_XDa%t(X`E+kvKQ4zrQ*uuQoj>7@@ykWvF332)RO?%AA&Fsn&MNzmFa$ zWk&&^=NNjxLjrli_8ESU)}U|N{%j&TQmvY~lk!~Jh}*=^INA~&QB9em!in_X%Rl1&Kd~Z(u z9mra#<@vZQlOY+JYUwCrgoea4C8^(xv4ceCXcejq84TQ#sF~IU2V}LKc~Xlr_P=ry zl&Hh0exdCbVd^NPCqNNlxM3vA13EI8XvZ1H9#bT7y*U8Y{H8nwGpOR!e!!}*g;mJ#}T{ekSb}5zIPmye*If(}}_=PcuAW#yidAa^9-`<8Gr0 z)Fz=NiZ{)HAvw{Pl5uu)?)&i&Us$Cx4gE}cIJ}B4Xz~-q7)R_%owbP!z_V2=Aq%Rj z{V;7#kV1dNT9-6R+H}}(ED*_!F=~uz>&nR3gb^Ce%+0s#u|vWl<~JD3MvS0T9thdF zioIG3c#Sdsv;LdtRv3ml7%o$6LTVL>(H`^@TNg`2KPIk*8-IB}X!MT0`hN9Ddf7yN z?J=GxPL!uJ7lqwowsl?iRrh@#5C$%E&h~Z>XQcvFC*5%0RN-Opq|=IwX(dq(*sjs+ zqy99+v~m|6T#zR*e1AVxZ8djd5>eIeCi(b8sUk)OGjAsKSOg^-ugwl2WSL@d#?mdl zib0v*{u-?cq}dDGyZ%$XRY=UkQwt2oGu`zQneZh$=^! zj;!pCBWQNtvAcwcWIBM2y9!*W|8LmQy$H~5BEx)78J`4Z0(FJO2P^!YyQU{*Al+fs z){!4JvT1iLrJ8aU3k0t|P}{RN)_^v%$$r;+p0DY7N8CXzmS*HB*=?qaaF9D@#_$SN zSz{moAK<*RH->%r7xX~9gVW$l7?b|_SYI)gcjf0VAUJ%FcQP(TpBs; zg$25D!Ry_`8xpS_OJdeo$qh#7U+cepZ??TII7_%AXsT$B z=e)Bx#v%J0j``00Zk5hsvv6%T^*xGNx%KN-=pocSoqE5_R)OK%-Pbu^1MNzfds)mL zxz^F4lDKV9D&lEY;I+A)ui{TznB*CE$=9(wgE{m}`^<--OzV-5V4X2w9j(_!+jpTr zJvD*y6;39&T+==$F&tsRKM_lqa1HC}aGL0o`%c9mO=fts?36@8MGm7Vi{Y z^<7m$(EtdSr#22<(rm_(l_(`j!*Pu~Y>>xc>I9M#DJYDJNHO&4=HM%YLIp?;iR&$m z#_$ZWYLfGLt5FJZhr3jpYb`*%9S!zCG6ivNHYzNHcI%khtgHBliM^Ou}ZVD7ehU9 zS+W@AV=?Ro!=%AJ>Kcy9aU3%VX3|XM_K0A+ZaknKDyIS3S-Hw1C7&BSW5)sqj5Ye_ z4OSW7Yu-;bCyYKHFUk}<*<(@TH?YZPHr~~Iy%9@GR2Yd}J2!N9K&CN7Eq{Ka!jdu; zQNB*Y;i(7)OxZK%IHGt#Rt?z`I|A{q_BmoF!f^G}XVeTbe1Wnzh%1g>j}>DqFf;Rp zz7>xIs12@Ke0gr+4-!pmFP84vCIaTjqFNg{V`5}Rdt~xE^I;Bxp4)|cs8=f)1YwHz zqI`G~s2~qqDV+h02b`PQpUE#^^Aq8l%y2|ByQeXSADg5*qMprEAE3WFg0Q39`O+i1 z!J@iV!`Y~C$wJ!5Z+j5$i<1`+@)tBG$JL=!*uk=2k;T<@{|s1$YL079FvK%mPhyHV zP8^KGZnp`(hVMZ;s=n~3r2y;LTwcJwoBW-(ndU-$03{RD zh+Qn$ja_Z^OuMf3Ub|JTY74s&Am*(n{J3~@#OJNYuEVVJd9*H%)oFoRBkySGm`hx! zT3tG|+aAkXcx-2Apy)h^BkOyFTWQVeZ%e2@;*0DtlG9I3Et=PKaPt&K zw?WI7S;P)TWED7aSH$3hL@Qde?H#tzo^<(o_sv_2ci<7M?F$|oCFWc?7@KBj-;N$P zB;q!8@bW-WJY9do&y|6~mEruZAVe$!?{)N9rZZxD-|oltkhW9~nR8bLBGXw<632!l z*TYQn^NnUy%Ds}$f^=yQ+BM-a5X4^GHF=%PDrRfm_uqC zh{sKwIu|O0&jWb27;wzg4w5uA@TO_j(1X?8E>5Zfma|Ly7Bklq|s z9)H`zoAGY3n-+&JPrT!>u^qg9Evx4y@GI4$n-Uk_5wttU1_t?6><>}cZ-U+&+~JE) zPlDbO_j;MoxdLzMd~Ew|1o^a5q_1R*JZ=#XXMzg?6Zy!^hop}qoLQlJ{(%!KYt`MK z8umEN@Z4w!2=q_oe=;QttPCQy3Nm4F@x>@v4sz_jo{4m*0r%J(w1cSo;D_hQtJs7W z><$QrmG^+<$4{d2bgGo&3-FV}avg9zI|Rr(k{wTyl3!M1q+a zD9W{pCd%il*j&Ft z5H$nENf>>k$;SONGW`qo6`&qKs*T z2^RS)pXk9b@(_Fw1bkb)-oqK|v}r$L!W&aXA>IpcdNZ_vWE#XO8X`#Yp1+?RshVcd zknG%rPd*4ECEI0wD#@d+3NbHKxl}n^Sgkx==Iu%}HvNliOqVBqG?P2va zQ;kRJ$J6j;+wP9cS za#m;#GUT!qAV%+rdWolk+)6kkz4@Yh5LXP+LSvo9_T+MmiaP-eq6_k;)i6_@WSJ zlT@wK$zqHu<83U2V*yJ|XJU4farT#pAA&@qu)(PO^8PxEmPD4;Txpio+2)#!9 z>&=i7*#tc0`?!==vk>s7V+PL#S1;PwSY?NIXN2=Gu89x(cToFm))7L;< z+bhAbVD*bD=}iU`+PU+SBobTQ%S!=VL!>q$rfWsaaV}Smz>lO9JXT#`CcH_mRCSf4%YQAw`$^yY z3Y*^Nzk_g$xn7a_NO(2Eb*I=^;4f!Ra#Oo~LLjlcjke*k*o$~U#0ZXOQ5@HQ&T46l z7504MUgZkz2gNP1QFN8Y?nSEnEai^Rgyvl}xZfMUV6QrJcXp;jKGqB=D*tj{8(_pV zqyB*DK$2lgYGejmJUW)*s_Cv65sFf&pb(Yz8oWgDtQ0~k^0-wdF|tj}MOXaN@ydF8 zNr={U?=;&Z?wr^VC+`)S2xl}QFagy;$mG=TUs7Vi2wws5zEke4hTa2)>O0U?$WYsZ z<8bN2bB_N4AWd%+kncgknZ&}bM~eDtj#C5uRkp21hWW5gxWvc6b*4+dn<{c?w9Rmf zIVZKsPl{W2vQAlYO3yh}-{Os=YBnL8?uN5(RqfQ=-1cOiUnJu>KcLA*tQK3FU`_bM zM^T28w;nAj5EdAXFi&Kk1Nnl2)D!M{@+D-}bIEe+Lc4{s;YJc-{F#``iS2uk;2!Zp zF9#myUmO!wCeJIoi^A+T^e~20c+c2C}XltaR!|U-HfDA=^xF97ev}$l6#oY z&-&T{egB)&aV$3_aVA51XGiU07$s9vubh_kQG?F$FycvS6|IO!6q zq^>9|3U^*!X_C~SxX&pqUkUjz%!j=VlXDo$!2VLH!rKj@61mDpSr~7B2yy{>X~_nc zRI+7g2V&k zd**H++P9dg!-AOs3;GM`(g<+GRV$+&DdMVpUxY9I1@uK28$az=6oaa+PutlO9?6#? zf-OsgT>^@8KK>ggkUQRPPgC7zjKFR5spqQb3ojCHzj^(UH~v+!y*`Smv)VpVoPwa6 zWG18WJaPKMi*F6Zdk*kU^`i~NNTfn3BkJniC`yN98L-Awd)Z&mY? zprBW$!qL-OL7h@O#kvYnLsfff@kDIegt~?{-*5A7JrA;#TmTe?jICJqhub-G@e??D zqiV#g{)M!kW1-4SDel7TO{;@*h2=_76g3NUD@|c*WO#>MfYq6_YVUP+&8e4|%4T`w zXzhmVNziAHazWO2qXcaOu@R1MrPP{t)`N)}-1&~mq=ZH=w=;-E$IOk=y$dOls{6sRR`I5>|X zpq~XYW4sd;J^6OwOf**J>a7u$S>WTFPRkjY;BfVgQst)u4aMLR1|6%)CB^18XCz+r ztkYQ}G43j~Q&1em(_EkMv0|WEiKu;z2zhb(L%$F&xWwzOmk;VLBYAZ8lOCziNoPw1 zv2BOyXA`A8z^WH!nXhKXM`t0;6D*-uGds3TYGrm8SPnJJOQ^fJU#}@aIy@MYWz**H zvkp?7I5PE{$$|~{-ZaFxr6ZolP^nL##mHOErB^AqJqn^hFA=)HWj!m3WDaHW$C)i^ z9@6G$SzB=>jbe>4kqr#sF7#K}W*Cg-5y6kun3u&0L7BpXF9=#7IN8FOjWrWwUBZiU zT_se3ih-GBKx+Uw0N|CwP3D@-C=5(9T#BH@M`F2!Goiqx+Js5xC92|Sy0%WWWp={$(am!#l~f^W_oz78HX<0X#7 zp)p1u~M*o9W@O8P{0Qkg@Wa# z2{Heb&oX^CQSZWSFBXKOfE|tsAm#^U-WkDnU;IowZ`Ok4!mwHwH=s|AqZ^YD4!5!@ zPxJj+Bd-q6w_YG`z_+r;S86zwXb+EO&qogOq8h-Ect5(M2+>(O7n7)^dP*ws_3U6v zVsh)sk^@*c>)3EML|0<-YROho{lz@Nd4;R9gL{9|64xVL`n!m$-Jjrx?-Bacp!=^5 z1^T^eB{_)Y<9)y{-4Rz@9_>;_7h;5D+@QcbF4Wv7hu)s0&==&6u)33 zHRj+&Woq-vDvjwJCYES@$C4{$?f$Ibi4G()UeN11rgjF+^;YE^5nYprYoJNoudNj= zm1pXSeG64dcWHObUetodRn1Fw|1nI$D9z}dVEYT0lQnsf_E1x2vBLql7NrHH!n&Sq z6lc*mvU=WS6=v9Lrl}&zRiu_6u;6g%_DU{9b+R z#YHqX7`m9eydf?KlKu6Sb%j$%_jmydig`B*TN`cZL-g!R)iE?+Q5oOqBFKhx z%MW>BC^(F_JuG(ayE(MT{S3eI{cKiwOtPwLc0XO*{*|(JOx;uQOfq@lp_^cZo=FZj z4#}@e@dJ>Bn%2`2_WPeSN7si^{U#H=7N4o%Dq3NdGybrZgEU$oSm$hC)uNDC_M9xc zGzwh5Sg?mpBIE8lT2XsqTt3j3?We8}3bzLBTQd639vyg^$0#1epq8snlDJP2(BF)K zSx30RM+{f+b$g{9usIL8H!hCO117Xgv}ttPJm9wVRjPk;ePH@zxv%j9k5`TzdXLeT zFgFX`V7cYIcBls5WN0Pf6SMBN+;CrQ(|EsFd*xtwr#$R{Z9FP`OWtyNsq#mCgZ7+P z^Yn$haBJ)r96{ZJd8vlMl?IBxrgh=fdq_NF!1{jARCVz>jNdC)H^wfy?R94#MPdUjcYX>#wEx+LB#P-#4S-%YH>t-j+w zOFTI8gX$ard6fAh&g=u&56%3^-6E2tpk*wx3HSCQ+t7+*iOs zPk5ysqE}i*cQocFvA68xHfL|iX(C4h*67@3|5Qwle(8wT&!&{8*{f%0(5gH+m>$tq zp;AqrP7?XTEooYG1Dzfxc>W%*CyL16q|fQ0_jp%%Bk^k!i#Nbi(N9&T>#M{gez_Ws zYK=l}adalV(nH}I_!hNeb;tQFk3BHX7N}}R8%pek^E`X}%ou=cx8InPU1EE0|Hen- zyw8MoJqB5=)Z%JXlrdTXAE)eqLAdVE-=>wGHrkRet}>3Yu^lt$Kzu%$3#(ioY}@Gu zjk3BZuQH&~7H+C*uX^4}F*|P89JX;Hg2U!pt>rDi(n(Qe-c}tzb0#6_ItoR0->LSt zR~UT<-|@TO%O`M+_e_J4wx7^)5_%%u+J=yF_S#2Xd?C;Ss3N7KY^#-vx+|;bJX&8r zD?|MetfhdC;^2WG`7MCgs>TKKN=^=!x&Q~BzmQio_^l~LboTNT=I zC5pme^P@ER``p$2md9>4!K#vV-Fc1an7pl>_|&>aqP}+zqR?+~Z;f2^`a+-!Te%V? z;H2SbF>jP^GE(R1@%C==XQ@J=G9lKX+Z<@5}PO(EYkJh=GCv#)Nj{DkWJM2}F&oAZ6xu8&g7pn1ps2U5srwQ7CAK zN&*~@t{`31lUf`O;2w^)M3B@o)_mbRu{-`PrfNpF!R^q>yTR&ETS7^-b2*{-tZAZz zw@q5x9B5V8Qd7dZ!Ai$9hk%Q!wqbE1F1c96&zwBBaRW}(^axoPpN^4Aw}&a5dMe+*Gomky_l^54*rzXro$ z>LL)U5Ry>~FJi=*{JDc)_**c)-&faPz`6v`YU3HQa}pLtb5K)u%K+BOqXP0)rj5Au$zB zW1?vr?mDv7Fsxtsr+S6ucp2l#(4dnr9sD*v+@*>g#M4b|U?~s93>Pg{{a5|rm2xfI z`>E}?9S@|IoUX{Q1zjm5YJT|3S>&09D}|2~BiMo=z4YEjXlWh)V&qs;*C{`UMxp$9 zX)QB?G$fPD6z5_pNs>Jeh{^&U^)Wbr?2D6-q?)`*1k@!UvwQgl8eG$r+)NnFoT)L6 zg7lEh+E6J17krfYJCSjWzm67hEth24pomhz71|Qodn#oAILN)*Vwu2qpJirG)4Wnv}9GWOFrQg%Je+gNrPl8mw7ykE8{ z=|B4+uwC&bpp%eFcRU6{mxRV32VeH8XxX>v$du<$(DfinaaWxP<+Y97Z#n#U~V zVEu-GoPD=9$}P;xv+S~Ob#mmi$JQmE;Iz4(){y*9pFyW-jjgdk#oG$fl4o9E8bo|L zWjo4l%n51@Kz-n%zeSCD`uB?T%FVk+KBI}=ve zvlcS#wt`U6wrJo}6I6Rwb=1GzZfwE=I&Ne@p7*pH84XShXYJRgvK)UjQL%R9Zbm(m zxzTQsLTON$WO7vM)*vl%Pc0JH7WhP;$z@j=y#avW4X8iqy6mEYr@-}PW?H)xfP6fQ z&tI$F{NNct4rRMSHhaelo<5kTYq+(?pY)Ieh8*sa83EQfMrFupMM@nfEV@EmdHUv9 z35uzIrIuo4#WnF^_jcpC@uNNaYTQ~uZWOE6P@LFT^1@$o&q+9Qr8YR+ObBkpP9=F+$s5+B!mX2~T zAuQ6RenX?O{IlLMl1%)OK{S7oL}X%;!XUxU~xJN8xk z`xywS*naF(J#?vOpB(K=o~lE;m$zhgPWDB@=p#dQIW>xe_p1OLoWInJRKbEuoncf; zmS1!u-ycc1qWnDg5Nk2D)BY%jmOwCLC+Ny>`f&UxFowIsHnOXfR^S;&F(KXd{ODlm z$6#1ccqt-HIH9)|@fHnrKudu!6B$_R{fbCIkSIb#aUN|3RM>zuO>dpMbROZ`^hvS@ z$FU-;e4W}!ubzKrU@R*dW*($tFZ>}dd*4_mv)#O>X{U@zSzQt*83l9mI zI$8O<5AIDx`wo0}f2fsPC_l>ONx_`E7kdXu{YIZbp1$(^oBAH({T~&oQ&1{X951QW zmhHUxd)t%GQ9#ak5fTjk-cahWC;>^Rg7(`TVlvy0W@Y!Jc%QL3Ozu# zDPIqBCy&T2PWBj+d-JA-pxZlM=9ja2ce|3B(^VCF+a*MMp`(rH>Rt6W1$;r{n1(VK zLs>UtkT43LR2G$AOYHVailiqk7naz2yZGLo*xQs!T9VN5Q>eE(w zw$4&)&6xIV$IO^>1N-jrEUg>O8G4^@y+-hQv6@OmF@gy^nL_n1P1-Rtyy$Bl;|VcV zF=p*&41-qI5gG9UhKmmnjs932!6hceXa#-qfK;3d*a{)BrwNFeKU|ge?N!;zk+kB! zMD_uHJR#%b54c2tr~uGPLTRLg$`fupo}cRJeTwK;~}A>(Acy4k-Xk&Aa1&eWYS1ULWUj@fhBiWY$pdfy+F z@G{OG{*v*mYtH3OdUjwEr6%_ZPZ3P{@rfbNPQG!BZ7lRyC^xlMpWH`@YRar`tr}d> z#wz87t?#2FsH-jM6m{U=gp6WPrZ%*w0bFm(T#7m#v^;f%Z!kCeB5oiF`W33W5Srdt zdU?YeOdPG@98H7NpI{(uN{FJdu14r(URPH^F6tOpXuhU7T9a{3G3_#Ldfx_nT(Hec zo<1dyhsVsTw;ZkVcJ_0-h-T3G1W@q)_Q30LNv)W?FbMH+XJ* zy=$@39Op|kZv`Rt>X`zg&at(?PO^I=X8d9&myFEx#S`dYTg1W+iE?vt#b47QwoHI9 zNP+|3WjtXo{u}VG(lLUaW0&@yD|O?4TS4dfJI`HC-^q;M(b3r2;7|FONXphw-%7~* z&;2!X17|05+kZOpQ3~3!Nb>O94b&ZSs%p)TK)n3m=4eiblVtSx@KNFgBY_xV6ts;NF;GcGxMP8OKV^h6LmSb2E#Qnw ze!6Mnz7>lE9u{AgQ~8u2zM8CYD5US8dMDX-5iMlgpE9m*s+Lh~A#P1er*rF}GHV3h z=`STo?kIXw8I<`W0^*@mB1$}pj60R{aJ7>C2m=oghKyxMbFNq#EVLgP0cH3q7H z%0?L93-z6|+jiN|@v>ix?tRBU(v-4RV`}cQH*fp|)vd3)8i9hJ3hkuh^8dz{F5-~_ zUUr1T3cP%cCaTooM8dj|4*M=e6flH0&8ve32Q)0dyisl))XkZ7Wg~N}6y`+Qi2l+e zUd#F!nJp{#KIjbQdI`%oZ`?h=5G^kZ_uN`<(`3;a!~EMsWV|j-o>c?x#;zR2ktiB! z);5rrHl?GPtr6-o!tYd|uK;Vbsp4P{v_4??=^a>>U4_aUXPWQ$FPLE4PK$T^3Gkf$ zHo&9$U&G`d(Os6xt1r?sg14n)G8HNyWa^q8#nf0lbr4A-Fi;q6t-`pAx1T*$eKM*$ z|CX|gDrk#&1}>5H+`EjV$9Bm)Njw&7-ZR{1!CJTaXuP!$Pcg69`{w5BRHysB$(tWUes@@6aM69kb|Lx$%BRY^-o6bjH#0!7b;5~{6J+jKxU!Kmi# zndh@+?}WKSRY2gZ?Q`{(Uj|kb1%VWmRryOH0T)f3cKtG4oIF=F7RaRnH0Rc_&372={_3lRNsr95%ZO{IX{p@YJ^EI%+gvvKes5cY+PE@unghjdY5#9A!G z70u6}?zmd?v+{`vCu-53_v5@z)X{oPC@P)iA3jK$`r zSA2a7&!^zmUiZ82R2=1cumBQwOJUPz5Ay`RLfY(EiwKkrx%@YN^^XuET;tE zmr-6~I7j!R!KrHu5CWGSChO6deaLWa*9LLJbcAJsFd%Dy>a!>J`N)Z&oiU4OEP-!Ti^_!p}O?7`}i7Lsf$-gBkuY*`Zb z7=!nTT;5z$_5$=J=Ko+Cp|Q0J=%oFr>hBgnL3!tvFoLNhf#D0O=X^h+x08iB;@8pXdRHxX}6R4k@i6%vmsQwu^5z zk1ip`#^N)^#Lg#HOW3sPI33xqFB4#bOPVnY%d6prwxf;Y-w9{ky4{O6&94Ra8VN@K zb-lY;&`HtxW@sF!doT5T$2&lIvJpbKGMuDAFM#!QPXW87>}=Q4J3JeXlwHys?!1^#37q_k?N@+u&Ns20pEoBeZC*np;i;M{2C0Z4_br2gsh6eL z#8`#sn41+$iD?^GL%5?cbRcaa-Nx0vE(D=*WY%rXy3B%gNz0l?#noGJGP728RMY#q z=2&aJf@DcR?QbMmN)ItUe+VM_U!ryqA@1VVt$^*xYt~-qvW!J4Tp<-3>jT=7Zow5M z8mSKp0v4b%a8bxFr>3MwZHSWD73D@+$5?nZAqGM#>H@`)mIeC#->B)P8T$zh-Pxnc z8)~Zx?TWF4(YfKuF3WN_ckpCe5;x4V4AA3(i$pm|78{%!q?|~*eH0f=?j6i)n~Hso zmTo>vqEtB)`%hP55INf7HM@taH)v`Fw40Ayc*R!T?O{ziUpYmP)AH`euTK!zg9*6Z z!>M=$3pd0!&TzU=hc_@@^Yd3eUQpX4-33}b{?~5t5lgW=ldJ@dUAH%`l5US1y_`40 zs(X`Qk}vvMDYYq+@Rm+~IyCX;iD~pMgq^KY)T*aBz@DYEB={PxA>)mI6tM*sx-DmGQHEaHwRrAmNjO!ZLHO4b;;5mf@zzlPhkP($JeZGE7 z?^XN}Gf_feGoG~BjUgVa*)O`>lX=$BSR2)uD<9 z>o^|nb1^oVDhQbfW>>!;8-7<}nL6L^V*4pB=>wwW+RXAeRvKED(n1;R`A6v$6gy0I(;Vf?!4;&sgn7F%LpM}6PQ?0%2Z@b{It<(G1CZ|>913E0nR2r^Pa*Bp z@tFGi*CQ~@Yc-?{cwu1 zsilf=k^+Qs>&WZG(3WDixisHpR>`+ihiRwkL(3T|=xsoNP*@XX3BU8hr57l3k;pni zI``=3Nl4xh4oDj<%>Q1zYXHr%Xg_xrK3Nq?vKX3|^Hb(Bj+lONTz>4yhU-UdXt2>j z<>S4NB&!iE+ao{0Tx^N*^|EZU;0kJkx@zh}S^P{ieQjGl468CbC`SWnwLRYYiStXm zOxt~Rb3D{dz=nHMcY)#r^kF8|q8KZHVb9FCX2m^X*(|L9FZg!5a7((!J8%MjT$#Fs)M1Pb zq6hBGp%O1A+&%2>l0mpaIzbo&jc^!oN^3zxap3V2dNj3x<=TwZ&0eKX5PIso9j1;e zwUg+C&}FJ`k(M|%%}p=6RPUq4sT3-Y;k-<68ciZ~_j|bt>&9ZLHNVrp#+pk}XvM{8 z`?k}o-!if>hVlCP9j%&WI2V`5SW)BCeR5>MQhF)po=p~AYN%cNa_BbV6EEh_kk^@a zD>4&>uCGCUmyA-c)%DIcF4R6!>?6T~Mj_m{Hpq`*(wj>foHL;;%;?(((YOxGt)Bhx zuS+K{{CUsaC++%}S6~CJ=|vr(iIs-je)e9uJEU8ZJAz)w166q)R^2XI?@E2vUQ!R% zn@dxS!JcOimXkWJBz8Y?2JKQr>`~SmE2F2SL38$SyR1^yqj8_mkBp)o$@+3BQ~Mid z9U$XVqxX3P=XCKj0*W>}L0~Em`(vG<>srF8+*kPrw z20{z(=^w+ybdGe~Oo_i|hYJ@kZl*(9sHw#Chi&OIc?w`nBODp?ia$uF%Hs(X>xm?j zqZQ`Ybf@g#wli`!-al~3GWiE$K+LCe=Ndi!#CVjzUZ z!sD2O*;d28zkl))m)YN7HDi^z5IuNo3^w(zy8 zszJG#mp#Cj)Q@E@r-=NP2FVxxEAeOI2e=|KshybNB6HgE^(r>HD{*}S}mO>LuRGJT{*tfTzw_#+er-0${}%YPe@CMJ1Ng#j#)i)SnY@ss3gL;g zg2D~#Kpdfu#G;q1qz_TwSz1VJT(b3zby$Vk&;Y#1(A)|xj`_?i5YQ;TR%jice5E;0 zYHg;`zS5{S*9xI6o^j>rE8Ua*XhIw{_-*&@(R|C(am8__>+Ws&Q^ymy*X4~hR2b5r zm^p3sw}yv=tdyncy_Ui7{BQS732et~Z_@{-IhHDXAV`(Wlay<#hb>%H%WDi+K$862nA@BDtM#UCKMu+kM`!JHyWSi?&)A7_ z3{cyNG%a~nnH_!+;g&JxEMAmh-Z}rC!o7>OVzW&PoMyTA_g{hqXG)SLraA^OP**<7 zjWbr7z!o2n3hnx7A=2O=WL;`@9N{vQIM@&|G-ljrPvIuJHYtss0Er0fT5cMXNUf1B z7FAwBDixt0X7C3S)mPe5g`YtME23wAnbU)+AtV}z+e8G;0BP=bI;?(#|Ep!vVfDbK zvx+|CKF>yt0hWQ3drchU#XBU+HiuG*V^snFAPUp-5<#R&BUAzoB!aZ+e*KIxa26V}s6?nBK(U-7REa573wg-jqCg>H8~>O{ z*C0JL-?X-k_y%hpUFL?I>0WV{oV`Nb)nZbJG01R~AG>flIJf)3O*oB2i8~;!P?Wo_ z0|QEB*fifiL6E6%>tlAYHm2cjTFE@*<);#>689Z6S#BySQ@VTMhf9vYQyLeDg1*F} zjq>i1*x>5|CGKN{l9br3kB0EHY|k4{%^t7-uhjd#NVipUZa=EUuE5kS1_~qYX?>hJ z$}!jc9$O$>J&wnu0SgfYods^z?J4X;X7c77Me0kS-dO_VUQ39T(Kv(Y#s}Qqz-0AH z^?WRL(4RzpkD+T5FG_0NyPq-a-B7A5LHOCqwObRJi&oRi(<;OuIN7SV5PeHU$<@Zh zPozEV`dYmu0Z&Tqd>t>8JVde9#Pt+l95iHe$4Xwfy1AhI zDM4XJ;bBTTvRFtW>E+GzkN)9k!hA5z;xUOL2 zq4}zn-DP{qc^i|Y%rvi|^5k-*8;JZ~9a;>-+q_EOX+p1Wz;>i7c}M6Nv`^NY&{J-> z`(mzDJDM}QPu5i44**2Qbo(XzZ-ZDu%6vm8w@DUarqXj41VqP~ zs&4Y8F^Waik3y1fQo`bVUH;b=!^QrWb)3Gl=QVKr+6sxc=ygauUG|cm?|X=;Q)kQ8 zM(xrICifa2p``I7>g2R~?a{hmw@{!NS5`VhH8+;cV(F>B94M*S;5#O`YzZH1Z%yD? zZ61w(M`#aS-*~Fj;x|J!KM|^o;MI#Xkh0ULJcA?o4u~f%Z^16ViA27FxU5GM*rKq( z7cS~MrZ=f>_OWx8j#-Q3%!aEU2hVuTu(7`TQk-Bi6*!<}0WQi;_FpO;fhpL4`DcWp zGOw9vx0N~6#}lz(r+dxIGZM3ah-8qrqMmeRh%{z@dbUD2w15*_4P?I~UZr^anP}DB zU9CCrNiy9I3~d#&!$DX9e?A});BjBtQ7oGAyoI$8YQrkLBIH@2;lt4E^)|d6Jwj}z z&2_E}Y;H#6I4<10d_&P0{4|EUacwFHauvrjAnAm6yeR#}f}Rk27CN)vhgRqEyPMMS7zvunj2?`f;%?alsJ+-K+IzjJx>h8 zu~m_y$!J5RWAh|C<6+uiCNsOKu)E72M3xKK(a9Okw3e_*O&}7llNV!=P87VM2DkAk zci!YXS2&=P0}Hx|wwSc9JP%m8dMJA*q&VFB0yMI@5vWoAGraygwn){R+Cj6B1a2Px z5)u(K5{+;z2n*_XD!+Auv#LJEM)(~Hx{$Yb^ldQmcYF2zNH1V30*)CN_|1$v2|`LnFUT$%-tO0Eg|c5$BB~yDfzS zcOXJ$wpzVK0MfTjBJ0b$r#_OvAJ3WRt+YOLlJPYMx~qp>^$$$h#bc|`g0pF-Ao43? z>*A+8lx>}L{p(Tni2Vvk)dtzg$hUKjSjXRagj)$h#8=KV>5s)J4vGtRn5kP|AXIz! zPgbbVxW{2o4s-UM;c#We8P&mPN|DW7_uLF!a|^0S=wr6Esx9Z$2|c1?GaupU6$tb| zY_KU`(_29O_%k(;>^|6*pZURH3`@%EuKS;Ns z1lujmf;r{qAN&Q0&m{wJSZ8MeE7RM5+Sq;ul_ z`+ADrd_Um+G37js6tKsArNB}n{p*zTUxQr>3@wA;{EUbjNjlNd6$Mx zg0|MyU)v`sa~tEY5$en7^PkC=S<2@!nEdG6L=h(vT__0F=S8Y&eM=hal#7eM(o^Lu z2?^;05&|CNliYrq6gUv;|i!(W{0N)LWd*@{2q*u)}u*> z7MQgk6t9OqqXMln?zoMAJcc zMKaof_Up})q#DzdF?w^%tTI7STI^@8=Wk#enR*)&%8yje>+tKvUYbW8UAPg55xb70 zEn5&Ba~NmOJlgI#iS8W3-@N%>V!#z-ZRwfPO1)dQdQkaHsiqG|~we2ALqG7Ruup(DqSOft2RFg_X%3w?6VqvV1uzX_@F(diNVp z4{I|}35=11u$;?|JFBEE*gb;T`dy+8gWJ9~pNsecrO`t#V9jW-6mnfO@ff9od}b(3s4>p0i30gbGIv~1@a^F2kl7YO;DxmF3? zWi-RoXhzRJV0&XE@ACc?+@6?)LQ2XNm4KfalMtsc%4!Fn0rl zpHTrHwR>t>7W?t!Yc{*-^xN%9P0cs0kr=`?bQ5T*oOo&VRRu+1chM!qj%2I!@+1XF z4GWJ=7ix9;Wa@xoZ0RP`NCWw0*8247Y4jIZ>GEW7zuoCFXl6xIvz$ezsWgKdVMBH> z{o!A7f;R-@eK9Vj7R40xx)T<2$?F2E<>Jy3F;;=Yt}WE59J!1WN367 zA^6pu_zLoZIf*x031CcwotS{L8bJE(<_F%j_KJ2P_IusaZXwN$&^t716W{M6X2r_~ zaiMwdISX7Y&Qi&Uh0upS3TyEIXNDICQlT5fHXC`aji-c{U(J@qh-mWl-uMN|T&435 z5)a1dvB|oe%b2mefc=Vpm0C%IUYYh7HI*;3UdgNIz}R##(#{(_>82|zB0L*1i4B5j-xi9O4x10rs_J6*gdRBX=@VJ+==sWb&_Qc6tSOowM{BX@(zawtjl zdU!F4OYw2@Tk1L^%~JCwb|e#3CC>srRHQ*(N%!7$Mu_sKh@|*XtR>)BmWw!;8-mq7 zBBnbjwx8Kyv|hd*`5}84flTHR1Y@@uqjG`UG+jN_YK&RYTt7DVwfEDXDW4U+iO{>K zw1hr{_XE*S*K9TzzUlJH2rh^hUm2v7_XjwTuYap|>zeEDY$HOq3X4Tz^X}E9z)x4F zs+T?Ed+Hj<#jY-`Va~fT2C$=qFT-5q$@p9~0{G&eeL~tiIAHXA!f6C(rAlS^)&k<- zXU|ZVs}XQ>s5iONo~t!XXZgtaP$Iau;JT%h)>}v54yut~pykaNye4axEK#5@?TSsQ zE;Jvf9I$GVb|S`7$pG)4vgo9NXsKr?u=F!GnA%VS2z$@Z(!MR9?EPcAqi5ft)Iz6sNl`%kj+_H-X`R<>BFrBW=fSlD|{`D%@Rcbu2?%>t7i34k?Ujb)2@J-`j#4 zLK<69qcUuniIan-$A1+fR=?@+thwDIXtF1Tks@Br-xY zfB+zblrR(ke`U;6U~-;p1Kg8Lh6v~LjW@9l2P6s+?$2!ZRPX`(ZkRGe7~q(4&gEi<$ch`5kQ?*1=GSqkeV z{SA1EaW_A!t{@^UY2D^YO0(H@+kFVzZaAh0_`A`f(}G~EP~?B|%gtxu&g%^x{EYSz zk+T;_c@d;+n@$<>V%P=nk36?L!}?*=vK4>nJSm+1%a}9UlmTJTrfX4{Lb7smNQn@T zw9p2%(Zjl^bWGo1;DuMHN(djsEm)P8mEC2sL@KyPjwD@d%QnZ$ zMJ3cnn!_!iP{MzWk%PI&D?m?C(y2d|2VChluN^yHya(b`h>~GkI1y;}O_E57zOs!{ zt2C@M$^PR2U#(dZmA-sNreB@z-yb0Bf7j*yONhZG=onhx>t4)RB`r6&TP$n zgmN*)eCqvgriBO-abHQ8ECN0bw?z5Bxpx z=jF@?zFdVn?@gD5egM4o$m`}lV(CWrOKKq(sv*`mNcHcvw&Xryfw<{ch{O&qc#WCTXX6=#{MV@q#iHYba!OUY+MGeNTjP%Fj!WgM&`&RlI^=AWTOqy-o zHo9YFt!gQ*p7{Fl86>#-JLZo(b^O`LdFK~OsZBRR@6P?ad^Ujbqm_j^XycM4ZHFyg ziUbIFW#2tj`65~#2V!4z7DM8Z;fG0|APaQ{a2VNYpNotB7eZ5kp+tPDz&Lqs0j%Y4tA*URpcfi z_M(FD=fRGdqf430j}1z`O0I=;tLu81bwJXdYiN7_&a-?ly|-j*+=--XGvCq#32Gh(=|qj5F?kmihk{%M&$}udW5)DHK zF_>}5R8&&API}o0osZJRL3n~>76nUZ&L&iy^s>PMnNcYZ|9*1$v-bzbT3rpWsJ+y{ zPrg>5Zlery96Um?lc6L|)}&{992{_$J&=4%nRp9BAC6!IB=A&=tF>r8S*O-=!G(_( zwXbX_rGZgeiK*&n5E;f=k{ktyA1(;x_kiMEt0*gpp_4&(twlS2e5C?NoD{n>X2AT# zY@Zp?#!b1zNq96MQqeO*M1MMBin5v#RH52&Xd~DO6-BZLnA6xO1$sou(YJ1Dlc{WF zVa%2DyYm`V#81jP@70IJ;DX@y*iUt$MLm)ByAD$eUuji|5{ptFYq(q)mE(5bOpxjM z^Q`AHWq44SG3`_LxC9fwR)XRVIp=B%<(-lOC3jI#bb@dK(*vjom!=t|#<@dZql%>O z15y^{4tQoeW9Lu%G&V$90x6F)xN6y_oIn;!Q zs)8jT$;&;u%Y>=T3hg34A-+Y*na=|glcStr5D;&5*t5*DmD~x;zQAV5{}Ya`?RRGa zT*t9@$a~!co;pD^!J5bo?lDOWFx%)Y=-fJ+PDGc0>;=q=s?P4aHForSB+)v0WY2JH z?*`O;RHum6j%#LG)Vu#ciO#+jRC3!>T(9fr+XE7T2B7Z|0nR5jw@WG)kDDzTJ=o4~ zUpeyt7}_nd`t}j9BKqryOha{34erm)RmST)_9Aw)@ zHbiyg5n&E{_CQR@h<}34d7WM{s{%5wdty1l+KX8*?+-YkNK2Be*6&jc>@{Fd;Ps|| z26LqdI3#9le?;}risDq$K5G3yoqK}C^@-8z^wj%tdgw-6@F#Ju{Sg7+y)L?)U$ez> zoOaP$UFZ?y5BiFycir*pnaAaY+|%1%8&|(@VB)zweR%?IidwJyK5J!STzw&2RFx zZV@qeaCB01Hu#U9|1#=Msc8Pgz5P*4Lrp!Q+~(G!OiNR{qa7|r^H?FC6gVhkk3y7=uW#Sh;&>78bZ}aK*C#NH$9rX@M3f{nckYI+5QG?Aj1DM)@~z_ zw!UAD@gedTlePB*%4+55naJ8ak_;))#S;4ji!LOqY5VRI){GMwHR~}6t4g>5C_#U# ztYC!tjKjrKvRy=GAsJVK++~$|+s!w9z3H4G^mACv=EErXNSmH7qN}%PKcN|8%9=i)qS5+$L zu&ya~HW%RMVJi4T^pv?>mw*Gf<)-7gf#Qj|e#w2|v4#t!%Jk{&xlf;$_?jW*n!Pyx zkG$<18kiLOAUPuFfyu-EfWX%4jYnjBYc~~*9JEz6oa)_R|8wjZA|RNrAp%}14L7fW zi7A5Wym*K+V8pkqqO-X#3ft{0qs?KVt^)?kS>AicmeO&q+~J~ zp0YJ_P~_a8j= zsAs~G=8F=M{4GZL{|B__UorX@MRNQLn?*_gym4aW(~+i13knnk1P=khoC-ViMZk+x zLW(l}oAg1H`dU+Fv**;qw|ANDSRs>cGqL!Yw^`; zv;{E&8CNJcc)GHzTYM}f&NPw<6j{C3gaeelU#y!M)w-utYEHOCCJo|Vgp7K6C_$14 zqIrLUB0bsgz^D%V%fbo2f9#yb#CntTX?55Xy|Kps&Xek*4_r=KDZ z+`TQuv|$l}MWLzA5Ay6Cvsa^7xvwXpy?`w(6vx4XJ zWuf1bVSb#U8{xlY4+wlZ$9jjPk)X_;NFMqdgq>m&W=!KtP+6NL57`AMljW+es zzqjUjgz;V*kktJI?!NOg^s_)ph45>4UDA!Vo0hn>KZ+h-3=?Y3*R=#!fOX zP$Y~+14$f66ix?UWB_6r#fMcC^~X4R-<&OD1CSDNuX~y^YwJ>sW0j`T<2+3F9>cLo z#!j57$ll2K9(%$4>eA7(>FJX5e)pR5&EZK!IMQzOfik#FU*o*LGz~7u(8}XzIQRy- z!U7AlMTIe|DgQFmc%cHy_9^{o`eD%ja_L>ckU6$O4*U**o5uR7`FzqkU8k4gxtI=o z^P^oGFPm5jwZMI{;nH}$?p@uV8FT4r=|#GziKXK07bHJLtK}X%I0TON$uj(iJ`SY^ zc$b2CoxCQ>7LH@nxcdW&_C#fMYBtTxcg46dL{vf%EFCZ~eErMvZq&Z%Lhumnkn^4A zsx$ay(FnN7kYah}tZ@0?-0Niroa~13`?hVi6`ndno`G+E8;$<6^gsE-K3)TxyoJ4M zb6pj5=I8^FD5H@`^V#Qb2^0cx7wUz&cruA5g>6>qR5)O^t1(-qqP&1g=qvY#s&{bx zq8Hc%LsbK1*%n|Y=FfojpE;w~)G0-X4i*K3{o|J7`krhIOd*c*$y{WIKz2n2*EXEH zT{oml3Th5k*vkswuFXdGDlcLj15Nec5pFfZ*0?XHaF_lVuiB%Pv&p7z)%38}%$Gup zVTa~C8=cw%6BKn_|4E?bPNW4PT7}jZQLhDJhvf4z;~L)506IE0 zX!tWXX(QOQPRj-p80QG79t8T2^az4Zp2hOHziQlvT!|H)jv{Ixodabzv6lBj)6WRB z{)Kg@$~~(7$-az?lw$4@L%I&DI0Lo)PEJJziWP33a3azb?jyXt1v0N>2kxwA6b%l> zZqRpAo)Npi&loWbjFWtEV)783BbeIAhqyuc+~>i7aQ8shIXt)bjCWT6$~ro^>99G} z2XfmT0(|l!)XJb^E!#3z4oEGIsL(xd; zYX1`1I(cG|u#4R4T&C|m*9KB1`UzKvho5R@1eYtUL9B72{i(ir&ls8g!pD ztR|25xGaF!4z5M+U@@lQf(12?xGy`!|3E}7pI$k`jOIFjiDr{tqf0va&3pOn6Pu)% z@xtG2zjYuJXrV)DUrIF*y<1O1<$#54kZ#2;=X51J^F#0nZ0(;S$OZDt_U2bx{RZ=Q zMMdd$fH|!s{ zXq#l;{`xfV`gp&C>A`WrQU?d{!Ey5(1u*VLJt>i27aZ-^&2IIk=zP5p+{$q(K?2(b z8?9h)kvj9SF!Dr zoyF}?V|9;6abHxWk2cEvGs$-}Pg}D+ZzgkaN&$Snp%;5m%zh1E#?Wac-}x?BYlGN#U#Mek*}kek#I9XaHt?mz3*fDrRTQ#&#~xyeqJk1QJ~E$7qsw6 z?sV;|?*=-{M<1+hXoj?@-$y+(^BJ1H~wQ9G8C0#^aEAyhDduNX@haoa=PuPp zYsGv8UBfQaRHgBgLjmP^eh>fLMeh{8ic)?xz?#3kX-D#Z{;W#cd_`9OMFIaJg-=t`_3*!YDgtNQ2+QUEAJB9M{~AvT$H`E)IKmCR21H532+ata8_i_MR@ z2Xj<3w<`isF~Ah$W{|9;51ub*f4#9ziKrOR&jM{x7I_7()O@`F*5o$KtZ?fxU~g`t zUovNEVKYn$U~VX8eR)qb`7;D8pn*Pp$(otYTqL)5KH$lUS-jf}PGBjy$weoceAcPp z&5ZYB$r&P$MN{0H0AxCe4Qmd3T%M*5d4i%#!nmBCN-WU-4m4Tjxn-%j3HagwTxCZ9 z)j5vO-C7%s%D!&UfO>bi2oXiCw<-w{vVTK^rVbv#W=WjdADJy8$khnU!`ZWCIU`># zyjc^1W~pcu>@lDZ{zr6gv%)2X4n27~Ve+cQqcND%0?IFSP4sH#yIaXXYAq^z3|cg` z`I3$m%jra>e2W-=DiD@84T!cb%||k)nPmEE09NC%@PS_OLhkrX*U!cgD*;;&gIaA(DyVT4QD+q_xu z>r`tg{hiGY&DvD-)B*h+YEd+Zn)WylQl}<4>(_NlsKXCRV;a)Rcw!wtelM2_rWX`j zTh5A|i6=2BA(iMCnj_fob@*eA;V?oa4Z1kRBGaU07O70fb6-qmA$Hg$ps@^ka1=RO zTbE_2#)1bndC3VuK@e!Sftxq4=Uux}fDxXE#Q5_x=E1h>T5`DPHz zbH<_OjWx$wy7=%0!mo*qH*7N4tySm+R0~(rbus`7;+wGh;C0O%x~fEMkt!eV>U$`i z5>Q(o z=t$gPjgGh0&I7KY#k50V7DJRX<%^X z>6+ebc9efB3@eE2Tr){;?_w`vhgF>`-GDY(YkR{9RH(MiCnyRtd!LxXJ75z+?2 zGi@m^+2hKJ5sB1@Xi@s_@p_Kwbc<*LQ_`mr^Y%j}(sV_$`J(?_FWP)4NW*BIL~sR>t6 zM;qTJZ~GoY36&{h-Pf}L#y2UtR}>ZaI%A6VkU>vG4~}9^i$5WP2Tj?Cc}5oQxe2=q z8BeLa$hwCg_psjZyC2+?yX4*hJ58Wu^w9}}7X*+i5Rjqu5^@GzXiw#SUir1G1`jY% zOL=GE_ENYxhcyUrEt9XlMNP6kx6h&%6^u3@zB8KUCAa18T(R2J`%JjWZ z!{7cXaEW+Qu*iJPu+m>QqW}Lo$4Z+!I)0JNzZ&_M%=|B1yejFRM04bGAvu{=lNPd+ zJRI^DRQ(?FcVUD+bgEcAi@o(msqys9RTCG#)TjI!9~3-dc`>gW;HSJuQvH~d`MQs86R$|SKXHh zqS9Qy)u;T`>>a!$LuaE2keJV%;8g)tr&Nnc;EkvA-RanHXsy)D@XN0a>h}z2j81R; zsUNJf&g&rKpuD0WD@=dDrPHdBoK42WoBU|nMo17o(5^;M|dB4?|FsAGVrSyWcI`+FVw^vTVC`y}f(BwJl zrw3Sp151^9=}B})6@H*i4-dIN_o^br+BkcLa^H56|^2XsT0dESw2 zMX>(KqNl=x2K5=zIKg}2JpGAZu{I_IO}0$EQ5P{4zol**PCt3F4`GX}2@vr8#Y)~J zKb)gJeHcFnR@4SSh%b;c%J`l=W*40UPjF#q{<}ywv-=vHRFmDjv)NtmC zQx9qm)d%0zH&qG7AFa3VAU1S^(n8VFTC~Hb+HjYMjX8r#&_0MzlNR*mnLH5hi}`@{ zK$8qiDDvS_(L9_2vHgzEQ${DYSE;DqB!g*jhJghE&=LTnbgl&Xepo<*uRtV{2wDHN z)l;Kg$TA>Y|K8Lc&LjWGj<+bp4Hiye_@BfU(y#nF{fpR&|Ltbye?e^j0}8JC4#xi% zv29ZR%8%hk=3ZDvO-@1u8KmQ@6p%E|dlHuy#H1&MiC<*$YdLkHmR#F3ae;bKd;@*i z2_VfELG=B}JMLCO-6UQy^>RDE%K4b>c%9ki`f~Z2Qu8hO7C#t%Aeg8E%+}6P7Twtg z-)dj(w}_zFK&86KR@q9MHicUAucLVshUdmz_2@32(V`y3`&Kf8Q2I)+!n0mR=rrDU zXvv^$ho;yh*kNqJ#r1}b0|i|xRUF6;lhx$M*uG3SNLUTC@|htC z-=fsw^F%$qqz4%QdjBrS+ov}Qv!z00E+JWas>p?z@=t!WWU3K*?Z(0meTuTOC7OTx zU|kFLE0bLZ+WGcL$u4E}5dB0g`h|uwv3=H6f+{5z9oLv-=Q45+n~V4WwgO=CabjM% zBAN+RjM65(-}>Q2V#i1Na@a0`08g&y;W#@sBiX6Tpy8r}*+{RnyGUT`?XeHSqo#|J z^ww~c;ou|iyzpErDtlVU=`8N7JSu>4M z_pr9=tX0edVn9B}YFO2y(88j#S{w%E8vVOpAboK*27a7e4Ekjt0)hIX99*1oE;vex z7#%jhY=bPijA=Ce@9rRO(Vl_vnd00!^TAc<+wVvRM9{;hP*rqEL_(RzfK$er_^SN; z)1a8vo8~Dr5?;0X0J62Cusw$A*c^Sx1)dom`-)Pl7hsW4i(r*^Mw`z5K>!2ixB_mu z*Ddqjh}zceRFdmuX1akM1$3>G=#~|y?eYv(e-`Qy?bRHIq=fMaN~fB zUa6I8Rt=)jnplP>yuS+P&PxeWpJ#1$F`iqRl|jF$WL_aZFZl@kLo&d$VJtu&w?Q0O zzuXK>6gmygq(yXJy0C1SL}T8AplK|AGNUOhzlGeK_oo|haD@)5PxF}rV+5`-w{Aag zus45t=FU*{LguJ11Sr-28EZkq;!mJO7AQGih1L4rEyUmp>B!%X0YemsrV3QFvlgt* z5kwlPzaiJ+kZ^PMd-RRbl(Y?F*m`4*UIhIuf#8q>H_M=fM*L_Op-<_r zBZagV=4B|EW+KTja?srADTZXCd3Yv%^Chfpi)cg{ED${SI>InNpRj5!euKv?=Xn92 zsS&FH(*w`qLIy$doc>RE&A5R?u zzkl1sxX|{*fLpXvIW>9d<$ePROttn3oc6R!sN{&Y+>Jr@yeQN$sFR z;w6A<2-0%UA?c8Qf;sX7>>uKRBv3Ni)E9pI{uVzX|6Bb0U)`lhLE3hK58ivfRs1}d zNjlGK0hdq0qjV@q1qI%ZFMLgcpWSY~mB^LK)4GZ^h_@H+3?dAe_a~k*;9P_d7%NEFP6+ zgV(oGr*?W(ql?6SQ~`lUsjLb%MbfC4V$)1E0Y_b|OIYxz4?O|!kRb?BGrgiH5+(>s zoqM}v*;OBfg-D1l`M6T6{K`LG+0dJ1)!??G5g(2*vlNkm%Q(MPABT$r13q?|+kL4- zf)Mi5r$sn;u41aK(K#!m+goyd$c!KPl~-&-({j#D4^7hQkV3W|&>l_b!}!z?4($OA z5IrkfuT#F&S1(`?modY&I40%gtroig{YMvF{K{>5u^I51k8RriGd${z)=5k2tG zM|&Bp5kDTfb#vfuTTd?)a=>bX=lokw^y9+2LS?kwHQIWI~pYgy7 zb?A-RKVm_vM5!9?C%qYdfRAw& zAU7`up~%g=p@}pg#b7E)BFYx3g%(J36Nw(Dij!b>cMl@CSNbrW!DBDbTD4OXk!G4x zi}JBKc8HBYx$J~31PXH+4^x|UxK~(<@I;^3pWN$E=sYma@JP|8YL`L(zI6Y#c%Q{6 z*APf`DU$S4pr#_!60BH$FGViP14iJmbrzSrOkR;f3YZa{#E7Wpd@^4E-zH8EgPc-# zKWFPvh%WbqU_%ZEt`=Q?odKHc7@SUmY{GK`?40VuL~o)bS|is$Hn=<=KGHOsEC5tB zFb|q}gGlL97NUf$G$>^1b^3E18PZ~Pm9kX%*ftnolljiEt@2#F2R5ah$zbXd%V_Ev zyDd{1o_uuoBga$fB@Fw!V5F3jIr=a-ykqrK?WWZ#a(bglI_-8pq74RK*KfQ z0~Dzus7_l;pMJYf>Bk`)`S8gF!To-BdMnVw5M-pyu+aCiC5dwNH|6fgRsIKZcF&)g zr}1|?VOp}I3)IR@m1&HX1~#wsS!4iYqES zK}4J{Ei>;e3>LB#Oly>EZkW14^@YmpbgxCDi#0RgdM${&wxR+LiX}B+iRioOB0(pDKpVEI;ND?wNx>%e|m{RsqR_{(nmQ z3ZS}@t!p4a(BKx_-CYwrcyJ5u1TO9bcXti$8sy>xcLKqKCc#~UOZYD{llKTSFEjJ~ zyNWt>tLU}*>^`TvPxtP%F`ZJQw@W0^>x;!^@?k_)9#bF$j0)S3;mH-IR5y82l|%=F z2lR8zhP?XNP-ucZZ6A+o$xOyF!w;RaLHGh57GZ|TCXhJqY~GCh)aXEV$1O&$c}La1 zjuJxkY9SM4av^Hb;i7efiYaMwI%jGy`3NdY)+mcJhF(3XEiSlU3c|jMBi|;m-c?~T z+x0_@;SxcoY=(6xNgO$bBt~Pj8`-<1S|;Bsjrzw3@zSjt^JC3X3*$HI79i~!$RmTz zsblZsLYs7L$|=1CB$8qS!tXrWs!F@BVuh?kN(PvE5Av-*r^iYu+L^j^m9JG^#=m>@ z=1soa)H*w6KzoR$B8mBCXoU;f5^bVuwQ3~2LKg!yxomG1#XPmn(?YH@E~_ED+W6mxs%x{%Z<$pW`~ON1~2XjP5v(0{C{+6Dm$00tsd3w=f=ZENy zOgb-=f}|Hb*LQ$YdWg<(u7x3`PKF)B7ZfZ6;1FrNM63 z?O6tE%EiU@6%rVuwIQjvGtOofZBGZT1Sh(xLIYt9c4VI8`!=UJd2BfLjdRI#SbVAX ziT(f*RI^T!IL5Ac>ql7uduF#nuCRJ1)2bdvAyMxp-5^Ww5p#X{rb5)(X|fEhDHHW{ zw(Lfc$g;+Q`B0AiPGtmK%*aWfQQ$d!*U<|-@n2HZvCWSiw^I>#vh+LyC;aaVWGbmkENr z&kl*8o^_FW$T?rDYLO1Pyi%>@&kJKQoH2E0F`HjcN}Zlnx1ddoDA>G4Xu_jyp6vuT zPvC}pT&Owx+qB`zUeR|4G;OH(<<^_bzkjln0k40t`PQxc$7h(T8Ya~X+9gDc8Z9{Z z&y0RAU}#_kQGrM;__MK9vwIwK^aoqFhk~dK!ARf1zJqHMxF2?7-8|~yoO@_~Ed;_wvT%Vs{9RK$6uUQ|&@#6vyBsFK9eZW1Ft#D2)VpQRwpR(;x^ zdoTgMqfF9iBl%{`QDv7B0~8{8`8k`C4@cbZAXBu00v#kYl!#_Wug{)2PwD5cNp?K^ z9+|d-4z|gZ!L{57>!Ogfbzchm>J1)Y%?NThxIS8frAw@z>Zb9v%3_3~F@<=LG%r*U zaTov}{{^z~SeX!qgSYow`_5)ij*QtGp4lvF`aIGQ>@3ZTkDmsl#@^5*NGjOuu82}o zzLF~Q9SW+mP=>88%eSA1W4_W7-Q>rdq^?t=m6}^tDPaBRGFLg%ak93W!kOp#EO{6& zP%}Iff5HZQ9VW$~+9r=|Quj#z*=YwcnssS~9|ub2>v|u1JXP47vZ1&L1O%Z1DsOrDfSIMHU{VT>&>H=9}G3i@2rP+rx@eU@uE8rJNec zij~#FmuEBj03F1~ct@C@$>y)zB+tVyjV3*n`mtAhIM0$58vM9jOQC}JJOem|EpwqeMuYPxu3sv}oMS?S#o6GGK@8PN59)m&K4Dc&X% z(;XL_kKeYkafzS3Wn5DD>Yiw{LACy_#jY4op(>9q>>-*9@C0M+=b#bknAWZ37^(Ij zq>H%<@>o4a#6NydoF{_M4i4zB_KG)#PSye9bk0Ou8h%1Dtl7Q_y#7*n%g)?m>xF~( zjqvOwC;*qvN_3(*a+w2|ao0D?@okOvg8JskUw(l7n`0fncglavwKd?~l_ryKJ^Ky! zKCHkIC-o7%fFvPa$)YNh022lakMar^dgL=t#@XLyNHHw!b?%WlM)R@^!)I!smZL@k zBi=6wE5)2v&!UNV(&)oOYW(6Qa!nUjDKKBf-~Da=#^HE4(@mWk)LPvhyN3i4goB$3K8iV7uh zsv+a?#c4&NWeK(3AH;ETrMOIFgu{_@%XRwCZ;L=^8Ts)hix4Pf3yJRQ<8xb^CkdmC z?c_gB)XmRsk`9ch#tx4*hO=#qS7={~Vb4*tTf<5P%*-XMfUUYkI9T1cEF;ObfxxI-yNuA=I$dCtz3ey znVkctYD*`fUuZ(57+^B*R=Q}~{1z#2!ca?)+YsRQb+lt^LmEvZt_`=j^wqig+wz@n@ z`LIMQJT3bxMzuKg8EGBU+Q-6cs5(@5W?N>JpZL{$9VF)veF`L5%DSYTNQEypW%6$u zm_~}T{HeHj1bAlKl8ii92l9~$dm=UM21kLemA&b$;^!wB7#IKWGnF$TVq!!lBlG4 z{?Rjz?P(uvid+|i$VH?`-C&Gcb3{(~Vpg`w+O);Wk1|Mrjxrht0GfRUnZqz2MhrXa zqgVC9nemD5)H$to=~hp)c=l9?#~Z_7i~=U-`FZxb-|TR9@YCxx;Zjo-WpMNOn2)z) zFPGGVl%3N$f`gp$gPnWC+f4(rmts%fidpo^BJx72zAd7|*Xi{2VXmbOm)1`w^tm9% znM=0Fg4bDxH5PxPEm{P3#A(mxqlM7SIARP?|2&+c7qmU8kP&iApzL|F>Dz)Ixp_`O zP%xrP1M6@oYhgo$ZWwrAsYLa4 z|I;DAvJxno9HkQrhLPQk-8}=De{9U3U%)dJ$955?_AOms!9gia%)0E$Mp}$+0er@< zq7J&_SzvShM?e%V?_zUu{niL@gt5UFOjFJUJ}L?$f%eU%jUSoujr{^O=?=^{19`ON zlRIy8Uo_nqcPa6@yyz`CM?pMJ^^SN^Fqtt`GQ8Q#W4kE7`V9^LT}j#pMChl!j#g#J zr-=CCaV%xyFeQ9SK+mG(cTwW*)xa(eK;_Z(jy)woZp~> zA(4}-&VH+TEeLzPTqw&FOoK(ZjD~m{KW05fiGLe@E3Z2`rLukIDahE*`u!ubU)9`o zn^-lyht#E#-dt~S>}4y$-mSbR8{T@}22cn^refuQ08NjLOv?JiEWjyOnzk<^R5%gO zhUH_B{oz~u#IYwVnUg8?3P*#DqD8#X;%q%HY**=I>>-S|!X*-!x1{^l#OnR56O>iD zc;i;KS+t$koh)E3)w0OjWJl_aW2;xF=9D9Kr>)(5}4FqUbk# zI#$N8o0w;IChL49m9CJTzoC!|u{Ljd%ECgBOf$}&jA^$(V#P#~)`&g`H8E{uv52pp zwto`xUL-L&WTAVREEm$0g_gYPL(^vHq(*t1WCH_6alhkeW&GCZ3hL)|{O-jiFOBrF z!EW=Jej|dqQitT6!B-7&io2K)WIm~Q)v@yq%U|VpV+I?{y0@Yd%n8~-NuuM*pM~KA z85YB};IS~M(c<}4Hxx>qRK0cdl&e?t253N%vefkgds>Ubn8X}j6Vpgs>a#nFq$osY z1ZRwLqFv=+BTb=i%D2Wv>_yE0z}+niZ4?rE|*a3d7^kndWGwnFqt+iZ(7+aln<}jzbAQ(#Z2SS}3S$%Bd}^ zc9ghB%O)Z_mTZMRC&H#)I#fiLuIkGa^`4e~9oM5zKPx?zjkC&Xy0~r{;S?FS%c7w< zWbMpzc(xSw?9tGxG~_l}Acq}zjt5ClaB7-!vzqnlrX;}$#+PyQ9oU)_DfePh2E1<7 ztok6g6K^k^DuHR*iJ?jw?bs_whk|bx`dxu^nC6#e{1*m~z1eq7m}Cf$*^Eua(oi_I zAL+3opNhJteu&mWQ@kQWPucmiP)4|nFG`b2tpC;h{-PI@`+h?9v=9mn|0R-n8#t=+Z*FD(c5 zjj79Jxkgck*DV=wpFgRZuwr%}KTm+dx?RT@aUHJdaX-ODh~gByS?WGx&czAkvkg;x zrf92l8$Or_zOwJVwh>5rB`Q5_5}ef6DjS*$x30nZbuO3dijS*wvNEqTY5p1_A0gWr znH<(Qvb!os14|R)n2Ost>jS2;d1zyLHu`Svm|&dZD+PpP{Bh>U&`Md;gRl64q;>{8MJJM$?UNUd`aC>BiLe>*{ zJY15->yW+<3rLgYeTruFDtk1ovU<$(_y7#HgUq>)r0{^}Xbth}V#6?%5jeFYt;SG^ z3qF)=uWRU;Jj)Q}cpY8-H+l_n$2$6{ZR?&*IGr{>ek!69ZH0ZoJ*Ji+ezzlJ^%qL3 zO5a`6gwFw(moEzqxh=yJ9M1FTn!eo&qD#y5AZXErHs%22?A+JmS&GIolml!)rZTnUDM3YgzYfT#;OXn)`PWv3Ta z!-i|-Wojv*k&bC}_JJDjiAK(Ba|YZgUI{f}TdEOFT2+}nPmttytw7j%@bQZDV1vvj z^rp{gRkCDmYJHGrE1~e~AE!-&6B6`7UxVQuvRrfdFkGX8H~SNP_X4EodVd;lXd^>eV1jN+Tt4}Rsn)R0LxBz0c=NXU|pUe!MQQFkGBWbR3&(jLm z%RSLc#p}5_dO{GD=DEFr=Fc% z85CBF>*t!6ugI?soX(*JNxBp+-DdZ4X0LldiK}+WWGvXV(C(Ht|!3$psR=&c*HIM=BmX;pRIpz@Ale{9dhGe(U2|Giv;# zOc|;?p67J=Q(kamB*aus=|XP|m{jN^6@V*Bpm?ye56Njh#vyJqE=DweC;?Rv7faX~ zde03n^I~0B2vUmr;w^X37tVxUK?4}ifsSH5_kpKZIzpYu0;Kv}SBGfI2AKNp+VN#z`nI{UNDRbo-wqa4NEls zICRJpu)??cj^*WcZ^MAv+;bDbh~gpN$1Cor<{Y2oyIDws^JsfW^5AL$azE(T0p&pP z1Mv~6Q44R&RHoH95&OuGx2srIr<@zYJTOMKiVs;Bx3py89I87LOb@%mr`0)#;7_~Z zzcZj8?w=)>%5@HoCHE_&hnu(n_yQ-L(~VjpjjkbT7e)Dk5??fApg(d>vwLRJ-x{um z*Nt?DqTSxh_MIyogY!vf1mU1`Gld-&L)*43f6dilz`Q@HEz;+>MDDYv9u!s;WXeao zUq=TaL$P*IFgJzrGc>j1dDOd zed+=ZBo?w4mr$2)Ya}?vedDopomhW1`#P<%YOJ_j=WwClX0xJH-f@s?^tmzs_j7t!k zK@j^zS0Q|mM4tVP5Ram$VbS6|YDY&y?Q1r1joe9dj08#CM{RSMTU}(RCh`hp_Rkl- zGd|Cv~G@F{DLhCizAm9AN!^{rNs8hu!G@8RpnGx7e`-+K$ffN<0qjR zGq^$dj_Tv!n*?zOSyk5skI7JVKJ)3jysnjIu-@VSzQiP8r6MzudCU=~?v-U8yzo^7 zGf~SUTvEp+S*!X9uX!sq=o}lH;r{pzk~M*VA(uyQ`3C8!{C;)&6)95fv(cK!%Cuz$ z_Zal57H6kPN>25KNiI6z6F)jzEkh#%OqU#-__Xzy)KyH};81#N6OfX$$IXWzOn`Q& z4f$Z1t>)8&8PcYfEwY5UadU1yg+U*(1m2ZlHoC-!2?gB!!fLhmTl))D@dhvkx#+Yj z1O=LV{(T%{^IeCuFK>%QR!VZ4GnO5tK8a+thWE zg4VytZrwcS?7^ zuZfhYnB8dwd%VLO?DK7pV5Wi<(`~DYqOXn8#jUIL^)12*Dbhk4GmL_E2`WX&iT16o zk(t|hok(Y|v-wzn?4x34T)|+SfZP>fiq!><*%vnxGN~ypST-FtC+@TPv*vYv@iU!_ z@2gf|PrgQ?Ktf*9^CnJ(x*CtZVB8!OBfg0%!wL;Z8(tYYre0vcnPGlyCc$V(Ipl*P z_(J!a=o@vp^%Efme!K74(Ke7A>Y}|sxV+JL^aYa{~m%5#$$+R1? zGaQhZTTX!#s#=Xtpegqero$RNt&`4xn3g$)=y*;=N=Qai)}~`xtxI_N*#MMCIq#HFifT zz(-*m;pVH&+4bixL&Bbg)W5FN^bH87pAHp)zPkWNMfTFqS=l~AC$3FX3kQUSh_C?-ZftyClgM)o_D7cX$RGlEYblux0jv5 zTr|i-I3@ZPCGheCl~BGhImF)K4!9@?pC(gi3ozX=a!|r1)LFxy_8c&wY0<^{2cm|P zv6Y`QktY*;I)IUd5y3ne1CqpVanlY45z8hf4&$EUBnucDj16pDa4&GI&TArYhf*xh zdj>*%APH8(h~c>o@l#%T>R$e>rwVx_WUB|~V`p^JHsg*y12lzj&zF}w6W09HwB2yb z%Q~`es&(;7#*DUC_w-Dmt7|$*?TA_m;zB+-u{2;Bg{O}nV7G_@7~<)Bv8fH^G$XG8$(&{A zwXJK5LRK%M34(t$&NI~MHT{UQ9qN-V_yn|%PqC81EIiSzmMM=2zb`mIwiP_b)x+2M z7Gd`83h79j#SItpQ}luuf2uOU`my_rY5T{6P#BNlb%h%<#MZb=m@y5aW;#o1^2Z)SWo+b`y0gV^iRcZtz5!-05vF z7wNo=hc6h4hc&s@uL^jqRvD6thVYtbErDK9k!;+a0xoE0WL7zLixjn5;$fXvT=O3I zT6jI&^A7k6R{&5#lVjz#8%_RiAa2{di{`kx79K+j72$H(!ass|B%@l%KeeKchYLe_ z>!(JC2fxsv>XVen+Y42GeYPxMWqm`6F$(E<6^s|g(slNk!lL*6v^W2>f6hh^mE$s= z3D$)}{V5(Qm&A6bp%2Q}*GZ5Qrf}n7*Hr51?bJOyA-?B4vg6y_EX<*-e20h{=0Mxs zbuQGZ$fLyO5v$nQ&^kuH+mNq9O#MWSfThtH|0q1i!NrWj^S}_P;Q1OkYLW6U^?_7G zx2wg?CULj7))QU(n{$0JE%1t2dWrMi2g-Os{v|8^wK{@qlj%+1b^?NI z$}l2tjp0g>K3O+p%yK<9!XqmQ?E9>z&(|^Pi~aSRwI5x$jaA62GFz9%fmO3t3a>cq zK8Xbv=5Ps~4mKN5+Eqw12(!PEyedFXv~VLxMB~HwT1Vfo51pQ#D8e$e4pFZ{&RC2P z5gTIzl{3!&(tor^BwZfR8j4k{7Rq#`riKXP2O-Bh66#WWK2w=z;iD9GLl+3 zpHIaI4#lQ&S-xBK8PiQ%dwOh?%BO~DCo06pN7<^dnZCN@NzY{_Z1>rrB0U|nC&+!2 z2y!oBcTd2;@lzyk(B=TkyZ)zy0deK05*Q0zk+o$@nun`VI1Er7pjq>8V zNmlW{p7S^Btgb(TA}jL(uR>`0w8gHP^T~Sh5Tkip^spk4SBAhC{TZU}_Z)UJw-}zm zPq{KBm!k)?P{`-(9?LFt&YN4s%SIZ-9lJ!Ws~B%exHOeVFk3~}HewnnH(d)qkLQ_d z6h>O)pEE{vbOVw}E+jdYC^wM+AAhaI(YAibUc@B#_mDss0Ji&BK{WG`4 zOk>vSNq(Bq2IB@s>>Rxm6Wv?h;ZXkpb1l8u|+_qXWdC*jjcPCixq;!%BVPSp#hP zqo`%cNf&YoQXHC$D=D45RiT|5ngPlh?0T~?lUf*O)){K@*Kbh?3RW1j9-T?%lDk@y z4+~?wKI%Y!-=O|_IuKz|=)F;V7ps=5@g)RrE;;tvM$gUhG>jHcw2Hr@fS+k^Zr~>G z^JvPrZc}_&d_kEsqAEMTMJw!!CBw)u&ZVzmq+ZworuaE&TT>$pYsd9|g9O^0orAe8 z221?Va!l1|Y5X1Y?{G7rt1sX#qFA^?RLG^VjoxPf63;AS=_mVDfGJKg73L zsGdnTUD40y(>S##2l|W2Cy!H(@@5KBa(#gs`vlz}Y~$ot5VsqPQ{{YtjYFvIumZzt zA{CcxZLJR|4#{j7k~Tu*jkwz8QA|5G1$Cl895R`Zyp;irp1{KN){kB30O8P1W5;@bG znvX74roeMmQlUi=v9Y%(wl$ZC#9tKNFpvi3!C}f1m6Ct|l2g%psc{TJp)@yu)*e2> z((p0Fg*8gJ!|3WZke9;Z{8}&NRkv7iP=#_y-F}x^y?2m%-D_aj^)f04%mneyjo_;) z6qc_Zu$q37d~X``*eP~Q>I2gg%rrV8v=kDfpp$=%Vj}hF)^dsSWygoN(A$g*E=Do6FX?&(@F#7pbiJ`;c0c@Ul zDqW_90Wm#5f2L<(Lf3)3TeXtI7nhYwRm(F;*r_G6K@OPW4H(Y3O5SjUzBC}u3d|eQ8*8d@?;zUPE+i#QNMn=r(ap?2SH@vo*m z3HJ%XuG_S6;QbWy-l%qU;8x;>z>4pMW7>R}J%QLf%@1BY(4f_1iixd-6GlO7Vp*yU zp{VU^3?s?90i=!#>H`lxT!q8rk>W_$2~kbpz7eV{3wR|8E=8**5?qn8#n`*(bt1xRQrdGxyx2y%B$qmw#>ZV$c7%cO#%JM1lY$Y0q?Yuo> ze9KdJoiM)RH*SB%^;TAdX-zEjA7@%y=!0=Zg%iWK7jVI9b&Dk}0$Af&08KHo+ zOwDhFvA(E|ER%a^cdh@^wLUlmIv6?_3=BvX8jKk92L=Y}7Jf5OGMfh` zBdR1wFCi-i5@`9km{isRb0O%TX+f~)KNaEz{rXQa89`YIF;EN&gN)cigu6mNh>?Cm zAO&Im2flv6D{jwm+y<%WsPe4!89n~KN|7}Cb{Z;XweER73r}Qp2 zz}WP4j}U0&(uD&9yGy6`!+_v-S(yG*iytsTR#x_Rc>=6u^vnRDnf1gP{#2>`ffrAC% zTZ5WQ@hAK;P;>kX{D)mIXe4%a5p=LO1xXH@8T?mz7Q@d)$3pL{{B!2{-v70L*o1AO+|n5beiw~ zk@(>m?T3{2k2c;NWc^`4@P&Z?BjxXJ@;x1qhn)9Mn*IFdt_J-dIqx5#d`NfyfX~m( zIS~5)MfZ2Uy?_4W`47i}u0ZgPh<{D|w_d#;D}Q&U$Q-G}xM1A@1f{#%A$jh6Qp&0hQ<0bPOM z-{1Wm&p%%#eb_?x7i;bol EfAhh=DF6Tf diff --git a/product-service/.mvn/wrapper/maven-wrapper.properties b/product-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/product-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/product-service/Dockerfile b/product-service/Dockerfile deleted file mode 100644 index 9fb128f89..000000000 --- a/product-service/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY product-service/ . -ADD product-service/target/product-service-v${PROJECT_VERSION}.jar product-service.jar -EXPOSE 8500 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "product-service.jar"] - - diff --git a/product-service/compose.yml b/product-service/compose.yml deleted file mode 100644 index 69c6370eb..000000000 --- a/product-service/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - product-service-container: - image: selimhorri/product-service-ecommerce-boot:0.1.0 - ports: - - 8500:8500 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/product-service/mvnw b/product-service/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/product-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/product-service/mvnw.cmd b/product-service/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/product-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/product-service/pom.xml b/product-service/pom.xml deleted file mode 100644 index c04252e05..000000000 --- a/product-service/pom.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - product-service - product-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/ProductServiceApplication.java b/product-service/src/main/java/com/selimhorri/app/ProductServiceApplication.java deleted file mode 100644 index 04c9708e9..000000000 --- a/product-service/src/main/java/com/selimhorri/app/ProductServiceApplication.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -public class ProductServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(ProductServiceApplication.class, args); - } - - - -} - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/product-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java deleted file mode 100644 index 27021f387..000000000 --- a/product-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/product-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java deleted file mode 100644 index f7de593a7..000000000 --- a/product-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/product-service/src/main/java/com/selimhorri/app/constant/AppConstant.java deleted file mode 100644 index 2e051c4b5..000000000 --- a/product-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/product-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java deleted file mode 100644 index b19764968..000000000 --- a/product-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/domain/Category.java b/product-service/src/main/java/com/selimhorri/app/domain/Category.java deleted file mode 100644 index 8696fcf56..000000000 --- a/product-service/src/main/java/com/selimhorri/app/domain/Category.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "categories") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"subCategories", "parentCategory", "products"}) -@Data -@Builder -public final class Category extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "category_id", unique = true, nullable = false, updatable = false) - private Integer categoryId; - - @Column(name = "category_title") - private String categoryTitle; - - @Column(name = "image_url") - private String imageUrl; - - @JsonIgnore - @OneToMany(mappedBy = "parentCategory", fetch = FetchType.LAZY, cascade = CascadeType.ALL) - private Set subCategories; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "parent_category_id") - private Category parentCategory; - - @JsonIgnore - @OneToMany(mappedBy = "category", fetch = FetchType.LAZY, cascade = CascadeType.ALL) - private Set products; - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/domain/Product.java b/product-service/src/main/java/com/selimhorri/app/domain/Product.java deleted file mode 100644 index 6864f707f..000000000 --- a/product-service/src/main/java/com/selimhorri/app/domain/Product.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "products") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"category"}) -@Data -@Builder -public final class Product extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "product_id", unique = true, nullable = false, updatable = false) - private Integer productId; - - @Column(name = "product_title") - private String productTitle; - - @Column(name = "image_url") - private String imageUrl; - - @Column(unique = true) - private String sku; - - @Column(name = "price_unit", columnDefinition = "decimal") - private Double priceUnit; - - @Column(name = "quantity") - private Integer quantity; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "category_id") - private Category category; - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/dto/CategoryDto.java b/product-service/src/main/java/com/selimhorri/app/dto/CategoryDto.java deleted file mode 100644 index e641d3653..000000000 --- a/product-service/src/main/java/com/selimhorri/app/dto/CategoryDto.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CategoryDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer categoryId; - private String categoryTitle; - private String imageUrl; - - @JsonInclude(Include.NON_NULL) - private Set subCategoriesDtos; - - @JsonProperty("parentCategory") - @JsonInclude(Include.NON_NULL) - private CategoryDto parentCategoryDto; - - @JsonInclude(Include.NON_NULL) - private Set productDtos; - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/dto/ProductDto.java b/product-service/src/main/java/com/selimhorri/app/dto/ProductDto.java deleted file mode 100644 index d5d70c66f..000000000 --- a/product-service/src/main/java/com/selimhorri/app/dto/ProductDto.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonProperty("category") - @JsonInclude(Include.NON_NULL) - private CategoryDto categoryDto; - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/product-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java deleted file mode 100644 index ecee30efd..000000000 --- a/product-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/product-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java deleted file mode 100644 index 98a98437c..000000000 --- a/product-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.CategoryNotFoundException; -import com.selimhorri.app.exception.wrapper.ProductNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - CategoryNotFoundException.class, - ProductNotFoundException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/product-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java deleted file mode 100644 index 77429c9d1..000000000 --- a/product-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/exception/wrapper/CategoryNotFoundException.java b/product-service/src/main/java/com/selimhorri/app/exception/wrapper/CategoryNotFoundException.java deleted file mode 100644 index f31ee9689..000000000 --- a/product-service/src/main/java/com/selimhorri/app/exception/wrapper/CategoryNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class CategoryNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public CategoryNotFoundException() { - super(); - } - - public CategoryNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public CategoryNotFoundException(String message) { - super(message); - } - - public CategoryNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/exception/wrapper/ProductNotFoundException.java b/product-service/src/main/java/com/selimhorri/app/exception/wrapper/ProductNotFoundException.java deleted file mode 100644 index 8e16e7e21..000000000 --- a/product-service/src/main/java/com/selimhorri/app/exception/wrapper/ProductNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class ProductNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public ProductNotFoundException() { - super(); - } - - public ProductNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public ProductNotFoundException(String message) { - super(message); - } - - public ProductNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/helper/CategoryMappingHelper.java b/product-service/src/main/java/com/selimhorri/app/helper/CategoryMappingHelper.java deleted file mode 100644 index 3e9f805e8..000000000 --- a/product-service/src/main/java/com/selimhorri/app/helper/CategoryMappingHelper.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.selimhorri.app.helper; - -import java.util.Optional; - -import com.selimhorri.app.domain.Category; -import com.selimhorri.app.dto.CategoryDto; - -public interface CategoryMappingHelper { - - public static CategoryDto map(final Category category) { - - final var parentCategory = Optional.ofNullable(category - .getParentCategory()).orElseGet(() -> new Category()); - - return CategoryDto.builder() - .categoryId(category.getCategoryId()) - .categoryTitle(category.getCategoryTitle()) - .imageUrl(category.getImageUrl()) - .parentCategoryDto( - CategoryDto.builder() - .categoryId(parentCategory.getCategoryId()) - .categoryTitle(parentCategory.getCategoryTitle()) - .imageUrl(parentCategory.getImageUrl()) - .build()) - .build(); - } - - public static Category map(final CategoryDto categoryDto) { - - final var parentCategoryDto = Optional.ofNullable(categoryDto - .getParentCategoryDto()).orElseGet(() -> new CategoryDto()); - - return Category.builder() - .categoryId(categoryDto.getCategoryId()) - .categoryTitle(categoryDto.getCategoryTitle()) - .imageUrl(categoryDto.getImageUrl()) - .parentCategory( - Category.builder() - .categoryId(parentCategoryDto.getCategoryId()) - .categoryTitle(parentCategoryDto.getCategoryTitle()) - .imageUrl(parentCategoryDto.getImageUrl()) - .build()) - .build(); - } - - - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/helper/ProductMappingHelper.java b/product-service/src/main/java/com/selimhorri/app/helper/ProductMappingHelper.java deleted file mode 100644 index ce42f3c62..000000000 --- a/product-service/src/main/java/com/selimhorri/app/helper/ProductMappingHelper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Category; -import com.selimhorri.app.domain.Product; -import com.selimhorri.app.dto.CategoryDto; -import com.selimhorri.app.dto.ProductDto; - -public interface ProductMappingHelper { - - public static ProductDto map(final Product product) { - return ProductDto.builder() - .productId(product.getProductId()) - .productTitle(product.getProductTitle()) - .imageUrl(product.getImageUrl()) - .sku(product.getSku()) - .priceUnit(product.getPriceUnit()) - .quantity(product.getQuantity()) - .categoryDto( - CategoryDto.builder() - .categoryId(product.getCategory().getCategoryId()) - .categoryTitle(product.getCategory().getCategoryTitle()) - .imageUrl(product.getCategory().getImageUrl()) - .build()) - .build(); - } - - public static Product map(final ProductDto productDto) { - return Product.builder() - .productId(productDto.getProductId()) - .productTitle(productDto.getProductTitle()) - .imageUrl(productDto.getImageUrl()) - .sku(productDto.getSku()) - .priceUnit(productDto.getPriceUnit()) - .quantity(productDto.getQuantity()) - .category( - Category.builder() - .categoryId(productDto.getCategoryDto().getCategoryId()) - .categoryTitle(productDto.getCategoryDto().getCategoryTitle()) - .imageUrl(productDto.getCategoryDto().getImageUrl()) - .build()) - .build(); - } - - - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/repository/CategoryRepository.java b/product-service/src/main/java/com/selimhorri/app/repository/CategoryRepository.java deleted file mode 100644 index 4aee2cdd6..000000000 --- a/product-service/src/main/java/com/selimhorri/app/repository/CategoryRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Category; - -public interface CategoryRepository extends JpaRepository { - - - -} diff --git a/product-service/src/main/java/com/selimhorri/app/repository/ProductRepository.java b/product-service/src/main/java/com/selimhorri/app/repository/ProductRepository.java deleted file mode 100644 index 4dbae2a92..000000000 --- a/product-service/src/main/java/com/selimhorri/app/repository/ProductRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Product; - -public interface ProductRepository extends JpaRepository { - - - -} diff --git a/product-service/src/main/java/com/selimhorri/app/resource/CategoryResource.java b/product-service/src/main/java/com/selimhorri/app/resource/CategoryResource.java deleted file mode 100644 index 917738a03..000000000 --- a/product-service/src/main/java/com/selimhorri/app/resource/CategoryResource.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.CategoryDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.CategoryService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/categories") -@Slf4j -@RequiredArgsConstructor -public class CategoryResource { - - private final CategoryService categoryService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** CategoryDto List, controller; fetch all categories *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.categoryService.findAll())); - } - - @GetMapping("/{categoryId}") - public ResponseEntity findById( - @PathVariable("categoryId") - @NotBlank(message = "Input must not be blank") - @Valid final String categoryId) { - log.info("*** CategoryDto, resource; fetch category by id *"); - return ResponseEntity.ok(this.categoryService.findById(Integer.parseInt(categoryId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CategoryDto categoryDto) { - log.info("*** CategoryDto, resource; save category *"); - return ResponseEntity.ok(this.categoryService.save(categoryDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CategoryDto categoryDto) { - log.info("*** CategoryDto, resource; update category *"); - return ResponseEntity.ok(this.categoryService.update(categoryDto)); - } - - @PutMapping("/{categoryId}") - public ResponseEntity update( - @PathVariable("categoryId") - @NotBlank(message = "Input must not be blank") - @Valid final String categoryId, - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final CategoryDto categoryDto) { - log.info("*** CategoryDto, resource; update category with categoryId *"); - return ResponseEntity.ok(this.categoryService.update(Integer.parseInt(categoryId), categoryDto)); - } - - @DeleteMapping("/{categoryId}") - public ResponseEntity deleteById(@PathVariable("categoryId") final String categoryId) { - log.info("*** Boolean, resource; delete category by id *"); - this.categoryService.deleteById(Integer.parseInt(categoryId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/resource/ProductResource.java b/product-service/src/main/java/com/selimhorri/app/resource/ProductResource.java deleted file mode 100644 index 7fd57dd18..000000000 --- a/product-service/src/main/java/com/selimhorri/app/resource/ProductResource.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.ProductService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/products") -@Slf4j -@RequiredArgsConstructor -public class ProductResource { - - private final ProductService productService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** ProductDto List, controller; fetch all categories *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.productService.findAll())); - } - - @GetMapping("/{productId}") - public ResponseEntity findById( - @PathVariable("productId") - @NotBlank(message = "Input must not be blank!") - @Valid final String productId) { - log.info("*** ProductDto, resource; fetch product by id *"); - return ResponseEntity.ok(this.productService.findById(Integer.parseInt(productId))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto) { - log.info("*** ProductDto, resource; save product *"); - return ResponseEntity.ok(this.productService.save(productDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto) { - log.info("*** ProductDto, resource; update product *"); - return ResponseEntity.ok(this.productService.update(productDto)); - } - - @PutMapping("/{productId}") - public ResponseEntity update( - @PathVariable("productId") - @NotBlank(message = "Input must not be blank!") - @Valid final String productId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto) { - log.info("*** ProductDto, resource; update product with productId *"); - return ResponseEntity.ok(this.productService.update(Integer.parseInt(productId), productDto)); - } - - @DeleteMapping("/{productId}") - public ResponseEntity deleteById(@PathVariable("productId") final String productId) { - log.info("*** Boolean, resource; delete product by id *"); - this.productService.deleteById(Integer.parseInt(productId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/service/CategoryService.java b/product-service/src/main/java/com/selimhorri/app/service/CategoryService.java deleted file mode 100644 index bffc53e81..000000000 --- a/product-service/src/main/java/com/selimhorri/app/service/CategoryService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.CategoryDto; - -public interface CategoryService { - - List findAll(); - CategoryDto findById(final Integer categoryId); - CategoryDto save(final CategoryDto categoryDto); - CategoryDto update(final CategoryDto categoryDto); - CategoryDto update(final Integer categoryId, final CategoryDto categoryDto); - void deleteById(final Integer categoryId); - -} diff --git a/product-service/src/main/java/com/selimhorri/app/service/ProductService.java b/product-service/src/main/java/com/selimhorri/app/service/ProductService.java deleted file mode 100644 index b6f7d572f..000000000 --- a/product-service/src/main/java/com/selimhorri/app/service/ProductService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.ProductDto; - -public interface ProductService { - - List findAll(); - ProductDto findById(final Integer productId); - ProductDto save(final ProductDto productDto); - ProductDto update(final ProductDto productDto); - ProductDto update(final Integer productId, final ProductDto productDto); - void deleteById(final Integer productId); - -} diff --git a/product-service/src/main/java/com/selimhorri/app/service/impl/CategoryServiceImpl.java b/product-service/src/main/java/com/selimhorri/app/service/impl/CategoryServiceImpl.java deleted file mode 100644 index 4fc89277d..000000000 --- a/product-service/src/main/java/com/selimhorri/app/service/impl/CategoryServiceImpl.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.CategoryDto; -import com.selimhorri.app.exception.wrapper.CategoryNotFoundException; -import com.selimhorri.app.helper.CategoryMappingHelper; -import com.selimhorri.app.repository.CategoryRepository; -import com.selimhorri.app.service.CategoryService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class CategoryServiceImpl implements CategoryService { - - private final CategoryRepository categoryRepository; - - @Override - public List findAll() { - log.info("*** CategoryDto List, service; fetch all categorys *"); - return this.categoryRepository.findAll() - .stream() - .map(CategoryMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public CategoryDto findById(final Integer categoryId) { - log.info("*** CategoryDto, service; fetch category by id *"); - return this.categoryRepository.findById(categoryId) - .map(CategoryMappingHelper::map) - .orElseThrow(() -> new CategoryNotFoundException(String.format("Category with id: %d not found", categoryId))); - } - - @Override - public CategoryDto save(final CategoryDto categoryDto) { - log.info("*** CategoryDto, service; save category *"); - return CategoryMappingHelper.map(this.categoryRepository - .save(CategoryMappingHelper.map(categoryDto))); - } - - @Override - public CategoryDto update(final CategoryDto categoryDto) { - log.info("*** CategoryDto, service; update category *"); - return CategoryMappingHelper.map(this.categoryRepository - .save(CategoryMappingHelper.map(categoryDto))); - } - - @Override - public CategoryDto update(final Integer categoryId, final CategoryDto categoryDto) { - log.info("*** CategoryDto, service; update category with categoryId *"); - return CategoryMappingHelper.map(this.categoryRepository - .save(CategoryMappingHelper.map(this.findById(categoryId)))); - } - - @Override - public void deleteById(final Integer categoryId) { - log.info("*** Void, service; delete category by id *"); - this.categoryRepository.deleteById(categoryId); - } - - - -} - - - - - - - - - diff --git a/product-service/src/main/java/com/selimhorri/app/service/impl/ProductServiceImpl.java b/product-service/src/main/java/com/selimhorri/app/service/impl/ProductServiceImpl.java deleted file mode 100644 index 6a624614c..000000000 --- a/product-service/src/main/java/com/selimhorri/app/service/impl/ProductServiceImpl.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.exception.wrapper.ProductNotFoundException; -import com.selimhorri.app.helper.ProductMappingHelper; -import com.selimhorri.app.repository.ProductRepository; -import com.selimhorri.app.service.ProductService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class ProductServiceImpl implements ProductService { - - private final ProductRepository productRepository; - - @Override - public List findAll() { - log.info("*** ProductDto List, service; fetch all products *"); - return this.productRepository.findAll() - .stream() - .map(ProductMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public ProductDto findById(final Integer productId) { - log.info("*** ProductDto, service; fetch product by id *"); - return this.productRepository.findById(productId) - .map(ProductMappingHelper::map) - .orElseThrow(() -> new ProductNotFoundException(String.format("Product with id: %d not found", productId))); - } - - @Override - public ProductDto save(final ProductDto productDto) { - log.info("*** ProductDto, service; save product *"); - return ProductMappingHelper.map(this.productRepository - .save(ProductMappingHelper.map(productDto))); - } - - @Override - public ProductDto update(final ProductDto productDto) { - log.info("*** ProductDto, service; update product *"); - return ProductMappingHelper.map(this.productRepository - .save(ProductMappingHelper.map(productDto))); - } - - @Override - public ProductDto update(final Integer productId, final ProductDto productDto) { - log.info("*** ProductDto, service; update product with productId *"); - return ProductMappingHelper.map(this.productRepository - .save(ProductMappingHelper.map(this.findById(productId)))); - } - - @Override - public void deleteById(final Integer productId) { - log.info("*** Void, service; delete product by id *"); - this.productRepository.delete(ProductMappingHelper - .map(this.findById(productId))); - } - - - -} - - - - - - - - - diff --git a/product-service/src/main/resources/application-dev.yml b/product-service/src/main/resources/application-dev.yml deleted file mode 100644 index 706d90e48..000000000 --- a/product-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,47 +0,0 @@ - -server: - port: 8500 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/product-service/src/main/resources/application-prod.yml b/product-service/src/main/resources/application-prod.yml deleted file mode 100644 index 7fa685710..000000000 --- a/product-service/src/main/resources/application-prod.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8500 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - diff --git a/product-service/src/main/resources/application-stage.yml b/product-service/src/main/resources/application-stage.yml deleted file mode 100644 index e07e9b670..000000000 --- a/product-service/src/main/resources/application-stage.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8300 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/product-service/src/main/resources/application.yml b/product-service/src/main/resources/application.yml deleted file mode 100644 index d0296b82c..000000000 --- a/product-service/src/main/resources/application.yml +++ /dev/null @@ -1,45 +0,0 @@ - -server: - servlet: - context-path: /product-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: PRODUCT-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - productService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - diff --git a/product-service/src/main/resources/db/migration/V1__create_categories_table.sql b/product-service/src/main/resources/db/migration/V1__create_categories_table.sql deleted file mode 100644 index 12cb7ffb2..000000000 --- a/product-service/src/main/resources/db/migration/V1__create_categories_table.sql +++ /dev/null @@ -1,10 +0,0 @@ - -CREATE TABLE categories ( - category_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - parent_category_id INT(11), - category_title VARCHAR(255), - image_url VARCHAR(255), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - diff --git a/product-service/src/main/resources/db/migration/V2__insert_categories_table.sql b/product-service/src/main/resources/db/migration/V2__insert_categories_table.sql deleted file mode 100644 index a74aa0b0a..000000000 --- a/product-service/src/main/resources/db/migration/V2__insert_categories_table.sql +++ /dev/null @@ -1,7 +0,0 @@ - -INSERT INTO categories -(parent_category_id, category_title) VALUES -(null, 'Computer'), -(null, 'Mode'), -(null, 'Game'); - diff --git a/product-service/src/main/resources/db/migration/V3__create_products_table.sql b/product-service/src/main/resources/db/migration/V3__create_products_table.sql deleted file mode 100644 index 9d2920f4a..000000000 --- a/product-service/src/main/resources/db/migration/V3__create_products_table.sql +++ /dev/null @@ -1,13 +0,0 @@ - -CREATE TABLE products ( - product_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - category_id INT(11), - product_title VARCHAR(255), - image_url VARCHAR(255), - sku VARCHAR(255), - price_unit DECIMAL(7, 2), - quantity INT(11), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - diff --git a/product-service/src/main/resources/db/migration/V4__insert_products_table.sql b/product-service/src/main/resources/db/migration/V4__insert_products_table.sql deleted file mode 100644 index fed0c1192..000000000 --- a/product-service/src/main/resources/db/migration/V4__insert_products_table.sql +++ /dev/null @@ -1,8 +0,0 @@ - -INSERT INTO products -(category_id, product_title, image_url, sku, price_unit, quantity) VALUES -(1, 'asus', 'xxx', 'dfqejklejrkn', 0, 50), -(1, 'hp', 'xxx', 'zsejfedbjh', 0, 50), -(2, 'Armani', 'xxx', 'fjdvf', 0, 50), -(3, 'GTA', 'xxx', 'qsdkjnvfrekjrf', 0, 50); - diff --git a/product-service/src/main/resources/db/migration/V5__create_categories_parent_category_id_fk.sql b/product-service/src/main/resources/db/migration/V5__create_categories_parent_category_id_fk.sql deleted file mode 100644 index 88f863ae3..000000000 --- a/product-service/src/main/resources/db/migration/V5__create_categories_parent_category_id_fk.sql +++ /dev/null @@ -1,3 +0,0 @@ - -ALTER TABLE categories - ADD CONSTRAINT fk7_assign FOREIGN KEY (parent_category_id) REFERENCES categories (category_id); diff --git a/product-service/src/main/resources/db/migration/V6__create_products_category_id_fk.sql b/product-service/src/main/resources/db/migration/V6__create_products_category_id_fk.sql deleted file mode 100644 index e43114299..000000000 --- a/product-service/src/main/resources/db/migration/V6__create_products_category_id_fk.sql +++ /dev/null @@ -1,3 +0,0 @@ - -ALTER TABLE products - ADD CONSTRAINT fk8_assign FOREIGN KEY (category_id) REFERENCES categories (category_id); diff --git a/product-service/src/test/java/com/selimhorri/app/ProductServiceApplicationTests.java b/product-service/src/test/java/com/selimhorri/app/ProductServiceApplicationTests.java deleted file mode 100644 index e3d2ced32..000000000 --- a/product-service/src/test/java/com/selimhorri/app/ProductServiceApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ProductServiceApplicationTests { - - - -} - - - - - - diff --git a/product-service/system.properties b/product-service/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/product-service/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/proxy-client/.gitignore b/proxy-client/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/proxy-client/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/proxy-client/.mvn/wrapper/MavenWrapperDownloader.java b/proxy-client/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/proxy-client/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/proxy-client/.mvn/wrapper/maven-wrapper.jar b/proxy-client/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/proxy-client/.mvn/wrapper/maven-wrapper.properties b/proxy-client/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/proxy-client/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/proxy-client/Dockerfile b/proxy-client/Dockerfile deleted file mode 100644 index e0e8715f1..000000000 --- a/proxy-client/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY proxy-client/ . -ADD proxy-client/target/proxy-client-v${PROJECT_VERSION}.jar proxy-client.jar -EXPOSE 8900 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "proxy-client.jar"] - - diff --git a/proxy-client/compose.yml b/proxy-client/compose.yml deleted file mode 100644 index 3f06548c4..000000000 --- a/proxy-client/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - auth-service-container: - image: selimhorri/proxy-client-ecommerce-boot:0.1.0 - ports: - - 8900:8900 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/proxy-client/mvnw b/proxy-client/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/proxy-client/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/proxy-client/mvnw.cmd b/proxy-client/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/proxy-client/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/proxy-client/pom.xml b/proxy-client/pom.xml deleted file mode 100644 index fda228a04..000000000 --- a/proxy-client/pom.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - proxy-client - proxy-client - Spring Boot Microservice! - jar - - - 11 - 2020.0.4 - 1.16.2 - - - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - org.springframework.boot - spring-boot-starter-validation - - - io.jsonwebtoken - jjwt - 0.9.1 - - - javax.xml.bind - jaxb-api - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity5 - - - org.projectlombok - lombok - true - - - org.springframework.security - spring-security-test - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/ProxyClientApplication.java b/proxy-client/src/main/java/com/selimhorri/app/ProxyClientApplication.java deleted file mode 100644 index a6ee05612..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/ProxyClientApplication.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.cloud.openfeign.EnableFeignClients; - -@SpringBootApplication -@EnableEurekaClient -@EnableFeignClients -public class ProxyClientApplication { - - public static void main(String[] args) { - SpringApplication.run(ProxyClientApplication.class, args); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/controller/AuthenticationController.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/controller/AuthenticationController.java deleted file mode 100644 index b822d07b4..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/controller/AuthenticationController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.selimhorri.app.business.auth.controller; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.auth.model.request.AuthenticationRequest; -import com.selimhorri.app.business.auth.model.response.AuthenticationResponse; -import com.selimhorri.app.business.auth.service.AuthenticationService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/authenticate") -@Slf4j -@RequiredArgsConstructor -public class AuthenticationController { - - private final AuthenticationService authenticationService; - - @PostMapping - public ResponseEntity authenticate( - @RequestBody - @NotNull(message = "") - @Valid final AuthenticationRequest authenticationRequest) { - log.info("**Authentication controller, proceed with the request*\n"); - return ResponseEntity.ok(this.authenticationService.authenticate(authenticationRequest)); - } - - @GetMapping("/jwt/{jwt}") - public ResponseEntity authenticate(@PathVariable("jwt") final String jwt) { - log.info("**Authentication controller, proceed with the request*\n"); - return ResponseEntity.ok(this.authenticationService.authenticate(jwt)); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/request/AuthenticationRequest.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/request/AuthenticationRequest.java deleted file mode 100644 index 31b74073b..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/request/AuthenticationRequest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.selimhorri.app.business.auth.model.request; - -import java.io.Serializable; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AuthenticationRequest implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotBlank(message = "*Username must not be empty!**") - private String username; - - @NotNull(message = "*Password must not be null!**") - private String password; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/response/AuthenticationResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/response/AuthenticationResponse.java deleted file mode 100644 index 901a36505..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/model/response/AuthenticationResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.business.auth.model.response; - -import java.io.Serializable; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AuthenticationResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private String jwtToken; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/AuthenticationService.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/AuthenticationService.java deleted file mode 100644 index 93efbe9bb..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/AuthenticationService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.selimhorri.app.business.auth.service; - -import com.selimhorri.app.business.auth.model.request.AuthenticationRequest; -import com.selimhorri.app.business.auth.model.response.AuthenticationResponse; - -public interface AuthenticationService { - - AuthenticationResponse authenticate(final AuthenticationRequest authenticationRequest); - Boolean authenticate(final String jwt); - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/AuthenticationServiceImpl.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/AuthenticationServiceImpl.java deleted file mode 100644 index 76d3ee93a..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/AuthenticationServiceImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.selimhorri.app.business.auth.service.impl; - -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.stereotype.Service; - -import com.selimhorri.app.business.auth.model.request.AuthenticationRequest; -import com.selimhorri.app.business.auth.model.response.AuthenticationResponse; -import com.selimhorri.app.business.auth.service.AuthenticationService; -import com.selimhorri.app.exception.wrapper.IllegalAuthenticationCredentialsException; -import com.selimhorri.app.jwt.service.JwtService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Slf4j -@RequiredArgsConstructor -public class AuthenticationServiceImpl implements AuthenticationService { - - private final AuthenticationManager authenticationManager; - private final UserDetailsService userDetailsService; - private final JwtService jwtService; - - @Override - public AuthenticationResponse authenticate(final AuthenticationRequest authenticationRequest) { - - log.info("** AuthenticationResponse, authenticate user service*\n"); - - try { - this.authenticationManager.authenticate(new UsernamePasswordAuthenticationToken( - authenticationRequest.getUsername(), authenticationRequest.getPassword())); - } - catch (BadCredentialsException e) { - throw new IllegalAuthenticationCredentialsException("#### Bad credentials! ####"); - } - - return new AuthenticationResponse(this.jwtService.generateToken(this.userDetailsService - .loadUserByUsername(authenticationRequest.getUsername()))); - } - - @Override - public Boolean authenticate(final String jwt) { - return null; - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/UserDetailsServiceImpl.java b/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/UserDetailsServiceImpl.java deleted file mode 100644 index 6df28972d..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/auth/service/impl/UserDetailsServiceImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.selimhorri.app.business.auth.service.impl; - -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.business.user.model.CredentialDto; -import com.selimhorri.app.business.user.model.UserDetailsImpl; -import com.selimhorri.app.constant.AppConstant; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Slf4j -@RequiredArgsConstructor -public class UserDetailsServiceImpl implements UserDetailsService { - - private static final String API_URL = AppConstant.DiscoveredDomainsApi.USER_SERVICE_HOST + "/api/credentials"; - private final RestTemplate restTemplate; - - @Override - public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException { - log.info("**UserDetails, load user by username*\n"); - return new UserDetailsImpl(this.restTemplate.getForObject(API_URL + "/username/" + username, CredentialDto.class)); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/controller/FavouriteController.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/controller/FavouriteController.java deleted file mode 100644 index 3a1cc2825..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/controller/FavouriteController.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.selimhorri.app.business.favourite.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.favourite.model.FavouriteDto; -import com.selimhorri.app.business.favourite.model.FavouriteId; -import com.selimhorri.app.business.favourite.model.response.FavouriteFavouriteServiceCollectionDtoResponse; -import com.selimhorri.app.business.favourite.service.FavouriteClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/favourites") -@RequiredArgsConstructor -public class FavouriteController { - - private final FavouriteClientService favouriteClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.favouriteClientService.findAll().getBody()); - } - - @GetMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity findById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate) { - return ResponseEntity.ok(this.favouriteClientService.findById(userId, productId, likeDate).getBody()); - } - - @GetMapping("/find") - public ResponseEntity findById(@RequestBody final FavouriteId favouriteId) { - return ResponseEntity.ok(this.favouriteClientService.findById(favouriteId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final FavouriteDto favouriteDto) { - return ResponseEntity.ok(this.favouriteClientService.save(favouriteDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final FavouriteDto favouriteDto) { - return ResponseEntity.ok(this.favouriteClientService.update(favouriteDto).getBody()); - } - - @DeleteMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity deleteById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate) { - this.favouriteClientService.deleteById(userId, productId, likeDate).getBody(); - return ResponseEntity.ok(true); - } - - @DeleteMapping("/delete") - public ResponseEntity deleteById(@RequestBody final FavouriteId favouriteId) { - this.favouriteClientService.deleteById(favouriteId).getBody(); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteDto.java deleted file mode 100644 index e07acb732..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteDto.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.selimhorri.app.business.favourite.model; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class FavouriteDto implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull(message = "Field must not be NULL") - private Integer userId; - - @NotNull(message = "Field must not be NULL") - private Integer productId; - - @NotNull(message = "Field must not be NULL") - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - - @JsonProperty("user") - @JsonInclude(Include.NON_NULL) - private UserDto userDto; - - @JsonProperty("product") - @JsonInclude(Include.NON_NULL) - private ProductDto productDto; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteId.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteId.java deleted file mode 100644 index ea618070c..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/FavouriteId.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.selimhorri.app.business.favourite.model; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -public class FavouriteId implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull - private Integer userId; - - @NotNull - private Integer productId; - - @NotNull - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime likeDate; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/ProductDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/ProductDto.java deleted file mode 100644 index 208d130bf..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/ProductDto.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.selimhorri.app.business.favourite.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonInclude(Include.NON_NULL) - private Set favouriteDtos; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/UserDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/UserDto.java deleted file mode 100644 index 70843a6c2..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/UserDto.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.selimhorri.app.business.favourite.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonInclude(Include.NON_NULL) - private Set favouriteDtos; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/response/FavouriteFavouriteServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/response/FavouriteFavouriteServiceCollectionDtoResponse.java deleted file mode 100644 index f8d829780..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/model/response/FavouriteFavouriteServiceCollectionDtoResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.favourite.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.favourite.model.FavouriteDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class FavouriteFavouriteServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/service/FavouriteClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/favourite/service/FavouriteClientService.java deleted file mode 100644 index 89313123c..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/favourite/service/FavouriteClientService.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.selimhorri.app.business.favourite.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.favourite.model.FavouriteDto; -import com.selimhorri.app.business.favourite.model.FavouriteId; -import com.selimhorri.app.business.favourite.model.response.FavouriteFavouriteServiceCollectionDtoResponse; - -@FeignClient(name = "FAVOURITE-SERVICE", contextId = "favouriteClientService", path = "/favourite-service/api/favourites") -public interface FavouriteClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity findById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate); - - @GetMapping("/find") - public ResponseEntity findById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteId favouriteId); - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteDto favouriteDto); - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteDto favouriteDto); - - @DeleteMapping("/{userId}/{productId}/{likeDate}") - public ResponseEntity deleteById( - @PathVariable("userId") final String userId, - @PathVariable("productId") final String productId, - @PathVariable("likeDate") final String likeDate); - - @DeleteMapping("/delete") - public ResponseEntity deleteById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final FavouriteId favouriteId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/CartController.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/CartController.java deleted file mode 100644 index abda4edd4..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/CartController.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.selimhorri.app.business.order.controller; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.order.model.CartDto; -import com.selimhorri.app.business.order.model.response.CartOrderServiceDtoCollectionResponse; -import com.selimhorri.app.business.order.service.CartClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/carts") -@RequiredArgsConstructor -public class CartController { - - private final CartClientService cartClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.cartClientService.findAll().getBody()); - } - - @GetMapping("/{cartId}") - public ResponseEntity findById( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank!") - @Valid final String cartId) { - return ResponseEntity.ok(this.cartClientService.findById(cartId).getBody()); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto) { - return ResponseEntity.ok(this.cartClientService.save(cartDto).getBody()); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto) { - return ResponseEntity.ok(this.cartClientService.update(cartDto).getBody()); - } - - @PutMapping("/{cartId}") - public ResponseEntity update( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank!") - @Valid final String cartId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto) { - return ResponseEntity.ok(this.cartClientService.update(cartId, cartDto).getBody()); - } - - @DeleteMapping("/{cartId}") - public ResponseEntity deleteById(@PathVariable("cartId") final String cartId) { - this.cartClientService.deleteById(cartId).getBody(); - return ResponseEntity.ok(true); - } - - - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/OrderController.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/OrderController.java deleted file mode 100644 index f5f772c88..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/controller/OrderController.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.selimhorri.app.business.order.controller; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.order.model.OrderDto; -import com.selimhorri.app.business.order.model.response.OrderOrderServiceDtoCollectionResponse; -import com.selimhorri.app.business.order.service.OrderClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/orders") -@RequiredArgsConstructor -public class OrderController { - - private final OrderClientService orderClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.orderClientService.findAll().getBody()); - } - - @GetMapping("/{orderId}") - public ResponseEntity findById( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank!") - @Valid final String orderId) { - return ResponseEntity.ok(this.orderClientService.findById(orderId).getBody()); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto) { - return ResponseEntity.ok(this.orderClientService.save(orderDto).getBody()); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto) { - return ResponseEntity.ok(this.orderClientService.update(orderDto).getBody()); - } - - @PutMapping("/{orderId}") - public ResponseEntity update( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank!") - @Valid final String orderId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto) { - return ResponseEntity.ok(this.orderClientService.update(orderId, orderDto).getBody()); - } - - @DeleteMapping("/{orderId}") - public ResponseEntity deleteById(@PathVariable("orderId") final String orderId) { - this.orderClientService.deleteById(orderId).getBody(); - return ResponseEntity.ok(true); - } - - - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/CartDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/CartDto.java deleted file mode 100644 index 570546ccc..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/CartDto.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.selimhorri.app.business.order.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CartDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer cartId; - private Integer userId; - - @JsonInclude(Include.NON_NULL) - private Set orderDtos; - - @JsonProperty("user") - @JsonInclude(Include.NON_NULL) - private UserDto userDto; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/OrderDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/OrderDto.java deleted file mode 100644 index ad1ed8ded..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/OrderDto.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.selimhorri.app.business.order.model; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - - @JsonProperty("cart") - @JsonInclude(Include.NON_NULL) - private CartDto cartDto; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/UserDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/UserDto.java deleted file mode 100644 index 23e1813a6..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/UserDto.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.selimhorri.app.business.order.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonProperty("cart") - @JsonInclude(Include.NON_NULL) - private CartDto cartDto; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/CartOrderServiceDtoCollectionResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/CartOrderServiceDtoCollectionResponse.java deleted file mode 100644 index 12bc5fb1f..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/CartOrderServiceDtoCollectionResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.order.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.order.model.CartDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CartOrderServiceDtoCollectionResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/OrderOrderServiceDtoCollectionResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/OrderOrderServiceDtoCollectionResponse.java deleted file mode 100644 index c61e6b574..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/model/response/OrderOrderServiceDtoCollectionResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.order.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.order.model.OrderDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderOrderServiceDtoCollectionResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/service/CartClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/service/CartClientService.java deleted file mode 100644 index 32be02946..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/service/CartClientService.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.selimhorri.app.business.order.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.order.model.CartDto; -import com.selimhorri.app.business.order.model.response.CartOrderServiceDtoCollectionResponse; - -@FeignClient(name = "ORDER-SERVICE", contextId = "cartClientService", path = "/order-service/api/carts") -public interface CartClientService { - - @GetMapping - public ResponseEntity findAll(); - - @GetMapping("/{cartId}") - public ResponseEntity findById( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank!") - @Valid final String cartId); - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto); - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto); - - @PutMapping("/{cartId}") - public ResponseEntity update( - @PathVariable("cartId") - @NotBlank(message = "Input must not be blank!") - @Valid final String cartId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CartDto cartDto); - - @DeleteMapping("/{cartId}") - public ResponseEntity deleteById(@PathVariable("cartId") final String cartId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/order/service/OrderClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/order/service/OrderClientService.java deleted file mode 100644 index ba9406c57..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/order/service/OrderClientService.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.selimhorri.app.business.order.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.order.model.OrderDto; -import com.selimhorri.app.business.order.model.response.OrderOrderServiceDtoCollectionResponse; - -@FeignClient(name = "ORDER-SERVICE", contextId = "orderClientService", path = "/order-service/api/orders") -public interface OrderClientService { - - @GetMapping - public ResponseEntity findAll(); - - @GetMapping("/{orderId}") - public ResponseEntity findById( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank!") - @Valid final String orderId); - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto); - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto); - - @PutMapping("/{orderId}") - public ResponseEntity update( - @PathVariable("orderId") - @NotBlank(message = "Input must not be blank!") - @Valid final String orderId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final OrderDto orderDto); - - @DeleteMapping("/{orderId}") - public ResponseEntity deleteById(@PathVariable("orderId") final String orderId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/controller/OrderItemController.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/controller/OrderItemController.java deleted file mode 100644 index 6e5a8ab04..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/controller/OrderItemController.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.selimhorri.app.business.orderItem.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.orderItem.model.OrderItemDto; -import com.selimhorri.app.business.orderItem.model.OrderItemId; -import com.selimhorri.app.business.orderItem.model.response.OrderItemOrderItemServiceDtoCollectionResponse; -import com.selimhorri.app.business.orderItem.service.OrderItemClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/shippings") -@RequiredArgsConstructor -public class OrderItemController { - - private final OrderItemClientService orderItemClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.orderItemClientService.findAll().getBody()); - } - - @GetMapping("/{orderId}/{productId}") - public ResponseEntity findById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId) { - return ResponseEntity.ok(this.orderItemClientService.findById(new OrderItemId(Integer.parseInt(productId), - Integer.parseInt(orderId))).getBody()); - } - - @GetMapping("/find") - public ResponseEntity findById(@RequestBody final OrderItemId orderItemId) { - return ResponseEntity.ok(this.orderItemClientService.findById(orderItemId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final OrderItemDto orderItemDto) { - return ResponseEntity.ok(this.orderItemClientService.save(orderItemDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final OrderItemDto orderItemDto) { - return ResponseEntity.ok(this.orderItemClientService.update(orderItemDto).getBody()); - } - - @DeleteMapping("/{orderId}/{productId}") - public ResponseEntity deleteById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId) { - this.orderItemClientService.deleteById(new OrderItemId(Integer.parseInt(orderId), - Integer.parseInt(productId))).getBody(); - return ResponseEntity.ok(true); - } - - @DeleteMapping("/delete") - public ResponseEntity deleteById(@RequestBody final OrderItemId orderItemId) { - this.orderItemClientService.deleteById(orderItemId).getBody(); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderDto.java deleted file mode 100644 index e7fd52906..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderDto.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.selimhorri.app.business.orderItem.model; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.Set; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - - @JsonInclude(Include.NON_NULL) - private Set orderItemDtos; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemDto.java deleted file mode 100644 index b9ebb62e2..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemDto.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.selimhorri.app.business.orderItem.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderItemDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer productId; - private Integer orderId; - private Integer orderedQuantity; - - @JsonProperty("product") - @JsonInclude(Include.NON_NULL) - private ProductDto productDto; - - @JsonProperty("order") - @JsonInclude(Include.NON_NULL) - private OrderDto orderDto; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemId.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemId.java deleted file mode 100644 index 54de8a58b..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/OrderItemId.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.business.orderItem.model; - -import java.io.Serializable; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -public class OrderItemId implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private Integer orderId; - -} - - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/ProductDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/ProductDto.java deleted file mode 100644 index fbacf607b..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/ProductDto.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.selimhorri.app.business.orderItem.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonInclude(Include.NON_NULL) - private Set orderItemDtos; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/response/OrderItemOrderItemServiceDtoCollectionResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/response/OrderItemOrderItemServiceDtoCollectionResponse.java deleted file mode 100644 index 375e407e6..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/model/response/OrderItemOrderItemServiceDtoCollectionResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.orderItem.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.orderItem.model.OrderItemDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderItemOrderItemServiceDtoCollectionResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/service/OrderItemClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/service/OrderItemClientService.java deleted file mode 100644 index 069a11362..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/orderItem/service/OrderItemClientService.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.selimhorri.app.business.orderItem.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.orderItem.model.OrderItemDto; -import com.selimhorri.app.business.orderItem.model.OrderItemId; -import com.selimhorri.app.business.orderItem.model.response.OrderItemOrderItemServiceDtoCollectionResponse; - -@FeignClient(name = "SHIPPING-SERVICE", contextId = "shippingClientService", path = "/shipping-service/api/shippings") -public interface OrderItemClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{orderId}/{productId}") - ResponseEntity findById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId); - - @GetMapping("/find") - ResponseEntity findById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemId orderItemId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemDto orderItemDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemDto orderItemDto); - - @DeleteMapping("/{orderId}/{productId}") - ResponseEntity deleteById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId); - - @DeleteMapping("/delete") - ResponseEntity deleteById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemId orderItemId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/controller/PaymentController.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/controller/PaymentController.java deleted file mode 100644 index e10d783d7..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/controller/PaymentController.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.selimhorri.app.business.payment.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.payment.model.PaymentDto; -import com.selimhorri.app.business.payment.model.response.PaymentPaymentServiceDtoCollectionResponse; -import com.selimhorri.app.business.payment.service.PaymentClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/payments") -@RequiredArgsConstructor -public class PaymentController { - - private final PaymentClientService paymentClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.paymentClientService.findAll().getBody()); - } - - @GetMapping("/{paymentId}") - public ResponseEntity findById(@PathVariable("paymentId") final String paymentId) { - return ResponseEntity.ok(this.paymentClientService.findById(paymentId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final PaymentDto paymentDto) { - return ResponseEntity.ok(this.paymentClientService.save(paymentDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final PaymentDto paymentDto) { - return ResponseEntity.ok(this.paymentClientService.update(paymentDto).getBody()); - } - - @DeleteMapping("/{paymentId}") - public ResponseEntity deleteById(@PathVariable("paymentId") final String paymentId) { - return ResponseEntity.ok(this.paymentClientService.deleteById(paymentId).getBody()); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/OrderDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/OrderDto.java deleted file mode 100644 index 9eb872532..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/OrderDto.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.selimhorri.app.business.payment.model; - -import java.io.Serializable; -import java.time.LocalDateTime; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentDto.java deleted file mode 100644 index c888f76eb..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentDto.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.selimhorri.app.business.payment.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class PaymentDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer paymentId; - private Boolean isPayed; - private PaymentStatus paymentStatus; - - @JsonProperty("order") - @JsonInclude(Include.NON_NULL) - private OrderDto orderDto; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentStatus.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentStatus.java deleted file mode 100644 index 3eb9aa0bf..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/PaymentStatus.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app.business.payment.model; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum PaymentStatus { - - NOT_STARTED("not_started"), - IN_PROGRESS("in_progress"), - COMPLETED("completed"); - - private final String status; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/response/PaymentPaymentServiceDtoCollectionResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/response/PaymentPaymentServiceDtoCollectionResponse.java deleted file mode 100644 index a6086f067..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/model/response/PaymentPaymentServiceDtoCollectionResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.payment.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.payment.model.PaymentDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class PaymentPaymentServiceDtoCollectionResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/payment/service/PaymentClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/payment/service/PaymentClientService.java deleted file mode 100644 index a629633f4..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/payment/service/PaymentClientService.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.selimhorri.app.business.payment.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.payment.model.PaymentDto; -import com.selimhorri.app.business.payment.model.response.PaymentPaymentServiceDtoCollectionResponse; - -@FeignClient(name = "PAYMENT-SERVICE", contextId = "paymentClientService", path = "/payment-service/api/payments") -public interface PaymentClientService { - - @GetMapping - public ResponseEntity findAll(); - - @GetMapping("/{paymentId}") - public ResponseEntity findById( - @PathVariable("paymentId") - @NotBlank(message = "Input must not be blank!") - @Valid final String paymentId); - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final PaymentDto paymentDto); - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final PaymentDto paymentDto); - - @DeleteMapping("/{paymentId}") - public ResponseEntity deleteById(@PathVariable("paymentId") final String paymentId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/CategoryController.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/CategoryController.java deleted file mode 100644 index 4b6d248a2..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/CategoryController.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.selimhorri.app.business.product.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.product.model.CategoryDto; -import com.selimhorri.app.business.product.model.response.CategoryProductServiceCollectionDtoResponse; -import com.selimhorri.app.business.product.service.CategoryClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/categories") -@RequiredArgsConstructor -public class CategoryController { - - private final CategoryClientService categoryClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.categoryClientService.findAll().getBody()); - } - - @GetMapping("/{categoryId}") - public ResponseEntity findById(@PathVariable("categoryId") final String categoryId) { - return ResponseEntity.ok(this.categoryClientService.findById(categoryId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final CategoryDto categoryDto) { - return ResponseEntity.ok(this.categoryClientService.save(categoryDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final CategoryDto categoryDto) { - return ResponseEntity.ok(this.categoryClientService.update(categoryDto).getBody()); - } - - @PutMapping("/{categoryId}") - public ResponseEntity update(@PathVariable("categoryId") final String categoryId, - @RequestBody final CategoryDto categoryDto) { - return ResponseEntity.ok(this.categoryClientService.update(categoryId, categoryDto).getBody()); - } - - @DeleteMapping("/{categoryId}") - public ResponseEntity deleteById(@PathVariable("categoryId") final String categoryId) { - return ResponseEntity.ok(this.categoryClientService.deleteById(categoryId).getBody()); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/ProductController.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/ProductController.java deleted file mode 100644 index ce1420a49..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/controller/ProductController.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.selimhorri.app.business.product.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.product.model.ProductDto; -import com.selimhorri.app.business.product.model.response.ProductProductServiceCollectionDtoResponse; -import com.selimhorri.app.business.product.service.ProductClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/products") -@RequiredArgsConstructor -public class ProductController { - - private final ProductClientService productClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.productClientService.findAll().getBody()); - } - - @GetMapping("/{productId}") - public ResponseEntity findById(@PathVariable("productId") final String productId) { - return ResponseEntity.ok(this.productClientService.findById(productId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final ProductDto productDto) { - return ResponseEntity.ok(this.productClientService.save(productDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final ProductDto productDto) { - return ResponseEntity.ok(this.productClientService.update(productDto).getBody()); - } - - @PutMapping("/{productId}") - public ResponseEntity update(@PathVariable("productId") final String productId, - @RequestBody final ProductDto productDto) { - return ResponseEntity.ok(this.productClientService.update(productId, productDto).getBody()); - } - - @DeleteMapping("/{productId}") - public ResponseEntity deleteById(@PathVariable("productId") final String productId) { - return ResponseEntity.ok(this.productClientService.deleteById(productId).getBody()); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/CategoryDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/CategoryDto.java deleted file mode 100644 index 2c67fa505..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/CategoryDto.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.selimhorri.app.business.product.model; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CategoryDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer categoryId; - private String categoryTitle; - private String imageUrl; - - @JsonInclude(Include.NON_NULL) - private Set subCategoriesDtos; - - @JsonProperty("parentCategory") - @JsonInclude(Include.NON_NULL) - private CategoryDto parentCategoryDto; - - @JsonInclude(Include.NON_NULL) - private Set productDtos; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/ProductDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/ProductDto.java deleted file mode 100644 index 3da6399f7..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/ProductDto.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.selimhorri.app.business.product.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonProperty("category") - @JsonInclude(Include.NON_NULL) - private CategoryDto categoryDto; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/CategoryProductServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/CategoryProductServiceCollectionDtoResponse.java deleted file mode 100644 index f654fc965..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/CategoryProductServiceCollectionDtoResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.product.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.product.model.CategoryDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CategoryProductServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/ProductProductServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/ProductProductServiceCollectionDtoResponse.java deleted file mode 100644 index 94396dc0a..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/model/response/ProductProductServiceCollectionDtoResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.product.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.product.model.ProductDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductProductServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/service/CategoryClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/service/CategoryClientService.java deleted file mode 100644 index 843182b8d..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/service/CategoryClientService.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.selimhorri.app.business.product.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.product.model.CategoryDto; -import com.selimhorri.app.business.product.model.response.CategoryProductServiceCollectionDtoResponse; - -@FeignClient(name = "PRODUCT-SERVICE", contextId = "categoryClientService", path = "/product-service/api/categories") -public interface CategoryClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{categoryId}") - ResponseEntity findById( - @PathVariable("categoryId") - @NotBlank(message = "Input must not be blank!") - @Valid final String categoryId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CategoryDto categoryDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CategoryDto categoryDto); - - @PutMapping("/{categoryId}") - ResponseEntity update( - @PathVariable("categoryId") - @NotBlank(message = "Input must not be blank!") - @Valid final String categoryId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final CategoryDto categoryDto); - - @DeleteMapping("/{categoryId}") - ResponseEntity deleteById(@PathVariable("categoryId") final String categoryId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/product/service/ProductClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/product/service/ProductClientService.java deleted file mode 100644 index fb36962df..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/product/service/ProductClientService.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.selimhorri.app.business.product.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.product.model.ProductDto; -import com.selimhorri.app.business.product.model.response.ProductProductServiceCollectionDtoResponse; - -@FeignClient(name = "PRODUCT-SERVICE", contextId = "productClientService", path = "/product-service/api/products") -public interface ProductClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{productId}") - ResponseEntity findById( - @PathVariable("productId") - @NotBlank(message = "Input must not be blank!") - @Valid final String productId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto); - - @PutMapping("/{productId}") - ResponseEntity update( - @PathVariable("productId") - @NotBlank(message = "Input must not be blank!") - @Valid final String productId, - @RequestBody - @NotNull(message = "Input must not be NULL!") - @Valid final ProductDto productDto); - - @DeleteMapping("/{productId}") - ResponseEntity deleteById(@PathVariable("productId") final String productId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/AddressController.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/AddressController.java deleted file mode 100644 index 3f446258a..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/AddressController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.selimhorri.app.business.user.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.user.model.AddressDto; -import com.selimhorri.app.business.user.model.response.AddressUserServiceCollectionDtoResponse; -import com.selimhorri.app.business.user.service.AddressClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/address") -@RequiredArgsConstructor -public class AddressController { - - private final AddressClientService addressClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.addressClientService.findAll().getBody()); - } - - @GetMapping("/{addressId}") - public ResponseEntity findById(@PathVariable("addressId") final String addressId) { - return ResponseEntity.ok(this.addressClientService.findById(addressId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final AddressDto addressDto) { - return ResponseEntity.ok(this.addressClientService.save(addressDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final AddressDto addressDto) { - return ResponseEntity.ok(this.addressClientService.update(addressDto).getBody()); - } - - @PutMapping("/{addressId}") - public ResponseEntity update(@PathVariable("addressId") final String addressId, @RequestBody final AddressDto addressDto) { - return ResponseEntity.ok(this.addressClientService.update(addressDto).getBody()); - } - - @DeleteMapping("/{addressId}") - public ResponseEntity deleteById(@PathVariable("addressId") final String addressId) { - return ResponseEntity.ok(this.addressClientService.deleteById(addressId).getBody()); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/CredentialController.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/CredentialController.java deleted file mode 100644 index dfc5cbfbe..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/CredentialController.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.selimhorri.app.business.user.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.user.model.CredentialDto; -import com.selimhorri.app.business.user.model.response.CredentialUserServiceCollectionDtoResponse; -import com.selimhorri.app.business.user.service.CredentialClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/credentials") -@RequiredArgsConstructor -public class CredentialController { - - private final CredentialClientService credentialClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.credentialClientService.findAll().getBody()); - } - - @GetMapping("/{credentialId}") - public ResponseEntity findById(@PathVariable("credentialId") final String credentialId) { - return ResponseEntity.ok(this.credentialClientService.findById(credentialId).getBody()); - } - - @GetMapping("/username/{username}") - public ResponseEntity findByCredentialname(@PathVariable("username") final String username) { - return ResponseEntity.ok(this.credentialClientService.findByUsername(username).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final CredentialDto credentialDto) { - return ResponseEntity.ok(this.credentialClientService.save(credentialDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final CredentialDto credentialDto) { - return ResponseEntity.ok(this.credentialClientService.update(credentialDto).getBody()); - } - - @PutMapping("/{credentialId}") - public ResponseEntity update(@PathVariable("credentialId") final String credentialId, @RequestBody final CredentialDto credentialDto) { - return ResponseEntity.ok(this.credentialClientService.update(credentialDto).getBody()); - } - - @DeleteMapping("/{credentialId}") - public ResponseEntity deleteById(@PathVariable("credentialId") final String credentialId) { - return ResponseEntity.ok(this.credentialClientService.deleteById(credentialId).getBody()); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/UserController.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/UserController.java deleted file mode 100644 index 3999e8026..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/UserController.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.selimhorri.app.business.user.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.user.model.UserDto; -import com.selimhorri.app.business.user.model.response.UserUserServiceCollectionDtoResponse; -import com.selimhorri.app.business.user.service.UserClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/users") -@RequiredArgsConstructor -public class UserController { - - private final UserClientService userClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.userClientService.findAll().getBody()); - } - - @GetMapping("/{userId}") - public ResponseEntity findById(@PathVariable("userId") final String userId) { - return ResponseEntity.ok(this.userClientService.findById(userId).getBody()); - } - - @GetMapping("/username/{username}") - public ResponseEntity findByUsername(@PathVariable("username") final String username) { - return ResponseEntity.ok(this.userClientService.findByUsername(username).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final UserDto userDto) { - return ResponseEntity.ok(this.userClientService.save(userDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final UserDto userDto) { - return ResponseEntity.ok(this.userClientService.update(userDto).getBody()); - } - - @PutMapping("/{userId}") - public ResponseEntity update(@PathVariable("userId") final String userId, @RequestBody final UserDto userDto) { - return ResponseEntity.ok(this.userClientService.update(userDto).getBody()); - } - - @DeleteMapping("/{userId}") - public ResponseEntity deleteById(@PathVariable("userId") final String userId) { - return ResponseEntity.ok(this.userClientService.deleteById(userId).getBody()); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/VerificationTokenController.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/VerificationTokenController.java deleted file mode 100644 index c1608a9da..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/controller/VerificationTokenController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.selimhorri.app.business.user.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.business.user.model.VerificationTokenDto; -import com.selimhorri.app.business.user.model.response.VerificationUserTokenServiceCollectionDtoResponse; -import com.selimhorri.app.business.user.service.VerificationTokenClientService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/verificationTokens") -@RequiredArgsConstructor -public class VerificationTokenController { - - private final VerificationTokenClientService verificationTokenClientService; - - @GetMapping - public ResponseEntity findAll() { - return ResponseEntity.ok(this.verificationTokenClientService.findAll().getBody()); - } - - @GetMapping("/{verificationTokenId}") - public ResponseEntity findById(@PathVariable("verificationTokenId") final String verificationTokenId) { - return ResponseEntity.ok(this.verificationTokenClientService.findById(verificationTokenId).getBody()); - } - - @PostMapping - public ResponseEntity save(@RequestBody final VerificationTokenDto verificationTokenDto) { - return ResponseEntity.ok(this.verificationTokenClientService.save(verificationTokenDto).getBody()); - } - - @PutMapping - public ResponseEntity update(@RequestBody final VerificationTokenDto verificationTokenDto) { - return ResponseEntity.ok(this.verificationTokenClientService.update(verificationTokenDto).getBody()); - } - - @PutMapping("/{verificationTokenId}") - public ResponseEntity update(@PathVariable("verificationTokenId") final String verificationTokenId, @RequestBody final VerificationTokenDto verificationTokenDto) { - return ResponseEntity.ok(this.verificationTokenClientService.update(verificationTokenDto).getBody()); - } - - @DeleteMapping("/{verificationTokenId}") - public ResponseEntity deleteById(@PathVariable("verificationTokenId") final String verificationTokenId) { - return ResponseEntity.ok(this.verificationTokenClientService.deleteById(verificationTokenId).getBody()); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/AddressDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/AddressDto.java deleted file mode 100644 index 0e055ecdf..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/AddressDto.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.selimhorri.app.business.user.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AddressDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer addressId; - - private String fullAddress; - - private String postalCode; - - private String city; - - @JsonProperty("user") - @JsonInclude(value = Include.NON_NULL) - private UserDto userDto; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/CredentialDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/CredentialDto.java deleted file mode 100644 index a8048167b..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/CredentialDto.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.selimhorri.app.business.user.model; - -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CredentialDto { - - private Integer credentialId; - private String username; - private String password; - private RoleBasedAuthority roleBasedAuthority; - private Boolean isEnabled; - private Boolean isAccountNonExpired; - private Boolean isAccountNonLocked; - private Boolean isCredentialsNonExpired; - - @JsonProperty("user") - @JsonInclude(value = Include.NON_NULL) - private UserDto userDto; - - @JsonInclude(value = Include.NON_NULL) - private Set verificationTokenDtos; - -} - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/RoleBasedAuthority.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/RoleBasedAuthority.java deleted file mode 100644 index f19d341fb..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/RoleBasedAuthority.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.selimhorri.app.business.user.model; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum RoleBasedAuthority { - - ROLE_USER("USER"), - ROLE_ADMIN("ADMIN"); - - private final String role; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDetailsImpl.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDetailsImpl.java deleted file mode 100644 index ef11a0f46..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDetailsImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.selimhorri.app.business.user.model; - -import java.util.Collection; -import java.util.List; - -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class UserDetailsImpl implements UserDetails { - - private static final long serialVersionUID = 1L; - private final CredentialDto credential; - - @Override - public Collection getAuthorities() { - return List.of(new SimpleGrantedAuthority(this.credential.getRoleBasedAuthority().name())); - } - - @Override - public String getUsername() { - return this.credential.getUsername(); - } - - @Override - public String getPassword() { - return this.credential.getPassword(); - } - - @Override - public boolean isEnabled() { - return this.credential.getIsEnabled(); - } - - @Override - public boolean isAccountNonExpired() { - return this.credential.getIsAccountNonExpired(); - } - - @Override - public boolean isAccountNonLocked() { - return this.credential.getIsAccountNonLocked(); - } - - @Override - public boolean isCredentialsNonExpired() { - return this.credential.getIsCredentialsNonExpired(); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDto.java deleted file mode 100644 index 397addf19..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/UserDto.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.selimhorri.app.business.user.model; - -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto { - - private Integer userId; - private String firstName; - private String lastName; - private String imageUrl; - private String email; - private String phone; - - @JsonInclude(value = Include.NON_NULL) - private Set addressDtos; - - @JsonProperty("credential") - @JsonInclude(value = Include.NON_NULL) - private CredentialDto credentialDto; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/VerificationTokenDto.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/VerificationTokenDto.java deleted file mode 100644 index 57b247f53..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/VerificationTokenDto.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.selimhorri.app.business.user.model; - -import java.time.LocalDate; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class VerificationTokenDto { - - private Integer verificationTokenId; - private String token; - - @JsonFormat(pattern = AppConstant.LOCAL_DATE_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_FORMAT) - private LocalDate expireDate; - - @JsonProperty("credential") - @JsonInclude(value = Include.NON_NULL) - private CredentialDto credentialDto; - -} - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/AddressUserServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/AddressUserServiceCollectionDtoResponse.java deleted file mode 100644 index 37df00570..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/AddressUserServiceCollectionDtoResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.user.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.user.model.AddressDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AddressUserServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/CredentialUserServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/CredentialUserServiceCollectionDtoResponse.java deleted file mode 100644 index da0942a24..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/CredentialUserServiceCollectionDtoResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.user.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.user.model.CredentialDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CredentialUserServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/UserUserServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/UserUserServiceCollectionDtoResponse.java deleted file mode 100644 index bff0f0aa4..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/UserUserServiceCollectionDtoResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.user.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.user.model.UserDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserUserServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/VerificationUserTokenServiceCollectionDtoResponse.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/VerificationUserTokenServiceCollectionDtoResponse.java deleted file mode 100644 index 7941fd571..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/model/response/VerificationUserTokenServiceCollectionDtoResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.selimhorri.app.business.user.model.response; - -import java.io.Serializable; -import java.util.Collection; - -import com.selimhorri.app.business.user.model.VerificationTokenDto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class VerificationUserTokenServiceCollectionDtoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - private Collection collection; - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/AddressClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/AddressClientService.java deleted file mode 100644 index 3c9cc9b43..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/AddressClientService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.selimhorri.app.business.user.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.user.model.AddressDto; -import com.selimhorri.app.business.user.model.response.AddressUserServiceCollectionDtoResponse; - -@FeignClient(name = "USER-SERVICE", contextId = "addressClientService", path = "/user-service/api/address", decode404 = true) -public interface AddressClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{addressId}") - ResponseEntity findById( - @PathVariable("addressId") - @NotBlank(message = "*Input must not blank!**") - @Valid final String addressId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final AddressDto addressDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final AddressDto addressDto); - - @PutMapping("/{addressId}") - ResponseEntity update( - @PathVariable("addressId") - @NotBlank(message = "*Input must not blank!**") final String addressId, - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final AddressDto addressDto); - - @DeleteMapping("/{addressId}") - ResponseEntity deleteById(@PathVariable("addressId") @NotBlank(message = "*Input must not blank!**") @Valid final String addressId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/CredentialClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/CredentialClientService.java deleted file mode 100644 index 665b58075..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/CredentialClientService.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.selimhorri.app.business.user.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.user.model.CredentialDto; -import com.selimhorri.app.business.user.model.response.CredentialUserServiceCollectionDtoResponse; - -@FeignClient(name = "USER-SERVICE", contextId = "credentialClientService", path = "/user-service/api/credentials", decode404 = true) -public interface CredentialClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{credentialId}") - ResponseEntity findById( - @PathVariable("credentialId") - @NotBlank(message = "*Input must not blank!**") - @Valid final String credentialId); - - @GetMapping("/username/{username}") - ResponseEntity findByUsername( - @PathVariable("username") - @NotBlank(message = "*Input must not blank!**") - @Valid final String username); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final CredentialDto credentialDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final CredentialDto credentialDto); - - @PutMapping("/{credentialId}") - ResponseEntity update( - @PathVariable("credentialId") - @NotBlank(message = "*Input must not blank!**") final String credentialId, - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final CredentialDto credentialDto); - - @DeleteMapping("/{credentialId}") - ResponseEntity deleteById(@PathVariable("credentialId") @NotBlank(message = "*Input must not blank!**") @Valid final String credentialId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/UserClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/UserClientService.java deleted file mode 100644 index 9657ebee0..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/UserClientService.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.selimhorri.app.business.user.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.user.model.UserDto; -import com.selimhorri.app.business.user.model.response.UserUserServiceCollectionDtoResponse; - -@FeignClient(name = "USER-SERVICE", contextId = "userClientService", path = "/user-service/api/users", decode404 = true) -public interface UserClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{userId}") - ResponseEntity findById( - @PathVariable("userId") - @NotBlank(message = "*Input must not blank!**") - @Valid final String userId); - - @GetMapping("/username/{username}") - ResponseEntity findByUsername( - @PathVariable("username") - @NotBlank(message = "*Input must not blank!**") - @Valid final String username); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final UserDto userDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final UserDto userDto); - - @PutMapping("/{userId}") - ResponseEntity update( - @PathVariable("userId") - @NotBlank(message = "*Input must not blank!**") final String userId, - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final UserDto userDto); - - @DeleteMapping("/{userId}") - ResponseEntity deleteById(@PathVariable("userId") @NotBlank(message = "*Input must not blank!**") @Valid final String userId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/VerificationTokenClientService.java b/proxy-client/src/main/java/com/selimhorri/app/business/user/service/VerificationTokenClientService.java deleted file mode 100644 index f039fc577..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/business/user/service/VerificationTokenClientService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.selimhorri.app.business.user.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.selimhorri.app.business.user.model.VerificationTokenDto; -import com.selimhorri.app.business.user.model.response.VerificationUserTokenServiceCollectionDtoResponse; - -@FeignClient(name = "USER-SERVICE", contextId = "verificationTokenClientService", path = "/user-service/api/verificationTokens", decode404 = true) -public interface VerificationTokenClientService { - - @GetMapping - ResponseEntity findAll(); - - @GetMapping("/{verificationTokenId}") - ResponseEntity findById( - @PathVariable("verificationTokenId") - @NotBlank(message = "*Input must not blank!**") - @Valid final String verificationTokenId); - - @PostMapping - ResponseEntity save( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final VerificationTokenDto verificationTokenDto); - - @PutMapping - ResponseEntity update( - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final VerificationTokenDto verificationTokenDto); - - @PutMapping("/{verificationTokenId}") - ResponseEntity update( - @PathVariable("verificationTokenId") - @NotBlank(message = "*Input must not blank!**") final String verificationTokenId, - @RequestBody - @NotNull(message = "*Input must not NULL!**") - @Valid final VerificationTokenDto verificationTokenDto); - - @DeleteMapping("/{verificationTokenId}") - ResponseEntity deleteById(@PathVariable("verificationTokenId") @NotBlank(message = "*Input must not blank!**") @Valid final String verificationTokenId); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/config/encoder/EncoderConfig.java b/proxy-client/src/main/java/com/selimhorri/app/config/encoder/EncoderConfig.java deleted file mode 100644 index 76f5e5e73..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/config/encoder/EncoderConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.selimhorri.app.config.encoder; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; - -@Configuration -public class EncoderConfig { - - @Bean - public PasswordEncoder getPasswordEncoder() { - return new BCryptPasswordEncoder(); - } - - - -} - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/config/filter/JwtRequestFilter.java b/proxy-client/src/main/java/com/selimhorri/app/config/filter/JwtRequestFilter.java deleted file mode 100644 index f3750d912..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/config/filter/JwtRequestFilter.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.selimhorri.app.config.filter; - -import java.io.IOException; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import com.selimhorri.app.jwt.service.JwtService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Component -@Slf4j -@RequiredArgsConstructor -public class JwtRequestFilter extends OncePerRequestFilter { - - private final UserDetailsService userDetailsService; - private final JwtService jwtService; - - @Override - protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) - throws ServletException, IOException { - - log.info("**JwtRequestFilter, once per request, validating and extracting token*\n"); - - final var authorizationHeader = request.getHeader("Authorization"); - - String username = null; - String jwt = null; - - if ( authorizationHeader != null && authorizationHeader.startsWith("Bearer ") ) { - jwt = authorizationHeader.substring(7); - username = jwtService.extractUsername(jwt); - } - - if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { - - final UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); - - if (this.jwtService.validateToken(jwt, userDetails)) { - final UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = - new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); - } - - } - - filterChain.doFilter(request, response); - log.info("**Jwt request filtered!*\n"); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/config/template/TemplateConfig.java b/proxy-client/src/main/java/com/selimhorri/app/config/template/TemplateConfig.java deleted file mode 100644 index 9a127b3cc..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/config/template/TemplateConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.config.template; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class TemplateConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/constant/AppConstant.java b/proxy-client/src/main/java/com/selimhorri/app/constant/AppConstant.java deleted file mode 100644 index 2e051c4b5..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/proxy-client/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java deleted file mode 100644 index 31f794e45..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.CredentialNotFoundException; -import com.selimhorri.app.exception.wrapper.FavouriteNotFoundException; -import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; -import com.selimhorri.app.exception.wrapper.VerificationTokenNotFoundException; - -import feign.FeignException; -import feign.FeignException.FeignClientException; -import feign.FeignException.FeignServerException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - FeignClientException.class, - FeignServerException.class, - FeignException.class - }) - public ResponseEntity handleProxyException(final T e) { - - log.info("**ApiExceptionHandler controller, handle feign proxy exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg(e.contentUTF8()) - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg(e.getBindingResult().getFieldError().getDefaultMessage()) - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - UserObjectNotFoundException.class, - CredentialNotFoundException.class, - VerificationTokenNotFoundException.class, - FavouriteNotFoundException.class, - IllegalStateException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg(e.getMessage()) - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/proxy-client/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java deleted file mode 100644 index 96659ad64..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - - private final HttpStatus httpStatus; - - private final String msg; - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java deleted file mode 100644 index 284fa381b..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class CredentialNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public CredentialNotFoundException() { - super(); - } - - public CredentialNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public CredentialNotFoundException(String message) { - super(message); - } - - public CredentialNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java deleted file mode 100644 index d7d68c9af..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/FavouriteNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class FavouriteNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public FavouriteNotFoundException() { - super(); - } - - public FavouriteNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public FavouriteNotFoundException(String message) { - super(message); - } - - public FavouriteNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/IllegalAuthenticationCredentialsException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/IllegalAuthenticationCredentialsException.java deleted file mode 100644 index 7b3ba8d1a..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/IllegalAuthenticationCredentialsException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class IllegalAuthenticationCredentialsException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public IllegalAuthenticationCredentialsException() { - super(); - } - - public IllegalAuthenticationCredentialsException(String message, Throwable cause) { - super(message, cause); - } - - public IllegalAuthenticationCredentialsException(String message) { - super(message); - } - - public IllegalAuthenticationCredentialsException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java deleted file mode 100644 index 199e193ff..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class UserObjectNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public UserObjectNotFoundException() { - super(); - } - - public UserObjectNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public UserObjectNotFoundException(String message) { - super(message); - } - - public UserObjectNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java b/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java deleted file mode 100644 index eaa184f77..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class VerificationTokenNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public VerificationTokenNotFoundException() { - super(); - } - - public VerificationTokenNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public VerificationTokenNotFoundException(String message) { - super(message); - } - - public VerificationTokenNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/jwt/service/JwtService.java b/proxy-client/src/main/java/com/selimhorri/app/jwt/service/JwtService.java deleted file mode 100644 index c88f62a67..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/jwt/service/JwtService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.selimhorri.app.jwt.service; - -import java.util.Date; -import java.util.function.Function; - -import org.springframework.security.core.userdetails.UserDetails; - -import io.jsonwebtoken.Claims; - -public interface JwtService { - - String extractUsername(final String token); - Date extractExpiration(final String token); - T extractClaims(final String token, final Function claimsResolver); - String generateToken(final UserDetails userDetails); - Boolean validateToken(final String token, final UserDetails userDetails); - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/jwt/service/impl/JwtServiceImpl.java b/proxy-client/src/main/java/com/selimhorri/app/jwt/service/impl/JwtServiceImpl.java deleted file mode 100644 index 6c7a7c21c..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/jwt/service/impl/JwtServiceImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.selimhorri.app.jwt.service.impl; - -import java.util.Date; -import java.util.function.Function; - -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Service; - -import com.selimhorri.app.jwt.service.JwtService; -import com.selimhorri.app.jwt.util.JwtUtil; - -import io.jsonwebtoken.Claims; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Slf4j -@RequiredArgsConstructor -public class JwtServiceImpl implements JwtService { - - private final JwtUtil jwtUtil; - - @Override - public String extractUsername(final String token) { - log.info("**String, jwt service extract username from given token!*"); - return this.jwtUtil.extractUsername(token); - } - - @Override - public Date extractExpiration(final String token) { - log.info("**Date, jwt service extract expiration from given token!*"); - return this.jwtUtil.extractExpiration(token); - } - - @Override - public T extractClaims(final String token, final Function claimsResolver) { - log.info("**T, jwt service extract claims from given token and claimResolver Function!*"); - return this.jwtUtil.extractClaims(token, claimsResolver); - } - - @Override - public String generateToken(final UserDetails userDetails) { - log.info("**String, jwt service generate token from given userDetails!*"); - return this.jwtUtil.generateToken(userDetails); - } - - @Override - public Boolean validateToken(final String token, final UserDetails userDetails) { - log.info("**Boolean, jwt service validate token from given token and userDetails!*"); - return this.jwtUtil.validateToken(token, userDetails); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/jwt/util/JwtUtil.java b/proxy-client/src/main/java/com/selimhorri/app/jwt/util/JwtUtil.java deleted file mode 100644 index 67ca9ac9f..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/jwt/util/JwtUtil.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.selimhorri.app.jwt.util; - -import java.util.Date; -import java.util.function.Function; - -import org.springframework.security.core.userdetails.UserDetails; - -import io.jsonwebtoken.Claims; - -public interface JwtUtil { - - String extractUsername(final String token); - Date extractExpiration(final String token); - T extractClaims(final String token, final Function claimsResolver); - String generateToken(final UserDetails userDetails); - Boolean validateToken(final String token, final UserDetails userDetails); - -} diff --git a/proxy-client/src/main/java/com/selimhorri/app/jwt/util/impl/JwtUtilImpl.java b/proxy-client/src/main/java/com/selimhorri/app/jwt/util/impl/JwtUtilImpl.java deleted file mode 100644 index 3d5dec6de..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/jwt/util/impl/JwtUtilImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.selimhorri.app.jwt.util.impl; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Component; - -import com.selimhorri.app.jwt.util.JwtUtil; - -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; - -@Component -public class JwtUtilImpl implements JwtUtil { - - private static final String SECRET_KEY = "secret"; - - @Override - public String extractUsername(final String token) { - return this.extractClaims(token, Claims::getSubject); - } - - @Override - public Date extractExpiration(final String token) { - return this.extractClaims(token, Claims::getExpiration); - } - - @Override - public T extractClaims(final String token, Function claimsResolver) { - final Claims claims = this.extractAllClaims(token); - return claimsResolver.apply(claims); - } - - private Claims extractAllClaims(final String token) { - return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody(); - } - - private Boolean isTokenExpired(final String token) { - return this.extractExpiration(token).before(new Date()); - } - - @Override - public String generateToken(final UserDetails userDetails) { - final Map claims = new HashMap<>(); - return this.createToken(claims, userDetails.getUsername()); - } - - private String createToken(final Map claims, final String subject) { - return Jwts.builder() - .setClaims(claims) - .setSubject(subject) - .setIssuedAt(new Date(System.currentTimeMillis())) - .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) - .signWith(SignatureAlgorithm.HS256, SECRET_KEY) - .compact(); - } - - @Override - public Boolean validateToken(final String token, final UserDetails userDetails) { - final String username = this.extractUsername(token); - return ( - username.equals(userDetails.getUsername()) && !isTokenExpired(token) - ); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/java/com/selimhorri/app/security/SecurityConfig.java b/proxy-client/src/main/java/com/selimhorri/app/security/SecurityConfig.java deleted file mode 100644 index 40e9f7b6d..000000000 --- a/proxy-client/src/main/java/com/selimhorri/app/security/SecurityConfig.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.selimhorri.app.security; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -import com.selimhorri.app.business.user.model.RoleBasedAuthority; -import com.selimhorri.app.config.filter.JwtRequestFilter; - -import lombok.RequiredArgsConstructor; - -@Configuration -@EnableWebSecurity -@RequiredArgsConstructor -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - private final UserDetailsService userDetailsService; - private final PasswordEncoder passwordEncoder; - private final JwtRequestFilter jwtRequestFilter; - - @Override - protected void configure(final AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(this.userDetailsService) - .passwordEncoder(this.passwordEncoder); - } - - @Override - protected void configure(final HttpSecurity http) throws Exception { - http.cors().disable() - .csrf().disable() - .authorizeRequests() - .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() - .antMatchers("/", "index", "**/css/**", "**/js/**").permitAll() - .antMatchers("/api/authenticate/**").permitAll() - .antMatchers("/api/categories/**").permitAll() - .antMatchers("/api/products/**").permitAll() - .antMatchers("/api/**") - .hasAnyRole(RoleBasedAuthority.ROLE_USER.getRole(), - RoleBasedAuthority.ROLE_ADMIN.getRole()) - .antMatchers("/actuator/health/**", "/actuator/info/**") - .permitAll() - .antMatchers("/actuator/**") - .hasAnyRole(RoleBasedAuthority.ROLE_ADMIN.getRole()) - .anyRequest().authenticated() - .and() - .headers() - .frameOptions() - .sameOrigin() - .and() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .addFilterBefore(this.jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); - } - - @Bean - @Override - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } - - - -} - - - - - - - - - - diff --git a/proxy-client/src/main/resources/application-dev.yml b/proxy-client/src/main/resources/application-dev.yml deleted file mode 100644 index b577c93a4..000000000 --- a/proxy-client/src/main/resources/application-dev.yml +++ /dev/null @@ -1,25 +0,0 @@ - -server: - port: 8900 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/proxy-client/src/main/resources/application-prod.yml b/proxy-client/src/main/resources/application-prod.yml deleted file mode 100644 index cb71cf7c6..000000000 --- a/proxy-client/src/main/resources/application-prod.yml +++ /dev/null @@ -1,28 +0,0 @@ - -server: - port: 8900 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/proxy-client/src/main/resources/application-stage.yml b/proxy-client/src/main/resources/application-stage.yml deleted file mode 100644 index 18547761f..000000000 --- a/proxy-client/src/main/resources/application-stage.yml +++ /dev/null @@ -1,28 +0,0 @@ - -server: - port: 8900 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/proxy-client/src/main/resources/application.yml b/proxy-client/src/main/resources/application.yml deleted file mode 100644 index 70d90fc16..000000000 --- a/proxy-client/src/main/resources/application.yml +++ /dev/null @@ -1,45 +0,0 @@ - -server: - servlet: - context-path: /app - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: PROXY-CLIENT - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - proxyService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - diff --git a/proxy-client/src/test/java/com/selimhorri/app/ProxyClientApplicationTests.java b/proxy-client/src/test/java/com/selimhorri/app/ProxyClientApplicationTests.java deleted file mode 100644 index 47d7749c5..000000000 --- a/proxy-client/src/test/java/com/selimhorri/app/ProxyClientApplicationTests.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ProxyClientApplicationTests { - - - -} diff --git a/proxy-client/system.properties b/proxy-client/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/proxy-client/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/service-discovery/.gitignore b/service-discovery/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/service-discovery/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/service-discovery/.mvn/wrapper/MavenWrapperDownloader.java b/service-discovery/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/service-discovery/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/service-discovery/.mvn/wrapper/maven-wrapper.jar b/service-discovery/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/service-discovery/.mvn/wrapper/maven-wrapper.properties b/service-discovery/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/service-discovery/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/service-discovery/Dockerfile b/service-discovery/Dockerfile deleted file mode 100644 index 1ac8fcbc6..000000000 --- a/service-discovery/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY service-discovery/ . -ADD service-discovery/target/service-discovery-v${PROJECT_VERSION}.jar service-discovery.jar -EXPOSE 8761 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "service-discovery.jar"] - - diff --git a/service-discovery/compose.yml b/service-discovery/compose.yml deleted file mode 100644 index 340e3f25b..000000000 --- a/service-discovery/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - service-discovery-container: - image: selimhorri/service-discovery-ecommerce-boot:0.1.0 - ports: - - 8761:8761 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/service-discovery/mvnw b/service-discovery/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/service-discovery/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/service-discovery/mvnw.cmd b/service-discovery/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/service-discovery/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/service-discovery/pom.xml b/service-discovery/pom.xml deleted file mode 100644 index 970495806..000000000 --- a/service-discovery/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - service-discovery - service-discovery - Spring Boot microservice! - jar - - - 11 - 2020.0.4 - - - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-server - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - ${project.artifactId}-v${project.version} - - - - - - - - diff --git a/service-discovery/src/main/java/com/selimhorri/app/ServiceDiscoveryApplication.java b/service-discovery/src/main/java/com/selimhorri/app/ServiceDiscoveryApplication.java deleted file mode 100644 index 1ef59568b..000000000 --- a/service-discovery/src/main/java/com/selimhorri/app/ServiceDiscoveryApplication.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; - -@SpringBootApplication -@EnableEurekaServer -public class ServiceDiscoveryApplication { - - public static void main(String[] args) { - SpringApplication.run(ServiceDiscoveryApplication.class, args); - } - - - -} - - - - - - - diff --git a/service-discovery/src/main/resources/application-dev.yml b/service-discovery/src/main/resources/application-dev.yml deleted file mode 100644 index c15f335d7..000000000 --- a/service-discovery/src/main/resources/application-dev.yml +++ /dev/null @@ -1,30 +0,0 @@ - -server: - port: 8761 - -management: - endpoints: - web: - exposure: - include: "*" - -eureka: - client: - register-with-eureka: false - fetch-registry: false - -logging: - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - diff --git a/service-discovery/src/main/resources/application-prod.yml b/service-discovery/src/main/resources/application-prod.yml deleted file mode 100644 index b9b7aa587..000000000 --- a/service-discovery/src/main/resources/application-prod.yml +++ /dev/null @@ -1,28 +0,0 @@ - -server: - port: 8761 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - diff --git a/service-discovery/src/main/resources/application-stage.yml b/service-discovery/src/main/resources/application-stage.yml deleted file mode 100644 index 3e082b8b5..000000000 --- a/service-discovery/src/main/resources/application-stage.yml +++ /dev/null @@ -1,28 +0,0 @@ - -server: - port: 8761 - -management: - endpoints: - web: - exposure: - include: "*" - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/service-discovery/src/main/resources/application.yml b/service-discovery/src/main/resources/application.yml deleted file mode 100644 index 688fc278c..000000000 --- a/service-discovery/src/main/resources/application.yml +++ /dev/null @@ -1,39 +0,0 @@ - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - application: - name: SERVICE-DISCOVERY - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - serviceDiscovery: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - diff --git a/service-discovery/src/test/java/com/selimhorri/app/ServiceDiscoveryApplicationTests.java b/service-discovery/src/test/java/com/selimhorri/app/ServiceDiscoveryApplicationTests.java deleted file mode 100644 index ee7c54fec..000000000 --- a/service-discovery/src/test/java/com/selimhorri/app/ServiceDiscoveryApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ServiceDiscoveryApplicationTests { - - - -} - - - - - - diff --git a/service-discovery/system.properties b/service-discovery/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/service-discovery/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/shipping-service/.gitignore b/shipping-service/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/shipping-service/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/shipping-service/.mvn/wrapper/MavenWrapperDownloader.java b/shipping-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/shipping-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/shipping-service/.mvn/wrapper/maven-wrapper.jar b/shipping-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/shipping-service/.mvn/wrapper/maven-wrapper.properties b/shipping-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/shipping-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/shipping-service/Dockerfile b/shipping-service/Dockerfile deleted file mode 100644 index fddc2f6cd..000000000 --- a/shipping-service/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY shipping-service/ . -ADD shipping-service/target/shipping-service-v${PROJECT_VERSION}.jar shipping-service.jar -EXPOSE 8600 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "shipping-service.jar"] - - diff --git a/shipping-service/compose.yml b/shipping-service/compose.yml deleted file mode 100644 index f50bb8e8e..000000000 --- a/shipping-service/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - shipping-service-container: - image: selimhorri/shipping-service-ecommerce-boot:0.1.0 - ports: - - 8600:8600 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/shipping-service/mvnw b/shipping-service/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/shipping-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/shipping-service/mvnw.cmd b/shipping-service/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/shipping-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/shipping-service/pom.xml b/shipping-service/pom.xml deleted file mode 100644 index f0b871146..000000000 --- a/shipping-service/pom.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - shipping-service - shipping-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/ShippingServiceApplication.java b/shipping-service/src/main/java/com/selimhorri/app/ShippingServiceApplication.java deleted file mode 100644 index be2c3ca13..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/ShippingServiceApplication.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -@EnableEurekaClient -public class ShippingServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(ShippingServiceApplication.class, args); - } - - - -} - -@RestController -class ShippingController { - - @GetMapping - public String msg() { - return "shipping controller responding!!"; - } - -} - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/shipping-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java deleted file mode 100644 index 27021f387..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/shipping-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java deleted file mode 100644 index f7de593a7..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/shipping-service/src/main/java/com/selimhorri/app/constant/AppConstant.java deleted file mode 100644 index 2e051c4b5..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/shipping-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java deleted file mode 100644 index b19764968..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/domain/OrderItem.java b/shipping-service/src/main/java/com/selimhorri/app/domain/OrderItem.java deleted file mode 100644 index dcae49965..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/domain/OrderItem.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.Table; - -import com.selimhorri.app.domain.id.OrderItemId; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "order_items") -@IdClass(OrderItemId.class) -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -@Data -@Builder -public final class OrderItem extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @Column(name = "product_id", nullable = false, updatable = false) - private Integer productId; - - @Id - @Column(name = "order_id", nullable = false, updatable = false) - private Integer orderId; - - @Column(name = "ordered_quantity") - private Integer orderedQuantity; - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/domain/id/OrderItemId.java b/shipping-service/src/main/java/com/selimhorri/app/domain/id/OrderItemId.java deleted file mode 100644 index dbd171539..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/domain/id/OrderItemId.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.domain.id; - -import java.io.Serializable; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -public class OrderItemId implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private Integer orderId; - -} - - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/dto/OrderDto.java b/shipping-service/src/main/java/com/selimhorri/app/dto/OrderDto.java deleted file mode 100644 index 893e12f43..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/dto/OrderDto.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.Set; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer orderId; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - @JsonFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_TIME_FORMAT) - private LocalDateTime orderDate; - private String orderDesc; - private Double orderFee; - - @JsonInclude(Include.NON_NULL) - private Set orderItemDtos; - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/dto/OrderItemDto.java b/shipping-service/src/main/java/com/selimhorri/app/dto/OrderItemDto.java deleted file mode 100644 index 560b6b298..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/dto/OrderItemDto.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class OrderItemDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer productId; - private Integer orderId; - private Integer orderedQuantity; - - @JsonProperty("product") - @JsonInclude(Include.NON_NULL) - private ProductDto productDto; - - @JsonProperty("order") - @JsonInclude(Include.NON_NULL) - private OrderDto orderDto; - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/dto/ProductDto.java b/shipping-service/src/main/java/com/selimhorri/app/dto/ProductDto.java deleted file mode 100644 index 931c095b1..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/dto/ProductDto.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class ProductDto implements Serializable { - - private static final long serialVersionUID = 1L; - private Integer productId; - private String productTitle; - private String imageUrl; - private String sku; - private Double priceUnit; - private Integer quantity; - - @JsonInclude(Include.NON_NULL) - private Set orderItemDtos; - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/shipping-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java deleted file mode 100644 index ecee30efd..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/shipping-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java deleted file mode 100644 index fb8c5fa70..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class, - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - IllegalStateException.class, - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/shipping-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java deleted file mode 100644 index 77429c9d1..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonSerialize(using = ZonedDateTimeSerializer.class) - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - private final HttpStatus httpStatus; - private final String msg; - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderItemNotFoundException.java b/shipping-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderItemNotFoundException.java deleted file mode 100644 index 96b08b745..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/exception/wrapper/OrderItemNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class OrderItemNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public OrderItemNotFoundException() { - super(); - } - - public OrderItemNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public OrderItemNotFoundException(String message) { - super(message); - } - - public OrderItemNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/helper/OrderItemMappingHelper.java b/shipping-service/src/main/java/com/selimhorri/app/helper/OrderItemMappingHelper.java deleted file mode 100644 index eb43bff2d..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/helper/OrderItemMappingHelper.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.OrderItem; -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.OrderItemDto; -import com.selimhorri.app.dto.ProductDto; - -public interface OrderItemMappingHelper { - - public static OrderItemDto map(final OrderItem orderItem) { - return OrderItemDto.builder() - .productId(orderItem.getProductId()) - .orderId(orderItem.getOrderId()) - .orderedQuantity(orderItem.getOrderedQuantity()) - .productDto( - ProductDto.builder() - .productId(orderItem.getProductId()) - .build()) - .orderDto( - OrderDto.builder() - .orderId(orderItem.getOrderId()) - .build()) - .build(); - } - - public static OrderItem map(final OrderItemDto orderItemDto) { - return OrderItem.builder() - .productId(orderItemDto.getProductId()) - .orderId(orderItemDto.getOrderId()) - .orderedQuantity(orderItemDto.getOrderedQuantity()) - .build(); - } - - - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/repository/OrderItemRepository.java b/shipping-service/src/main/java/com/selimhorri/app/repository/OrderItemRepository.java deleted file mode 100644 index f476be222..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/repository/OrderItemRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.OrderItem; -import com.selimhorri.app.domain.id.OrderItemId; - -public interface OrderItemRepository extends JpaRepository { - - - -} diff --git a/shipping-service/src/main/java/com/selimhorri/app/resource/OrderItemResource.java b/shipping-service/src/main/java/com/selimhorri/app/resource/OrderItemResource.java deleted file mode 100644 index d07f7dc87..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/resource/OrderItemResource.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.domain.id.OrderItemId; -import com.selimhorri.app.dto.OrderItemDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.OrderItemService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping("/api/shippings") -@Slf4j -@RequiredArgsConstructor -public class OrderItemResource { - - private final OrderItemService orderItemService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** OrderItemDto List, controller; fetch all orderItems *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.orderItemService.findAll())); - } - - @GetMapping("/{orderId}/{productId}") - public ResponseEntity findById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId) { - log.info("*** OrderItemDto, resource; fetch orderItem by id *"); - return ResponseEntity.ok(this.orderItemService.findById( - new OrderItemId(Integer.parseInt(orderId), Integer.parseInt(productId)))); - } - - @GetMapping("/find") - public ResponseEntity findById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemId orderItemId) { - log.info("*** OrderItemDto, resource; fetch orderItem by id *"); - return ResponseEntity.ok(this.orderItemService.findById(orderItemId)); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemDto orderItemDto) { - log.info("*** OrderItemDto, resource; save orderItem *"); - return ResponseEntity.ok(this.orderItemService.save(orderItemDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemDto orderItemDto) { - log.info("*** OrderItemDto, resource; update orderItem *"); - return ResponseEntity.ok(this.orderItemService.update(orderItemDto)); - } - - @DeleteMapping("/{orderId}/{productId}") - public ResponseEntity deleteById( - @PathVariable("orderId") final String orderId, - @PathVariable("productId") final String productId) { - log.info("*** Boolean, resource; delete orderItem by id *"); - this.orderItemService.deleteById(new OrderItemId(Integer.parseInt(orderId), Integer.parseInt(productId))); - return ResponseEntity.ok(true); - } - - @DeleteMapping("/delete") - public ResponseEntity deleteById( - @RequestBody - @NotNull(message = "Input must not be NULL") - @Valid final OrderItemId orderItemId) { - log.info("*** Boolean, resource; delete orderItem by id *"); - this.orderItemService.deleteById(orderItemId); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/shipping-service/src/main/java/com/selimhorri/app/service/OrderItemService.java b/shipping-service/src/main/java/com/selimhorri/app/service/OrderItemService.java deleted file mode 100644 index e3dfe41b9..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/service/OrderItemService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.domain.id.OrderItemId; -import com.selimhorri.app.dto.OrderItemDto; - -public interface OrderItemService { - - List findAll(); - OrderItemDto findById(final OrderItemId orderItemId); - OrderItemDto save(final OrderItemDto orderItemDto); - OrderItemDto update(final OrderItemDto orderItemDto); - void deleteById(final OrderItemId orderItemId); - -} diff --git a/shipping-service/src/main/java/com/selimhorri/app/service/impl/OrderItemServiceImpl.java b/shipping-service/src/main/java/com/selimhorri/app/service/impl/OrderItemServiceImpl.java deleted file mode 100644 index 10f1e1e18..000000000 --- a/shipping-service/src/main/java/com/selimhorri/app/service/impl/OrderItemServiceImpl.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import com.selimhorri.app.constant.AppConstant; -import com.selimhorri.app.domain.id.OrderItemId; -import com.selimhorri.app.dto.OrderDto; -import com.selimhorri.app.dto.OrderItemDto; -import com.selimhorri.app.dto.ProductDto; -import com.selimhorri.app.exception.wrapper.OrderItemNotFoundException; -import com.selimhorri.app.helper.OrderItemMappingHelper; -import com.selimhorri.app.repository.OrderItemRepository; -import com.selimhorri.app.service.OrderItemService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class OrderItemServiceImpl implements OrderItemService { - - private final OrderItemRepository orderItemRepository; - private final RestTemplate restTemplate; - - @Override - public List findAll() { - log.info("*** OrderItemDto List, service; fetch all orderItems *"); - return this.orderItemRepository.findAll() - .stream() - .map(OrderItemMappingHelper::map) - .map(o -> { - o.setProductDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .PRODUCT_SERVICE_API_URL + "/" + o.getProductDto().getProductId(), ProductDto.class)); - o.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .ORDER_SERVICE_API_URL + "/" + o.getOrderDto().getOrderId(), OrderDto.class)); - return o; - }) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public OrderItemDto findById(final OrderItemId orderItemId) { - log.info("*** OrderItemDto, service; fetch orderItem by id *"); - return this.orderItemRepository.findById(null) - .map(OrderItemMappingHelper::map) - .map(o -> { - o.setProductDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .PRODUCT_SERVICE_API_URL + "/" + o.getProductDto().getProductId(), ProductDto.class)); - o.setOrderDto(this.restTemplate.getForObject(AppConstant.DiscoveredDomainsApi - .ORDER_SERVICE_API_URL + "/" + o.getOrderDto().getOrderId(), OrderDto.class)); - return o; - }) - .orElseThrow(() -> new OrderItemNotFoundException(String.format("OrderItem with id: %s not found", orderItemId))); - } - - @Override - public OrderItemDto save(final OrderItemDto orderItemDto) { - log.info("*** OrderItemDto, service; save orderItem *"); - return OrderItemMappingHelper.map(this.orderItemRepository - .save(OrderItemMappingHelper.map(orderItemDto))); - } - - @Override - public OrderItemDto update(final OrderItemDto orderItemDto) { - log.info("*** OrderItemDto, service; update orderItem *"); - return OrderItemMappingHelper.map(this.orderItemRepository - .save(OrderItemMappingHelper.map(orderItemDto))); - } - - @Override - public void deleteById(final OrderItemId orderItemId) { - log.info("*** Void, service; delete orderItem by id *"); - this.orderItemRepository.deleteById(orderItemId); - } - - - -} - - - - - - - - - diff --git a/shipping-service/src/main/resources/application-dev.yml b/shipping-service/src/main/resources/application-dev.yml deleted file mode 100644 index 1c60cfae9..000000000 --- a/shipping-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,47 +0,0 @@ - -server: - port: 8600 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/shipping-service/src/main/resources/application-prod.yml b/shipping-service/src/main/resources/application-prod.yml deleted file mode 100644 index 24c23f755..000000000 --- a/shipping-service/src/main/resources/application-prod.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8600 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - diff --git a/shipping-service/src/main/resources/application-stage.yml b/shipping-service/src/main/resources/application-stage.yml deleted file mode 100644 index 087e3ee4d..000000000 --- a/shipping-service/src/main/resources/application-stage.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8600 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/shipping-service/src/main/resources/application.yml b/shipping-service/src/main/resources/application.yml deleted file mode 100644 index 5f4be4217..000000000 --- a/shipping-service/src/main/resources/application.yml +++ /dev/null @@ -1,45 +0,0 @@ - -server: - servlet: - context-path: /shipping-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: SHIPPING-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - shippingService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - diff --git a/shipping-service/src/main/resources/db/migration/V1__create_order_items_table.sql b/shipping-service/src/main/resources/db/migration/V1__create_order_items_table.sql deleted file mode 100644 index 7c700182e..000000000 --- a/shipping-service/src/main/resources/db/migration/V1__create_order_items_table.sql +++ /dev/null @@ -1,10 +0,0 @@ - -CREATE TABLE order_items ( - product_id INT(11) NOT NULL, - order_id INT(11) NOT NULL, - ordered_quantity INT(11), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP, - PRIMARY KEY (product_id, order_id) -); - diff --git a/shipping-service/src/main/resources/db/migration/V2__insert_order_items_table.sql b/shipping-service/src/main/resources/db/migration/V2__insert_order_items_table.sql deleted file mode 100644 index f1a6e6d2a..000000000 --- a/shipping-service/src/main/resources/db/migration/V2__insert_order_items_table.sql +++ /dev/null @@ -1,8 +0,0 @@ - -INSERT INTO order_items -(product_id, order_id, ordered_quantity) VALUES -(1, 1, 2), -(1, 2, 1), -(2, 1, 1), -(2, 2, 1); - diff --git a/shipping-service/src/test/java/com/selimhorri/app/ShippingServiceApplicationTests.java b/shipping-service/src/test/java/com/selimhorri/app/ShippingServiceApplicationTests.java deleted file mode 100644 index a9d4e37b5..000000000 --- a/shipping-service/src/test/java/com/selimhorri/app/ShippingServiceApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ShippingServiceApplicationTests { - - - -} - - - - - - diff --git a/shipping-service/system.properties b/shipping-service/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/shipping-service/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/src/test/java/com/selimhorri/app/EcommerceMicroserviceBackendApplicationTests.java b/src/test/java/com/selimhorri/app/EcommerceMicroserviceBackendApplicationTests.java deleted file mode 100644 index 452fca4d5..000000000 --- a/src/test/java/com/selimhorri/app/EcommerceMicroserviceBackendApplicationTests.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class EcommerceMicroserviceBackendApplicationTests { - - - -} diff --git a/system.properties b/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/user-service/.gitignore b/user-service/.gitignore deleted file mode 100644 index 7bc4bf79e..000000000 --- a/user-service/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/user-service/.mvn/wrapper/MavenWrapperDownloader.java b/user-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index ecf77ce35..000000000 --- a/user-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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/user-service/.mvn/wrapper/maven-wrapper.jar b/user-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/user-service/.mvn/wrapper/maven-wrapper.properties b/user-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7c9d0da42..000000000 --- a/user-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -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/user-service/Dockerfile b/user-service/Dockerfile deleted file mode 100644 index efa479f7d..000000000 --- a/user-service/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ - -FROM openjdk:11 -ARG PROJECT_VERSION=0.1.0 -RUN mkdir -p /home/app -WORKDIR /home/app -ENV SPRING_PROFILES_ACTIVE dev -COPY user-service/ . -ADD user-service/target/user-service-v${PROJECT_VERSION}.jar user-service.jar -EXPOSE 8700 -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "user-service.jar"] - - diff --git a/user-service/compose.yml b/user-service/compose.yml deleted file mode 100644 index 852204260..000000000 --- a/user-service/compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -version: '3' -services: - user-service-container: - image: selimhorri/user-service-ecommerce-boot:0.1.0 - ports: - - 8700:8700 - environment: - - SPRING_PROFILES_ACTIVE=dev - - - diff --git a/user-service/mvnw b/user-service/mvnw deleted file mode 100755 index 4c1c42714..000000000 --- a/user-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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/user-service/mvnw.cmd b/user-service/mvnw.cmd deleted file mode 100644 index 66db70c15..000000000 --- a/user-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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/user-service/pom.xml b/user-service/pom.xml deleted file mode 100644 index 91cb40d81..000000000 --- a/user-service/pom.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - 4.0.0 - - com.selimhorri - ecommerce-microservice-backend - 0.1.0 - - user-service - user-service - Spring Boot microservice - jar - - - 11 - 2020.0.4 - 1.16.0 - - - - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.flywaydb - flyway-core - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - com.h2database - h2 - runtime - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.testcontainers - mysql - test - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - ${project.artifactId}-v${project.version} - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/UserServiceApplication.java b/user-service/src/main/java/com/selimhorri/app/UserServiceApplication.java deleted file mode 100644 index a26cbf129..000000000 --- a/user-service/src/main/java/com/selimhorri/app/UserServiceApplication.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; - -@SpringBootApplication -@EnableEurekaClient -public class UserServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(UserServiceApplication.class, args); - } - - - -} - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java b/user-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java deleted file mode 100644 index 27021f387..000000000 --- a/user-service/src/main/java/com/selimhorri/app/config/client/ClientConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.selimhorri.app.config.client; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration -public class ClientConfig { - - @LoadBalanced - @Bean - public RestTemplate restTemplateBean() { - return new RestTemplate(); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java b/user-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java deleted file mode 100644 index f7de593a7..000000000 --- a/user-service/src/main/java/com/selimhorri/app/config/mapper/MapperConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.selimhorri.app.config.mapper; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; - -@Configuration -public class MapperConfig { - - @Bean - public ObjectMapper objectMapperBean() { - return new JsonMapper() - .enable(SerializationFeature.INDENT_OUTPUT); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/constant/AppConstant.java b/user-service/src/main/java/com/selimhorri/app/constant/AppConstant.java deleted file mode 100644 index 2e051c4b5..000000000 --- a/user-service/src/main/java/com/selimhorri/app/constant/AppConstant.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public abstract class AppConstant { - - public static final String LOCAL_DATE_FORMAT = "dd-MM-yyyy"; - public static final String LOCAL_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String ZONED_DATE_TIME_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - public static final String INSTANT_FORMAT = "dd-MM-yyyy__HH:mm:ss:SSSSSS"; - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public abstract class DiscoveredDomainsApi { - - public static final String USER_SERVICE_HOST = "http://USER-SERVICE/user-service"; - public static final String USER_SERVICE_API_URL = "http://USER-SERVICE/user-service/api/users"; - - public static final String PRODUCT_SERVICE_HOST = "http://PRODUCT-SERVICE/product-service"; - public static final String PRODUCT_SERVICE_API_URL = "http://PRODUCT-SERVICE/product-service/api/products"; - - public static final String ORDER_SERVICE_HOST = "http://ORDER-SERVICE/order-service"; - public static final String ORDER_SERVICE_API_URL = "http://ORDER-SERVICE/order-service/api/orders"; - - public static final String FAVOURITE_SERVICE_HOST = "http://FAVOURITE-SERVICE/favourite-service"; - public static final String FAVOURITE_SERVICE_API_URL = "http://FAVOURITE-SERVICE/favourite-service/api/favourites"; - - public static final String PAYMENT_SERVICE_HOST = "http://PAYMENT-SERVICE/payment-service"; - public static final String PAYMENT_SERVICE_API_URL = "http://PAYMENT-SERVICE/payment-service/api/payments"; - - public static final String SHIPPING_SERVICE_HOST = "http://SHIPPING-SERVICE/shipping-service"; - public static final String SHIPPING_SERVICE_API_URL = "http://SHIPPING-SERVICE/shipping-service/api/shippings"; - - } - - - -} - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java b/user-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java deleted file mode 100644 index b19764968..000000000 --- a/user-service/src/main/java/com/selimhorri/app/domain/AbstractMappedEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Data -abstract public class AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "created_at") - private Instant createdAt; - - @LastModifiedDate - @JsonFormat(shape = Shape.STRING) - @Column(name = "updated_at") - private Instant updatedAt; - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/domain/Address.java b/user-service/src/main/java/com/selimhorri/app/domain/Address.java deleted file mode 100644 index ce9b354f6..000000000 --- a/user-service/src/main/java/com/selimhorri/app/domain/Address.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.selimhorri.app.domain; - -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.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "address") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"user"}) -@Data -@Builder -public final class Address extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "address_id", unique = true, nullable = false, updatable = false) - private Integer addressId; - - @Column(name = "full_address", unique = true) - private String fullAddress; - - @Column(name = "postal_code") - private String postalCode; - - private String city; - - @ManyToOne - @JoinColumn(name = "user_id") - private User user; - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/domain/Credential.java b/user-service/src/main/java/com/selimhorri/app/domain/Credential.java deleted file mode 100644 index 6bf002160..000000000 --- a/user-service/src/main/java/com/selimhorri/app/domain/Credential.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "credentials") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"user", "verificationTokens"}) -@Data -@Builder -public final class Credential extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "credential_id", unique = true, nullable = false, updatable = false) - private Integer credentialId; - - @Column(unique = true) - private String username; - - private String password; - - @Enumerated(EnumType.STRING) - @Column(name = "role") - private RoleBasedAuthority roleBasedAuthority; - - @Column(name = "is_enabled") - private Boolean isEnabled; - - @Column(name = "is_account_non_expired") - private Boolean isAccountNonExpired; - - @Column(name = "is_account_non_locked") - private Boolean isAccountNonLocked; - - @Column(name = "is_credentials_non_expired") - private Boolean isCredentialsNonExpired; - - @JsonIgnore - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id", nullable = false) - private User user; - - @JsonIgnore - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "credential") - private Set verificationTokens; - -} - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/domain/RoleBasedAuthority.java b/user-service/src/main/java/com/selimhorri/app/domain/RoleBasedAuthority.java deleted file mode 100644 index f5b61d682..000000000 --- a/user-service/src/main/java/com/selimhorri/app/domain/RoleBasedAuthority.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.selimhorri.app.domain; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum RoleBasedAuthority { - - ROLE_USER("USER"), - ROLE_ADMIN("ADMIN"); - - private final String role; - -} diff --git a/user-service/src/main/java/com/selimhorri/app/domain/User.java b/user-service/src/main/java/com/selimhorri/app/domain/User.java deleted file mode 100644 index bab00f3e1..000000000 --- a/user-service/src/main/java/com/selimhorri/app/domain/User.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.validation.constraints.Email; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "users") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"addresses", "credential"}) -@Data -@Builder -public final class User extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "user_id", unique = true, nullable = false, updatable = false) - private Integer userId; - - @Column(name = "first_name") - private String firstName; - - @Column(name = "last_name") - private String lastName; - - @Column(name = "image_url") - private String imageUrl; - - @Email(message = "*Input must be in Email format!**") - private String email; - - private String phone; - - @JsonIgnore - @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.LAZY) - private Set

addresses; - - @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user") - private Credential credential; - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/domain/VerificationToken.java b/user-service/src/main/java/com/selimhorri/app/domain/VerificationToken.java deleted file mode 100644 index e8c075073..000000000 --- a/user-service/src/main/java/com/selimhorri/app/domain/VerificationToken.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.selimhorri.app.domain; - -import java.io.Serializable; -import java.time.LocalDate; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "verification_tokens") -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true, exclude = {"credential"}) -@Data -@Builder -public final class VerificationToken extends AbstractMappedEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "verification_token_id", unique = true, nullable = false, updatable = false) - private Integer verificationTokenId; - - @Column(name = "verif_token") - private String token; - - @JsonFormat(pattern = AppConstant.LOCAL_DATE_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_FORMAT) - @Column(name = "expire_date") - private LocalDate expireDate; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "credential_id") - private Credential credential; - -} - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/dto/AddressDto.java b/user-service/src/main/java/com/selimhorri/app/dto/AddressDto.java deleted file mode 100644 index a866738c1..000000000 --- a/user-service/src/main/java/com/selimhorri/app/dto/AddressDto.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class AddressDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer addressId; - - private String fullAddress; - - private String postalCode; - - private String city; - - @JsonProperty("user") - @JsonInclude(value = Include.NON_NULL) - private UserDto userDto; - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/dto/CredentialDto.java b/user-service/src/main/java/com/selimhorri/app/dto/CredentialDto.java deleted file mode 100644 index bf919952f..000000000 --- a/user-service/src/main/java/com/selimhorri/app/dto/CredentialDto.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.domain.RoleBasedAuthority; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class CredentialDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer credentialId; - - private String username; - - private String password; - - private RoleBasedAuthority roleBasedAuthority; - - private Boolean isEnabled; - - private Boolean isAccountNonExpired; - - private Boolean isAccountNonLocked; - - private Boolean isCredentialsNonExpired; - - @JsonProperty("user") - @JsonInclude(value = Include.NON_NULL) - private UserDto userDto; - - @JsonInclude(value = Include.NON_NULL) - private Set verificationTokenDtos; - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/dto/UserDto.java b/user-service/src/main/java/com/selimhorri/app/dto/UserDto.java deleted file mode 100644 index aaf6a1f6a..000000000 --- a/user-service/src/main/java/com/selimhorri/app/dto/UserDto.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class UserDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer userId; - - private String firstName; - - private String lastName; - - private String imageUrl; - - private String email; - - private String phone; - - @JsonInclude(value = Include.NON_NULL) - private Set addressDtos; - - @JsonProperty("credential") - @JsonInclude(value = Include.NON_NULL) - private CredentialDto credentialDto; - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/dto/VerificationTokenDto.java b/user-service/src/main/java/com/selimhorri/app/dto/VerificationTokenDto.java deleted file mode 100644 index cb56dab8f..000000000 --- a/user-service/src/main/java/com/selimhorri/app/dto/VerificationTokenDto.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.selimhorri.app.dto; - -import java.io.Serializable; -import java.time.LocalDate; - -import org.springframework.format.annotation.DateTimeFormat; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class VerificationTokenDto implements Serializable { - - private static final long serialVersionUID = 1L; - - private Integer verificationTokenId; - - private String token; - - @JsonFormat(pattern = AppConstant.LOCAL_DATE_FORMAT, shape = Shape.STRING) - @DateTimeFormat(pattern = AppConstant.LOCAL_DATE_FORMAT) - private LocalDate expireDate; - - @JsonProperty("credential") - @JsonInclude(value = Include.NON_NULL) - private CredentialDto credentialDto; - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java b/user-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java deleted file mode 100644 index ecee30efd..000000000 --- a/user-service/src/main/java/com/selimhorri/app/dto/response/collection/DtoCollectionResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.selimhorri.app.dto.response.collection; - -import java.util.Collection; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class DtoCollectionResponse { - - private Collection collection; - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java b/user-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java deleted file mode 100644 index 48b12f331..000000000 --- a/user-service/src/main/java/com/selimhorri/app/exception/ApiExceptionHandler.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.selimhorri.app.exception; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import com.selimhorri.app.exception.payload.ExceptionMsg; -import com.selimhorri.app.exception.wrapper.AddressNotFoundException; -import com.selimhorri.app.exception.wrapper.CredentialNotFoundException; -import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; -import com.selimhorri.app.exception.wrapper.VerificationTokenNotFoundException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@ControllerAdvice -@Slf4j -@RequiredArgsConstructor -public class ApiExceptionHandler { - - @ExceptionHandler(value = { - MethodArgumentNotValidException.class, - HttpMessageNotReadableException.class - }) - public ResponseEntity handleValidationException(final T e) { - - log.info("**ApiExceptionHandler controller, handle validation exception*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("*" + e.getBindingResult().getFieldError().getDefaultMessage() + "!**") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - @ExceptionHandler(value = { - UserObjectNotFoundException.class, - CredentialNotFoundException.class, - VerificationTokenNotFoundException.class, - AddressNotFoundException.class - }) - public ResponseEntity handleApiRequestException(final T e) { - - log.info("**ApiExceptionHandler controller, handle API request*\n"); - final var badRequest = HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>( - ExceptionMsg.builder() - .msg("#### " + e.getMessage() + "! ####") - .httpStatus(badRequest) - .timestamp(ZonedDateTime - .now(ZoneId.systemDefault())) - .build(), badRequest); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java b/user-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java deleted file mode 100644 index a031689a9..000000000 --- a/user-service/src/main/java/com/selimhorri/app/exception/payload/ExceptionMsg.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.selimhorri.app.exception.payload; - -import java.io.Serializable; -import java.time.ZonedDateTime; - -import org.springframework.http.HttpStatus; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonFormat.Shape; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.selimhorri.app.constant.AppConstant; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@AllArgsConstructor -@Data -@Builder -public final class ExceptionMsg implements Serializable { - - private static final long serialVersionUID = 1L; - - @JsonFormat(shape = Shape.STRING, pattern = AppConstant.ZONED_DATE_TIME_FORMAT) - private final ZonedDateTime timestamp; - - @JsonInclude(value = Include.NON_NULL) - private Throwable throwable; - - private final HttpStatus httpStatus; - - private final String msg; - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/AddressNotFoundException.java b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/AddressNotFoundException.java deleted file mode 100644 index 89dcca363..000000000 --- a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/AddressNotFoundException.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class AddressNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public AddressNotFoundException() { - super(); - } - - public AddressNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public AddressNotFoundException(String message) { - super(message); - } - - public AddressNotFoundException(Throwable cause) { - super(cause); - } - - - -} diff --git a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java deleted file mode 100644 index 284fa381b..000000000 --- a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/CredentialNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class CredentialNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public CredentialNotFoundException() { - super(); - } - - public CredentialNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public CredentialNotFoundException(String message) { - super(message); - } - - public CredentialNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java deleted file mode 100644 index 199e193ff..000000000 --- a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/UserObjectNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class UserObjectNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public UserObjectNotFoundException() { - super(); - } - - public UserObjectNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public UserObjectNotFoundException(String message) { - super(message); - } - - public UserObjectNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java b/user-service/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java deleted file mode 100644 index eaa184f77..000000000 --- a/user-service/src/main/java/com/selimhorri/app/exception/wrapper/VerificationTokenNotFoundException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.selimhorri.app.exception.wrapper; - -public class VerificationTokenNotFoundException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public VerificationTokenNotFoundException() { - super(); - } - - public VerificationTokenNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public VerificationTokenNotFoundException(String message) { - super(message); - } - - public VerificationTokenNotFoundException(Throwable cause) { - super(cause); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/helper/AddressMappingHelper.java b/user-service/src/main/java/com/selimhorri/app/helper/AddressMappingHelper.java deleted file mode 100644 index 523f94e5a..000000000 --- a/user-service/src/main/java/com/selimhorri/app/helper/AddressMappingHelper.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Address; -import com.selimhorri.app.domain.User; -import com.selimhorri.app.dto.AddressDto; -import com.selimhorri.app.dto.UserDto; - -public interface AddressMappingHelper { - - public static AddressDto map(final Address address) { - return AddressDto.builder() - .addressId(address.getAddressId()) - .fullAddress(address.getFullAddress()) - .postalCode(address.getPostalCode()) - .city(address.getCity()) - .userDto( - UserDto.builder() - .userId(address.getUser().getUserId()) - .firstName(address.getUser().getFirstName()) - .lastName(address.getUser().getLastName()) - .imageUrl(address.getUser().getImageUrl()) - .email(address.getUser().getEmail()) - .phone(address.getUser().getPhone()) - .build()) - .build(); - } - - public static Address map(final AddressDto addressDto) { - return Address.builder() - .addressId(addressDto.getAddressId()) - .fullAddress(addressDto.getFullAddress()) - .postalCode(addressDto.getPostalCode()) - .city(addressDto.getCity()) - .user( - User.builder() - .userId(addressDto.getUserDto().getUserId()) - .firstName(addressDto.getUserDto().getFirstName()) - .lastName(addressDto.getUserDto().getLastName()) - .imageUrl(addressDto.getUserDto().getImageUrl()) - .email(addressDto.getUserDto().getEmail()) - .phone(addressDto.getUserDto().getPhone()) - .build()) - .build(); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/helper/CredentialMappingHelper.java b/user-service/src/main/java/com/selimhorri/app/helper/CredentialMappingHelper.java deleted file mode 100644 index d349f98e2..000000000 --- a/user-service/src/main/java/com/selimhorri/app/helper/CredentialMappingHelper.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Credential; -import com.selimhorri.app.domain.User; -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.dto.UserDto; - -public interface CredentialMappingHelper { - - public static CredentialDto map(final Credential credential) { - return CredentialDto.builder() - .credentialId(credential.getCredentialId()) - .username(credential.getUsername()) - .password(credential.getPassword()) - .roleBasedAuthority(credential.getRoleBasedAuthority()) - .isEnabled(credential.getIsEnabled()) - .isAccountNonExpired(credential.getIsAccountNonExpired()) - .isAccountNonLocked(credential.getIsAccountNonLocked()) - .isCredentialsNonExpired(credential.getIsCredentialsNonExpired()) - .userDto( - UserDto.builder() - .userId(credential.getUser().getUserId()) - .firstName(credential.getUser().getFirstName()) - .lastName(credential.getUser().getLastName()) - .imageUrl(credential.getUser().getImageUrl()) - .email(credential.getUser().getEmail()) - .phone(credential.getUser().getPhone()) - .build()) - .build(); - } - - public static Credential map(final CredentialDto credentialDto) { - return Credential.builder() - .credentialId(credentialDto.getCredentialId()) - .username(credentialDto.getUsername()) - .password(credentialDto.getPassword()) - .roleBasedAuthority(credentialDto.getRoleBasedAuthority()) - .isEnabled(credentialDto.getIsEnabled()) - .isAccountNonExpired(credentialDto.getIsAccountNonExpired()) - .isAccountNonLocked(credentialDto.getIsAccountNonLocked()) - .isCredentialsNonExpired(credentialDto.getIsCredentialsNonExpired()) - .user( - User.builder() - .userId(credentialDto.getUserDto().getUserId()) - .firstName(credentialDto.getUserDto().getFirstName()) - .lastName(credentialDto.getUserDto().getLastName()) - .imageUrl(credentialDto.getUserDto().getImageUrl()) - .email(credentialDto.getUserDto().getEmail()) - .phone(credentialDto.getUserDto().getPhone()) - .build()) - .build(); - } - - - -} - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/helper/UserMappingHelper.java b/user-service/src/main/java/com/selimhorri/app/helper/UserMappingHelper.java deleted file mode 100644 index 96c93f96a..000000000 --- a/user-service/src/main/java/com/selimhorri/app/helper/UserMappingHelper.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Credential; -import com.selimhorri.app.domain.User; -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.dto.UserDto; - -public interface UserMappingHelper { - - public static UserDto map(final User user) { - return UserDto.builder() - .userId(user.getUserId()) - .firstName(user.getFirstName()) - .lastName(user.getLastName()) - .imageUrl(user.getImageUrl()) - .email(user.getEmail()) - .phone(user.getPhone()) - .credentialDto( - CredentialDto.builder() - .credentialId(user.getCredential().getCredentialId()) - .username(user.getCredential().getUsername()) - .password(user.getCredential().getPassword()) - .roleBasedAuthority(user.getCredential().getRoleBasedAuthority()) - .isEnabled(user.getCredential().getIsEnabled()) - .isAccountNonExpired(user.getCredential().getIsAccountNonExpired()) - .isAccountNonLocked(user.getCredential().getIsAccountNonLocked()) - .isCredentialsNonExpired(user.getCredential().getIsCredentialsNonExpired()) - .build()) - .build(); - } - - public static User map(final UserDto userDto) { - return User.builder() - .userId(userDto.getUserId()) - .firstName(userDto.getFirstName()) - .lastName(userDto.getLastName()) - .imageUrl(userDto.getImageUrl()) - .email(userDto.getEmail()) - .phone(userDto.getPhone()) - .credential( - Credential.builder() - .credentialId(userDto.getCredentialDto().getCredentialId()) - .username(userDto.getCredentialDto().getUsername()) - .password(userDto.getCredentialDto().getPassword()) - .roleBasedAuthority(userDto.getCredentialDto().getRoleBasedAuthority()) - .isEnabled(userDto.getCredentialDto().getIsEnabled()) - .isAccountNonExpired(userDto.getCredentialDto().getIsAccountNonExpired()) - .isAccountNonLocked(userDto.getCredentialDto().getIsAccountNonLocked()) - .isCredentialsNonExpired(userDto.getCredentialDto().getIsCredentialsNonExpired()) - .build()) - .build(); - } - - - -} - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/helper/VerificationTokenMappingHelper.java b/user-service/src/main/java/com/selimhorri/app/helper/VerificationTokenMappingHelper.java deleted file mode 100644 index 2c106feee..000000000 --- a/user-service/src/main/java/com/selimhorri/app/helper/VerificationTokenMappingHelper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.selimhorri.app.helper; - -import com.selimhorri.app.domain.Credential; -import com.selimhorri.app.domain.VerificationToken; -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.dto.VerificationTokenDto; - -public interface VerificationTokenMappingHelper { - - public static VerificationTokenDto map(final VerificationToken verificationToken) { - return VerificationTokenDto.builder() - .verificationTokenId(verificationToken.getVerificationTokenId()) - .token(verificationToken.getToken()) - .expireDate(verificationToken.getExpireDate()) - .credentialDto( - CredentialDto.builder() - .credentialId(verificationToken.getCredential().getCredentialId()) - .username(verificationToken.getCredential().getUsername()) - .password(verificationToken.getCredential().getPassword()) - .roleBasedAuthority(verificationToken.getCredential().getRoleBasedAuthority()) - .isEnabled(verificationToken.getCredential().getIsEnabled()) - .isAccountNonExpired(verificationToken.getCredential().getIsAccountNonExpired()) - .isAccountNonLocked(verificationToken.getCredential().getIsAccountNonLocked()) - .isCredentialsNonExpired(verificationToken.getCredential().getIsCredentialsNonExpired()) - .build()) - .build(); - } - - public static VerificationToken map(final VerificationTokenDto verificationTokenDto) { - return VerificationToken.builder() - .verificationTokenId(verificationTokenDto.getVerificationTokenId()) - .token(verificationTokenDto.getToken()) - .expireDate(verificationTokenDto.getExpireDate()) - .credential( - Credential.builder() - .credentialId(verificationTokenDto.getCredentialDto().getCredentialId()) - .username(verificationTokenDto.getCredentialDto().getUsername()) - .password(verificationTokenDto.getCredentialDto().getPassword()) - .roleBasedAuthority(verificationTokenDto.getCredentialDto().getRoleBasedAuthority()) - .isEnabled(verificationTokenDto.getCredentialDto().getIsEnabled()) - .isAccountNonExpired(verificationTokenDto.getCredentialDto().getIsAccountNonExpired()) - .isAccountNonLocked(verificationTokenDto.getCredentialDto().getIsAccountNonLocked()) - .isCredentialsNonExpired(verificationTokenDto.getCredentialDto().getIsCredentialsNonExpired()) - .build()) - .build(); - } - - - -} - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/repository/AddressRepository.java b/user-service/src/main/java/com/selimhorri/app/repository/AddressRepository.java deleted file mode 100644 index 36e92489f..000000000 --- a/user-service/src/main/java/com/selimhorri/app/repository/AddressRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Address; - -public interface AddressRepository extends JpaRepository { - - - -} diff --git a/user-service/src/main/java/com/selimhorri/app/repository/CredentialRepository.java b/user-service/src/main/java/com/selimhorri/app/repository/CredentialRepository.java deleted file mode 100644 index 162151cbc..000000000 --- a/user-service/src/main/java/com/selimhorri/app/repository/CredentialRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.selimhorri.app.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.Credential; - -public interface CredentialRepository extends JpaRepository { - - Optional findByUsername(final String username); - -} diff --git a/user-service/src/main/java/com/selimhorri/app/repository/UserRepository.java b/user-service/src/main/java/com/selimhorri/app/repository/UserRepository.java deleted file mode 100644 index 97b45d0cf..000000000 --- a/user-service/src/main/java/com/selimhorri/app/repository/UserRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.selimhorri.app.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.User; - -public interface UserRepository extends JpaRepository { - - Optional findByCredentialUsername(final String username); - -} diff --git a/user-service/src/main/java/com/selimhorri/app/repository/VerificationTokenRepository.java b/user-service/src/main/java/com/selimhorri/app/repository/VerificationTokenRepository.java deleted file mode 100644 index 308c10bca..000000000 --- a/user-service/src/main/java/com/selimhorri/app/repository/VerificationTokenRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.selimhorri.app.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.selimhorri.app.domain.VerificationToken; - -public interface VerificationTokenRepository extends JpaRepository { - - - -} diff --git a/user-service/src/main/java/com/selimhorri/app/resource/AddressResource.java b/user-service/src/main/java/com/selimhorri/app/resource/AddressResource.java deleted file mode 100644 index 7d367e916..000000000 --- a/user-service/src/main/java/com/selimhorri/app/resource/AddressResource.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.AddressDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.AddressService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping(value = {"/api/address"}) -@Slf4j -@RequiredArgsConstructor -public class AddressResource { - - private final AddressService addressService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** AddressDto List, controller; fetch all addresss *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.addressService.findAll())); - } - - @GetMapping("/{addressId}") - public ResponseEntity findById( - @PathVariable("addressId") - @NotBlank(message = "Input must not blank") - @Valid final String addressId) { - log.info("*** AddressDto, resource; fetch address by id *"); - return ResponseEntity.ok(this.addressService.findById(Integer.parseInt(addressId.strip()))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final AddressDto addressDto) { - log.info("*** AddressDto, resource; save address *"); - return ResponseEntity.ok(this.addressService.save(addressDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final AddressDto addressDto) { - log.info("*** AddressDto, resource; update address *"); - return ResponseEntity.ok(this.addressService.update(addressDto)); - } - - @PutMapping("/{addressId}") - public ResponseEntity update( - @PathVariable("addressId") - @NotBlank(message = "Input must not blank") final String addressId, - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final AddressDto addressDto) { - log.info("*** AddressDto, resource; update address with addressId *"); - return ResponseEntity.ok(this.addressService.update(Integer.parseInt(addressId.strip()), addressDto)); - } - - @DeleteMapping("/{addressId}") - public ResponseEntity deleteById(@PathVariable("addressId") @NotBlank(message = "Input must not blank") @Valid final String addressId) { - log.info("*** Boolean, resource; delete address by id *"); - this.addressService.deleteById(Integer.parseInt(addressId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/resource/CredentialResource.java b/user-service/src/main/java/com/selimhorri/app/resource/CredentialResource.java deleted file mode 100644 index 3502b9dd6..000000000 --- a/user-service/src/main/java/com/selimhorri/app/resource/CredentialResource.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.CredentialService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping(value = {"/api/credentials"}) -@Slf4j -@RequiredArgsConstructor -public class CredentialResource { - - private final CredentialService credentialService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** CredentialDto List, controller; fetch all credentials *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.credentialService.findAll())); - } - - @GetMapping("/{credentialId}") - public ResponseEntity findById( - @PathVariable("credentialId") - @NotBlank(message = "Input must not blank") - @Valid final String credentialId) { - log.info("*** CredentialDto, resource; fetch credential by id *"); - return ResponseEntity.ok(this.credentialService.findById(Integer.parseInt(credentialId.strip()))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final CredentialDto credentialDto) { - log.info("*** CredentialDto, resource; save credential *"); - return ResponseEntity.ok(this.credentialService.save(credentialDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final CredentialDto credentialDto) { - log.info("*** CredentialDto, resource; update credential *"); - return ResponseEntity.ok(this.credentialService.update(credentialDto)); - } - - @PutMapping("/{credentialId}") - public ResponseEntity update( - @PathVariable("credentialId") - @NotBlank(message = "Input must not blank") final String credentialId, - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final CredentialDto credentialDto) { - log.info("*** CredentialDto, resource; update credential with credentialId *"); - return ResponseEntity.ok(this.credentialService.update(Integer.parseInt(credentialId.strip()), credentialDto)); - } - - @DeleteMapping("/{credentialId}") - public ResponseEntity deleteById( - @PathVariable("credentialId") - @NotBlank(message = "Input must not blank") - @Valid final String credentialId) { - log.info("*** Boolean, resource; delete credential by id *"); - this.credentialService.deleteById(Integer.parseInt(credentialId)); - return ResponseEntity.ok(true); - } - - @GetMapping("/username/{username}") - public ResponseEntity findByUsername( - @PathVariable("username") - @NotBlank(message = "Input must not blank") - @Valid final String username) { - log.info("*** CredentialDto, resource; update credential with credentialId *"); - return ResponseEntity.ok(this.credentialService.findByUsername(username)); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/resource/UserResource.java b/user-service/src/main/java/com/selimhorri/app/resource/UserResource.java deleted file mode 100644 index 5afb7abe2..000000000 --- a/user-service/src/main/java/com/selimhorri/app/resource/UserResource.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.UserDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.UserService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping(value = {"/api/users"}) -@Slf4j -@RequiredArgsConstructor -public class UserResource { - - private final UserService userService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** UserDto List, controller; fetch all users *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.userService.findAll())); - } - - @GetMapping("/{userId}") - public ResponseEntity findById( - @PathVariable("userId") - @NotBlank(message = "Input must not blank") - @Valid final String userId) { - log.info("*** UserDto, resource; fetch user by id *"); - return ResponseEntity.ok(this.userService.findById(Integer.parseInt(userId.strip()))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final UserDto userDto) { - log.info("*** UserDto, resource; save user *"); - return ResponseEntity.ok(this.userService.save(userDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final UserDto userDto) { - log.info("*** UserDto, resource; update user *"); - return ResponseEntity.ok(this.userService.update(userDto)); - } - - @PutMapping("/{userId}") - public ResponseEntity update( - @PathVariable("userId") - @NotBlank(message = "Input must not blank") final String userId, - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final UserDto userDto) { - log.info("*** UserDto, resource; update user with userId *"); - return ResponseEntity.ok(this.userService.update(Integer.parseInt(userId.strip()), userDto)); - } - - @DeleteMapping("/{userId}") - public ResponseEntity deleteById(@PathVariable("userId") @NotBlank(message = "Input must not blank") @Valid final String userId) { - log.info("*** Boolean, resource; delete user by id *"); - this.userService.deleteById(Integer.parseInt(userId)); - return ResponseEntity.ok(true); - } - - @GetMapping("/username/{username}") - public ResponseEntity findByUsername( - @PathVariable("username") - @NotBlank(message = "Input must not blank") - @Valid final String username) { - return ResponseEntity.ok(this.userService.findByUsername(username)); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/resource/VerificationTokenResource.java b/user-service/src/main/java/com/selimhorri/app/resource/VerificationTokenResource.java deleted file mode 100644 index 4ec4dcff2..000000000 --- a/user-service/src/main/java/com/selimhorri/app/resource/VerificationTokenResource.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.selimhorri.app.resource; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.selimhorri.app.dto.VerificationTokenDto; -import com.selimhorri.app.dto.response.collection.DtoCollectionResponse; -import com.selimhorri.app.service.VerificationTokenService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequestMapping(value = {"/api/verificationTokens"}) -@Slf4j -@RequiredArgsConstructor -public class VerificationTokenResource { - - private final VerificationTokenService verificationTokenService; - - @GetMapping - public ResponseEntity> findAll() { - log.info("*** VerificationTokenDto List, controller; fetch all verificationTokens *"); - return ResponseEntity.ok(new DtoCollectionResponse<>(this.verificationTokenService.findAll())); - } - - @GetMapping("/{verificationTokenId}") - public ResponseEntity findById( - @PathVariable("verificationTokenId") - @NotBlank(message = "Input must not blank") - @Valid final String verificationTokenId) { - log.info("*** VerificationTokenDto, resource; fetch verificationToken by id *"); - return ResponseEntity.ok(this.verificationTokenService.findById(Integer.parseInt(verificationTokenId.strip()))); - } - - @PostMapping - public ResponseEntity save( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, resource; save verificationToken *"); - return ResponseEntity.ok(this.verificationTokenService.save(verificationTokenDto)); - } - - @PutMapping - public ResponseEntity update( - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, resource; update verificationToken *"); - return ResponseEntity.ok(this.verificationTokenService.update(verificationTokenDto)); - } - - @PutMapping("/{verificationTokenId}") - public ResponseEntity update( - @PathVariable("verificationTokenId") - @NotBlank(message = "Input must not blank") final String verificationTokenId, - @RequestBody - @NotNull(message = "Input must not NULL") - @Valid final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, resource; update verificationToken with verificationTokenId *"); - return ResponseEntity.ok(this.verificationTokenService.update(Integer.parseInt(verificationTokenId.strip()), verificationTokenDto)); - } - - @DeleteMapping("/{verificationTokenId}") - public ResponseEntity deleteById( - @PathVariable("verificationTokenId") - @NotBlank(message = "Input must not blank") final String verificationTokenId) { - log.info("*** Boolean, resource; delete verificationToken by id *"); - this.verificationTokenService.deleteById(Integer.parseInt(verificationTokenId)); - return ResponseEntity.ok(true); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/service/AddressService.java b/user-service/src/main/java/com/selimhorri/app/service/AddressService.java deleted file mode 100644 index fdfdbe8c7..000000000 --- a/user-service/src/main/java/com/selimhorri/app/service/AddressService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.AddressDto; - -public interface AddressService { - - List findAll(); - AddressDto findById(final Integer addressId); - AddressDto save(final AddressDto addressDto); - AddressDto update(final AddressDto addressDto); - AddressDto update(final Integer addressId, final AddressDto addressDto); - void deleteById(final Integer addressId); - -} diff --git a/user-service/src/main/java/com/selimhorri/app/service/CredentialService.java b/user-service/src/main/java/com/selimhorri/app/service/CredentialService.java deleted file mode 100644 index cfe0588d8..000000000 --- a/user-service/src/main/java/com/selimhorri/app/service/CredentialService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.CredentialDto; - -public interface CredentialService { - - List findAll(); - CredentialDto findById(final Integer credentialId); - CredentialDto save(final CredentialDto credentialDto); - CredentialDto update(final CredentialDto credentialDto); - CredentialDto update(final Integer credentialId, final CredentialDto credentialDto); - void deleteById(final Integer credentialId); - CredentialDto findByUsername(final String username); - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/service/UserService.java b/user-service/src/main/java/com/selimhorri/app/service/UserService.java deleted file mode 100644 index 2507057ca..000000000 --- a/user-service/src/main/java/com/selimhorri/app/service/UserService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.UserDto; - -public interface UserService { - - List findAll(); - UserDto findById(final Integer userId); - UserDto save(final UserDto userDto); - UserDto update(final UserDto userDto); - UserDto update(final Integer userId, final UserDto userDto); - void deleteById(final Integer userId); - UserDto findByUsername(final String username); - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/service/VerificationTokenService.java b/user-service/src/main/java/com/selimhorri/app/service/VerificationTokenService.java deleted file mode 100644 index cab289f03..000000000 --- a/user-service/src/main/java/com/selimhorri/app/service/VerificationTokenService.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.selimhorri.app.service; - -import java.util.List; - -import com.selimhorri.app.dto.VerificationTokenDto; - -public interface VerificationTokenService { - - List findAll(); - VerificationTokenDto findById(final Integer verificationTokenId); - VerificationTokenDto save(final VerificationTokenDto verificationTokenDto); - VerificationTokenDto update(final VerificationTokenDto verificationTokenDto); - VerificationTokenDto update(final Integer verificationTokenId, final VerificationTokenDto verificationTokenDto); - void deleteById(final Integer verificationTokenId); - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/service/impl/AddressServiceImpl.java b/user-service/src/main/java/com/selimhorri/app/service/impl/AddressServiceImpl.java deleted file mode 100644 index 13c14c3ab..000000000 --- a/user-service/src/main/java/com/selimhorri/app/service/impl/AddressServiceImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.AddressDto; -import com.selimhorri.app.exception.wrapper.AddressNotFoundException; -import com.selimhorri.app.helper.AddressMappingHelper; -import com.selimhorri.app.repository.AddressRepository; -import com.selimhorri.app.service.AddressService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class AddressServiceImpl implements AddressService { - - private final AddressRepository addressRepository; - - @Override - public List findAll() { - log.info("*** AddressDto List, service; fetch all addresss *"); - return this.addressRepository.findAll() - .stream() - .map(AddressMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public AddressDto findById(final Integer addressId) { - log.info("*** AddressDto, service; fetch address by id *"); - return this.addressRepository.findById(addressId) - .map(AddressMappingHelper::map) - .orElseThrow(() -> new AddressNotFoundException(String.format("#### Address with id: %d not found! ####", addressId))); - } - - @Override - public AddressDto save(final AddressDto addressDto) { - log.info("*** AddressDto, service; save address *"); - return AddressMappingHelper.map(this.addressRepository.save(AddressMappingHelper.map(addressDto))); - } - - @Override - public AddressDto update(final AddressDto addressDto) { - log.info("*** AddressDto, service; update address *"); - return AddressMappingHelper.map(this.addressRepository.save(AddressMappingHelper.map(addressDto))); - } - - @Override - public AddressDto update(final Integer addressId, final AddressDto addressDto) { - log.info("*** AddressDto, service; update address with addressId *"); - return AddressMappingHelper.map(this.addressRepository.save( - AddressMappingHelper.map(this.findById(addressId)))); - } - - @Override - public void deleteById(final Integer addressId) { - log.info("*** Void, service; delete address by id *"); - this.addressRepository.deleteById(addressId); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/service/impl/CredentialServiceImpl.java b/user-service/src/main/java/com/selimhorri/app/service/impl/CredentialServiceImpl.java deleted file mode 100644 index a7b1dda51..000000000 --- a/user-service/src/main/java/com/selimhorri/app/service/impl/CredentialServiceImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.CredentialDto; -import com.selimhorri.app.exception.wrapper.CredentialNotFoundException; -import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; -import com.selimhorri.app.helper.CredentialMappingHelper; -import com.selimhorri.app.repository.CredentialRepository; -import com.selimhorri.app.service.CredentialService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class CredentialServiceImpl implements CredentialService { - - private final CredentialRepository credentialRepository; - - @Override - public List findAll() { - log.info("*** CredentialDto List, service; fetch all credentials *"); - return this.credentialRepository.findAll() - .stream() - .map(CredentialMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public CredentialDto findById(final Integer credentialId) { - log.info("*** CredentialDto, service; fetch credential by ids *"); - return this.credentialRepository.findById(credentialId) - .map(CredentialMappingHelper::map) - .orElseThrow(() -> new CredentialNotFoundException(String.format("#### Credential with id: %d not found! ####", credentialId))); - } - - @Override - public CredentialDto save(final CredentialDto credentialDto) { - log.info("*** CredentialDto, service; save credential *"); - return CredentialMappingHelper.map(this.credentialRepository.save(CredentialMappingHelper.map(credentialDto))); - } - - @Override - public CredentialDto update(final CredentialDto credentialDto) { - log.info("*** CredentialDto, service; update credential *"); - return CredentialMappingHelper.map(this.credentialRepository.save(CredentialMappingHelper.map(credentialDto))); - } - - @Override - public CredentialDto update(final Integer credentialId, final CredentialDto credentialDto) { - log.info("*** CredentialDto, service; update credential with credentialId *"); - return CredentialMappingHelper.map(this.credentialRepository.save( - CredentialMappingHelper.map(this.findById(credentialId)))); - } - - @Override - public void deleteById(final Integer credentialId) { - log.info("*** Void, service; delete credential by id *"); - this.credentialRepository.deleteById(credentialId); - } - - @Override - public CredentialDto findByUsername(final String username) { - return CredentialMappingHelper.map(this.credentialRepository.findByUsername(username) - .orElseThrow(() -> new UserObjectNotFoundException(String.format("#### Credential with username: %s not found! ####", username)))); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/service/impl/UserServiceImpl.java b/user-service/src/main/java/com/selimhorri/app/service/impl/UserServiceImpl.java deleted file mode 100644 index 64e8fbe79..000000000 --- a/user-service/src/main/java/com/selimhorri/app/service/impl/UserServiceImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.UserDto; -import com.selimhorri.app.exception.wrapper.UserObjectNotFoundException; -import com.selimhorri.app.helper.UserMappingHelper; -import com.selimhorri.app.repository.UserRepository; -import com.selimhorri.app.service.UserService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class UserServiceImpl implements UserService { - - private final UserRepository userRepository; - - @Override - public List findAll() { - log.info("*** UserDto List, service; fetch all users *"); - return this.userRepository.findAll() - .stream() - .map(UserMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public UserDto findById(final Integer userId) { - log.info("*** UserDto, service; fetch user by id *"); - return this.userRepository.findById(userId) - .map(UserMappingHelper::map) - .orElseThrow(() -> new UserObjectNotFoundException(String.format("User with id: %d not found", userId))); - } - - @Override - public UserDto save(final UserDto userDto) { - log.info("*** UserDto, service; save user *"); - return UserMappingHelper.map(this.userRepository.save(UserMappingHelper.map(userDto))); - } - - @Override - public UserDto update(final UserDto userDto) { - log.info("*** UserDto, service; update user *"); - return UserMappingHelper.map(this.userRepository.save(UserMappingHelper.map(userDto))); - } - - @Override - public UserDto update(final Integer userId, final UserDto userDto) { - log.info("*** UserDto, service; update user with userId *"); - return UserMappingHelper.map(this.userRepository.save( - UserMappingHelper.map(this.findById(userId)))); - } - - @Override - public void deleteById(final Integer userId) { - log.info("*** Void, service; delete user by id *"); - this.userRepository.deleteById(userId); - } - - @Override - public UserDto findByUsername(final String username) { - log.info("*** UserDto, service; fetch user with username *"); - return UserMappingHelper.map(this.userRepository.findByCredentialUsername(username) - .orElseThrow(() -> new UserObjectNotFoundException(String.format("User with username: %s not found", username)))); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/java/com/selimhorri/app/service/impl/VerificationTokenServiceImpl.java b/user-service/src/main/java/com/selimhorri/app/service/impl/VerificationTokenServiceImpl.java deleted file mode 100644 index 27b8d13a4..000000000 --- a/user-service/src/main/java/com/selimhorri/app/service/impl/VerificationTokenServiceImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.selimhorri.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.springframework.stereotype.Service; - -import com.selimhorri.app.dto.VerificationTokenDto; -import com.selimhorri.app.exception.wrapper.VerificationTokenNotFoundException; -import com.selimhorri.app.helper.VerificationTokenMappingHelper; -import com.selimhorri.app.repository.VerificationTokenRepository; -import com.selimhorri.app.service.VerificationTokenService; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class VerificationTokenServiceImpl implements VerificationTokenService { - - private final VerificationTokenRepository verificationTokenRepository; - - @Override - public List findAll() { - log.info("*** VerificationTokenDto List, service; fetch all verificationTokens *"); - return this.verificationTokenRepository.findAll() - .stream() - .map(VerificationTokenMappingHelper::map) - .distinct() - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public VerificationTokenDto findById(final Integer verificationTokenId) { - log.info("*** VerificationTokenDto, service; fetch verificationToken by ids *"); - return this.verificationTokenRepository.findById(verificationTokenId) - .map(VerificationTokenMappingHelper::map) - .orElseThrow(() -> new VerificationTokenNotFoundException(String - .format("#### VerificationToken with id: %d not found! ####", verificationTokenId))); - } - - @Override - public VerificationTokenDto save(final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, service; save verificationToken *"); - return VerificationTokenMappingHelper.map(this.verificationTokenRepository - .save(VerificationTokenMappingHelper.map(verificationTokenDto))); - } - - @Override - public VerificationTokenDto update(final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, service; update verificationToken *"); - return VerificationTokenMappingHelper.map(this.verificationTokenRepository - .save(VerificationTokenMappingHelper.map(verificationTokenDto))); - } - - @Override - public VerificationTokenDto update(final Integer verificationTokenId, final VerificationTokenDto verificationTokenDto) { - log.info("*** VerificationTokenDto, service; update verificationToken with verificationTokenId *"); - return VerificationTokenMappingHelper.map(this.verificationTokenRepository.save( - VerificationTokenMappingHelper.map(this.findById(verificationTokenId)))); - } - - @Override - public void deleteById(final Integer verificationTokenId) { - log.info("*** Void, service; delete verificationToken by id *"); - this.verificationTokenRepository.deleteById(verificationTokenId); - } - - - -} - - - - - - - - - - diff --git a/user-service/src/main/resources/application-dev.yml b/user-service/src/main/resources/application-dev.yml deleted file mode 100644 index 50ed172a8..000000000 --- a/user-service/src/main/resources/application-dev.yml +++ /dev/null @@ -1,47 +0,0 @@ - -server: - port: 8700 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:h2:mem:ecommerce_dev_db;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect - use_sql_comments: true - format_sql: true - h2: - console: - enabled: true - path: /h2-console - #flyway: - # baseline-on-migrate: true - # enabled: true - -logging: - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/user-service/src/main/resources/application-prod.yml b/user-service/src/main/resources/application-prod.yml deleted file mode 100644 index 46e1a718f..000000000 --- a/user-service/src/main/resources/application-prod.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8700 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: false - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/prod_log.log - clean-history-on-start: false - level: - org: - hibernate: - SQL: INFO - springframework: - web: INFO - data: INFO - boot: - autoconfigure: - data: - rest: INFO - jpa: INFO - orm: INFO - diff --git a/user-service/src/main/resources/application-stage.yml b/user-service/src/main/resources/application-stage.yml deleted file mode 100644 index 4ae59af32..000000000 --- a/user-service/src/main/resources/application-stage.yml +++ /dev/null @@ -1,43 +0,0 @@ - -server: - port: 8700 - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - datasource: - url: jdbc:mysql://localhost:3306/ecommerce_stage_db - username: root - password: - jpa: - show-sql: true - hibernate: - ddl-auto: validate - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect - use_sql_comments: true - format_sql: true - -logging: - file: - name: src/main/resources/script/stage_log.log - clean-history-on-start: true - level: - org: - hibernate: - SQL: DEBUG - springframework: - web: DEBUG - data: DEBUG - boot: - autoconfigure: - data: - rest: DEBUG - jpa: DEBUG - orm: DEBUG - diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml deleted file mode 100644 index f3669dcf4..000000000 --- a/user-service/src/main/resources/application.yml +++ /dev/null @@ -1,45 +0,0 @@ - -server: - servlet: - context-path: /user-service - -spring: - zipkin: - base-url: ${SPRING_ZIPKIN_BASE_URL:http://localhost:9411/} - config: - import: ${SPRING_CONFIG_IMPORT:optional:configserver:http://localhost:9296} - application: - name: USER-SERVICE - profiles: - active: - - dev - -resilience4j: - circuitbreaker: - instances: - userService: - register-health-indicator: true - event-consumer-buffer-size: 10 - automatic-transition-from-open-to-half-open-enabled: true - failure-rate-threshold: 50 - minimum-number-of-calls: 5 - permitted-number-of-calls-in-half-open-state: 3 - sliding-window-size: 10 - wait-duration-in-open-state: 5s - sliding-window-type: COUNT_BASED - -management: - health: - circuitbreakers: - enabled: true - endpoint: - health: - show-details: always - - - - - - - - diff --git a/user-service/src/main/resources/db/migration/V10__create_credentials_user_id_fk.sql b/user-service/src/main/resources/db/migration/V10__create_credentials_user_id_fk.sql deleted file mode 100644 index 4d4d93794..000000000 --- a/user-service/src/main/resources/db/migration/V10__create_credentials_user_id_fk.sql +++ /dev/null @@ -1,3 +0,0 @@ - -ALTER TABLE credentials - ADD CONSTRAINT fk2_assign FOREIGN KEY (user_id) REFERENCES users (user_id); diff --git a/user-service/src/main/resources/db/migration/V11__create_verification_tokens_credential_id_fk.sql b/user-service/src/main/resources/db/migration/V11__create_verification_tokens_credential_id_fk.sql deleted file mode 100644 index 00dfabbbc..000000000 --- a/user-service/src/main/resources/db/migration/V11__create_verification_tokens_credential_id_fk.sql +++ /dev/null @@ -1,3 +0,0 @@ - -ALTER TABLE verification_tokens - ADD CONSTRAINT fk3_assign FOREIGN KEY (credential_id) REFERENCES credentials (credential_id); diff --git a/user-service/src/main/resources/db/migration/V1__create_users_table.sql b/user-service/src/main/resources/db/migration/V1__create_users_table.sql deleted file mode 100644 index 25b917a90..000000000 --- a/user-service/src/main/resources/db/migration/V1__create_users_table.sql +++ /dev/null @@ -1,14 +0,0 @@ - -CREATE TABLE users ( - user_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - first_name VARCHAR(255), - last_name VARCHAR(255), - image_url VARCHAR(255) DEFAULT 'https://bootdey.com/img/Content/avatar/avatar7.png', - email VARCHAR(255) DEFAULT 'springxyzabcboot@gmail.com', - phone VARCHAR(255) DEFAULT '+21622125144', - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - - - diff --git a/user-service/src/main/resources/db/migration/V2__insert_users_table.sql b/user-service/src/main/resources/db/migration/V2__insert_users_table.sql deleted file mode 100644 index 9a08206e9..000000000 --- a/user-service/src/main/resources/db/migration/V2__insert_users_table.sql +++ /dev/null @@ -1,9 +0,0 @@ - -INSERT INTO users -(first_name, last_name) VALUES -('selim', 'horri'), -('amine', 'ladjimi'), -('omar', 'derouiche'), -('admin', 'admin'); - - diff --git a/user-service/src/main/resources/db/migration/V3__create_address_table.sql b/user-service/src/main/resources/db/migration/V3__create_address_table.sql deleted file mode 100644 index 9abd77bac..000000000 --- a/user-service/src/main/resources/db/migration/V3__create_address_table.sql +++ /dev/null @@ -1,12 +0,0 @@ - -CREATE TABLE address ( - address_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - user_id INT(11), - full_address VARCHAR(255), - postal_code VARCHAR(255), - city VARCHAR(255), - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - - diff --git a/user-service/src/main/resources/db/migration/V4__insert_address_table.sql b/user-service/src/main/resources/db/migration/V4__insert_address_table.sql deleted file mode 100644 index 62379eda2..000000000 --- a/user-service/src/main/resources/db/migration/V4__insert_address_table.sql +++ /dev/null @@ -1,11 +0,0 @@ - -INSERT INTO address -(user_id, full_address, postal_code, city) VALUES -(1, 'carthage byrsa', '2016', 'carthage'), -(2, 'carthage byrsa', '2016', 'carthage'), -(3, 'carthage byrsa', '2016', 'carthage'), -(4, 'carthage byrsa', '2016', 'carthage'), -(2, 'kram', '2015', 'kram'), -(1, 'kram', '2015', 'kram'); - - diff --git a/user-service/src/main/resources/db/migration/V5__create_credentials_table.sql b/user-service/src/main/resources/db/migration/V5__create_credentials_table.sql deleted file mode 100644 index a67efade7..000000000 --- a/user-service/src/main/resources/db/migration/V5__create_credentials_table.sql +++ /dev/null @@ -1,15 +0,0 @@ - -CREATE TABLE credentials ( - credential_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - user_id INT(11), - username VARCHAR(255), - password VARCHAR(255), - role VARCHAR(255), - is_enabled BOOLEAN DEFAULT false, - is_account_non_expired BOOLEAN DEFAULT true, - is_account_non_locked BOOLEAN DEFAULT true, - is_credentials_non_expired BOOLEAN DEFAULT true, - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - diff --git a/user-service/src/main/resources/db/migration/V6__insert_credentials_table.sql b/user-service/src/main/resources/db/migration/V6__insert_credentials_table.sql deleted file mode 100644 index a2a1568a4..000000000 --- a/user-service/src/main/resources/db/migration/V6__insert_credentials_table.sql +++ /dev/null @@ -1,8 +0,0 @@ - -INSERT INTO credentials -(user_id, username, password, role, is_enabled) VALUES -(1, 'selimhorri', '$2a$04$/S7cWjHPZul03sPEivycWeKTBvLyjYdaRWmeaFbiqKy9es/3W4QB6', 'ROLE_USER', true), -(2, 'amineladjimi', '$2a$04$8D8OuqPbE4LhRckvtBAHrOmpeWmE92xNNVtyK8Z/lrJFjsImpjBkm', 'ROLE_USER', true), -(3, 'omarderouiche', '$2a$04$jelNGcF4wFHJirT5Pm7jPO8812QE/3tIWIs1DNnajS68iG4aKUqvS', 'ROLE_USER', true), -(4, 'admin', '$2a$04$1G4TwSzwf5JwZ4dKCXG1Zu1Qh3WIY9JNaM9vF6Ff05QDfyPg7nSxO', 'ROLE_USER', true); - diff --git a/user-service/src/main/resources/db/migration/V7__create_verification_tokens_table.sql b/user-service/src/main/resources/db/migration/V7__create_verification_tokens_table.sql deleted file mode 100644 index 27485652a..000000000 --- a/user-service/src/main/resources/db/migration/V7__create_verification_tokens_table.sql +++ /dev/null @@ -1,10 +0,0 @@ - -CREATE TABLE verification_tokens ( - verification_token_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, - credential_id INT(11), - verif_token VARCHAR(255), - expire_date DATE, - created_at TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL NULL_TO_DEFAULT, - updated_at TIMESTAMP -); - diff --git a/user-service/src/main/resources/db/migration/V8__insert_verification_tokens_table.sql b/user-service/src/main/resources/db/migration/V8__insert_verification_tokens_table.sql deleted file mode 100644 index 4479b83c0..000000000 --- a/user-service/src/main/resources/db/migration/V8__insert_verification_tokens_table.sql +++ /dev/null @@ -1,8 +0,0 @@ - -INSERT INTO verification_tokens -(credential_id, verif_token, expire_date) VALUES -(1, '', '2021-12-31'), -(2, '', '2021-12-31'), -(3, '', '2021-12-31'), -(4, '', '2021-12-31'); - diff --git a/user-service/src/main/resources/db/migration/V9__create_address_user_id_fk.sql b/user-service/src/main/resources/db/migration/V9__create_address_user_id_fk.sql deleted file mode 100644 index d3a00cbec..000000000 --- a/user-service/src/main/resources/db/migration/V9__create_address_user_id_fk.sql +++ /dev/null @@ -1,3 +0,0 @@ - -ALTER TABLE address - ADD CONSTRAINT fk1_assign FOREIGN KEY (user_id) REFERENCES users (user_id); diff --git a/user-service/src/test/java/com/selimhorri/app/UserServiceApplicationTests.java b/user-service/src/test/java/com/selimhorri/app/UserServiceApplicationTests.java deleted file mode 100644 index 22f69dc17..000000000 --- a/user-service/src/test/java/com/selimhorri/app/UserServiceApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.selimhorri.app; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class UserServiceApplicationTests { - - - -} - - - - - - diff --git a/user-service/system.properties b/user-service/system.properties deleted file mode 100644 index 180a27348..000000000 --- a/user-service/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=11 \ No newline at end of file diff --git a/zipkin-dash.png b/zipkin-dash.png deleted file mode 100644 index 2bed4fff89e2e39ae7b440db81b7e2f24bcbb351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93822 zcmeFY^;eWp8#RogASEd+El7jXsYtgd-ObS5A>H7B(jna--6bu}(A^`_-S8fKp66Zf zFW-Og&0;Mbotyj2IalnxuYHFq%1dCN5~Cs@AYe#IiYg%>JQ+hkcwGDp3H%HF`BydY z#}fw;sn5^A%k!C02zXEAD5mE4$;QOdMc>{S!PMHu%9z=~(B9bC+QH1maUZc&2myft zK}z)fXV;XS1rN{9=U(vpsl?HU>{0D!cJTpq{?>Yy5mug3mOZotJ@N(}y)(|0R+S4f zwF^Qu(=*oYQl5P^b5`fIb9bv&$+^ZxGoiRWNIhH^NZnk7Bpf(;Pa0(YlqNzsVm95+ zFxe|;Xs{?KS@z+=(|oo2L>bs{!SvyCizoi?ak2mR;$`i(#C#|E-`Bdv4+^>ey)i3>)B;=PvqzxPRe{1o!PE2uvG z|2O&1j{SdcmtWls*_VGi*(<6uU72p^6iHeH;W3?SFs>JH-^WKiaxl?1qN1|TdgIsr zgLlp!>)+voy6F#l>&!Q%=R+!JZ0Hj@qM0B>i3k@0f)}1TSDr%X%cCB(2h(1fCU%_< z7ys`ZRRh@{X;_o-UiNoea-$<699#a}Ja#>Bb2l^3?=c{}nQ6wptrN*C|CU zRK$ZO=KeQQOcu~Q&OWu6E+rr^{Gy@{l;5R|k?7k=8j2_}#EBU|q(OXPdD&9{a_|`#VI61a; zC#X!iva8F^V#OTa#8|7`LW7yWyUBAO#^Bv>%{-_~M>WO7%ti4p9aOc7iA#R0=R$;C ziWy1@YkYeWJf9Aas=%37FlER$O>LToZ1F z@mFK^vPX3>yPz5O%l^GHeKm7QosLKH^tbcC{-cXcg4%h)h-yzT2q*VB zr5!cH1Iwd6pYPTtK@F{)vrR9}+c|aFIy*IBN8g*PN<+4plZ>IpJ}=0(cd;tpGNJ)brXcDK6y@y5Z~ z`PO_#mJ5kVO&lr{7Lc{MMwrN1vRW9sX^Jw)Nh!cFv<++uH3hFaLQf zVc*b>~tdu^yY>9Hn+<4oHq)%36rC#?YDIXFO^R3s$`&3BBeH($b^_+6)YW1Z+ z%PHE;K7sDWDW}BzOs;RQ++`EqR_khHUzXy6KG1pv$h*v zB7sAaXeGPCxYpYlYkRoqu|(^k+}-A7Jg_o^zBQctcu&GzCWs3K^ zNl_<`3<=Sa>aiesB-x*kIN5O$Axpe%UQlS2a>prqw;Tt#Z&EoW3fgEVG4p{*%UoC2i5$o?ysuaE#Qs zZ0KErX$)9?N~kA#PuE>Co z%l-SCG06$dPabp%H{G=f!gT&`wFMEH?%L@*Kc5nTaudzk+DCq06N@K7CD`nR{>0Dm z#I?Wzl75l~H#T0~+J+y5enLlox@@%DThp`G7%Lwgf5d%`jT)Q}66mH_wq~&fnl;gJ zUG3~~(KScDytUi$q`}LJr`3`B_zeskfVu!{xSz2b$Vp#^S>9s;R=wRZ(z}cOyTrJm zJ!n~Su9SIFL)tFRkAW zNXoS%D8-N(<>X+HlW_8SuHv0rGG$ierfE)=X4hwh<2prB!)WDy} z?FueJzZB%v#@7>dz%>&qLjoP(2OUedT%&&u1PQ+k3%_ex5V9X?h^v8m?EKw*)s8Qr zrA7MW1AJcBKtv!MZu|%fRg4EV({(Ko?Qk9>;(fF3lU+)RHHoGB6@Abg!jn-yv z-jPr1Il08FGIP*-Cm4~X3L^rzKN6xZbT`8`q%g^S@3p#&lOY<(RB_wfQuOsn{e;e7khKAd+}wk z`O(O($M?HSmgKOcze3tQ`!+raDVH;NEW;hASNst}heH^r15*Aiz8RDnjqVr8NAX)n zXOW(Q#F4AJ$I*Npye{lpx5jyShX>lpj}Fc*-L`fS9k1OlW6AevY}y6lSdt{R{LdBZ zsG?haE-{dTgDx&a`R@;kxO=qd@lbKYM1y(^#d{X0Kc^IK@as0GtDe2gwsj+8-J4OM zvEN&LydoLknv4;ypK`pC1iJdwjlgXz!NJ*ekLC8^DJ9h#&3_RTaee2&!k{o!NyBX; z>&oS=lQLas1^W1fKpOPjZuvjF0Z(VT64y!Gb$80xuMg>U46mJetrgeP7le=Aq4%lX z-2EEa%zEFzVTJhW#=lNs3g=mndL>8jI89H&ngVxP``lDdEqPNgp2TAb`Lvexa?dMu zjMn2*OB2IXQf(Bfiiui0=<*xbBJ0XtFfUjY-x2sU$K z>eH5%zpJ2^W3VDb+Dc5!HZ~ej)BFG`f7_-1_h}*fTL8W6y)->)W~bqY1HA$eo#6vg zgR?rGAiwuG;?*DIX>lTdnm}0Y_ma10cyaprhE{#zZe#R#2CiT9%xF~wEiK)#Ewl)| z`4lr;kck@9vBT>cu;j60(R8zj{Nw{vhRo-_jpE_3FS-e=;klfQe@F-^n0ZmYv|i6x zBl-ItlaW6|;+>fOMeVXAK6GQ5q`^OZefTk`yV_I85nfU}pe}0Rg2`3%eM1KS=(zSd z!olAb|83Yb)%!oVSZ%hA8iHJ{Nqo#v z<#ce=NPg5SSX-_?Vefu*C22=6wrv{6)PYbs{ywMIu5jC@=hhm-M_p(vuCi=+n_bPOv z`q>7d^lOXzQNwYL+Bd9>hyZ%%QAldWBj1l;A>21zGtYVmEiG|?PJKsgqbm%m!_;*! z&&-Idh~GE z0I{ogCJbt?x!%k6-1oNc8BBDm_awsX1a#!bxuSS$a%uK0DbD9GdbqLIfL$>ClHM zC#M&sVEHw_N3T`WN)2z|lIdy1L^F9ddS9t0%9VNO?%E1^rh@Zoqt(j(TzHV7Ke;S! zK`|f?O5E&CoNW*USdmu1K_WU{K6*dpxZ3$N!tG_|=xZm_SqYU*QZH{92W0nbWO6O_ z;7&}`#NW6E8G!7m^uk&3-{(7qQhQ_lsG|l3`Woi$e9F}rFt%U%=kuRCqkK;PWY6u- zDz+`%thnUux{LK6Uu@ss@WY&2X7Ft)4`IT$A5=D3(snaKdO6Llyq_n~VpMa&+!uoy zh{s?sdU}?2>+lYI)8_m&Ifo-L1aTXZW(9+$RAJ8>?1v6BQ?_JGfhBN0jWWbJdP&!~ zd0~Z%aX9Z~&?E24PYvhY7mOAfelkZZyuS`lHd_iE5;jQ|;lQp(&8Gq_B=><{=_hUS z7TN1O?_iUZ8U9h28wbuWJ+6?WgYBmptqpgHwOPi^;8wCnNqyFJg9aWYUg$xr>iNjx zZvDX!6%{VqtlEJi4p-!ntyTGshh1+?|B#FjRpn1UQVyBgl0##j0E@9+;X;bK{Pfv_ zG^GYscy-0oI}8ZbnDEgNsi1#)Z#Z`absEG4(Yw@3s2OwA(Gg*!){R8G(OqvULXx@+ zQXH5SbcKTzQuxk2V|U2;^GB=k@tT>lKofyf{0!aSHP(_IUtOZ!n(K|2x6&BWD!va#8ZXm+7`h@H2%o~Bt*E7!dsh{{v#D=I+bQ?&* z^|3hRL^7V0?c6_L3Mdtr_nEwRi;J)q zqCXx>KWN>J=}Y%Ta0J)QrF&4>u`qUDX1}6ir{nyNC{g6P>)(N3WSV`P8oWpM_En&thTF*^v%obh{qW<4DemHahl`EL?Qdhz%#WG0U=c^rWlbn;N3X(N*U@UBe{B(H z{Xe|-K0CYq%*_$IYI_hXe2e&;R8Yv%(vjy~V~H*2{R-=Sl+gV_=g=$0+Y_M%gosj+@~U?*USk@BS01%(Mp`nciE)^N zH%bfRzhrD)woM5iKAEPn_p-0o`mCa&q^Q_dRMrxvPl&fT)|M^+&phg-TVLPM9a}{N zxyUgwRqnin<9)Eu!#?Cq@da{pv6l0Vul5-5P=(`#-U)-%Tt#f?R^9{S%T+G^WyZHD zp8Qo`wmz)SyxbNbNR391i_5fIQ90a3=I8gzBfUb5_V|a#wU`ItwU}7sHfst#Mc@2+ z!!Or63o1*}(-r8<%hdp~JO14geQaLw=Rp$ z?tF50)3}sd-yAE594+hGGH!(I;q4Rv06!p@$Bj$Vzk|Q0uK-5y@K;5Ow)^Qzv|rF? zy3G!-nXuAO#@n%&*o(iZ$rr-Hb7D>((Ckzg?M&fMr4{52dRnh&JuqMD?`KepX3+wU zmmq8_)VY6qeoy}8Npd8hNJCSLlvwC7-xAtxYfJO=)XB&j6!h59xd=)(UA3v1UoK3q ztp@ctoL!wSDE*Qvia(COKf>`sL{wu|VGFvKFYX`Sh>EGcNhfd_-9E>)Ay1Prlj-Ag zZuOCj7N+8U7T@1Bl*&)f%-pr*7}Z3F&pf;~?49>b*lj3qcrC;BR*v9BF6a26c8 zQu>ibVCqfOHcBu+;x~y+ClM7{sUbnONA(dvd{GW!qlypjwmxkknx%-c2*y;DJF!9hL& zLWl%7%5qLE=E(G-+mP3yhYSi(b7=T+q@-mLmOp<$>yKyZG_Q_=V7`EENB3`J78ghC z&ec|0OqDtasj;E^XKnzZn6-a+OTM2CQU}1%h|k;#c!ie&WKC&gNq@K5e67x{S4KVd z2}v>|4a?Oo+Fi(ze`IF*Rlw8XFx9lYlfxdjo${VPho^Qwj^2X3)e8?d?D%UuU**ml zdU&?w_1;Ka_WT6gVf5w{Z2hf~I^4w{D=cc-fRJ@}>@dK0Ei75fwg zQqS4+w7rKCc>8s{?y+tWKbY#4y}m{CH!M9o@*qD-C-Vrw3-*6?ylId`+cR9#6%`-z zO;TdGGuClfPJx;<(iWDqL9L4x(D7MS_a?;!G=os(4Bpfsc4f0Qq9ET1wujBitH||D zZ$1_JE+IrTBg7|r>=s188~W62so^}T@>p1hM>15qH9I?Cb=81@f#EePD;&;x>*vvO z^(?aGeG-2|xdwXB<45==gZh^-PvZ|!Lqd8_MIXSL)>K1tGeGqcg!{e|=77QPuHR`+ zMh}oUmlMg0o4@IvIa2~C^j9&j=bt;zmWqKYJSL>h+ymW|RIzj)+p(@kv<7UXNkl>K zHSEU{9HO27sBt>a9h4nyp0OYlnv?LT%soTGE9-@~dR~)wE(_Ulu>}YQN7?39nhv+#4A`C0D0*6F89Po;g+*X(+Ytd@}47kZWJP*d&Ud2)GMr{fcB z=D2eRm{6$#L7_-;M3+H^nHw39ObUu22+N|{xXRTX_ks;x`v#Az4kIdix*k{Gl6!Wh z`KP~eu@l19e2jsCaq=8}jGN7N6poJ#-Hv}q{d(GZVRv%aKH`u3e6wF(#VTk|WgJi> zvQDm$f6lCih|Bt|9K0Itt7Z`n)Ob^qWXXAQk#3SmAXU6X>aLh(edFp~ge! z&%BLxajo0@o(4y7Sbcbd9Q|N2BWoUH)XOxWO|W6kH|V>r&9wVm&1^w$L85-l=A)N$`ZEo`4Wv%1G$a42ZPz_ubIaY|TVp!K>tz8;=S zCC^>^h}Hr2>F^BGwy=C7Q-=h*{;FP!W!{>5uEvVr=Eba$0j28bk$|4-^Jf z#eMs(QYV<)c02S}neffGlW}x>o0jjsrCej5Vpy+<0eX30n;<34cW2!CiOnr~2X(o2 z;Wqh2`r6*lb0Mqt^$4y*&hvwN~9k6!fq80Fsp#a&~$nE$nO6Ag>X4w zYBzruFhk|sO_D~TXCn`ir~?esOrg(6agRPymRDXNR<392<0V z&7AepD7)vPU^}c@twq-_Z(BW%pI2j~Qq4M4HiLV9vBN0WU^dF7iM4a~mhNCv(^V4b zn-N1XI44FMry6}N*di1)!Lht`{+3(tJLuWjwERDH{NHDSika{aEjULn)CL|2UgtJ9 zznz>^uVXs@#jlGj3tO+roDjHM78K2--6t%CI%638tm;o7>F=ozu_nv5wou zcY0P@TV}!~B|i6$exts#s$^Guf|S!fCp?J$AF^ra*a@Fi*bSn-QR1vk0<~JQB$bNl z4fXG(d5O!#TfhubyUU{J0$q-n?bvFOi+F074W zQk>5&XYN!Q{03Fl`2N8DjbB@iI%5Wprz)oReZ#^~o%g+h6{Yb_o4gwY$#8a@YrYk4 z_zse&HQ3%+Vk(P@ntb_pPT~U2OZW)C&-dsAsbi}mB4mVAKUiTzo;q1J?hmP#h&PTr zeu`TirgO(BH;zhAr5ZkJl~UGn_18%`kV`p>al8VbW%H7I(eR@Zad;e4Ms-eN9S@^Q zxKm9qJx~tTyRS;K?sFIL&cAjpg~Aw(jg@3Uml@Mjhf{aG9AMjtw^tUNN|Y*G^pe(_t;e><23 z7(MHr*S)2&1`-&>eJYf<$S=t#XnBsCiYL^t^^Wtr3M8q}T zs6z_W&=KzyzvM%3Y$~B*Oxhx&M@?vxPDq#k^8%=3%5mAuIEHB(-lzfGA8D1^bPjp3D@YdeGL%VP z!NkslLD=K)DFQ=L;cGsUTq_s8N3Y3FZ6{{eHYU7~c{Q|UXoz3AENbn|eHIC$4*i>J z67={z{&2F)d++D;QJo~2Z}!FOB%npw#i)Z@j!GIDg$PzSxe!17h~hBPEQl{=H1|I#&-Gp;(43(`=9)W>i@G+|8}T21 z*Lxi?Ed0es536xOTwMAMSJ8{`jpM+_pj#nqY-}KWR#yJ#%B7|0acm-AbImh45&=mX z=$AEhSTP4{oX`9FOpJ=D_xHN*oOPyAmlDp}n(vBvNV^`Ef{ifLETAfzMk)5C+UZY5 zs`&THX7M&BnNM(^ntz1RkUobk%qdV1($G^vBgScp@%uRsJrqRO#s3ZUOva;L^1pul zdik)2yoW6Uij0PvUkF)NQ-1N{yLHN3Dqf1VWSjljqg4&huL;HGRwp&1KHa~nU4-}| zrdBB&K0en;$9&87&OF7pN4S^BhMX)qK4RQxZ>cJc)oS(~z+4C)+9@Q8EWqANu#uWv zW?ouqHO6$h^0(YQ`UPbxkdn%#*TRL;1M*t8U|nN1CvIm~{-Q=JwIK#8trGp2N&Sa0QUgKMSNDkdZNIo9aN|idcV$w*$wTSaYQ5DiflDDABO6Ffbrn4&+_} z!$2|^hk8nC*KIPlUTwEsaZ4zWc*dU2%&Sxd0n8W(MnVOn%4YI;4n|JWiDYYt)juF# zH9gTJ6u8;&&}07E+Aihd)D*Mo-KEIrZfSt36DRZ+3+S^e&W$tm4s;5_w`e~CWLnv|e!@f&}C*Q*=!=TA*M@&N`S`?s^=U}pjOeD&&8 zrQkOUzX@|n>Q{*;>oj^7zKl4b74>Eq^~aS&sDZum3WnC=4EW(s`)9ajZjmvM?@XQ6 zH<=!FwBe9GG)kPY%I*LQ?L{GxmENa4*bkBqTk4|DY@^3dHD;#Yzp1D>Ax7Voun$O=&iZ?vj zHm=r?l(GMs6wkBb{6&sL`sb@W`x7IKcH4j#j7JnULf(+2PZdKcB!qcICwyx! zC#f+JWgFa6AW2n@rw_Wj(%cw8nEJPWjV%{Ean*?+0V4WHj~}5^unUnjGRrR+LM^`j zza8%dGc6n18(2(zvk`L*4uN_~LcEjLsSyKWq4-<2M ze@$8+2_~VUsubOC0qw6OcWjKF0Pgu-*|RA%)7Wi&pq~mSGA1b{K#(P>ekPLia)-m$ zHX)}zTuQe-Vcm7EH^osw=yJU`EF&;55Dy<;>GS7KMT%bjV8)9JS599=!Y@Mi2t<8S zz;)mboB$4)El)eXypX}KptV7X3b;u0!3JZ3I;~P@p?)5$;QX(;LA6GoE>AQ#QGi{g zLQ%54Ze_m3#~*j%Dky&b901!gx{J{Q+Ew@A6)h7!T37#ZU9~M|VgY@n7aG8NH2;hl zF!LLR)Y#A@;4S#(L(fP@$~n{E#F$vnM>B0zXxs24OBF3L320)E+}*E3MX9rCUqO?; z@yyF}nBPx_W%NY7%&Mq}DJ*2*vYw4dO#R?9E*;&2*f#Pdoz;?Q^K7-c$$8mOew-We z=NlJnP2f%d9f8rSk;)!Lyw=WosYP4aOcfi(A>n;4mh}I5%?szcI;|l@0vkj9-5}PB)!=yQ1pxtK$5O06Ir*lZ+*`!v59=EnkG|sB@p#iPNvD@|PYUcK?r*3-~>rF;^ zhHvHznakNYO|@3@nHPlRvb0#}qbrAFD~AT`OiV*VRGfXlMPhAx7lvNGqJ{Uq4d6I$KzccLbXe;7EPnoX7J+#@JgN2Zutwi}d>%q{-fW^L_k zm?*O4OLb3wfnERWUo$oiXJ$LtsT`KSd|%>Y8*(dAIIZgzqlY&;H#bw|{7Q4bF7YPt z*u=Hdp0b>GYWX-WOOeNKcpqdaCJ0`!83#!jX{sS}B3@dRL=_#K=dZPJ6ETv|cCTyw&z(iNNXjr()e!@83NEzp!T; zJYLV8(jw}|4pebiv#NK@Hg)mf;F#D}+1HD+TC&Z6PMXH5Mbd2WCotfbeuKv~@5i}b z0G_}~)S#7E5}r-?`B=RDK$HhvqsEG)tE&rjq||VY;MHqp<{Y5C*959^Q}qNR(}h*0y=l+wZ>89%5`SJ2{>aG+ zH{jTatlJA1op@4D=s zzbv99|B9z=R6#g(EE5ULfX>JZGJ#yH$RlE6{)S%a`I}F%>hbCQM_tG4 z=>9@F9eY3_wU~TzA3&)l9luYG>|W~I`fr@oiZ)Tnzb+LiKU$#&@{G42x<7KBZ0~0 zfmaECA+1vO`)hYgEK$KQ=B5Bf^;6NATvBC+8)sDPtyWjzcvSi*ql z3)EWj+dmTV6MykTMGvoTZzh(6B=*9T*O|25jsEuBG|twa=*WwAB^lCe*N~fEtLedZa>Z-jwQus(LzivR+8oy z$Y!%~8Ze~tTgZ)5thZ!|4^QQHiF!hgI{5a>zG3N3%c^eE4MBK03 z+_7JVKNv1yO^)+sn;NZd?ft?gTSnu4fn$>Z_nJlzq#jR&Y2F5L!3bi9B_OJbG%}-xS$MXVEOw}KqbF{1+dt# z*3|Lf52pG9skOI{_<5beGC3*L1XMDND0@%z6}~K}7qr^r%d)DNjpyX6S%wn{qpy!Q zjSiM~xy$WNQAtsft`%6K3P;wZ6@SoD*&kL-10S!fl;!uKn3$LuvasG)m4rwr&ivqq z?FOr!haZhF&4w93PrE^Bp#Em~n1%2b(1U>;4nZyO-b5t2SlwhIK?7(=(c*Bb)eg_j z^wpSBwob5mG3g~^=}EK$Ye0)r&ghFsGW+N^z4ZPek8wYVJt)T`jx~-^d0`y f=8 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%0AaIYh|FS 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

pUO#^(hl2r6X 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