├── microservices ├── docker │ ├── prometheus │ │ ├── prometheus │ │ │ ├── Dockerfile │ │ │ └── prometheus.yml │ │ └── docker-compose.yml │ ├── elk │ │ ├── filebeat │ │ │ ├── build.sh │ │ │ ├── Dockerfile │ │ │ ├── filebeat.yml │ │ │ └── elasticsearch.yml │ │ └── docker-compose.yml │ ├── zipkin │ │ └── docker-compose.yml │ ├── admin │ │ └── docker-compose.yml │ └── mq │ │ └── docker-compose.yml ├── microservice-graphql │ ├── examples │ │ ├── query.txt │ │ └── mutation.txt │ └── src │ │ ├── test │ │ ├── resources │ │ │ └── graphql-test │ │ │ │ ├── allDrugs.graphql │ │ │ │ ├── allPosts.graphql │ │ │ │ └── renamePost.graphql │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── miservices │ │ │ └── services │ │ │ └── graphql │ │ │ └── GraphQLApplicationTest.java │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── miservices │ │ │ └── services │ │ │ └── graphql │ │ │ ├── post │ │ │ ├── PostRepository.java │ │ │ ├── AuthorRepository.java │ │ │ ├── DataModel.java │ │ │ ├── Author.java │ │ │ └── Post.java │ │ │ ├── service │ │ │ ├── DrugModel.java │ │ │ └── DrugServiceFeignClient.java │ │ │ ├── GraphQLApplication.java │ │ │ └── web │ │ │ └── DrugController.java │ │ └── resources │ │ ├── application.yml │ │ └── graphql │ │ └── schema.graphqls ├── microservice-pharmacies │ └── src │ │ ├── test │ │ ├── resources │ │ │ └── application.yml │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── microservice │ │ │ └── service │ │ │ └── pharmacies │ │ │ └── PharmaciesServiceApplicationTest.java │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── microservice │ │ │ └── service │ │ │ └── pharmacies │ │ │ ├── service │ │ │ ├── load │ │ │ │ ├── PharmacyAvailableLoadModel.java │ │ │ │ └── PharmacyLoadModel.java │ │ │ └── drug │ │ │ │ ├── DrugService.java │ │ │ │ ├── DrugServiceFeignFallbackClient.java │ │ │ │ ├── DrugServiceFeignClient.java │ │ │ │ ├── DrugServiceFeignImpl.java │ │ │ │ └── DrugServiceTraversonImpl.java │ │ │ ├── model │ │ │ ├── DrugModel.java │ │ │ ├── PharmacyAvailable.java │ │ │ └── Pharmacy.java │ │ │ └── repository │ │ │ ├── PharmacyAvailableRepository.java │ │ │ └── PharmacyRepository.java │ │ └── resources │ │ ├── test-data │ │ └── pharmacy.json │ │ └── application.yml ├── microservice-recipes │ └── src │ │ ├── test │ │ ├── resources │ │ │ └── application.yml │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── microservice │ │ │ └── service │ │ │ └── recipes │ │ │ ├── RecipesServiceApplicationTest.java │ │ │ └── service │ │ │ └── drugs │ │ │ └── DrugServiceMock.java │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── microservice │ │ │ └── service │ │ │ └── recipes │ │ │ ├── service │ │ │ ├── drugs │ │ │ │ ├── DrugFeignType.java │ │ │ │ ├── DrugFeignConfig.java │ │ │ │ ├── DrugServiceFeignWithEurekaClient.java │ │ │ │ ├── DrugService.java │ │ │ │ ├── DrugServiceFeignUrlClient.java │ │ │ │ ├── DrugFeignClient.java │ │ │ │ └── DrugServiceWithFeignClient.java │ │ │ └── load │ │ │ │ ├── Person.java │ │ │ │ ├── RecipeLineLoadModel.java │ │ │ │ ├── DoctorLoadModel.java │ │ │ │ └── RecipeLoadModel.java │ │ │ ├── model │ │ │ ├── DrugModel.java │ │ │ ├── Doctor.java │ │ │ ├── OutgoingRecipe.java │ │ │ ├── Recipient.java │ │ │ ├── Recipe.java │ │ │ └── RecipeLine.java │ │ │ ├── controller │ │ │ ├── RecipeRestLineModel.java │ │ │ └── RecipeRestModel.java │ │ │ ├── repository │ │ │ ├── DoctorRepository.java │ │ │ ├── RecipientRepository.java │ │ │ ├── OutgoingRecipeRepository.java │ │ │ └── RecipeRepository.java │ │ │ └── RecipesServiceApplication.java │ │ └── resources │ │ ├── application.yml │ │ └── test-data │ │ └── doctor-and-recipies.json ├── microservice-delivery │ ├── delivery-core │ │ ├── src │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── epam │ │ │ │ └── training │ │ │ │ └── service │ │ │ │ └── delivery │ │ │ │ ├── model │ │ │ │ ├── DeliveryStatus.java │ │ │ │ └── DeliveryLine.java │ │ │ │ ├── event │ │ │ │ ├── DeliveryEvent.java │ │ │ │ ├── AddDeliveryLineEvent.java │ │ │ │ ├── ChangeDeliveryLineAmountEvent.java │ │ │ │ └── ChangeFieldEvent.java │ │ │ │ ├── repository │ │ │ │ └── DeliveryRepository.java │ │ │ │ └── service │ │ │ │ ├── DeliveryAggregateFactory.java │ │ │ │ ├── DeliveryEventApplier.java │ │ │ │ └── DeliveryService.java │ │ └── pom.xml │ ├── delivery-app │ │ └── src │ │ │ ├── main │ │ │ ├── resources │ │ │ │ └── application.yml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── epam │ │ │ │ └── training │ │ │ │ └── service │ │ │ │ └── delivery │ │ │ │ └── DeliveryApplication.java │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── service │ │ │ └── delivery │ │ │ └── DeliveryApplicationTest.java │ └── delivery-persistence │ │ └── src │ │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── service │ │ │ └── delivery │ │ │ └── jpa │ │ │ ├── EventEntityRepository.java │ │ │ └── EventEntity.java │ │ └── test │ │ └── java │ │ └── com │ │ └── epam │ │ └── training │ │ └── service │ │ └── delivery │ │ └── repository │ │ └── DeliveryRepositoryTest.java ├── microservice-saga-state-machine │ ├── src │ │ ├── main │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── epam │ │ │ │ │ └── training │ │ │ │ │ └── microservices │ │ │ │ │ └── services │ │ │ │ │ └── state │ │ │ │ │ └── machine │ │ │ │ │ ├── delivery │ │ │ │ │ ├── model │ │ │ │ │ │ ├── OrderEvent.java │ │ │ │ │ │ ├── DeliveryEvent.java │ │ │ │ │ │ └── DeliveryState.java │ │ │ │ │ └── action │ │ │ │ │ │ ├── OnRejectAction.java │ │ │ │ │ │ ├── OnCompleteDeliveryAction.java │ │ │ │ │ │ └── OnStartDeliveryAction.java │ │ │ │ │ └── StateMachineApplication.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── microservices │ │ │ └── services │ │ │ └── state │ │ │ └── machine │ │ │ └── StateMachineApplicationTest.java │ └── pom.xml ├── microservice-zuul │ └── src │ │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── miservices │ │ │ └── services │ │ │ └── zuul │ │ │ └── ZuulApplicationTest.java │ │ └── main │ │ ├── resources │ │ └── application.yml │ │ └── java │ │ └── com │ │ └── epam │ │ └── training │ │ └── miservices │ │ └── services │ │ └── zuul │ │ └── ZuulApplication.java ├── microservice-gateway │ └── src │ │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── miservices │ │ │ └── services │ │ │ └── gateway │ │ │ └── GatewayApplicationTest.java │ │ └── main │ │ └── resources │ │ └── application.yml ├── microservice-drugs │ └── src │ │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── miservices │ │ │ └── services │ │ │ └── drugs │ │ │ └── DrugsServiceApplicationTest.java │ │ └── main │ │ ├── resources │ │ └── application.yml │ │ └── java │ │ └── com │ │ └── epam │ │ └── training │ │ └── miservices │ │ └── services │ │ └── drugs │ │ ├── repository │ │ ├── DiseaseRepository.java │ │ ├── SymptomRepository.java │ │ └── DrugRepository.java │ │ ├── DrugsServiceApplication.java │ │ ├── service │ │ └── load │ │ │ └── DiseaseLoadModel.java │ │ ├── model │ │ ├── Symptom.java │ │ └── Disease.java │ │ ├── config │ │ └── RestRepositoryConfiguration.java │ │ └── controller │ │ └── ApiV1Controller.java ├── microservice-service-discovery │ └── src │ │ ├── main │ │ ├── resources │ │ │ └── application.yml │ │ └── java │ │ │ └── com.epam.training.microservices.service.discovery │ │ │ └── ServiceDiscoveryApplication.java │ │ └── test │ │ └── java │ │ └── com │ │ └── epam │ │ └── training │ │ └── microservices │ │ └── service │ │ └── discovery │ │ └── ServiceDiscoveryApplicationTest.java ├── pom.xml └── docker-compose │ └── platform-service-discovery │ └── docker-compose.yml ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── docs └── intro-slides │ └── images │ └── pexels-josh-sorenson-1714208.jpg ├── monolithic ├── monolithic-layered │ ├── docker-compose.yml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── epam │ │ │ │ └── training │ │ │ │ └── microservices │ │ │ │ └── monolithic │ │ │ │ ├── web │ │ │ │ ├── crud │ │ │ │ │ ├── SelectItem.java │ │ │ │ │ ├── single │ │ │ │ │ │ ├── form │ │ │ │ │ │ │ ├── FieldModel.java │ │ │ │ │ │ │ ├── HiddenFieldModel.java │ │ │ │ │ │ │ ├── TextFieldModel.java │ │ │ │ │ │ │ └── SelectFieldModel.java │ │ │ │ │ │ ├── details │ │ │ │ │ │ │ ├── RowModel.java │ │ │ │ │ │ │ └── ViewSingleDetailsTemplateParams.java │ │ │ │ │ │ └── ViewSingleTemplateParams.java │ │ │ │ │ ├── all │ │ │ │ │ │ ├── column │ │ │ │ │ │ │ ├── ColumnModel.java │ │ │ │ │ │ │ ├── TextColumnModel.java │ │ │ │ │ │ │ └── LinkColumnModel.java │ │ │ │ │ │ ├── ViewAllTemplateParams.java │ │ │ │ │ │ └── ViewAllSupport.java │ │ │ │ │ └── CrudController.java │ │ │ │ ├── HomeRedirectController.java │ │ │ │ ├── delivery │ │ │ │ │ └── DeliveryLineModel.java │ │ │ │ └── MonolithicErrorController.java │ │ │ │ ├── service │ │ │ │ ├── load │ │ │ │ │ ├── doctor │ │ │ │ │ │ ├── Person.java │ │ │ │ │ │ ├── RecipeLineLoadModel.java │ │ │ │ │ │ ├── DoctorLoadModel.java │ │ │ │ │ │ └── RecipeLoadModel.java │ │ │ │ │ ├── pharmacy │ │ │ │ │ │ ├── PharmacyDrugLoadModel.java │ │ │ │ │ │ ├── PharmacyOrderLineLoadModel.java │ │ │ │ │ │ ├── PharmacyLoadModel.java │ │ │ │ │ │ └── PharmacyOrderLoadModel.java │ │ │ │ │ └── disease │ │ │ │ │ │ └── DiseaseLoadModel.java │ │ │ │ ├── delivery │ │ │ │ │ ├── DeliveryRepository.java │ │ │ │ │ └── DeliveryService.java │ │ │ │ ├── drug │ │ │ │ │ ├── DrugRepository.java │ │ │ │ │ └── DrugService.java │ │ │ │ ├── disease │ │ │ │ │ ├── DiseaseRepository.java │ │ │ │ │ └── DiseaseService.java │ │ │ │ ├── symptom │ │ │ │ │ ├── SymptomRepository.java │ │ │ │ │ └── SymptomService.java │ │ │ │ ├── pharmacy │ │ │ │ │ ├── PharmacyRepository.java │ │ │ │ │ └── PharmacyService.java │ │ │ │ ├── doctor │ │ │ │ │ ├── DoctorRepository.java │ │ │ │ │ ├── RecipientRepository.java │ │ │ │ │ ├── RecipeRepository.java │ │ │ │ │ ├── DoctorService.java │ │ │ │ │ ├── RecipientService.java │ │ │ │ │ └── RecipeService.java │ │ │ │ └── CrudService.java │ │ │ │ ├── model │ │ │ │ ├── delivery │ │ │ │ │ ├── DeliveryStatus.java │ │ │ │ │ └── DeliveryLine.java │ │ │ │ ├── recipie │ │ │ │ │ ├── Doctor.java │ │ │ │ │ └── Recipient.java │ │ │ │ ├── disease │ │ │ │ │ └── Symptom.java │ │ │ │ └── pharmacy │ │ │ │ │ ├── PharmacyAvailable.java │ │ │ │ │ └── Pharmacy.java │ │ │ │ ├── exception │ │ │ │ ├── ResourceNotFoundException.java │ │ │ │ └── handler │ │ │ │ │ └── MonolithicControllerExceptionHandler.java │ │ │ │ └── MonolithicApplication.java │ │ └── resources │ │ │ ├── application.yml │ │ │ ├── templates │ │ │ ├── error │ │ │ │ ├── error-404.html │ │ │ │ ├── error-500.html │ │ │ │ ├── error.html │ │ │ │ └── resource-not-found.html │ │ │ └── common │ │ │ │ ├── single │ │ │ │ ├── item_only.html │ │ │ │ └── item_details.html │ │ │ │ └── index.html │ │ │ └── test-data │ │ │ ├── pharmacy.json │ │ │ └── doctor-and-recipies.json │ │ └── test │ │ └── java │ │ └── com │ │ └── epam │ │ └── training │ │ └── microservices │ │ └── monolithic │ │ ├── web │ │ ├── MockMvcTest.java │ │ ├── HomeRedirectControllerTest.java │ │ └── HomeRedirectControllerIT.java │ │ └── MonolithicApplicationTest.java ├── monolithic-hexagonal │ ├── monolithic-hexagonal-app │ │ └── src │ │ │ └── main │ │ │ ├── resources │ │ │ └── application.yml │ │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── microservices │ │ │ └── monolithic │ │ │ └── MonolithicHexagonalApplication.java │ ├── docker-compose.yml │ ├── monolithic-hexagonal-core │ │ ├── src │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── epam │ │ │ │ └── training │ │ │ │ └── microservices │ │ │ │ └── monolithic │ │ │ │ ├── model │ │ │ │ ├── HasId.java │ │ │ │ ├── delivery │ │ │ │ │ ├── DeliveryStatus.java │ │ │ │ │ ├── DeliveryLine.java │ │ │ │ │ └── Delivery.java │ │ │ │ ├── pharmacy │ │ │ │ │ ├── PharmacyAvailable.java │ │ │ │ │ └── Pharmacy.java │ │ │ │ ├── recipie │ │ │ │ │ ├── Doctor.java │ │ │ │ │ ├── Recipient.java │ │ │ │ │ ├── RecipeLine.java │ │ │ │ │ └── Recipe.java │ │ │ │ ├── disease │ │ │ │ │ ├── Symptom.java │ │ │ │ │ └── Disease.java │ │ │ │ └── drug │ │ │ │ │ └── DrugCreation.java │ │ │ │ ├── config │ │ │ │ └── MapperConfiguration.java │ │ │ │ ├── repository │ │ │ │ ├── DeliveryRepository.java │ │ │ │ ├── DrugRepository.java │ │ │ │ ├── CrudRepository.java │ │ │ │ ├── DiseaseRepository.java │ │ │ │ ├── SymptomRepository.java │ │ │ │ ├── PharmacyRepository.java │ │ │ │ ├── DoctorRepository.java │ │ │ │ ├── RecipientRepository.java │ │ │ │ └── RecipeRepository.java │ │ │ │ └── service │ │ │ │ ├── CrudService.java │ │ │ │ ├── DeliveryService.java │ │ │ │ ├── DoctorService.java │ │ │ │ ├── RecipientService.java │ │ │ │ ├── DrugService.java │ │ │ │ ├── DiseaseService.java │ │ │ │ ├── PharmacyService.java │ │ │ │ ├── SymptomService.java │ │ │ │ └── RecipeService.java │ │ └── pom.xml │ ├── monolithic-hexagonal-loader │ │ ├── src │ │ │ └── main │ │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── epam │ │ │ │ │ └── training │ │ │ │ │ └── microservices │ │ │ │ │ └── monolithic │ │ │ │ │ └── loader │ │ │ │ │ ├── doctor │ │ │ │ │ ├── Person.java │ │ │ │ │ ├── RecipeLineLoadModel.java │ │ │ │ │ ├── DoctorLoadModel.java │ │ │ │ │ └── RecipeLoadModel.java │ │ │ │ │ ├── pharmacy │ │ │ │ │ ├── PharmacyDrugLoadModel.java │ │ │ │ │ ├── PharmacyOrderLineLoadModel.java │ │ │ │ │ ├── PharmacyLoadModel.java │ │ │ │ │ └── PharmacyOrderLoadModel.java │ │ │ │ │ └── disease │ │ │ │ │ └── DiseaseLoadModel.java │ │ │ │ └── resources │ │ │ │ └── test-data │ │ │ │ └── pharmacy.json │ │ └── pom.xml │ ├── monolithic-hexagonal-web │ │ ├── src │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── epam │ │ │ │ └── training │ │ │ │ └── microservices │ │ │ │ └── monolithic │ │ │ │ └── web │ │ │ │ ├── model │ │ │ │ ├── DiseaseModel.java │ │ │ │ └── DeliveryModel.java │ │ │ │ ├── transformer │ │ │ │ ├── DiseaseModelTransformer.java │ │ │ │ └── DeliveryModelTransformer.java │ │ │ │ └── rest │ │ │ │ ├── DiseaseController.java │ │ │ │ └── DeliveryController.java │ │ └── pom.xml │ └── monolithic-hexagonal-persistence │ │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── epam │ │ │ └── training │ │ │ └── microservices │ │ │ └── monolithic │ │ │ ├── jpa │ │ │ ├── repository │ │ │ │ ├── DeliveryJpaRepository.java │ │ │ │ ├── DrugJpaRepository.java │ │ │ │ ├── DiseaseJpaRepository.java │ │ │ │ ├── SymptomJpaRepository.java │ │ │ │ ├── PharmacyJpaRepository.java │ │ │ │ ├── DoctorJpaRepository.java │ │ │ │ ├── RecipientJpaRepository.java │ │ │ │ └── RecipeJpaRepository.java │ │ │ └── entity │ │ │ │ ├── pharmacy │ │ │ │ ├── PharmacyEntity.java │ │ │ │ └── PharmacyAvailableEntity.java │ │ │ │ ├── recipie │ │ │ │ ├── DoctorEntity.java │ │ │ │ └── RecipientEntity.java │ │ │ │ └── disease │ │ │ │ └── SymptomEntity.java │ │ │ ├── transformer │ │ │ ├── Transformer.java │ │ │ ├── DrugTransformer.java │ │ │ ├── DoctorTransformer.java │ │ │ ├── RecipeTransformer.java │ │ │ ├── DiseaseTransformer.java │ │ │ ├── SymptomTransformer.java │ │ │ ├── DeliveryTransformer.java │ │ │ ├── PharmacyTransformer.java │ │ │ └── RecipientTransformer.java │ │ │ └── repository │ │ │ ├── DeliveryRepositoryImpl.java │ │ │ ├── DrugRepositoryImpl.java │ │ │ ├── DiseaseRepositoryImpl.java │ │ │ ├── SymptomRepositoryImpl.java │ │ │ └── PharmacyRepositoryImpl.java │ │ └── pom.xml └── pom.xml ├── .run ├── RecipesServiceApplication.run.xml ├── DrugsServiceApplication.run.xml ├── PharmaciesServiceApplication.run.xml └── ServiceDiscoveryApplication.run.xml ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── build.yml └── .gitignore /microservices/docker/prometheus/prometheus/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM prom/prometheus 2 | ADD prometheus.yml /etc/prometheus/ -------------------------------------------------------------------------------- /microservices/docker/elk/filebeat/build.sh: -------------------------------------------------------------------------------- 1 | docker build \ 2 | -t microservices/filebeat \ 3 | -f ./Dockerfile . -------------------------------------------------------------------------------- /microservices/microservice-graphql/examples/query.txt: -------------------------------------------------------------------------------- 1 | { 2 | allPosts { 3 | id, 4 | title 5 | } 6 | } -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/test/resources/application.yml: -------------------------------------------------------------------------------- 1 | feign: 2 | client: 3 | enabled: false 4 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aabarmin/epam-microservices-training-2022/HEAD/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/test/resources/graphql-test/allDrugs.graphql: -------------------------------------------------------------------------------- 1 | { 2 | allDrugs { 3 | id 4 | } 5 | } -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/test/resources/graphql-test/allPosts.graphql: -------------------------------------------------------------------------------- 1 | { 2 | allPosts{ 3 | id, 4 | title 5 | } 6 | } -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/test/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: test 4 | 5 | feign: 6 | client: 7 | enabled: false 8 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/examples/mutation.txt: -------------------------------------------------------------------------------- 1 | mutation RenamePost($id:Int, $title:String) { 2 | renamePost(id:$id, title: $title) { 3 | id, 4 | title 5 | } 6 | } -------------------------------------------------------------------------------- /docs/intro-slides/images/pexels-josh-sorenson-1714208.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aabarmin/epam-microservices-training-2022/HEAD/docs/intro-slides/images/pexels-josh-sorenson-1714208.jpg -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/test/resources/graphql-test/renamePost.graphql: -------------------------------------------------------------------------------- 1 | mutation RenamePost($id:Int, $title:String) { 2 | renamePost(id:$id, title: $title) { 3 | id, 4 | title 5 | } 6 | } -------------------------------------------------------------------------------- /monolithic/monolithic-layered/docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | monolithic-layer-server: 3 | container_name: monolithic-layered-server 4 | image: monolithic/monolithic-layered:latest 5 | ports: 6 | - "8080:8080" -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-app/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: dev 4 | datasource: 5 | url: jdbc:h2:mem:monolithic-hexagonal 6 | jpa: 7 | open-in-view: false -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | monolithic-hexagonal-server: 3 | container_name: monolithic-hexagonal-server 4 | image: monolithic/monolithic-hexagonal:latest 5 | ports: 6 | - "8080:8080" -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/HasId.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model; 2 | 3 | public interface HasId { 4 | KEY getId(); 5 | } 6 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.3/apache-maven-3.8.3-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar 3 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/model/DeliveryStatus.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.model; 2 | 3 | public enum DeliveryStatus { 4 | IN_QUEUE, 5 | IN_PROGRESS, 6 | COMPLETED, 7 | FAILED; 8 | } 9 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/SelectItem.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud; 2 | 3 | import lombok.Value; 4 | 5 | @Value 6 | public class SelectItem { 7 | Long id; 8 | String value; 9 | } 10 | -------------------------------------------------------------------------------- /microservices/docker/zipkin/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2.4' 2 | 3 | services: 4 | zipkin: 5 | image: openzipkin/zipkin 6 | ports: 7 | - 9411:9411 8 | networks: 9 | - microservices_network 10 | 11 | networks: 12 | microservices_network: 13 | name: microservices_network -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: dev 4 | datasource: 5 | url: jdbc:h2:mem:monolithic-layered 6 | jpa: 7 | open-in-view: false 8 | server: 9 | error: 10 | path: /error 11 | whitelabel: 12 | enabled: false -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-app/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: ${SERVER_PORT:8081} 3 | 4 | management: 5 | endpoints: 6 | web: 7 | exposure: 8 | include: '*' 9 | 10 | spring: 11 | zipkin: 12 | base-url: ${ZIPKIN_URL:http://localhost:9411} -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/single/form/FieldModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.single.form; 2 | 3 | public interface FieldModel { 4 | String getField(); 5 | String getTitle(); 6 | String getType(); 7 | } 8 | -------------------------------------------------------------------------------- /microservices/docker/admin/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | portainer: 5 | image: portainer/portainer-ce 6 | ports: 7 | - 9000:9000 8 | volumes: 9 | - /var/run/docker.sock:/var/run/docker.sock 10 | - portainer_data:/data 11 | 12 | volumes: 13 | portainer_data: -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/drugs/DrugFeignType.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.drugs; 2 | 3 | /** 4 | * @author Aleksandr Barmin 5 | */ 6 | public enum DrugFeignType { 7 | EUREKA, 8 | DIRECT 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/all/column/ColumnModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.all.column; 2 | 3 | public interface ColumnModel { 4 | String getTitle(); 5 | String getValue(T instance); 6 | String getType(); 7 | } 8 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/java/com/epam/training/miservices/services/graphql/post/PostRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql.post; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | public interface PostRepository extends JpaRepository { 6 | } 7 | -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/src/main/java/com/epam/training/microservices/services/state/machine/delivery/model/OrderEvent.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.services.state.machine.delivery.model; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class OrderEvent { 7 | private String orderId; 8 | } 9 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/java/com/epam/training/miservices/services/graphql/post/AuthorRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql.post; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | public interface AuthorRepository extends JpaRepository { 6 | } 7 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/load/Person.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.load; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Person { 7 | private String firstName; 8 | private String lastName; 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/load/doctor/Person.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.load.doctor; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Person { 7 | private String firstName; 8 | private String lastName; 9 | } 10 | -------------------------------------------------------------------------------- /microservices/docker/mq/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2.4' 2 | 3 | services: 4 | rabbitmq: 5 | image: rabbitmq:3.8.18-management 6 | ports: 7 | - 15672:15672 8 | - 5672:5672 9 | networks: 10 | - microservices_network 11 | 12 | networks: 13 | microservices_network: 14 | name: microservices_network -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/model/DeliveryLine.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.model; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class DeliveryLine { 7 | private Long id; 8 | private Long amount; 9 | private Long drugId; 10 | } 11 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/config/MapperConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.config; 2 | 3 | import org.mapstruct.MapperConfig; 4 | 5 | @MapperConfig(componentModel = "spring") 6 | public class MapperConfiguration { 7 | } 8 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/java/com/epam/training/microservices/monolithic/loader/doctor/Person.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.loader.doctor; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Person { 7 | private String firstName; 8 | private String lastName; 9 | } 10 | -------------------------------------------------------------------------------- /microservices/docker/elk/filebeat/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM docker.elastic.co/beats/filebeat:7.4.0 2 | 3 | USER root 4 | 5 | COPY filebeat.yml /usr/share/filebeat/filebeat.yml 6 | RUN chmod go-w /usr/share/filebeat/filebeat.yml 7 | 8 | COPY elasticsearch.yml /usr/share/filebeat/modules.d/elasticsearch.yml 9 | RUN chmod go-w /usr/share/filebeat/modules.d/elasticsearch.yml -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/model/delivery/DeliveryStatus.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.delivery; 2 | 3 | /** 4 | * Status of the delivery. 5 | */ 6 | public enum DeliveryStatus { 7 | IN_QUEUE, 8 | IN_PROGRESS, 9 | COMPLETED, 10 | FAILED; 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/load/pharmacy/PharmacyDrugLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.load.pharmacy; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class PharmacyDrugLoadModel { 7 | private String drugName; 8 | private Long amount; 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/load/pharmacy/PharmacyOrderLineLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.load.pharmacy; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class PharmacyOrderLineLoadModel { 7 | private String drug; 8 | private Long amount; 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-web/src/main/java/com/epam/training/microservices/monolithic/web/model/DiseaseModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.model; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class DiseaseModel { 7 | private Long id; 8 | private String name; 9 | private String description; 10 | } 11 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/java/com/epam/training/miservices/services/graphql/service/DrugModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql.service; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class DrugModel { 7 | private Long id; 8 | private String name; 9 | private String description; 10 | private String available; 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/service/load/PharmacyAvailableLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.service.load; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class PharmacyAvailableLoadModel { 7 | private String drugName; 8 | private Long amount; 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/java/com/epam/training/microservices/monolithic/loader/pharmacy/PharmacyDrugLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.loader.pharmacy; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class PharmacyDrugLoadModel { 7 | private String drugName; 8 | private Long amount; 9 | } 10 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/model/DrugModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.model; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class DrugModel { 7 | private Long id; 8 | private String name; 9 | private String description; 10 | private String available; 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/load/RecipeLineLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.load; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class RecipeLineLoadModel { 7 | private String drug; 8 | private Long amount; 9 | private String instruction; 10 | } 11 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/java/com/epam/training/microservices/monolithic/loader/pharmacy/PharmacyOrderLineLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.loader.pharmacy; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class PharmacyOrderLineLoadModel { 7 | private String drug; 8 | private Long amount; 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/load/doctor/RecipeLineLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.load.doctor; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class RecipeLineLoadModel { 7 | private String drug; 8 | private Long amount; 9 | private String instruction; 10 | } 11 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/delivery/DeliveryStatus.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.delivery; 2 | 3 | /** 4 | * Status of the delivery. 5 | */ 6 | public enum DeliveryStatus { 7 | IN_QUEUE, 8 | IN_PROGRESS, 9 | COMPLETED, 10 | FAILED; 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/model/DrugModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.model; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class DrugModel { 7 | private Long id; 8 | private String name; 9 | private String description; 10 | private String available; 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/event/DeliveryEvent.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.event; 2 | 3 | import com.epam.training.service.delivery.model.DeliveryAggregate; 4 | 5 | public interface DeliveryEvent { 6 | void process(DeliveryAggregate aggregate); 7 | 8 | void setId(Long id); 9 | Long getId(); 10 | } 11 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/java/com/epam/training/miservices/services/graphql/post/DataModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql.post; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class DataModel { 7 | private Long id; 8 | private String firstName; 9 | private String lastName; 10 | private String title; 11 | private String text; 12 | } 13 | -------------------------------------------------------------------------------- /microservices/microservice-zuul/src/test/java/com/epam/training/miservices/services/zuul/ZuulApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.zuul; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class ZuulApplicationTest { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/java/com/epam/training/microservices/monolithic/loader/doctor/RecipeLineLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.loader.doctor; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class RecipeLineLoadModel { 7 | private String drug; 8 | private Long amount; 9 | private String instruction; 10 | } 11 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-app/src/test/java/com/epam/training/service/delivery/DeliveryApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class DeliveryApplicationTest { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-gateway/src/test/java/com/epam/training/miservices/services/gateway/GatewayApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.gateway; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class GatewayApplicationTest { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/test/java/com/epam/training/miservices/services/graphql/GraphQLApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class GraphQLApplicationTest { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/test/java/com/epam/training/miservices/services/drugs/DrugsServiceApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class DrugsServiceApplicationTest { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/service/drug/DrugService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.service.drug; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import java.util.Optional; 6 | 7 | @Component 8 | public interface DrugService { 9 | Optional getDrugIdByName(String drugName); 10 | } 11 | -------------------------------------------------------------------------------- /microservices/microservice-zuul/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8080 3 | 4 | spring: 5 | application: 6 | name: micorservice-zuul 7 | profiles: 8 | active: dev 9 | 10 | eureka: 11 | client: 12 | service-url: 13 | defaultZone: http://localhost:8081/eureka 14 | 15 | zuul: 16 | routes: 17 | drugs: 18 | path: /route-drugs/* 19 | url: http://drug-service:8083/drugs -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/test/java/com/epam/training/microservice/service/recipes/RecipesServiceApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class RecipesServiceApplicationTest { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/delivery/DeliveryRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.delivery; 2 | 3 | import com.epam.training.microservices.monolithic.model.delivery.Delivery; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface DeliveryRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-persistence/src/main/java/com/epam/training/service/delivery/jpa/EventEntityRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.jpa; 2 | 3 | import java.util.Collection; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface EventEntityRepository extends JpaRepository { 7 | Collection findAllByEntityId(Long entityId); 8 | } 9 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: ${SERVER_PORT:8080} 3 | 4 | drug: 5 | service: 6 | url: ${DRUG_SERVIE_URL:http://localhost:8083} 7 | 8 | management: 9 | endpoints: 10 | web: 11 | exposure: 12 | include: '*' 13 | 14 | spring: 15 | graphql: 16 | graphiql: 17 | enabled: true 18 | zipkin: 19 | base-url: ${ZIPKIN_URL:http://localhost:9411} -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/test/java/com/epam/training/microservice/service/pharmacies/PharmaciesServiceApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class PharmaciesServiceApplicationTest { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/load/DoctorLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.load; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | @Data 9 | public class DoctorLoadModel { 10 | private Person doctor; 11 | private List recipes = new ArrayList<>(); 12 | } 13 | -------------------------------------------------------------------------------- /microservices/microservice-service-discovery/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: ${SERVER_PORT:8081} 3 | 4 | eureka: 5 | client: 6 | register-with-eureka: false 7 | fetch-registry: false 8 | instance: 9 | hostname: localhost 10 | 11 | management: 12 | endpoints: 13 | web: 14 | exposure: 15 | include: '*' 16 | 17 | spring: 18 | zipkin: 19 | base-url: ${ZIPKIN_URL:http://localhost:9411} -------------------------------------------------------------------------------- /microservices/microservice-service-discovery/src/test/java/com/epam/training/microservices/service/discovery/ServiceDiscoveryApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.service.discovery; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class ServiceDiscoveryApplicationTest { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/CrudController.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud; 2 | 3 | import com.epam.training.microservices.monolithic.web.crud.all.ViewAllSupport; 4 | import com.epam.training.microservices.monolithic.web.crud.single.ViewSingleSupport; 5 | 6 | public interface CrudController extends ViewAllSupport, ViewSingleSupport { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/src/test/java/com/epam/training/microservices/services/state/machine/StateMachineApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.services.state.machine; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class StateMachineApplicationTest { 8 | 9 | @Test 10 | void contextLoads() {} 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/load/doctor/DoctorLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.load.doctor; 2 | 3 | import com.google.common.collect.Lists; 4 | import java.util.List; 5 | import lombok.Data; 6 | 7 | @Data 8 | public class DoctorLoadModel { 9 | private Person doctor; 10 | private List recipes = Lists.newArrayList(); 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/repository/DeliveryRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.model.delivery.Delivery; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | 6 | public interface DeliveryRepository extends CrudRepository { 7 | } 8 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/repository/DeliveryRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.repository; 2 | 3 | import com.epam.training.service.delivery.model.DeliveryAggregate; 4 | import java.util.Optional; 5 | 6 | public interface DeliveryRepository { 7 | Optional findOne(Long id); 8 | 9 | DeliveryAggregate save(DeliveryAggregate save); 10 | } 11 | -------------------------------------------------------------------------------- /microservices/docker/prometheus/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | prometheus: 5 | build: 6 | context: ./prometheus 7 | ports: 8 | - 9090:9090 9 | networks: 10 | - microservices_network 11 | 12 | grafana: 13 | image: grafana/grafana 14 | ports: 15 | - 3000:3000 16 | networks: 17 | - microservices_network 18 | 19 | networks: 20 | microservices_network: 21 | name: microservices_network -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/repository/PharmacyAvailableRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.repository; 2 | 3 | import com.epam.training.microservice.service.pharmacies.model.PharmacyAvailable; 4 | import org.springframework.data.repository.CrudRepository; 5 | 6 | public interface PharmacyAvailableRepository extends CrudRepository { 7 | } 8 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/pharmacy/PharmacyAvailable.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.pharmacy; 2 | 3 | import com.epam.training.microservices.monolithic.model.drug.Drug; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class PharmacyAvailable { 8 | private Long id; 9 | 10 | private Drug drug; 11 | 12 | private Long amount; 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/exception/ResourceNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.exception; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public class ResourceNotFoundException extends RuntimeException { 9 | private final String resourceName; 10 | private final Long resourceId; 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/java/com/epam/training/microservices/monolithic/loader/doctor/DoctorLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.loader.doctor; 2 | 3 | import com.google.common.collect.Lists; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | @Data 9 | public class DoctorLoadModel { 10 | private Person doctor; 11 | private List recipes = Lists.newArrayList(); 12 | } 13 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/service/DeliveryAggregateFactory.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.service; 2 | 3 | import com.epam.training.service.delivery.model.DeliveryAggregate; 4 | import org.springframework.stereotype.Component; 5 | 6 | @Component 7 | public class DeliveryAggregateFactory { 8 | public DeliveryAggregate newInstance() { 9 | return new DeliveryAggregate(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/repository/DeliveryJpaRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.delivery.DeliveryEntity; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface DeliveryJpaRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/drug/DrugRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.drug; 2 | 3 | import com.epam.training.microservices.monolithic.model.drug.Drug; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface DrugRepository extends JpaRepository { 8 | Optional findDrugByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/single/form/HiddenFieldModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.single.form; 2 | 3 | public class HiddenFieldModel extends TextFieldModel { 4 | 5 | public HiddenFieldModel(String title, String field) { 6 | super(title, field); 7 | } 8 | 9 | @Override 10 | public String getType() { 11 | return "HIDDEN"; 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-app/src/main/java/com/epam/training/service/delivery/DeliveryApplication.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class DeliveryApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(DeliveryApplication.class, args); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-gateway/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: ${SERVER_PORT:8080} 3 | 4 | spring: 5 | application: 6 | name: api-gateway 7 | profiles: 8 | active: dev 9 | zipkin: 10 | base-url: ${ZIPKIN_URL:http://localhost:9411} 11 | 12 | eureka: 13 | client: 14 | service-url: 15 | defaultZone: ${EUREKA_URL:http://localhost:8081/eureka} 16 | 17 | management: 18 | endpoints: 19 | web: 20 | exposure: 21 | include: '*' -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/service/DeliveryEventApplier.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.service; 2 | 3 | import com.epam.training.service.delivery.event.DeliveryEvent; 4 | import com.epam.training.service.delivery.model.DeliveryAggregate; 5 | 6 | public interface DeliveryEventApplier { 7 | boolean supports(DeliveryEvent event); 8 | 9 | void apply(DeliveryAggregate aggregate, DeliveryEvent event); 10 | } 11 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/controller/RecipeRestLineModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.controller; 2 | 3 | import com.epam.training.microservice.service.recipes.model.DrugModel; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | 7 | @Data 8 | @Builder 9 | public class RecipeRestLineModel { 10 | private DrugModel drugModel; 11 | private Long amount; 12 | private String instruction; 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-web/src/main/java/com/epam/training/microservices/monolithic/web/model/DeliveryModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.model; 2 | 3 | import com.epam.training.microservices.monolithic.model.delivery.DeliveryStatus; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class DeliveryModel { 8 | private Long id; 9 | private String addressLine; 10 | private DeliveryStatus status; 11 | private String pharmacyName; 12 | } 13 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/MonolithicApplication.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class MonolithicApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(MonolithicApplication.class, args); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/resources/test-data/pharmacy.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Twimm", 4 | "address": "33012 Weeping Birch Street", 5 | "drugs": [ 6 | { 7 | "drugName": "Acetylcholinesterase inhibitors", 8 | "amount": 20 9 | }, 10 | { 11 | "drugName": "NMDA receptor antagonists", 12 | "amount": 15 13 | }, 14 | { 15 | "drugName": "Aducanumab", 16 | "amount": 10 17 | } 18 | ] 19 | } 20 | ] -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/disease/DiseaseRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.disease; 2 | 3 | import com.epam.training.microservices.monolithic.model.disease.Disease; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface DiseaseRepository extends JpaRepository { 8 | Optional findDiseaseByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/load/RecipeLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.load; 2 | 3 | import lombok.Data; 4 | 5 | import java.time.LocalDate; 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | @Data 10 | public class RecipeLoadModel { 11 | private LocalDate issueDate; 12 | private Person recipient; 13 | private List content = new ArrayList<>(); 14 | } 15 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/symptom/SymptomRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.symptom; 2 | 3 | import com.epam.training.microservices.monolithic.model.disease.Symptom; 4 | 5 | import java.util.Optional; 6 | import org.springframework.data.jpa.repository.JpaRepository; 7 | 8 | public interface SymptomRepository extends JpaRepository { 9 | Optional findSymptomByName(String name); 10 | } 11 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/service/load/PharmacyLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.service.load; 2 | 3 | import com.google.common.collect.Lists; 4 | import lombok.Data; 5 | 6 | import java.util.Collection; 7 | 8 | @Data 9 | public class PharmacyLoadModel { 10 | private String name; 11 | private String address; 12 | private Collection drugs = Lists.newArrayList(); 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/pharmacy/PharmacyRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.pharmacy; 2 | 3 | import com.epam.training.microservices.monolithic.model.pharmacy.Pharmacy; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface PharmacyRepository extends JpaRepository { 8 | Optional findPharmacyByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /microservices/docker/prometheus/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 5s 3 | 4 | scrape_configs: 5 | - job_name: prometheus 6 | scrape_interval: 5s 7 | static_configs: 8 | - targets: ['localhost:9090'] 9 | 10 | - job_name: microservices 11 | scrape_interval: 5s 12 | metrics_path: /actuator/prometheus 13 | static_configs: 14 | - targets: 15 | - service-discovery:8080 16 | - service-drugs:8080 17 | - service-recipes:8080 18 | - service-gateway:8080 -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/repository/DrugRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.model.drug.Drug; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import java.util.Optional; 6 | 7 | public interface DrugRepository extends CrudRepository { 8 | Optional findDrugByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/load/doctor/RecipeLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.load.doctor; 2 | 3 | import com.google.common.collect.Lists; 4 | import java.time.LocalDate; 5 | import java.util.List; 6 | import lombok.Data; 7 | 8 | @Data 9 | public class RecipeLoadModel { 10 | private LocalDate issueDate; 11 | private Person recipient; 12 | private List content = Lists.newArrayList(); 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/single/details/RowModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.single.details; 2 | 3 | import com.epam.training.microservices.monolithic.web.crud.single.form.FieldModel; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.Singular; 7 | 8 | import java.util.List; 9 | 10 | @Data 11 | @Builder 12 | public class RowModel { 13 | @Singular 14 | private List fields; 15 | } 16 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/drugs/DrugFeignConfig.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.drugs; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | 6 | /** 7 | * @author Aleksandr Barmin 8 | */ 9 | @Data 10 | @ConfigurationProperties(prefix = "drug-feign") 11 | public class DrugFeignConfig { 12 | private DrugFeignType type; 13 | private String drugServiceUrl; 14 | } 15 | -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/src/main/java/com/epam/training/microservices/services/state/machine/StateMachineApplication.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.services.state.machine; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class StateMachineApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(StateMachineApplication.class, args); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/repository/CrudRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.model.HasId; 4 | import java.util.Collection; 5 | import java.util.Optional; 6 | 7 | public interface CrudRepository, KEY> { 8 | MODEL save(MODEL instance); 9 | 10 | Optional findById(KEY id); 11 | 12 | Collection findAll(); 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/doctor/DoctorRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.doctor; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Doctor; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface DoctorRepository extends JpaRepository { 8 | Optional findDoctorByFirstNameAndLastName(String firrstName, String lastName); 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/HomeRedirectController.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.servlet.view.RedirectView; 6 | 7 | @Controller 8 | public class HomeRedirectController { 9 | @GetMapping("/") 10 | public RedirectView redirectView() { 11 | return new RedirectView("/drugs"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/repository/DoctorRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.repository; 2 | 3 | import com.epam.training.microservice.service.recipes.model.Doctor; 4 | import org.springframework.data.repository.CrudRepository; 5 | 6 | import java.util.Optional; 7 | 8 | public interface DoctorRepository extends CrudRepository { 9 | Optional findDoctorByFirstNameAndLastName(String firstName, String lastName); 10 | } 11 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/repository/DiseaseRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.model.disease.Disease; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import java.util.Optional; 6 | 7 | public interface DiseaseRepository extends CrudRepository { 8 | Optional findDiseaseByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/repository/SymptomRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.model.disease.Symptom; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import java.util.Optional; 6 | 7 | public interface SymptomRepository extends CrudRepository { 8 | Optional findSymptomByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/java/com/epam/training/microservices/monolithic/loader/doctor/RecipeLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.loader.doctor; 2 | 3 | import com.google.common.collect.Lists; 4 | import lombok.Data; 5 | 6 | import java.time.LocalDate; 7 | import java.util.List; 8 | 9 | @Data 10 | public class RecipeLoadModel { 11 | private LocalDate issueDate; 12 | private Person recipient; 13 | private List content = Lists.newArrayList(); 14 | } 15 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/repository/PharmacyRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.model.pharmacy.Pharmacy; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import java.util.Optional; 6 | 7 | public interface PharmacyRepository extends CrudRepository { 8 | Optional findPharmacyByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/repository/DrugJpaRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.drug.DrugEntity; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface DrugJpaRepository extends JpaRepository { 8 | Optional findDrugByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-app/src/main/java/com/epam/training/microservices/monolithic/MonolithicHexagonalApplication.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class MonolithicHexagonalApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(MonolithicHexagonalApplication.class, args); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.run/RecipesServiceApplication.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/doctor/RecipientRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.doctor; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Recipient; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface RecipientRepository extends JpaRepository { 8 | Optional findRecipientByFirstNameAndLastName(String firstName, String lastName); 9 | } 10 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/repository/RecipientRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.repository; 2 | 3 | import com.epam.training.microservice.service.recipes.model.Recipient; 4 | import org.springframework.data.repository.CrudRepository; 5 | 6 | import java.util.Optional; 7 | 8 | public interface RecipientRepository extends CrudRepository { 9 | Optional findRecipientByFirstNameAndLastName(String firstName, String lastName); 10 | } 11 | -------------------------------------------------------------------------------- /microservices/microservice-zuul/src/main/java/com/epam/training/miservices/services/zuul/ZuulApplication.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.zuul; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.netflix.zuul.EnableZuulProxy; 6 | 7 | @EnableZuulProxy 8 | @SpringBootApplication 9 | public class ZuulApplication { 10 | public static void main(String[] args) { 11 | SpringApplication.run(ZuulApplication.class, args); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/load/pharmacy/PharmacyLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.load.pharmacy; 2 | 3 | import com.google.common.collect.Lists; 4 | import java.util.List; 5 | import lombok.Data; 6 | 7 | @Data 8 | public class PharmacyLoadModel { 9 | private String name; 10 | private String address; 11 | private List drugs = Lists.newArrayList(); 12 | private List orders = Lists.newArrayList(); 13 | } 14 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/resources/graphql/schema.graphqls: -------------------------------------------------------------------------------- 1 | type Query { 2 | allPosts: [Post]! 3 | allDrugs: [Drug]! 4 | } 5 | 6 | type Mutation { 7 | renamePost(id: Int, title: String): Post 8 | } 9 | 10 | type Post { 11 | id: Int, 12 | author: Author, 13 | title: String, 14 | text: String 15 | } 16 | 17 | type Author { 18 | firstName: String, 19 | lastName: String, 20 | posts: [Post]! 21 | } 22 | 23 | type Drug { 24 | id: Int, 25 | name: String, 26 | description: String, 27 | available: String 28 | } -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/repository/DiseaseJpaRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.disease.DiseaseEntity; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface DiseaseJpaRepository extends JpaRepository { 8 | Optional findDiseaseByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/repository/SymptomJpaRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.disease.SymptomEntity; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface SymptomJpaRepository extends JpaRepository { 8 | Optional findSymptomByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: ${SERVER_PORT:8083} 3 | 4 | spring: 5 | application: 6 | name: drug-service 7 | profiles: 8 | active: dev 9 | datasource: 10 | url: jdbc:h2:mem:microservice-drugs 11 | zipkin: 12 | base-url: ${ZIPKIN_URL:http://localhost:9411} 13 | 14 | eureka: 15 | client: 16 | service-url: 17 | defaultZone: ${EUREKA_URL:http://localhost:8081/eureka} 18 | enabled: true 19 | 20 | management: 21 | endpoints: 22 | web: 23 | exposure: 24 | include: '*' -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/repository/DoctorRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Doctor; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import java.util.Optional; 6 | 7 | public interface DoctorRepository extends CrudRepository { 8 | Optional findDoctorByFirstNameAndLastName(String firstName, String lastName); 9 | } 10 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/java/com/epam/training/miservices/services/drugs/repository/DiseaseRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs.repository; 2 | 3 | import com.epam.training.miservices.services.drugs.model.Disease; 4 | import org.springframework.data.repository.CrudRepository; 5 | import org.springframework.data.repository.query.Param; 6 | 7 | import java.util.Optional; 8 | 9 | public interface DiseaseRepository extends CrudRepository { 10 | Optional findDiseaseByName(@Param("name") String name); 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/java/com/epam/training/miservices/services/drugs/repository/SymptomRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs.repository; 2 | 3 | import com.epam.training.miservices.services.drugs.model.Symptom; 4 | import org.springframework.data.repository.CrudRepository; 5 | import org.springframework.data.repository.query.Param; 6 | 7 | import java.util.Optional; 8 | 9 | public interface SymptomRepository extends CrudRepository { 10 | Optional findSymptomByName(@Param("name") String name); 11 | } 12 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/repository/PharmacyJpaRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.pharmacy.PharmacyEntity; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface PharmacyJpaRepository extends JpaRepository { 8 | Optional findPharmacyByName(String name); 9 | } 10 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/drugs/DrugServiceFeignWithEurekaClient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.drugs; 2 | 3 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | 6 | @FeignClient(name = "drug-service") 7 | @ConditionalOnProperty(prefix = "drug-feign", value = "type", havingValue = "eureka") 8 | public interface DrugServiceFeignWithEurekaClient extends DrugFeignClient { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/java/com/epam/training/microservices/monolithic/loader/pharmacy/PharmacyLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.loader.pharmacy; 2 | 3 | import com.google.common.collect.Lists; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | @Data 9 | public class PharmacyLoadModel { 10 | private String name; 11 | private String address; 12 | private List drugs = Lists.newArrayList(); 13 | private List orders = Lists.newArrayList(); 14 | } 15 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/java/com/epam/training/miservices/services/graphql/GraphQLApplication.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.openfeign.EnableFeignClients; 6 | 7 | @EnableFeignClients 8 | @SpringBootApplication 9 | public class GraphQLApplication { 10 | public static void main(String[] args) { 11 | SpringApplication.run(GraphQLApplication.class, args); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/repository/RecipientRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Recipient; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import java.util.Optional; 6 | 7 | public interface RecipientRepository extends CrudRepository { 8 | Optional findRecipientByFirstNameAndLastName(String firstName, String lastName); 9 | } 10 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/single/form/TextFieldModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.single.form; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class TextFieldModel implements FieldModel { 7 | private final String title; 8 | private final String field; 9 | 10 | public TextFieldModel(String title, String field) { 11 | this.title = title; 12 | this.field = field; 13 | } 14 | 15 | @Override 16 | public String getType() { 17 | return "TEXT"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/load/pharmacy/PharmacyOrderLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.load.pharmacy; 2 | 3 | import com.epam.training.microservices.monolithic.model.delivery.DeliveryStatus; 4 | import com.google.common.collect.Lists; 5 | import java.util.List; 6 | import lombok.Data; 7 | 8 | @Data 9 | public class PharmacyOrderLoadModel { 10 | private String address; 11 | private DeliveryStatus status; 12 | private List content = Lists.newArrayList(); 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/repository/DoctorJpaRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.recipie.DoctorEntity; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface DoctorJpaRepository extends JpaRepository { 8 | Optional findDoctorByFirstNameAndLastName(String firstName, String lastName); 9 | } 10 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/repository/PharmacyRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.repository; 2 | 3 | import com.epam.training.microservice.service.pharmacies.model.Pharmacy; 4 | import org.springframework.data.repository.CrudRepository; 5 | import org.springframework.data.repository.query.Param; 6 | 7 | import java.util.Optional; 8 | 9 | public interface PharmacyRepository extends CrudRepository { 10 | Optional findPharmacyByName(@Param("name") String name); 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/drugs/DrugService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.drugs; 2 | 3 | import com.epam.training.microservice.service.recipes.model.DrugModel; 4 | import java.util.Optional; 5 | 6 | /** 7 | * @author Aleksandr Barmin 8 | */ 9 | public interface DrugService { 10 | Optional findById(Long id); 11 | 12 | /** 13 | * Get drug's id by its name. 14 | * 15 | * @param drugName 16 | * @return 17 | */ 18 | Optional getDrugIdByName(String drugName); 19 | } 20 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/transformer/Transformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.transformer; 2 | 3 | import org.mapstruct.MappingTarget; 4 | 5 | public interface Transformer { 6 | default ENTITY toEntity(MODEL model) { 7 | final ENTITY entity = newEntity(); 8 | toEntity(entity, model); 9 | return entity; 10 | } 11 | 12 | void toEntity(@MappingTarget ENTITY entity, MODEL model); 13 | 14 | MODEL toModel(ENTITY entity); 15 | 16 | ENTITY newEntity(); 17 | } 18 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/java/com/epam/training/miservices/services/drugs/DrugsServiceApplication.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 6 | 7 | @EnableDiscoveryClient 8 | @SpringBootApplication 9 | public class DrugsServiceApplication { 10 | public static void main(String[] args) { 11 | SpringApplication.run(DrugsServiceApplication.class, args); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/recipie/Doctor.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.recipie; 2 | 3 | import com.epam.training.microservices.monolithic.model.HasId; 4 | import lombok.Data; 5 | 6 | /** 7 | * An entity to store information about doctors who issue the recipes. 8 | */ 9 | @Data 10 | public class Doctor implements HasId { 11 | private Long id; 12 | 13 | /** 14 | * Doctor's name. 15 | */ 16 | private String firstName; 17 | private String lastName; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/repository/RecipientJpaRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.recipie.RecipientEntity; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface RecipientJpaRepository extends JpaRepository { 8 | Optional findRecipientByFirstNameAndLastName(String firstName, String lastName); 9 | } 10 | -------------------------------------------------------------------------------- /microservices/docker/elk/filebeat/filebeat.yml: -------------------------------------------------------------------------------- 1 | filebeat.config: 2 | modules: 3 | path: ${path.config}/modules.d/*.yml 4 | reload.enabled: false 5 | 6 | filebeat.inputs: 7 | - type: container 8 | format: docker 9 | tags: ["logs-docker"] 10 | paths: 11 | - '/opt/containers/*/*-json.log' 12 | processors: 13 | - add_docker_metadata: 14 | host: "unix:///var/run/docker.sock" 15 | match_source: true 16 | match_source_index: 2 17 | 18 | setup.kibana: 19 | host: '${KIBANA_HOST}' 20 | 21 | output.elasticsearch: 22 | hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}' -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/java/com/epam/training/microservices/monolithic/loader/pharmacy/PharmacyOrderLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.loader.pharmacy; 2 | 3 | import com.epam.training.microservices.monolithic.model.delivery.DeliveryStatus; 4 | import com.google.common.collect.Lists; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | @Data 10 | public class PharmacyOrderLoadModel { 11 | private String address; 12 | private DeliveryStatus status; 13 | private List content = Lists.newArrayList(); 14 | } 15 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/java/com/epam/training/miservices/services/drugs/repository/DrugRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs.repository; 2 | 3 | import com.epam.training.miservices.services.drugs.model.Drug; 4 | import org.springframework.data.repository.CrudRepository; 5 | import org.springframework.data.repository.query.Param; 6 | 7 | import java.util.Optional; 8 | 9 | public interface DrugRepository extends CrudRepository { 10 | Optional findDrugById(@Param("id") Long id); 11 | 12 | Optional findDrugByName(@Param("name") String name); 13 | } 14 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/java/com/epam/training/miservices/services/drugs/service/load/DiseaseLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs.service.load; 2 | 3 | import com.google.common.collect.Lists; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * The model is used to import data from json. 10 | */ 11 | @Data 12 | public class DiseaseLoadModel { 13 | private String disease; 14 | private List symptoms = Lists.newArrayList(); 15 | private List treatments = Lists.newArrayList(); 16 | private List drugs = Lists.newArrayList(); 17 | } 18 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: ${SERVER_PORT:8084} 3 | 4 | spring: 5 | application: 6 | name: pharmacy-service 7 | profiles: 8 | active: dev 9 | datasource: 10 | url: jdbc:h2:mem:microservice-pharmacies 11 | zipkin: 12 | base-url: ${ZIPKIN_URL:http://localhost:9411} 13 | 14 | eureka: 15 | client: 16 | service-url: 17 | defaultZone: ${EUREKA_URL:http://localhost:8081/eureka} 18 | 19 | feign: 20 | circuitbreaker: 21 | enabled: true 22 | 23 | management: 24 | endpoints: 25 | web: 26 | exposure: 27 | include: '*' -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/all/ViewAllTemplateParams.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.all; 2 | 3 | import com.epam.training.microservices.monolithic.web.crud.all.column.TextColumnModel; 4 | import java.util.List; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.Singular; 8 | 9 | @Data 10 | @Builder 11 | public class ViewAllTemplateParams { 12 | private String title; 13 | @Singular 14 | private List columns; 15 | @Builder.Default 16 | private String viewName = "common/index"; 17 | } 18 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/load/disease/DiseaseLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.load.disease; 2 | 3 | import com.google.common.collect.Lists; 4 | import java.util.List; 5 | import lombok.Data; 6 | 7 | /** 8 | * The model is used to import data from json. 9 | */ 10 | @Data 11 | public class DiseaseLoadModel { 12 | private String disease; 13 | private List symptoms = Lists.newArrayList(); 14 | private List treatments = Lists.newArrayList(); 15 | private List drugs = Lists.newArrayList(); 16 | } 17 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/delivery/DeliveryLine.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.delivery; 2 | 3 | import com.epam.training.microservices.monolithic.model.drug.Drug; 4 | import lombok.Data; 5 | 6 | /** 7 | * One single item to be delivered. 8 | */ 9 | @Data 10 | public class DeliveryLine { 11 | private Long id; 12 | 13 | /** 14 | * A drug to deliver. 15 | */ 16 | private Drug drug; 17 | 18 | /** 19 | * Amount of drug to deliver. 20 | */ 21 | private Long amount; 22 | } 23 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/delivery/DeliveryLineModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.delivery; 2 | 3 | import com.epam.training.microservices.monolithic.web.crud.SelectItem; 4 | import com.google.common.collect.Lists; 5 | import java.util.Collection; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | @Data 10 | @Builder 11 | public class DeliveryLineModel { 12 | private Long id; 13 | private Long drugId; 14 | private Long amount; 15 | 16 | @Builder.Default 17 | private Collection drugs = Lists.newArrayList(); 18 | } 19 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/model/PharmacyAvailable.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.model; 2 | 3 | import lombok.Data; 4 | 5 | import jakarta.persistence.*; 6 | 7 | @Data 8 | @Entity 9 | @Table(name = "pharmacy_available") 10 | public class PharmacyAvailable { 11 | @Id 12 | @GeneratedValue(strategy = GenerationType.AUTO) 13 | private Long id; 14 | 15 | @JoinColumn(name = "pharmacy_id") 16 | @ManyToOne(fetch = FetchType.EAGER) 17 | private Pharmacy pharmacy; 18 | 19 | private Long drugId; 20 | private Long amount; 21 | } 22 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-web/src/main/java/com/epam/training/microservices/monolithic/web/transformer/DiseaseModelTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.model.disease.Disease; 5 | import com.epam.training.microservices.monolithic.web.model.DiseaseModel; 6 | import org.mapstruct.Mapper; 7 | 8 | @Mapper(config = MapperConfiguration.class) 9 | public interface DiseaseModelTransformer { 10 | DiseaseModel toModel(Disease disease); 11 | } 12 | -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/src/main/java/com/epam/training/microservices/services/state/machine/delivery/model/DeliveryEvent.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.services.state.machine.delivery.model; 2 | 3 | public enum DeliveryEvent { 4 | /** 5 | * The user confirms the com.epam.training.service.delivery. 6 | */ 7 | CONFIRM, 8 | /** 9 | * When drugs are not available. 10 | */ 11 | REJECT, 12 | /** 13 | * When a com.epam.training.service.delivery is started. 14 | */ 15 | START_DELIVERY, 16 | /** 17 | * When com.epam.training.service.delivery is done. 18 | */ 19 | END_DELIVERY; 20 | } 21 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/model/Doctor.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.model; 2 | 3 | import lombok.Data; 4 | 5 | import jakarta.persistence.*; 6 | 7 | /** 8 | * An entity to store information about doctors who issue the recipiees. 9 | */ 10 | @Data 11 | @Entity 12 | @Table(name = "doctors") 13 | public class Doctor { 14 | @Id 15 | @GeneratedValue(strategy = GenerationType.AUTO) 16 | private Long id; 17 | 18 | /** 19 | * Doctor's name. 20 | */ 21 | private String firstName; 22 | private String lastName; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/drugs/DrugServiceFeignUrlClient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.drugs; 2 | 3 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | 6 | /** 7 | * @author Aleksandr Barmin 8 | */ 9 | @FeignClient(name = "drug-service", url = "${drug-feign.drug-service-url}") 10 | @ConditionalOnProperty(prefix = "drug-feign", value = "type", havingValue = "direct") 11 | public interface DrugServiceFeignUrlClient extends DrugFeignClient { 12 | } 13 | -------------------------------------------------------------------------------- /microservices/microservice-service-discovery/src/main/java/com.epam.training.microservices.service.discovery/ServiceDiscoveryApplication.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.service.discovery; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 6 | 7 | @EnableEurekaServer 8 | @SpringBootApplication 9 | public class ServiceDiscoveryApplication { 10 | public static void main(String[] args) { 11 | SpringApplication.run(ServiceDiscoveryApplication.class, args); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/disease/Symptom.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.disease; 2 | 3 | import com.epam.training.microservices.monolithic.model.HasId; 4 | import lombok.Data; 5 | 6 | /** 7 | * Symptom of the particular disease. 8 | */ 9 | @Data 10 | public class Symptom implements HasId { 11 | private Long id; 12 | 13 | /** 14 | * Name of the symptom. 15 | */ 16 | private String name; 17 | 18 | /** 19 | * Description of the symptom. 20 | */ 21 | private String description; 22 | } 23 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/java/com/epam/training/microservices/monolithic/loader/disease/DiseaseLoadModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.loader.disease; 2 | 3 | import com.google.common.collect.Lists; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * The model is used to import data from json. 10 | */ 11 | @Data 12 | public class DiseaseLoadModel { 13 | private String disease; 14 | private List symptoms = Lists.newArrayList(); 15 | private List treatments = Lists.newArrayList(); 16 | private List drugs = Lists.newArrayList(); 17 | } 18 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/java/com/epam/training/miservices/services/drugs/model/Symptom.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs.model; 2 | 3 | import lombok.Data; 4 | 5 | import jakarta.persistence.*; 6 | 7 | /** 8 | * Symptom of the particular disease. 9 | */ 10 | @Data 11 | @Entity 12 | @Table(name = "symptoms") 13 | public class Symptom { 14 | @Id 15 | @GeneratedValue(strategy = GenerationType.AUTO) 16 | private Long id; 17 | 18 | /** 19 | * Name of the symptom. 20 | */ 21 | private String name; 22 | 23 | /** 24 | * Description of the symptom. 25 | */ 26 | private String description; 27 | } 28 | -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/src/main/java/com/epam/training/microservices/services/state/machine/delivery/model/DeliveryState.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.services.state.machine.delivery.model; 2 | 3 | public enum DeliveryState { 4 | /** 5 | * The order is confirmed by a user, need to start a com.epam.training.service.delivery. 6 | */ 7 | CONFIRMED, 8 | /** 9 | * Not available, will not be delivered. 10 | */ 11 | NOT_AVAILABLE, 12 | /** 13 | * Available, the com.epam.training.service.delivery has been started. 14 | */ 15 | DELIVERY, 16 | /** 17 | * The order has been delivered. 18 | */ 19 | DELIVERED; 20 | } 21 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/pharmacy/Pharmacy.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.pharmacy; 2 | 3 | import com.epam.training.microservices.monolithic.model.HasId; 4 | import com.google.common.collect.Sets; 5 | import java.util.Set; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | 9 | @Data 10 | @EqualsAndHashCode(exclude = "available") 11 | public class Pharmacy implements HasId { 12 | private Long id; 13 | 14 | private String name; 15 | private String address; 16 | 17 | private Set available = Sets.newHashSet(); 18 | } 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: aabarmin 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Additional context** 27 | Add any other context about the problem here. 28 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/CrudService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import java.util.Collection; 4 | import java.util.Optional; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface CrudService { 8 | JpaRepository getRepository(); 9 | 10 | default T save(T object) { 11 | return getRepository().save(object); 12 | } 13 | 14 | default Optional findOne(Long id) { 15 | return getRepository().findById(id); 16 | } 17 | 18 | default Collection findAll() { 19 | return getRepository().findAll(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/single/ViewSingleTemplateParams.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.single; 2 | 3 | import com.epam.training.microservices.monolithic.web.crud.single.form.FieldModel; 4 | import java.util.List; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.Singular; 8 | import lombok.experimental.SuperBuilder; 9 | 10 | @Data 11 | @SuperBuilder 12 | public class ViewSingleTemplateParams { 13 | private String title; 14 | @Builder.Default 15 | protected String viewName = "common/single/item_only"; 16 | @Singular 17 | private List fields; 18 | } 19 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/test/java/com/epam/training/microservices/monolithic/web/MockMvcTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.web.servlet.MockMvc; 7 | import org.springframework.transaction.annotation.Transactional; 8 | 9 | @Transactional 10 | @SpringBootTest 11 | @AutoConfigureMockMvc 12 | public abstract class MockMvcTest { 13 | 14 | @Autowired 15 | protected MockMvc mockMvc; 16 | 17 | } 18 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/templates/error/error-404.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |
11 |

Oops! Page not found

12 |

Sorry, we couldn't find the page you were looking for.

13 |
14 |
15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/service/DeliveryService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.service; 2 | 3 | import com.epam.training.service.delivery.model.DeliveryAggregate; 4 | import com.epam.training.service.delivery.repository.DeliveryRepository; 5 | import java.util.Optional; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | @RequiredArgsConstructor 11 | public class DeliveryService { 12 | private final DeliveryRepository repository; 13 | 14 | public Optional findOne(Long id) { 15 | return repository.findOne(id); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/event/AddDeliveryLineEvent.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.event; 2 | 3 | import com.epam.training.service.delivery.model.DeliveryAggregate; 4 | import com.epam.training.service.delivery.model.DeliveryLine; 5 | import lombok.Data; 6 | 7 | @Data 8 | public class AddDeliveryLineEvent implements DeliveryEvent { 9 | private DeliveryLine line; 10 | private Long id; 11 | 12 | public AddDeliveryLineEvent(DeliveryLine line) { 13 | this.line = line; 14 | } 15 | 16 | @Override 17 | public void process(DeliveryAggregate aggregate) { 18 | aggregate.addDeliveryLine(line); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/transformer/DrugTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.jpa.entity.drug.DrugEntity; 5 | import com.epam.training.microservices.monolithic.model.drug.Drug; 6 | import org.mapstruct.Mapper; 7 | 8 | @Mapper(config = MapperConfiguration.class) 9 | public interface DrugTransformer extends Transformer { 10 | @Override 11 | default DrugEntity newEntity() { 12 | return new DrugEntity(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/all/column/TextColumnModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.all.column; 2 | 3 | import java.util.function.Function; 4 | import lombok.Data; 5 | import lombok.RequiredArgsConstructor; 6 | 7 | @Data 8 | @RequiredArgsConstructor 9 | public class TextColumnModel implements ColumnModel { 10 | private final String title; 11 | private final Function valueSupplier; 12 | 13 | @Override 14 | public String getValue(T instance) { 15 | return valueSupplier.apply(instance); 16 | } 17 | 18 | @Override 19 | public String getType() { 20 | return "TEXT"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: aabarmin 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/single/form/SelectFieldModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.single.form; 2 | 3 | 4 | import lombok.Getter; 5 | 6 | import java.util.Collection; 7 | 8 | @Getter 9 | public class SelectFieldModel extends TextFieldModel { 10 | 11 | private final Long value; 12 | private final Collection content; 13 | 14 | public SelectFieldModel(String title, String field, Long value, Collection content) { 15 | super(title, field); 16 | this.value = value; 17 | this.content = content; 18 | } 19 | 20 | @Override 21 | public String getType() { 22 | return "SELECT"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/transformer/DoctorTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.jpa.entity.recipie.DoctorEntity; 5 | import com.epam.training.microservices.monolithic.model.recipie.Doctor; 6 | import org.mapstruct.Mapper; 7 | 8 | @Mapper(config = MapperConfiguration.class) 9 | public interface DoctorTransformer extends Transformer { 10 | @Override 11 | default DoctorEntity newEntity() { 12 | return new DoctorEntity(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/transformer/RecipeTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.jpa.entity.recipie.RecipeEntity; 5 | import com.epam.training.microservices.monolithic.model.recipie.Recipe; 6 | import org.mapstruct.Mapper; 7 | 8 | @Mapper(config = MapperConfiguration.class) 9 | public interface RecipeTransformer extends Transformer { 10 | @Override 11 | default RecipeEntity newEntity() { 12 | return new RecipeEntity(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/transformer/DiseaseTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.jpa.entity.disease.DiseaseEntity; 5 | import com.epam.training.microservices.monolithic.model.disease.Disease; 6 | import org.mapstruct.Mapper; 7 | 8 | @Mapper(config = MapperConfiguration.class) 9 | public interface DiseaseTransformer extends Transformer { 10 | @Override 11 | default DiseaseEntity newEntity() { 12 | return new DiseaseEntity(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/transformer/SymptomTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.jpa.entity.disease.SymptomEntity; 5 | import com.epam.training.microservices.monolithic.model.disease.Symptom; 6 | import org.mapstruct.Mapper; 7 | 8 | @Mapper(config = MapperConfiguration.class) 9 | public interface SymptomTransformer extends Transformer { 10 | @Override 11 | default SymptomEntity newEntity() { 12 | return new SymptomEntity(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-web/src/main/java/com/epam/training/microservices/monolithic/web/transformer/DeliveryModelTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.model.delivery.Delivery; 5 | import com.epam.training.microservices.monolithic.web.model.DeliveryModel; 6 | import org.mapstruct.Mapper; 7 | import org.mapstruct.Mapping; 8 | 9 | @Mapper(config = MapperConfiguration.class) 10 | public interface DeliveryModelTransformer { 11 | @Mapping(target = "pharmacyName", source = "pharmacy.name") 12 | DeliveryModel toModel(Delivery delivery); 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/test/java/com/epam/training/microservices/monolithic/MonolithicApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic; 2 | 3 | 4 | import static org.assertj.core.api.Assertions.assertThat; 5 | 6 | import com.epam.training.microservices.monolithic.web.DrugController; 7 | import org.junit.jupiter.api.Test; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.context.SpringBootTest; 10 | 11 | @SpringBootTest 12 | public class MonolithicApplicationTest { 13 | 14 | @Autowired 15 | private DrugController controller; 16 | 17 | @Test 18 | public void contextLoads() { 19 | assertThat(controller).isNotNull(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/repository/RecipeRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Doctor; 4 | import com.epam.training.microservices.monolithic.model.recipie.Recipe; 5 | import com.epam.training.microservices.monolithic.model.recipie.Recipient; 6 | import java.time.LocalDate; 7 | import java.util.Optional; 8 | 9 | public interface RecipeRepository extends CrudRepository { 10 | Optional findRecipeByDoctorAndRecipientAndIssueDate( 11 | Doctor doctor, 12 | Recipient recipient, 13 | LocalDate issueDate 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/transformer/DeliveryTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.jpa.entity.delivery.DeliveryEntity; 5 | import com.epam.training.microservices.monolithic.model.delivery.Delivery; 6 | import org.mapstruct.Mapper; 7 | 8 | @Mapper(config = MapperConfiguration.class) 9 | public interface DeliveryTransformer extends Transformer { 10 | @Override 11 | default DeliveryEntity newEntity() { 12 | return new DeliveryEntity(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/transformer/PharmacyTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.jpa.entity.pharmacy.PharmacyEntity; 5 | import com.epam.training.microservices.monolithic.model.pharmacy.Pharmacy; 6 | import org.mapstruct.Mapper; 7 | 8 | @Mapper(config = MapperConfiguration.class) 9 | public interface PharmacyTransformer extends Transformer { 10 | @Override 11 | default PharmacyEntity newEntity() { 12 | return new PharmacyEntity(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/controller/RecipeRestModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.controller; 2 | 3 | import com.epam.training.microservice.service.recipes.model.Doctor; 4 | import com.epam.training.microservice.service.recipes.model.Recipient; 5 | import java.time.LocalDate; 6 | import java.util.HashSet; 7 | import java.util.Set; 8 | import lombok.Builder; 9 | import lombok.Data; 10 | 11 | @Data 12 | @Builder 13 | public class RecipeRestModel { 14 | private Long id; 15 | private Doctor doctor; 16 | private Recipient recipient; 17 | @Builder.Default 18 | private Set lines = new HashSet<>(); 19 | private LocalDate issueDate; 20 | } 21 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/repository/OutgoingRecipeRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.repository; 2 | 3 | import com.epam.training.microservice.service.recipes.model.OutgoingRecipe; 4 | import com.epam.training.microservice.service.recipes.model.Recipe; 5 | import java.util.Collection; 6 | import java.util.Optional; 7 | import org.springframework.data.jpa.repository.JpaRepository; 8 | 9 | public interface OutgoingRecipeRepository extends JpaRepository { 10 | Optional findOutgoingRecipeByRecipeAndSent(Recipe recipe, boolean send); 11 | 12 | Collection findOutgoingRecipesBySent(boolean send); 13 | } 14 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/transformer/RecipientTransformer.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.transformer; 2 | 3 | import com.epam.training.microservices.monolithic.config.MapperConfiguration; 4 | import com.epam.training.microservices.monolithic.jpa.entity.recipie.RecipientEntity; 5 | import com.epam.training.microservices.monolithic.model.recipie.Recipient; 6 | import org.mapstruct.Mapper; 7 | 8 | @Mapper(config = MapperConfiguration.class) 9 | public interface RecipientTransformer extends Transformer { 10 | @Override 11 | default RecipientEntity newEntity() { 12 | return new RecipientEntity(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/templates/error/error-500.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |
11 |

Oops! Something went wrong!

12 |

Sorry, There is some issue, We are fixing it.

13 |
14 |

Please check again later

15 |
16 |
17 |
18 | 19 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/templates/error/error.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |
11 |

Oops! Something went wrong!

12 |

Sorry, There is some issue, Our Engineers are on it.

13 |
14 |

Please check again later

15 |
16 |
17 |
18 | 19 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/service/drug/DrugServiceFeignFallbackClient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.service.drug; 2 | 3 | import com.epam.training.microservice.service.pharmacies.model.DrugModel; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.hateoas.EntityModel; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Slf4j 9 | @Component 10 | public class DrugServiceFeignFallbackClient implements DrugServiceFeignClient { 11 | @Override 12 | public EntityModel findDrugByName(String name) { 13 | log.warn("This is the response from the fallback service"); 14 | return EntityModel.of(new DrugModel()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | rabbitmq: 3 | host: localhost 4 | port: 15672 5 | cloud: 6 | function: 7 | definition: confirmOrder,rejectOrder,startDelivery,completeDelivery 8 | stream: 9 | bindings: 10 | confirmOrder-in-0: 11 | destination: orders-confirm 12 | group: main 13 | rejectOrder-in-0: 14 | destination: orders-reject 15 | group: main 16 | startDelivery-in-0: 17 | destination: orders-start 18 | group: main 19 | completeDelivery-in-0: 20 | destination: orders-complete 21 | group: main 22 | 23 | management: 24 | endpoints: 25 | web: 26 | exposure: 27 | include: '*' -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/recipie/Recipient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.recipie; 2 | 3 | import com.epam.training.microservices.monolithic.model.HasId; 4 | import com.google.common.collect.Sets; 5 | import java.util.Set; 6 | import lombok.Data; 7 | 8 | /** 9 | * 10 | */ 11 | @Data 12 | public class Recipient implements HasId { 13 | private Long id; 14 | 15 | /** 16 | * Recipient name, etc. 17 | */ 18 | private String firstName; 19 | private String lastName; 20 | 21 | /** 22 | * A collection of recipes associated with this recipient. 23 | */ 24 | private Set recipes = Sets.newHashSet(); 25 | } 26 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/java/com/epam/training/miservices/services/graphql/service/DrugServiceFeignClient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql.service; 2 | 3 | import org.springframework.cloud.openfeign.FeignClient; 4 | import org.springframework.hateoas.CollectionModel; 5 | import org.springframework.hateoas.EntityModel; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.PathVariable; 8 | 9 | @FeignClient(url = "${drug.service.url}", name = "drug-service") 10 | public interface DrugServiceFeignClient { 11 | @GetMapping("/drugs") 12 | CollectionModel findAll(); 13 | 14 | @GetMapping("/drugs/{id}") 15 | EntityModel findOne(@PathVariable("id") Long id); 16 | } 17 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/model/Pharmacy.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.model; 2 | 3 | import com.google.common.collect.Sets; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import jakarta.persistence.*; 8 | import java.util.Set; 9 | 10 | @Data 11 | @Entity 12 | @Table(name = "pharmacies") 13 | @EqualsAndHashCode(exclude = "available") 14 | public class Pharmacy { 15 | @Id 16 | @GeneratedValue(strategy = GenerationType.AUTO) 17 | private Long id; 18 | 19 | private String name; 20 | private String address; 21 | 22 | @OneToMany(mappedBy = "pharmacy", cascade = CascadeType.ALL) 23 | private Set available = Sets.newHashSet(); 24 | } 25 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/java/com/epam/training/miservices/services/graphql/post/Author.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql.post; 2 | 3 | import java.util.Collection; 4 | import jakarta.persistence.Entity; 5 | import jakarta.persistence.FetchType; 6 | import jakarta.persistence.GeneratedValue; 7 | import jakarta.persistence.GenerationType; 8 | import jakarta.persistence.Id; 9 | import jakarta.persistence.OneToMany; 10 | import lombok.Data; 11 | 12 | @Data 13 | @Entity 14 | public class Author { 15 | @Id 16 | @GeneratedValue(strategy = GenerationType.AUTO) 17 | private Long id; 18 | private String firstName; 19 | private String lastName; 20 | @OneToMany(fetch = FetchType.EAGER, mappedBy = "author") 21 | private Collection posts; 22 | } 23 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/all/column/LinkColumnModel.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.all.column; 2 | 3 | import java.util.function.Function; 4 | 5 | public class LinkColumnModel extends TextColumnModel { 6 | private final Function linkSupplier; 7 | 8 | public LinkColumnModel(String title, Function valueSupplier, 9 | Function linkSupplier) { 10 | super(title, valueSupplier); 11 | this.linkSupplier = linkSupplier; 12 | } 13 | 14 | public String getLink(T instance) { 15 | return linkSupplier.apply(instance); 16 | } 17 | 18 | @Override 19 | public String getType() { 20 | return "LINK"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /monolithic/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | com.epam.microservices 8 | training 9 | 0.0.1-SNAPSHOT 10 | 11 | 12 | monolithic 13 | 0.0.1-SNAPSHOT 14 | 15 | pom 16 | 17 | 18 | monolithic-layered 19 | monolithic-hexagonal 20 | 21 | 22 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/doctor/RecipeRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.doctor; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Doctor; 4 | import com.epam.training.microservices.monolithic.model.recipie.Recipe; 5 | import com.epam.training.microservices.monolithic.model.recipie.Recipient; 6 | import java.time.LocalDate; 7 | import java.util.Optional; 8 | import org.springframework.data.jpa.repository.JpaRepository; 9 | 10 | public interface RecipeRepository extends JpaRepository { 11 | Optional findRecipeByDoctorAndRecipientAndIssueDate( 12 | Doctor doctor, 13 | Recipient recipient, 14 | LocalDate issueDate 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/service/drug/DrugServiceFeignClient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.service.drug; 2 | 3 | import com.epam.training.microservice.service.pharmacies.model.DrugModel; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | import org.springframework.hateoas.EntityModel; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.RequestParam; 8 | 9 | @FeignClient(value = "drug-service", fallback = DrugServiceFeignFallbackClient.class) 10 | public interface DrugServiceFeignClient { 11 | @GetMapping("/drugs/search/findDrugByName") 12 | EntityModel findDrugByName(@RequestParam("name") String name); 13 | } -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build the app 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | build: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v2 17 | 18 | - name: Set up JDK 21 19 | uses: actions/setup-java@v2 20 | with: 21 | java-version: '21' 22 | distribution: 'adopt' 23 | 24 | - name: Caching Apache Maven repository 25 | uses: actions/cache@v1 26 | with: 27 | path: ~/.m2/repository 28 | key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} 29 | restore-keys: | 30 | ${{ runner.os }}-maven- 31 | 32 | - name: Build with Maven 33 | run: ./mvnw clean package 34 | -------------------------------------------------------------------------------- /.run/DrugsServiceApplication.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/delivery/DeliveryService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.delivery; 2 | 3 | import com.epam.training.microservices.monolithic.model.delivery.Delivery; 4 | import com.epam.training.microservices.monolithic.service.CrudService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.data.jpa.repository.JpaRepository; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | @RequiredArgsConstructor 11 | public class DeliveryService implements CrudService { 12 | private final DeliveryRepository deliveryRepository; 13 | 14 | @Override 15 | public JpaRepository getRepository() { 16 | return deliveryRepository; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/repository/RecipeRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.repository; 2 | 3 | import com.epam.training.microservice.service.recipes.model.Doctor; 4 | import com.epam.training.microservice.service.recipes.model.Recipe; 5 | import com.epam.training.microservice.service.recipes.model.Recipient; 6 | import org.springframework.data.repository.CrudRepository; 7 | 8 | import java.time.LocalDate; 9 | import java.util.Optional; 10 | 11 | public interface RecipeRepository extends CrudRepository { 12 | Optional findRecipeByDoctorAndRecipientAndIssueDate( 13 | Doctor doctor, 14 | Recipient recipient, 15 | LocalDate issueDate 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | com.epam.microservices.monolithic 8 | monolithic-hexagonal 9 | 0.0.1-SNAPSHOT 10 | 11 | 12 | monolithic-hexagonal-core 13 | 0.0.1-SNAPSHOT 14 | 15 | 16 | true 17 | 18 | 19 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/service/CrudService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import com.epam.training.microservices.monolithic.model.HasId; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import java.util.Collection; 6 | import java.util.Optional; 7 | 8 | public interface CrudService> { 9 | CrudRepository getRepository(); 10 | 11 | default T save(T object) { 12 | return getRepository().save(object); 13 | } 14 | 15 | default Optional findOne(Long id) { 16 | return getRepository().findById(id); 17 | } 18 | 19 | default Collection findAll() { 20 | return getRepository().findAll(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/doctor/DoctorService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.doctor; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Doctor; 4 | import java.util.Optional; 5 | 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | @RequiredArgsConstructor 11 | public class DoctorService { 12 | private final DoctorRepository doctorRepository; 13 | 14 | public Optional findByName(String firstName, String lastName) { 15 | return doctorRepository.findDoctorByFirstNameAndLastName(firstName, lastName); 16 | } 17 | 18 | public Doctor save(Doctor doctor) { 19 | return doctorRepository.save(doctor); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | 25 | # Misc configs 26 | .classpath 27 | .project 28 | .settings/ 29 | .factorypath 30 | target/ 31 | *.iml 32 | .idea/ 33 | .vscode/ 34 | build 35 | 36 | # Gradle files 37 | .gradle 38 | build/ 39 | !gradle/wrapper/gradle-wrapper.jar 40 | !**/src/main/**/build/ 41 | !**/src/test/**/build/ 42 | 43 | # Maven files 44 | target/ 45 | !.mvn/wrapper/maven-wrapper.jar 46 | !**/src/main/**/target/ 47 | !**/src/test/**/target/ 48 | 49 | .DS_Store -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/model/recipie/Doctor.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.recipie; 2 | 3 | import jakarta.persistence.Entity; 4 | import jakarta.persistence.GeneratedValue; 5 | import jakarta.persistence.GenerationType; 6 | import jakarta.persistence.Id; 7 | import jakarta.persistence.Table; 8 | import lombok.Data; 9 | 10 | /** 11 | * An entity to store information about doctors who issue the recipiees. 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "doctors") 16 | public class Doctor { 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.AUTO) 19 | private Long id; 20 | 21 | /** 22 | * Doctor's name. 23 | */ 24 | private String firstName; 25 | private String lastName; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/single/details/ViewSingleDetailsTemplateParams.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.single.details; 2 | 3 | import com.epam.training.microservices.monolithic.web.crud.single.ViewSingleTemplateParams; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.experimental.SuperBuilder; 7 | 8 | import java.util.Collection; 9 | import java.util.List; 10 | 11 | @Data 12 | @SuperBuilder 13 | public class ViewSingleDetailsTemplateParams extends ViewSingleTemplateParams { 14 | @Builder.Default 15 | protected String viewName = "common/single/item_details"; 16 | private String detailObjectName; 17 | private List headers; 18 | private Collection details; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/recipie/RecipeLine.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.recipie; 2 | 3 | import com.epam.training.microservices.monolithic.model.drug.Drug; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * One line of the recipe. 9 | */ 10 | @Data 11 | @EqualsAndHashCode(exclude = { 12 | "drug", 13 | "recipe" 14 | }) 15 | public class RecipeLine { 16 | private Long id; 17 | 18 | /** 19 | * A drug to apply. 20 | */ 21 | private Drug drug; 22 | 23 | /** 24 | * Amount of drug to apply. 25 | */ 26 | private Long amount; 27 | 28 | /** 29 | * What exactly to be done. 30 | */ 31 | private String instruction; 32 | } 33 | -------------------------------------------------------------------------------- /.run/PharmaciesServiceApplication.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /.run/ServiceDiscoveryApplication.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/service/DeliveryService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import com.epam.training.microservices.monolithic.model.delivery.Delivery; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import com.epam.training.microservices.monolithic.repository.DeliveryRepository; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | @RequiredArgsConstructor 11 | public class DeliveryService implements CrudService { 12 | private final DeliveryRepository deliveryRepository; 13 | 14 | @Override 15 | public CrudRepository getRepository() { 16 | return deliveryRepository; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/drugs/DrugFeignClient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.drugs; 2 | 3 | import com.epam.training.microservice.service.recipes.model.DrugModel; 4 | import org.springframework.hateoas.EntityModel; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.PathVariable; 7 | import org.springframework.web.bind.annotation.RequestParam; 8 | 9 | /** 10 | * @author Aleksandr Barmin 11 | */ 12 | public interface DrugFeignClient { 13 | @GetMapping("/drugs/{id}") 14 | EntityModel findById(@PathVariable("id") Long id); 15 | 16 | @GetMapping("/drugs/search/findDrugByName") 17 | EntityModel findDrugByName(@RequestParam("name") String name); 18 | } 19 | -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/src/main/java/com/epam/training/microservices/services/state/machine/delivery/action/OnRejectAction.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.services.state.machine.delivery.action; 2 | 3 | import com.epam.training.microservices.services.state.machine.delivery.model.DeliveryEvent; 4 | import com.epam.training.microservices.services.state.machine.delivery.model.DeliveryState; 5 | import org.springframework.statemachine.StateContext; 6 | import org.springframework.statemachine.action.Action; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class OnRejectAction implements Action { 11 | @Override 12 | public void execute(StateContext context) { 13 | System.out.println("The order is rejected"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/disease/Disease.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.disease; 2 | 3 | import com.epam.training.microservices.monolithic.model.HasId; 4 | import com.google.common.collect.Sets; 5 | import java.util.Set; 6 | import lombok.Data; 7 | 8 | /** 9 | * Diseases. 10 | */ 11 | @Data 12 | public class Disease implements HasId { 13 | private Long id; 14 | 15 | /** 16 | * Name of the disease. 17 | */ 18 | private String name; 19 | 20 | /** 21 | * Description of the disease. 22 | */ 23 | private String description; 24 | 25 | /** 26 | * A collection of symptoms related to the disease. 27 | */ 28 | private Set symptoms = Sets.newHashSet(); 29 | } 30 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/doctor/RecipientService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.doctor; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Recipient; 4 | import java.util.Optional; 5 | 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | @RequiredArgsConstructor 11 | public class RecipientService { 12 | private final RecipientRepository recipientRepository; 13 | 14 | public Optional findByName(String firstName, String lastName) { 15 | return recipientRepository.findRecipientByFirstNameAndLastName(firstName, lastName); 16 | } 17 | 18 | public Recipient save(Recipient recipient) { 19 | return recipientRepository.save(recipient); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/model/disease/Symptom.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.disease; 2 | 3 | import jakarta.persistence.Entity; 4 | import jakarta.persistence.GeneratedValue; 5 | import jakarta.persistence.GenerationType; 6 | import jakarta.persistence.Id; 7 | import jakarta.persistence.Table; 8 | import lombok.Data; 9 | 10 | /** 11 | * Symptom of the particular disease. 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "symptoms") 16 | public class Symptom { 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.AUTO) 19 | private Long id; 20 | 21 | /** 22 | * Name of the symptom. 23 | */ 24 | private String name; 25 | 26 | /** 27 | * Description of the symptom. 28 | */ 29 | private String description; 30 | } 31 | -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/src/main/java/com/epam/training/microservices/services/state/machine/delivery/action/OnCompleteDeliveryAction.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.services.state.machine.delivery.action; 2 | 3 | import com.epam.training.microservices.services.state.machine.delivery.model.DeliveryEvent; 4 | import com.epam.training.microservices.services.state.machine.delivery.model.DeliveryState; 5 | import org.springframework.statemachine.StateContext; 6 | import org.springframework.statemachine.action.Action; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class OnCompleteDeliveryAction implements Action { 11 | @Override 12 | public void execute(StateContext context) { 13 | System.out.println("Delivery completed"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/src/main/java/com/epam/training/microservices/services/state/machine/delivery/action/OnStartDeliveryAction.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.services.state.machine.delivery.action; 2 | 3 | import com.epam.training.microservices.services.state.machine.delivery.model.DeliveryEvent; 4 | import com.epam.training.microservices.services.state.machine.delivery.model.DeliveryState; 5 | import org.springframework.statemachine.StateContext; 6 | import org.springframework.statemachine.action.Action; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class OnStartDeliveryAction implements Action { 11 | @Override 12 | public void execute(StateContext context) { 13 | System.out.println("Delivery has been started"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/entity/pharmacy/PharmacyEntity.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.entity.pharmacy; 2 | 3 | import com.google.common.collect.Sets; 4 | import java.util.Set; 5 | import jakarta.persistence.*; 6 | 7 | import lombok.Data; 8 | import lombok.EqualsAndHashCode; 9 | 10 | @Data 11 | @Entity 12 | @Table(name = "pharmacies") 13 | @EqualsAndHashCode(exclude = "available") 14 | public class PharmacyEntity { 15 | @Id 16 | @GeneratedValue(strategy = GenerationType.AUTO) 17 | private Long id; 18 | 19 | private String name; 20 | private String address; 21 | 22 | @OneToMany(mappedBy = "pharmacy", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 23 | private Set available = Sets.newHashSet(); 24 | } 25 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/entity/recipie/DoctorEntity.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.entity.recipie; 2 | 3 | import jakarta.persistence.Entity; 4 | import jakarta.persistence.GeneratedValue; 5 | import jakarta.persistence.GenerationType; 6 | import jakarta.persistence.Id; 7 | import jakarta.persistence.Table; 8 | import lombok.Data; 9 | 10 | /** 11 | * An entity to store information about doctors who issue the recipiees. 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "doctors") 16 | public class DoctorEntity { 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.AUTO) 19 | private Long id; 20 | 21 | /** 22 | * Doctor's name. 23 | */ 24 | private String firstName; 25 | private String lastName; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/templates/error/resource-not-found.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |
11 |

Oops! Data not found

12 |

Sorry, we couldn't find the with id:

13 |
14 |

Please provide the correct id

15 |
16 |
17 |
18 | 19 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/java/com/epam/training/miservices/services/drugs/config/RestRepositoryConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs.config; 2 | 3 | import com.epam.training.miservices.services.drugs.model.Drug; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.data.rest.core.config.RepositoryRestConfiguration; 6 | import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer; 7 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 8 | 9 | @Configuration 10 | public class RestRepositoryConfiguration implements RepositoryRestConfigurer { 11 | @Override 12 | public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) { 13 | config.exposeIdsFor( 14 | Drug.class 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/repository/RecipeJpaRepository.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.recipie.DoctorEntity; 4 | import com.epam.training.microservices.monolithic.jpa.entity.recipie.RecipeEntity; 5 | import com.epam.training.microservices.monolithic.jpa.entity.recipie.RecipientEntity; 6 | import java.time.LocalDate; 7 | import java.util.Optional; 8 | import org.springframework.data.jpa.repository.JpaRepository; 9 | 10 | public interface RecipeJpaRepository extends JpaRepository { 11 | Optional findRecipeByDoctorAndRecipientAndIssueDate( 12 | DoctorEntity doctor, 13 | RecipientEntity recipient, 14 | LocalDate issueDate 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/templates/common/single/item_only.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 |
9 |

10 | 11 |
12 |
13 |
14 |
15 | Back 16 | 17 |
18 |
19 |
20 | 21 |

22 | 23 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | com.epam.microservices.microservice 8 | delivery 9 | 0.0.1-SNAPSHOT 10 | 11 | 12 | com.epam.microservices.microservice.delivery 13 | core 14 | 0.0.1-SNAPSHOT 15 | 16 | microservice-delivery-core 17 | 18 | 19 | true 20 | 21 | 22 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-persistence/src/test/java/com/epam/training/service/delivery/repository/DeliveryRepositoryTest.java: -------------------------------------------------------------------------------- 1 | //package com.epam.training.service.delivery.repository; 2 | // 3 | //import org.junit.jupiter.api.Test; 4 | //import org.junit.jupiter.api.extension.ExtendWith; 5 | //import org.springframework.beans.factory.annotation.Autowired; 6 | //import org.springframework.test.context.ContextConfiguration; 7 | //import org.springframework.test.context.junit.jupiter.SpringExtension; 8 | //import static org.junit.jupiter.api.Assertions.*; 9 | // 10 | //@ExtendWith(SpringExtension.class) 11 | //@ContextConfiguration(classes = { 12 | // DeliveryRepositoryImpl.class 13 | //}) 14 | //class DeliveryRepositoryTest { 15 | // @Autowired 16 | // private DeliveryRepository repository; 17 | // 18 | // @Test 19 | // void check_contextStarts() { 20 | // assertNotNull(true); 21 | // } 22 | //} -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/test/java/com/epam/training/microservice/service/recipes/service/drugs/DrugServiceMock.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.drugs; 2 | 3 | import com.epam.training.microservice.service.recipes.model.DrugModel; 4 | import org.springframework.context.annotation.Profile; 5 | import org.springframework.stereotype.Component; 6 | 7 | import java.util.Optional; 8 | 9 | import static org.mockito.Mockito.mock; 10 | 11 | @Component 12 | @Profile("test") 13 | public class DrugServiceMock implements DrugService { 14 | 15 | @Override 16 | public Optional findById(Long id) { 17 | final DrugModel record = mock(); 18 | return Optional.of(record); 19 | } 20 | 21 | @Override 22 | public Optional getDrugIdByName(String drugName) { 23 | return Optional.of((long) drugName.hashCode()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/service/DoctorService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Doctor; 4 | import com.epam.training.microservices.monolithic.repository.DoctorRepository; 5 | import java.util.Optional; 6 | 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.stereotype.Service; 9 | 10 | @Service 11 | @RequiredArgsConstructor 12 | public class DoctorService { 13 | private final DoctorRepository doctorRepository; 14 | 15 | public Optional findByName(String firstName, String lastName) { 16 | return doctorRepository.findDoctorByFirstNameAndLastName(firstName, lastName); 17 | } 18 | 19 | public Doctor save(Doctor doctor) { 20 | return doctorRepository.save(doctor); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/entity/disease/SymptomEntity.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.entity.disease; 2 | 3 | import jakarta.persistence.Entity; 4 | import jakarta.persistence.GeneratedValue; 5 | import jakarta.persistence.GenerationType; 6 | import jakarta.persistence.Id; 7 | import jakarta.persistence.Table; 8 | import lombok.Data; 9 | 10 | /** 11 | * Symptom of the particular disease. 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "symptoms") 16 | public class SymptomEntity { 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.AUTO) 19 | private Long id; 20 | 21 | /** 22 | * Name of the symptom. 23 | */ 24 | private String name; 25 | 26 | /** 27 | * Description of the symptom. 28 | */ 29 | private String description; 30 | } 31 | -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/service/drug/DrugServiceFeignImpl.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.service.drug; 2 | 3 | import com.epam.training.microservice.service.pharmacies.model.DrugModel; 4 | import lombok.RequiredArgsConstructor; 5 | import org.springframework.hateoas.EntityModel; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.util.Optional; 9 | 10 | @Component 11 | @RequiredArgsConstructor 12 | public class DrugServiceFeignImpl implements DrugService { 13 | private final DrugServiceFeignClient feignClient; 14 | 15 | @Override 16 | public Optional getDrugIdByName(String drugName) { 17 | return Optional.ofNullable(feignClient.findDrugByName(drugName)) 18 | .map(EntityModel::getContent) 19 | .map(DrugModel::getId); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/test/java/com/epam/training/microservices/monolithic/web/HomeRedirectControllerTest.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 6 | import org.springframework.test.web.servlet.MockMvc; 7 | 8 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 9 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 10 | 11 | @WebMvcTest(HomeRedirectController.class) 12 | class HomeRedirectControllerTest { 13 | @Autowired 14 | MockMvc mockMvc; 15 | 16 | @Test 17 | void index_redirects() throws Exception { 18 | mockMvc.perform(get("/")) 19 | .andExpect(status().is3xxRedirection()); 20 | } 21 | } -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/drug/DrugService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.drug; 2 | 3 | import com.epam.training.microservices.monolithic.model.drug.Drug; 4 | import com.epam.training.microservices.monolithic.service.CrudService; 5 | import java.util.Optional; 6 | 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.data.jpa.repository.JpaRepository; 9 | import org.springframework.stereotype.Service; 10 | 11 | @Service 12 | @RequiredArgsConstructor 13 | public class DrugService implements CrudService { 14 | private final DrugRepository drugRepository; 15 | 16 | @Override 17 | public JpaRepository getRepository() { 18 | return drugRepository; 19 | } 20 | 21 | public Optional findByName(String name) { 22 | return drugRepository.findDrugByName(name); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /microservices/docker/elk/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | kibana: 5 | image: docker.elastic.co/kibana/kibana:7.5.0 6 | environment: 7 | - XPACK_REPORTING_CSV_MAXSIZEBYTES=1073741824 8 | ports: 9 | - 5601:5601 10 | 11 | elasticsearch: 12 | image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0 13 | environment: 14 | - discovery.type=single-node 15 | ports: 16 | - 9200:9200 17 | volumes: 18 | - elastic_data:/usr/share/elasticsearch/data 19 | 20 | filebeat: 21 | build: 22 | context: ./filebeat 23 | user: root 24 | environment: 25 | - KIBANA_HOST=kibana:5601 26 | - ELASTICSEARCH_HOSTS=["elasticsearch:9200"] 27 | volumes: 28 | - /var/lib/docker/containers:/opt/containers:ro 29 | - /var/lib/docker:/var/lib/docker:ro 30 | - /var/run/docker.sock:/var/run/docker.sock 31 | 32 | volumes: 33 | elastic_data: -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/service/RecipientService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Recipient; 4 | import com.epam.training.microservices.monolithic.repository.RecipientRepository; 5 | import java.util.Optional; 6 | 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.stereotype.Service; 9 | 10 | @Service 11 | @RequiredArgsConstructor 12 | public class RecipientService { 13 | private final RecipientRepository recipientRepository; 14 | 15 | public Optional findByName(String firstName, String lastName) { 16 | return recipientRepository.findRecipientByFirstNameAndLastName(firstName, lastName); 17 | } 18 | 19 | public Recipient save(Recipient recipient) { 20 | return recipientRepository.save(recipient); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/service/DrugService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import com.epam.training.microservices.monolithic.model.drug.Drug; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import com.epam.training.microservices.monolithic.repository.DrugRepository; 6 | import java.util.Optional; 7 | 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Service; 10 | 11 | @Service 12 | @RequiredArgsConstructor 13 | public class DrugService implements CrudService { 14 | private final DrugRepository drugRepository; 15 | 16 | @Override 17 | public CrudRepository getRepository() { 18 | return drugRepository; 19 | } 20 | 21 | public Optional findByName(String name) { 22 | return drugRepository.findDrugByName(name); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/disease/DiseaseService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.disease; 2 | 3 | import com.epam.training.microservices.monolithic.model.disease.Disease; 4 | import com.epam.training.microservices.monolithic.service.CrudService; 5 | import java.util.Optional; 6 | 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.data.jpa.repository.JpaRepository; 9 | import org.springframework.stereotype.Service; 10 | 11 | @Service 12 | @RequiredArgsConstructor 13 | public class DiseaseService implements CrudService { 14 | private final DiseaseRepository diseaseRepository; 15 | 16 | @Override 17 | public JpaRepository getRepository() { 18 | return diseaseRepository; 19 | } 20 | 21 | public Optional findByName(String name) { 22 | return diseaseRepository.findDiseaseByName(name); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/templates/common/single/item_details.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 |
9 |

10 | 11 |
12 |
13 |
14 |
15 |
16 | Back 17 | 18 |
19 |
20 |
21 | 22 |

23 | 24 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/java/com/epam/training/miservices/services/graphql/post/Post.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql.post; 2 | 3 | import jakarta.persistence.Entity; 4 | import jakarta.persistence.GeneratedValue; 5 | import jakarta.persistence.GenerationType; 6 | import jakarta.persistence.Id; 7 | import jakarta.persistence.JoinColumn; 8 | import jakarta.persistence.ManyToOne; 9 | import jakarta.persistence.Table; 10 | import lombok.AllArgsConstructor; 11 | import lombok.Builder; 12 | import lombok.Data; 13 | import lombok.NoArgsConstructor; 14 | 15 | @Data 16 | @Entity 17 | @Builder 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | @Table(name = "POSTS") 21 | public class Post { 22 | @Id 23 | @GeneratedValue(strategy = GenerationType.AUTO) 24 | private Long id; 25 | 26 | @ManyToOne 27 | @JoinColumn(name = "POST_AUTHOR_ID") 28 | private Author author; 29 | 30 | private String title; 31 | private String text; 32 | } 33 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: ${SERVER_PORT:8085} 3 | 4 | spring: 5 | application: 6 | name: recipe-service 7 | profiles: 8 | active: dev,feign-client 9 | datasource: 10 | url: jdbc:h2:mem:microservice-recipes 11 | rabbitmq: 12 | host: ${RABBIT_HOST:localhost} 13 | port: 5672 14 | zipkin: 15 | base-url: ${ZIPKIN_URL:http://localhost:9411} 16 | cloud: 17 | function: 18 | definition: recipeSender 19 | stream: 20 | bindings: 21 | deliveryNotificator-out-0: 22 | destination: recipes 23 | required-groups: main 24 | source: deliveryNotificator 25 | 26 | eureka: 27 | client: 28 | service-url: 29 | defaultZone: ${EUREKA_URL:http://localhost:8081/eureka} 30 | 31 | management: 32 | endpoints: 33 | web: 34 | exposure: 35 | include: '*' 36 | 37 | drug-feign: 38 | type: eureka 39 | drug-service-url: http://localhost:8083/ -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/recipie/Recipe.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.recipie; 2 | 3 | import com.epam.training.microservices.monolithic.model.HasId; 4 | import com.google.common.collect.Sets; 5 | import java.time.LocalDate; 6 | import java.util.Set; 7 | import lombok.Data; 8 | 9 | /** 10 | * A recipe to apply. 11 | */ 12 | @Data 13 | public class Recipe implements HasId { 14 | private Long id; 15 | 16 | /** 17 | * A doctor who issues the recipe. 18 | */ 19 | private Doctor doctor; 20 | 21 | /** 22 | * A recipient of the recipe. 23 | */ 24 | private Recipient recipient; 25 | 26 | /** 27 | * A content of the recipe. 28 | */ 29 | private Set lines = Sets.newHashSet(); 30 | 31 | /** 32 | * Issue date of the recipe. 33 | */ 34 | private LocalDate issueDate; 35 | } 36 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/pharmacy/PharmacyService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.pharmacy; 2 | 3 | import com.epam.training.microservices.monolithic.model.pharmacy.Pharmacy; 4 | import com.epam.training.microservices.monolithic.service.CrudService; 5 | 6 | import java.util.Optional; 7 | 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.data.jpa.repository.JpaRepository; 10 | import org.springframework.stereotype.Service; 11 | 12 | @Service 13 | @RequiredArgsConstructor 14 | public class PharmacyService implements CrudService { 15 | private final PharmacyRepository pharmacyRepository; 16 | 17 | @Override 18 | public JpaRepository getRepository() { 19 | return pharmacyRepository; 20 | } 21 | 22 | public Optional findByName(String name) { 23 | return pharmacyRepository.findPharmacyByName(name); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/crud/all/ViewAllSupport.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.crud.all; 2 | 3 | import com.epam.training.microservices.monolithic.web.crud.CrudSupport; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.servlet.ModelAndView; 6 | 7 | public interface ViewAllSupport extends CrudSupport { 8 | ViewAllTemplateParams getViewAllTemplateParams(); 9 | 10 | @GetMapping("") 11 | default ModelAndView viewAll(ModelAndView modelAndView) { 12 | final ViewAllTemplateParams templateParams = getViewAllTemplateParams(); 13 | 14 | modelAndView.setViewName(templateParams.getViewName()); 15 | modelAndView.addObject("items", getService().findAll()); 16 | modelAndView.addObject("templateParams", templateParams); 17 | modelAndView.addObject("pageTitle", templateParams.getTitle()); 18 | return modelAndView; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/symptom/SymptomService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.symptom; 2 | 3 | import com.epam.training.microservices.monolithic.service.CrudService; 4 | import com.epam.training.microservices.monolithic.model.disease.Symptom; 5 | 6 | import java.util.Optional; 7 | 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.data.jpa.repository.JpaRepository; 10 | import org.springframework.stereotype.Service; 11 | 12 | @Service 13 | @RequiredArgsConstructor 14 | public class SymptomService implements CrudService { 15 | private final SymptomRepository symptomRepository; 16 | 17 | @Override 18 | public JpaRepository getRepository() { 19 | return symptomRepository; 20 | } 21 | 22 | public Optional findByName(String name) { 23 | return symptomRepository.findSymptomByName(name); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/event/ChangeDeliveryLineAmountEvent.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.event; 2 | 3 | import com.epam.training.service.delivery.model.DeliveryAggregate; 4 | import com.epam.training.service.delivery.model.DeliveryLine; 5 | import lombok.Data; 6 | 7 | @Data 8 | public class ChangeDeliveryLineAmountEvent implements DeliveryEvent { 9 | private Long id; 10 | 11 | private Long lineId; 12 | private Long amount; 13 | 14 | public ChangeDeliveryLineAmountEvent(Long lineId, Long amount) { 15 | this.lineId = lineId; 16 | this.amount = amount; 17 | } 18 | 19 | @Override 20 | public void process(DeliveryAggregate aggregate) { 21 | final DeliveryLine deliveryLine = aggregate.getContent() 22 | .stream() 23 | .filter(line -> line.getId() == lineId) 24 | .findFirst() 25 | .get(); 26 | 27 | deliveryLine.setAmount(this.amount); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /microservices/microservice-graphql/src/main/java/com/epam/training/miservices/services/graphql/web/DrugController.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.graphql.web; 2 | 3 | import com.epam.training.miservices.services.graphql.service.DrugModel; 4 | import com.epam.training.miservices.services.graphql.service.DrugServiceFeignClient; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.graphql.data.method.annotation.QueryMapping; 7 | import org.springframework.graphql.data.method.annotation.SchemaMapping; 8 | import org.springframework.stereotype.Controller; 9 | 10 | import java.util.Collection; 11 | 12 | @Controller 13 | @SchemaMapping(typeName = "Drug") 14 | @RequiredArgsConstructor 15 | public class DrugController { 16 | private final DrugServiceFeignClient feignClient; 17 | 18 | @QueryMapping(name = "allDrugs") 19 | public Collection findAll() { 20 | return feignClient.findAll() 21 | .getContent(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/service/DiseaseService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import com.epam.training.microservices.monolithic.model.disease.Disease; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import com.epam.training.microservices.monolithic.repository.DiseaseRepository; 6 | import java.util.Optional; 7 | 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Service; 10 | 11 | @Service 12 | @RequiredArgsConstructor 13 | public class DiseaseService implements CrudService { 14 | private final DiseaseRepository diseaseRepository; 15 | 16 | @Override 17 | public CrudRepository getRepository() { 18 | return diseaseRepository; 19 | } 20 | 21 | public Optional findByName(String name) { 22 | return diseaseRepository.findDiseaseByName(name); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/drug/DrugCreation.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.drug; 2 | 3 | import com.epam.training.microservices.monolithic.model.disease.Disease; 4 | import com.epam.training.microservices.monolithic.model.disease.Symptom; 5 | import com.google.common.collect.Sets; 6 | import java.util.Set; 7 | import lombok.Data; 8 | 9 | /** 10 | * An information about creation of the drug for the particular disease. 11 | */ 12 | @Data 13 | public class DrugCreation { 14 | private Long id; 15 | 16 | /** 17 | * Information about the drug to be created. 18 | */ 19 | private Drug drug; 20 | 21 | /** 22 | * Symptoms to be cured by the drug. 23 | */ 24 | private Set symptoms = Sets.newHashSet(); 25 | 26 | /** 27 | * Diseases to be cured by the drug. 28 | */ 29 | private Set diseases = Sets.newHashSet(); 30 | } 31 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/service/PharmacyService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import com.epam.training.microservices.monolithic.model.pharmacy.Pharmacy; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import com.epam.training.microservices.monolithic.repository.PharmacyRepository; 6 | import java.util.Optional; 7 | 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Service; 10 | 11 | @Service 12 | @RequiredArgsConstructor 13 | public class PharmacyService implements CrudService { 14 | private final PharmacyRepository pharmacyRepository; 15 | 16 | @Override 17 | public CrudRepository getRepository() { 18 | return pharmacyRepository; 19 | } 20 | 21 | public Optional findByName(String name) { 22 | return pharmacyRepository.findPharmacyByName(name); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/service/SymptomService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import com.epam.training.microservices.monolithic.model.disease.Symptom; 4 | import com.epam.training.microservices.monolithic.repository.CrudRepository; 5 | import com.epam.training.microservices.monolithic.repository.SymptomRepository; 6 | import java.util.Optional; 7 | 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Service; 10 | 11 | @Service 12 | @RequiredArgsConstructor 13 | public class SymptomService implements CrudService { 14 | private final SymptomRepository symptomRepository; 15 | 16 | @Override 17 | public CrudRepository getRepository() { 18 | return symptomRepository; 19 | } 20 | 21 | public Optional findByName(String name) { 22 | return symptomRepository.findSymptomByName(name); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/model/OutgoingRecipe.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.model; 2 | 3 | import java.time.LocalDateTime; 4 | import jakarta.persistence.Entity; 5 | import jakarta.persistence.FetchType; 6 | import jakarta.persistence.GeneratedValue; 7 | import jakarta.persistence.GenerationType; 8 | import jakarta.persistence.Id; 9 | import jakarta.persistence.JoinColumn; 10 | import jakarta.persistence.OneToOne; 11 | import jakarta.persistence.Table; 12 | import lombok.Data; 13 | 14 | @Data 15 | @Entity 16 | @Table(name = "outgoing_recipes") 17 | public class OutgoingRecipe { 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.AUTO) 20 | private Long id; 21 | 22 | @JoinColumn(name = "recipe_id") 23 | @OneToOne(fetch = FetchType.EAGER) 24 | private Recipe recipe; 25 | 26 | private LocalDateTime createdDate = LocalDateTime.now(); 27 | private LocalDateTime sendDate; 28 | private boolean sent = false; 29 | } 30 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-core/src/main/java/com/epam/training/service/delivery/event/ChangeFieldEvent.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.event; 2 | 3 | import com.epam.training.service.delivery.model.DeliveryAggregate; 4 | import java.lang.reflect.Field; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | import lombok.SneakyThrows; 9 | 10 | @Data 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class ChangeFieldEvent implements DeliveryEvent { 14 | private String field; 15 | private Object value; 16 | private Long id; 17 | 18 | public ChangeFieldEvent(String field, Object value) { 19 | this.field = field; 20 | this.value = value; 21 | } 22 | 23 | @Override 24 | @SneakyThrows 25 | public void process(DeliveryAggregate aggregate) { 26 | final Field declaredField = aggregate.getClass().getDeclaredField(field); 27 | declaredField.setAccessible(true); 28 | declaredField.set(aggregate, value); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/model/Recipient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.model; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | import lombok.ToString; 6 | 7 | import jakarta.persistence.*; 8 | import java.util.HashSet; 9 | import java.util.Set; 10 | 11 | /** 12 | * 13 | */ 14 | @Data 15 | @Entity 16 | @Table(name = "recipients") 17 | @ToString(exclude = { 18 | "recipes" 19 | }) 20 | @EqualsAndHashCode(exclude = { 21 | "recipes" 22 | }) 23 | public class Recipient { 24 | @Id 25 | @GeneratedValue(strategy = GenerationType.AUTO) 26 | private Long id; 27 | 28 | /** 29 | * Recipient name, etc. 30 | */ 31 | private String firstName; 32 | private String lastName; 33 | 34 | /** 35 | * A collection of recipes associated with this recipient. 36 | */ 37 | @OneToMany(fetch = FetchType.EAGER) 38 | private Set recipes = new HashSet<>(); 39 | } 40 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/repository/DeliveryRepositoryImpl.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.delivery.DeliveryEntity; 4 | import com.epam.training.microservices.monolithic.jpa.repository.DeliveryJpaRepository; 5 | import com.epam.training.microservices.monolithic.model.delivery.Delivery; 6 | import com.epam.training.microservices.monolithic.transformer.DeliveryTransformer; 7 | import lombok.Getter; 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Component; 10 | 11 | @Component 12 | @RequiredArgsConstructor 13 | public class DeliveryRepositoryImpl extends BasicCrudRepository 14 | implements DeliveryRepository { 15 | 16 | @Getter 17 | private final DeliveryJpaRepository jpaRepository; 18 | 19 | @Getter 20 | private final DeliveryTransformer transformer; 21 | } 22 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/RecipesServiceApplication.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes; 2 | 3 | import com.epam.training.microservice.service.recipes.service.drugs.DrugFeignConfig; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 7 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 8 | import org.springframework.cloud.openfeign.EnableFeignClients; 9 | import org.springframework.scheduling.annotation.EnableScheduling; 10 | 11 | @EnableScheduling 12 | @EnableFeignClients 13 | @SpringBootApplication 14 | @EnableDiscoveryClient 15 | @EnableConfigurationProperties(DrugFeignConfig.class) 16 | public class RecipesServiceApplication { 17 | public static void main(String[] args) { 18 | SpringApplication.run(RecipesServiceApplication.class, args); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /microservices/microservice-delivery/delivery-persistence/src/main/java/com/epam/training/service/delivery/jpa/EventEntity.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.service.delivery.jpa; 2 | 3 | import jakarta.persistence.Column; 4 | import jakarta.persistence.Entity; 5 | import jakarta.persistence.GeneratedValue; 6 | import jakarta.persistence.GenerationType; 7 | import jakarta.persistence.Id; 8 | import jakarta.persistence.Table; 9 | import jakarta.persistence.Version; 10 | import jakarta.validation.constraints.Size; 11 | import lombok.Data; 12 | 13 | @Data 14 | @Entity 15 | @Table(name = "delivery_events") 16 | public class EventEntity { 17 | @Id 18 | @Column(name = "EVENT_ID") 19 | @GeneratedValue(strategy = GenerationType.AUTO) 20 | private Long id; 21 | 22 | @Column(name = "EVENT_TYPE") 23 | private String eventType; 24 | 25 | @Size(max = Integer.MAX_VALUE) 26 | @Column(name = "EVENT_CONTENT") 27 | private String eventContent; 28 | 29 | @Column(name = "EVENT_ENTITY_ID") 30 | private Long entityId; 31 | 32 | @Version 33 | private Long version; 34 | } 35 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/model/pharmacy/PharmacyAvailable.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.pharmacy; 2 | 3 | import com.epam.training.microservices.monolithic.model.drug.Drug; 4 | import jakarta.persistence.Entity; 5 | import jakarta.persistence.FetchType; 6 | import jakarta.persistence.GeneratedValue; 7 | import jakarta.persistence.GenerationType; 8 | import jakarta.persistence.Id; 9 | import jakarta.persistence.JoinColumn; 10 | import jakarta.persistence.ManyToOne; 11 | import jakarta.persistence.Table; 12 | import lombok.Data; 13 | 14 | @Data 15 | @Entity 16 | @Table(name = "pharmacy_available") 17 | public class PharmacyAvailable { 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.AUTO) 20 | private Long id; 21 | 22 | @JoinColumn(name = "pharmacy_id") 23 | @ManyToOne(fetch = FetchType.EAGER) 24 | private Pharmacy pharmacy; 25 | 26 | @JoinColumn(name = "drug_id") 27 | @ManyToOne(fetch = FetchType.EAGER) 28 | private Drug drug; 29 | 30 | private Long amount; 31 | } 32 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/model/pharmacy/Pharmacy.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.pharmacy; 2 | 3 | import com.google.common.collect.Sets; 4 | import java.util.Set; 5 | import jakarta.persistence.CascadeType; 6 | import jakarta.persistence.Entity; 7 | import jakarta.persistence.GeneratedValue; 8 | import jakarta.persistence.GenerationType; 9 | import jakarta.persistence.Id; 10 | import jakarta.persistence.OneToMany; 11 | import jakarta.persistence.Table; 12 | import lombok.Data; 13 | import lombok.EqualsAndHashCode; 14 | import lombok.ToString; 15 | 16 | @Data 17 | @Entity 18 | @Table(name = "pharmacies") 19 | @ToString(exclude = "available") 20 | @EqualsAndHashCode(exclude = "available") 21 | public class Pharmacy { 22 | @Id 23 | @GeneratedValue(strategy = GenerationType.AUTO) 24 | private Long id; 25 | 26 | private String name; 27 | private String address; 28 | 29 | @OneToMany(mappedBy = "pharmacy", cascade = CascadeType.ALL) 30 | private Set available = Sets.newHashSet(); 31 | } 32 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/exception/handler/MonolithicControllerExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.exception.handler; 2 | 3 | import com.epam.training.microservices.monolithic.exception.ResourceNotFoundException; 4 | import jakarta.servlet.http.HttpServletRequest; 5 | import org.springframework.web.bind.annotation.ControllerAdvice; 6 | import org.springframework.web.bind.annotation.ExceptionHandler; 7 | import org.springframework.web.servlet.ModelAndView; 8 | 9 | @ControllerAdvice 10 | class MonolithicControllerExceptionHandler { 11 | @ExceptionHandler(ResourceNotFoundException.class) 12 | public ModelAndView resourceNotFoundExceptionHandler(HttpServletRequest req, ResourceNotFoundException e) { 13 | ModelAndView modelAndView = new ModelAndView(); 14 | modelAndView.addObject("resourceName", e.getResourceName()); 15 | modelAndView.addObject("resourceId", e.getResourceId()); 16 | modelAndView.setViewName("error/resource-not-found"); 17 | return modelAndView; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/service/doctor/RecipeService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service.doctor; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Doctor; 4 | import com.epam.training.microservices.monolithic.model.recipie.Recipe; 5 | import com.epam.training.microservices.monolithic.model.recipie.Recipient; 6 | import java.time.LocalDate; 7 | import java.util.Optional; 8 | 9 | import lombok.RequiredArgsConstructor; 10 | import org.springframework.stereotype.Service; 11 | 12 | @Service 13 | @RequiredArgsConstructor 14 | public class RecipeService { 15 | private final RecipeRepository recipeRepository; 16 | 17 | public Recipe save(Recipe recipe) { 18 | return recipeRepository.save(recipe); 19 | } 20 | 21 | public Optional find(Doctor doctor, 22 | Recipient recipient, 23 | LocalDate issueDate) { 24 | 25 | return recipeRepository 26 | .findRecipeByDoctorAndRecipientAndIssueDate(doctor, recipient, issueDate); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/java/com/epam/training/miservices/services/drugs/model/Disease.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs.model; 2 | 3 | import com.google.common.collect.Sets; 4 | import lombok.Data; 5 | 6 | import jakarta.persistence.*; 7 | import java.util.Set; 8 | 9 | /** 10 | * Diseases. 11 | */ 12 | @Data 13 | @Entity 14 | @Table(name = "diseases") 15 | public class Disease { 16 | @Id 17 | @GeneratedValue(strategy = GenerationType.AUTO) 18 | private Long id; 19 | 20 | /** 21 | * Name of the disease. 22 | */ 23 | private String name; 24 | 25 | /** 26 | * Description of the disease. 27 | */ 28 | private String description; 29 | 30 | /** 31 | * A collection of symptoms related to the disease. 32 | */ 33 | @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 34 | @JoinTable( 35 | name = "disease_symptoms", 36 | joinColumns = @JoinColumn(name = "disease_id"), 37 | inverseJoinColumns = @JoinColumn(name = "symptom_id") 38 | ) 39 | private Set symptoms = Sets.newHashSet(); 40 | } 41 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/test/java/com/epam/training/microservices/monolithic/web/HomeRedirectControllerIT.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web; 2 | 3 | import org.junit.jupiter.api.DisplayName; 4 | import org.junit.jupiter.api.Test; 5 | import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; 6 | 7 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 8 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; 9 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 10 | 11 | /** 12 | * Test {@link HomeRedirectController} 13 | */ 14 | public class HomeRedirectControllerIT extends MockMvcTest { 15 | 16 | @Test 17 | @DisplayName("Test root path redirect to /drugs") 18 | public void shouldRedirectToDrugsFromRoot() throws Exception { 19 | MockHttpServletRequestBuilder request = get("/"); 20 | this.mockMvc.perform(request) 21 | .andExpect(status().is3xxRedirection()) 22 | .andExpect(redirectedUrl("/drugs")); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /microservices/docker/elk/filebeat/elasticsearch.yml: -------------------------------------------------------------------------------- 1 | # Module: elasticsearch 2 | # Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-elasticsearch.html 3 | 4 | - module: elasticsearch 5 | # Server log 6 | server: 7 | enabled: true 8 | 9 | # Set custom paths for the log files. If left empty, 10 | # Filebeat will choose the paths depending on your OS. 11 | #var.paths: 12 | 13 | gc: 14 | enabled: true 15 | # Set custom paths for the log files. If left empty, 16 | # Filebeat will choose the paths depending on your OS. 17 | #var.paths: 18 | 19 | audit: 20 | enabled: true 21 | # Set custom paths for the log files. If left empty, 22 | # Filebeat will choose the paths depending on your OS. 23 | #var.paths: 24 | 25 | slowlog: 26 | enabled: true 27 | # Set custom paths for the log files. If left empty, 28 | # Filebeat will choose the paths depending on your OS. 29 | #var.paths: 30 | 31 | deprecation: 32 | enabled: true 33 | # Set custom paths for the log files. If left empty, 34 | # Filebeat will choose the paths depending on your OS. 35 | #var.paths: -------------------------------------------------------------------------------- /microservices/microservice-drugs/src/main/java/com/epam/training/miservices/services/drugs/controller/ApiV1Controller.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.miservices.services.drugs.controller; 2 | 3 | import jakarta.annotation.PostConstruct; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | import java.util.UUID; 9 | 10 | @RestController 11 | @RequestMapping("/v1/info") 12 | public class ApiV1Controller { 13 | private String serviceId; 14 | 15 | /** 16 | * /orders <- POST 17 | * /orders/1 <- GET 18 | * /orders/1/cancel <- GET 19 | * /orders/1/items <- POST/PUT/PATCH 20 | * /orders/1/items/1/cancel <- GET 21 | * 22 | * /API <- POST 23 | * 24 | * /orders <- ?projection=id,title,name,description 25 | * /orders/1/items <- ?projection=order.id,item.title 26 | */ 27 | 28 | @PostConstruct 29 | public void init() { 30 | serviceId = UUID.randomUUID().toString(); 31 | } 32 | 33 | @GetMapping 34 | public String getServiceId() { 35 | return serviceId; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/test-data/pharmacy.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Twimm", 4 | "address": "33012 Weeping Birch Street", 5 | "drugs": [ 6 | { 7 | "drugName": "Acetylcholinesterase inhibitors", 8 | "amount": 20 9 | }, 10 | { 11 | "drugName": "NMDA receptor antagonists", 12 | "amount": 15 13 | }, 14 | { 15 | "drugName": "Aducanumab", 16 | "amount": 10 17 | } 18 | ], 19 | "orders": [ 20 | { 21 | "address": "1 Cherokee Hill", 22 | "status": "IN_QUEUE", 23 | "content": [ 24 | { 25 | "drug": "Acetylcholinesterase inhibitors", 26 | "amount": 3 27 | } 28 | ] 29 | }, 30 | { 31 | "address": "4545 Derek Junction", 32 | "status": "COMPLETED", 33 | "content": [ 34 | { 35 | "drug": "NMDA receptor antagonists", 36 | "amount": 3 37 | }, 38 | { 39 | "drug": "Aducanumab", 40 | "amount": 5 41 | } 42 | ] 43 | } 44 | ] 45 | } 46 | ] -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/entity/pharmacy/PharmacyAvailableEntity.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.entity.pharmacy; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.drug.DrugEntity; 4 | import jakarta.persistence.Entity; 5 | import jakarta.persistence.FetchType; 6 | import jakarta.persistence.GeneratedValue; 7 | import jakarta.persistence.GenerationType; 8 | import jakarta.persistence.Id; 9 | import jakarta.persistence.JoinColumn; 10 | import jakarta.persistence.ManyToOne; 11 | import jakarta.persistence.Table; 12 | import lombok.Data; 13 | 14 | @Data 15 | @Entity 16 | @Table(name = "pharmacy_available") 17 | public class PharmacyAvailableEntity { 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.AUTO) 20 | private Long id; 21 | 22 | @JoinColumn(name = "pharmacy_id") 23 | @ManyToOne(fetch = FetchType.EAGER) 24 | private PharmacyEntity pharmacy; 25 | 26 | @JoinColumn(name = "drug_id") 27 | @ManyToOne(fetch = FetchType.EAGER) 28 | private DrugEntity drug; 29 | 30 | private Long amount; 31 | } 32 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/jpa/entity/recipie/RecipientEntity.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.jpa.entity.recipie; 2 | 3 | import com.google.common.collect.Sets; 4 | import java.util.Set; 5 | import jakarta.persistence.Entity; 6 | import jakarta.persistence.FetchType; 7 | import jakarta.persistence.GeneratedValue; 8 | import jakarta.persistence.GenerationType; 9 | import jakarta.persistence.Id; 10 | import jakarta.persistence.OneToMany; 11 | import jakarta.persistence.Table; 12 | import lombok.Data; 13 | 14 | /** 15 | * 16 | */ 17 | @Data 18 | @Entity 19 | @Table(name = "recipients") 20 | public class RecipientEntity { 21 | @Id 22 | @GeneratedValue(strategy = GenerationType.AUTO) 23 | private Long id; 24 | 25 | /** 26 | * Recipient name, etc. 27 | */ 28 | private String firstName; 29 | private String lastName; 30 | 31 | /** 32 | * A collection of recipes associated with this recipient. 33 | */ 34 | @OneToMany(fetch = FetchType.LAZY) 35 | private Set recipes = Sets.newHashSet(); 36 | } 37 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/model/Recipe.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.model; 2 | 3 | import lombok.Data; 4 | 5 | import jakarta.persistence.*; 6 | import java.time.LocalDate; 7 | import java.util.HashSet; 8 | import java.util.Set; 9 | 10 | /** 11 | * A recipie to apply. 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "recipes") 16 | public class Recipe { 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.AUTO) 19 | private Long id; 20 | 21 | /** 22 | * A doctor who issues the recipie. 23 | */ 24 | @ManyToOne(fetch = FetchType.EAGER) 25 | private Doctor doctor; 26 | 27 | /** 28 | * A recipient of the recipie. 29 | */ 30 | @ManyToOne(fetch = FetchType.EAGER) 31 | private Recipient recipient; 32 | 33 | /** 34 | * A content of the recipie. 35 | */ 36 | @OneToMany(fetch = FetchType.EAGER, mappedBy = "recipe", cascade = CascadeType.ALL) 37 | private Set lines = new HashSet<>(); 38 | 39 | /** 40 | * Issue date of the recipe. 41 | */ 42 | private LocalDate issueDate; 43 | } 44 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/src/main/resources/test-data/pharmacy.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Twimm", 4 | "address": "33012 Weeping Birch Street", 5 | "drugs": [ 6 | { 7 | "drugName": "Acetylcholinesterase inhibitors", 8 | "amount": 20 9 | }, 10 | { 11 | "drugName": "NMDA receptor antagonists", 12 | "amount": 15 13 | }, 14 | { 15 | "drugName": "Aducanumab", 16 | "amount": 10 17 | } 18 | ], 19 | "orders": [ 20 | { 21 | "address": "1 Cherokee Hill", 22 | "status": "IN_QUEUE", 23 | "content": [ 24 | { 25 | "drug": "Acetylcholinesterase inhibitors", 26 | "amount": 3 27 | } 28 | ] 29 | }, 30 | { 31 | "address": "4545 Derek Junction", 32 | "status": "COMPLETED", 33 | "content": [ 34 | { 35 | "drug": "NMDA receptor antagonists", 36 | "amount": 3 37 | }, 38 | { 39 | "drug": "Aducanumab", 40 | "amount": 5 41 | } 42 | ] 43 | } 44 | ] 45 | } 46 | ] -------------------------------------------------------------------------------- /microservices/microservice-saga-state-machine/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | com.epam.microservices 8 | microservices 9 | 0.0.1-SNAPSHOT 10 | 11 | 12 | com.epam.microservices.microservice.saga 13 | state-machine 14 | 0.0.1-SNAPSHOT 15 | 16 | microservice-saga-state-machine 17 | 18 | 19 | 20 | org.springframework.boot 21 | spring-boot-starter-web 22 | 23 | 24 | org.springframework.statemachine 25 | spring-statemachine-starter 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/model/recipie/Recipient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.recipie; 2 | 3 | import com.google.common.collect.Sets; 4 | import java.util.Set; 5 | import jakarta.persistence.Entity; 6 | import jakarta.persistence.FetchType; 7 | import jakarta.persistence.GeneratedValue; 8 | import jakarta.persistence.GenerationType; 9 | import jakarta.persistence.Id; 10 | import jakarta.persistence.OneToMany; 11 | import jakarta.persistence.Table; 12 | import lombok.Data; 13 | import lombok.ToString; 14 | 15 | /** 16 | * A recipient of the recipie. 17 | */ 18 | @Data 19 | @Entity 20 | @ToString(exclude = "recipes") 21 | @Table(name = "recipients") 22 | public class Recipient { 23 | @Id 24 | @GeneratedValue(strategy = GenerationType.AUTO) 25 | private Long id; 26 | 27 | /** 28 | * Recipient name, etc. 29 | */ 30 | private String firstName; 31 | private String lastName; 32 | 33 | /** 34 | * A collection of recipes associated with this recipient. 35 | */ 36 | @OneToMany(fetch = FetchType.LAZY) 37 | private Set recipes = Sets.newHashSet(); 38 | } 39 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/templates/common/index.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 |
9 |

10 | 11 |
12 | 13 | 14 | 17 | 18 | 19 | 20 | 27 | 28 | 29 |
16 |
22 | 23 | 24 | 26 |
30 |
31 |

32 | 33 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/model/RecipeLine.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.ToString; 7 | 8 | import jakarta.persistence.*; 9 | 10 | /** 11 | * One line of the recipie. 12 | */ 13 | @Data 14 | @Entity 15 | @EqualsAndHashCode(exclude = { 16 | "recipe" 17 | }) 18 | @ToString(exclude = { 19 | "recipe" 20 | }) 21 | @JsonIgnoreProperties({ 22 | "recipe" 23 | }) 24 | @Table(name = "recipe_lines") 25 | public class RecipeLine { 26 | @Id 27 | @GeneratedValue(strategy = GenerationType.AUTO) 28 | private Long id; 29 | 30 | @JoinColumn(name = "recipe_id") 31 | @ManyToOne(fetch = FetchType.EAGER) 32 | private Recipe recipe; 33 | 34 | /** 35 | * A drug to apply. 36 | */ 37 | private Long drugId; 38 | 39 | /** 40 | * Amount of drug to apply. 41 | */ 42 | private Long amount; 43 | 44 | /** 45 | * What exactly to be done. 46 | */ 47 | private String instruction; 48 | } 49 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/java/com/epam/training/microservice/service/recipes/service/drugs/DrugServiceWithFeignClient.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.recipes.service.drugs; 2 | 3 | import com.epam.training.microservice.service.recipes.model.DrugModel; 4 | import java.util.Optional; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.context.annotation.Profile; 7 | import org.springframework.hateoas.EntityModel; 8 | import org.springframework.stereotype.Component; 9 | 10 | /** 11 | * @author Aleksandr Barmin 12 | */ 13 | @Component 14 | @Profile("feign-client") 15 | @RequiredArgsConstructor 16 | public class DrugServiceWithFeignClient implements DrugService { 17 | private final DrugFeignClient feignClient; 18 | 19 | @Override 20 | public Optional getDrugIdByName(String drugName) { 21 | return Optional.ofNullable(feignClient.findDrugByName(drugName)) 22 | .map(EntityModel::getContent) 23 | .map(DrugModel::getId); 24 | } 25 | 26 | @Override 27 | public Optional findById(Long id) { 28 | return Optional.ofNullable(feignClient.findById(id)) 29 | .map(EntityModel::getContent); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/repository/DrugRepositoryImpl.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.drug.DrugEntity; 4 | import com.epam.training.microservices.monolithic.jpa.repository.DrugJpaRepository; 5 | import com.epam.training.microservices.monolithic.model.drug.Drug; 6 | import com.epam.training.microservices.monolithic.transformer.DrugTransformer; 7 | import lombok.Getter; 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Component; 10 | 11 | import java.util.Optional; 12 | 13 | @Component 14 | @RequiredArgsConstructor 15 | public class DrugRepositoryImpl 16 | extends BasicCrudRepository 17 | implements DrugRepository { 18 | 19 | @Getter 20 | private final DrugJpaRepository jpaRepository; 21 | 22 | @Getter 23 | private final DrugTransformer transformer; 24 | 25 | @Override 26 | public Optional findDrugByName(String name) { 27 | return jpaRepository.findDrugByName(name) 28 | .map(transformer::toModel); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/model/delivery/DeliveryLine.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.delivery; 2 | 3 | import com.epam.training.microservices.monolithic.model.drug.Drug; 4 | import jakarta.persistence.Entity; 5 | import jakarta.persistence.FetchType; 6 | import jakarta.persistence.GeneratedValue; 7 | import jakarta.persistence.GenerationType; 8 | import jakarta.persistence.Id; 9 | import jakarta.persistence.JoinColumn; 10 | import jakarta.persistence.ManyToOne; 11 | import jakarta.persistence.Table; 12 | import lombok.Data; 13 | 14 | @Data 15 | @Entity 16 | @Table(name = "delivery_line") 17 | public class DeliveryLine { 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.AUTO) 20 | private Long id; 21 | 22 | @JoinColumn(name = "delivery_id") 23 | @ManyToOne(fetch = FetchType.EAGER) 24 | private Delivery delivery; 25 | 26 | /** 27 | * A drug to deliver. 28 | */ 29 | @JoinColumn(name = "drug_id") 30 | @ManyToOne(fetch = FetchType.EAGER) 31 | private Drug drug; 32 | 33 | /** 34 | * Amount of drug to deliver. 35 | */ 36 | private Long amount; 37 | } 38 | -------------------------------------------------------------------------------- /microservices/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | com.epam.microservices 8 | training 9 | 0.0.1-SNAPSHOT 10 | 11 | 12 | com.epam.microservices 13 | microservices 14 | 0.0.1-SNAPSHOT 15 | 16 | pom 17 | 18 | 19 | microservice-delivery 20 | microservice-drugs 21 | microservice-gateway 22 | microservice-graphql 23 | microservice-pharmacies 24 | microservice-recipes 25 | microservice-service-discovery 26 | microservice-saga-state-machine 27 | microservice-zuul 28 | 29 | 30 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/service/RecipeService.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.service; 2 | 3 | import com.epam.training.microservices.monolithic.model.recipie.Doctor; 4 | import com.epam.training.microservices.monolithic.model.recipie.Recipe; 5 | import com.epam.training.microservices.monolithic.model.recipie.Recipient; 6 | import com.epam.training.microservices.monolithic.repository.RecipeRepository; 7 | import java.time.LocalDate; 8 | import java.util.Optional; 9 | 10 | import lombok.RequiredArgsConstructor; 11 | import org.springframework.stereotype.Service; 12 | 13 | @Service 14 | @RequiredArgsConstructor 15 | public class RecipeService { 16 | private final RecipeRepository recipeRepository; 17 | 18 | public Recipe save(Recipe recipe) { 19 | return recipeRepository.save(recipe); 20 | } 21 | 22 | public Optional find(Doctor doctor, 23 | Recipient recipient, 24 | LocalDate issueDate) { 25 | 26 | return recipeRepository 27 | .findRecipeByDoctorAndRecipientAndIssueDate(doctor, recipient, issueDate); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /microservices/docker-compose/platform-service-discovery/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2.4' 2 | 3 | services: 4 | microservice-drugs: 5 | image: microservices/drugs:latest 6 | healthcheck: 7 | test: [ "CMD", "curl", "-f", "http://localhost:8080/actuator/health" ] 8 | interval: 5s 9 | timeout: 10s 10 | retries: 5 11 | environment: 12 | - SERVER_PORT=8080 13 | - EUREKA_CLIENT_ENABLED=false 14 | ports: 15 | - 8083:8080 16 | networks: 17 | - microservices_network 18 | 19 | microservice-recipes: 20 | image: microservices/recipes:latest 21 | healthcheck: 22 | test: [ "CMD", "curl", "-f", "http://localhost:8080/actuator/health" ] 23 | interval: 5s 24 | timeout: 10s 25 | retries: 5 26 | environment: 27 | - SERVER_PORT=8080 28 | - EUREKA_CLIENT_ENABLED=false 29 | - DRUG_FEIGN_TYPE=direct 30 | - DRUG_FEIGN_DRUG_SERVICE_URL=http://microservice-drugs:8080/ 31 | depends_on: 32 | microservice-drugs: 33 | condition: service_healthy 34 | ports: 35 | - 8085:8080 36 | networks: 37 | - microservices_network 38 | 39 | networks: 40 | microservices_network: 41 | name: microservices_network -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-core/src/main/java/com/epam/training/microservices/monolithic/model/delivery/Delivery.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.model.delivery; 2 | 3 | import com.epam.training.microservices.monolithic.model.HasId; 4 | import com.epam.training.microservices.monolithic.model.pharmacy.Pharmacy; 5 | import com.google.common.collect.Sets; 6 | import java.util.Set; 7 | import lombok.Data; 8 | import lombok.EqualsAndHashCode; 9 | 10 | /** 11 | * Stores information about the delivery. 12 | */ 13 | @Data 14 | @EqualsAndHashCode(exclude = { 15 | "pharmacy", 16 | "content" 17 | }) 18 | public class Delivery implements HasId { 19 | private Long id; 20 | 21 | /** 22 | * Address of the com.epam.training.service.delivery. 23 | */ 24 | private String addressLine; 25 | 26 | /** 27 | * Status of the com.epam.training.service.delivery. 28 | */ 29 | private DeliveryStatus status; 30 | 31 | /** 32 | * Where from. 33 | */ 34 | private Pharmacy pharmacy; 35 | 36 | /** 37 | * Content of the com.epam.training.service.delivery. 38 | */ 39 | private Set content = Sets.newHashSet(); 40 | } 41 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-loader/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | com.epam.microservices.monolithic 8 | monolithic-hexagonal 9 | 0.0.1-SNAPSHOT 10 | 11 | 12 | monolithic-hexagonal-loader 13 | 0.0.1-SNAPSHOT 14 | 15 | 16 | true 17 | 18 | 19 | 20 | 21 | com.epam.microservices.monolithic 22 | monolithic-hexagonal-core 23 | 24 | 25 | com.fasterxml.jackson.core 26 | jackson-databind 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-web/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | com.epam.microservices.monolithic 8 | monolithic-hexagonal 9 | 0.0.1-SNAPSHOT 10 | 11 | 12 | monolithic-hexagonal-web 13 | 0.0.1-SNAPSHOT 14 | 15 | 16 | true 17 | 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-web 23 | 24 | 25 | com.epam.microservices.monolithic 26 | monolithic-hexagonal-core 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/java/com/epam/training/microservices/monolithic/web/MonolithicErrorController.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web; 2 | 3 | import jakarta.servlet.RequestDispatcher; 4 | import jakarta.servlet.http.HttpServletRequest; 5 | import org.springframework.boot.web.servlet.error.ErrorController; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.stereotype.Controller; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | 10 | @Controller 11 | public class MonolithicErrorController implements ErrorController { 12 | 13 | @RequestMapping("/error") 14 | public String handleError(HttpServletRequest request) { 15 | Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); 16 | 17 | if (status != null) { 18 | Integer statusCode = Integer.valueOf(status.toString()); 19 | 20 | if (statusCode == HttpStatus.NOT_FOUND.value()) { 21 | return "error/error-404"; 22 | } else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) { 23 | return "error/error-500"; 24 | } 25 | } 26 | return "error/error"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-web/src/main/java/com/epam/training/microservices/monolithic/web/rest/DiseaseController.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.rest; 2 | 3 | import com.epam.training.microservices.monolithic.service.DiseaseService; 4 | import com.epam.training.microservices.monolithic.web.model.DiseaseModel; 5 | import com.epam.training.microservices.monolithic.web.transformer.DiseaseModelTransformer; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.web.bind.annotation.GetMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | import java.util.Collection; 12 | import java.util.stream.Collectors; 13 | 14 | @RestController 15 | @RequiredArgsConstructor 16 | @RequestMapping("/diseases") 17 | public class DiseaseController { 18 | private final DiseaseService diseaseService; 19 | private final DiseaseModelTransformer transformer; 20 | 21 | @GetMapping("/") 22 | public Collection findAll() { 23 | return diseaseService.findAll() 24 | .stream() 25 | .map(transformer::toModel) 26 | .collect(Collectors.toList()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | 7 | com.epam.microservices.monolithic 8 | monolithic-hexagonal 9 | 0.0.1-SNAPSHOT 10 | 11 | 12 | monolithic-hexagonal-persistence 13 | 0.0.1-SNAPSHOT 14 | 15 | 16 | true 17 | 18 | 19 | 20 | 21 | com.epam.microservices.monolithic 22 | monolithic-hexagonal-core 23 | 24 | 25 | org.springframework.boot 26 | spring-boot-starter-data-jpa 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/repository/DiseaseRepositoryImpl.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.disease.DiseaseEntity; 4 | import com.epam.training.microservices.monolithic.jpa.repository.DiseaseJpaRepository; 5 | import com.epam.training.microservices.monolithic.model.disease.Disease; 6 | import com.epam.training.microservices.monolithic.transformer.DiseaseTransformer; 7 | import lombok.Getter; 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Component; 10 | 11 | import java.util.Optional; 12 | 13 | @Component 14 | @RequiredArgsConstructor 15 | public class DiseaseRepositoryImpl 16 | extends BasicCrudRepository 17 | implements DiseaseRepository { 18 | 19 | @Getter 20 | private final DiseaseJpaRepository jpaRepository; 21 | 22 | @Getter 23 | private final DiseaseTransformer transformer; 24 | 25 | @Override 26 | public Optional findDiseaseByName(String name) { 27 | return jpaRepository.findDiseaseByName(name) 28 | .map(transformer::toModel); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/repository/SymptomRepositoryImpl.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.disease.SymptomEntity; 4 | import com.epam.training.microservices.monolithic.jpa.repository.SymptomJpaRepository; 5 | import com.epam.training.microservices.monolithic.model.disease.Symptom; 6 | import com.epam.training.microservices.monolithic.transformer.SymptomTransformer; 7 | import lombok.Getter; 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Component; 10 | 11 | import java.util.Optional; 12 | 13 | @Component 14 | @RequiredArgsConstructor 15 | public class SymptomRepositoryImpl 16 | extends BasicCrudRepository 17 | implements SymptomRepository { 18 | 19 | @Getter 20 | private final SymptomJpaRepository jpaRepository; 21 | 22 | @Getter 23 | private final SymptomTransformer transformer; 24 | 25 | @Override 26 | public Optional findSymptomByName(String name) { 27 | return jpaRepository.findSymptomByName(name) 28 | .map(transformer::toModel); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-web/src/main/java/com/epam/training/microservices/monolithic/web/rest/DeliveryController.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.web.rest; 2 | 3 | import com.epam.training.microservices.monolithic.service.DeliveryService; 4 | import com.epam.training.microservices.monolithic.web.model.DeliveryModel; 5 | import com.epam.training.microservices.monolithic.web.transformer.DeliveryModelTransformer; 6 | import java.util.Collection; 7 | import java.util.stream.Collectors; 8 | 9 | import lombok.RequiredArgsConstructor; 10 | import org.springframework.web.bind.annotation.GetMapping; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | @RestController 15 | @RequiredArgsConstructor 16 | @RequestMapping("/delivery") 17 | public class DeliveryController { 18 | private final DeliveryService deliveryService; 19 | private final DeliveryModelTransformer transformer; 20 | 21 | @GetMapping("/") 22 | public Collection findAll() { 23 | return deliveryService.findAll() 24 | .stream() 25 | .map(transformer::toModel) 26 | .collect(Collectors.toList()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /monolithic/monolithic-layered/src/main/resources/test-data/doctor-and-recipies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "doctor": { 4 | "firstName": "Julieta", 5 | "lastName": "Lamont" 6 | }, 7 | "recipes": [ 8 | { 9 | "issueDate": "2021-01-20", 10 | "recipient": { 11 | "firstName": "Sayer", 12 | "lastName": "Tomaselli" 13 | }, 14 | "content": [ 15 | { 16 | "drug": "Acetylcholinesterase inhibitors", 17 | "amount": 37, 18 | "instruction": "Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh." 19 | }, 20 | { 21 | "drug": "NMDA receptor antagonists", 22 | "amount": 12, 23 | "instruction": "Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat." 24 | }, 25 | { 26 | "drug": "Aducanumab", 27 | "amount": 3, 28 | "instruction": "Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;" 29 | } 30 | ] 31 | } 32 | ] 33 | } 34 | ] -------------------------------------------------------------------------------- /microservices/microservice-pharmacies/src/main/java/com/epam/training/microservice/service/pharmacies/service/drug/DrugServiceTraversonImpl.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservice.service.pharmacies.service.drug; 2 | 3 | import com.epam.training.microservice.service.pharmacies.model.DrugModel; 4 | import org.springframework.context.annotation.Profile; 5 | import org.springframework.hateoas.MediaTypes; 6 | import org.springframework.hateoas.client.Traverson; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.net.URI; 10 | import java.util.Map; 11 | import java.util.Optional; 12 | 13 | @Component 14 | @Profile("drug-service-traverson") 15 | public class DrugServiceTraversonImpl implements DrugService { 16 | @Override 17 | public Optional getDrugIdByName(String drugName) { 18 | final Traverson traverson = new Traverson(URI.create("http://localhost:8082/"), MediaTypes.HAL_JSON); 19 | 20 | final DrugModel record = traverson 21 | .follow("drugs", "search", "findDrugByName") 22 | .withTemplateParameters(Map.of("name", drugName)) 23 | .toObject(DrugModel.class); 24 | 25 | return Optional.ofNullable(record) 26 | .map(DrugModel::getId); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /microservices/microservice-recipes/src/main/resources/test-data/doctor-and-recipies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "doctor": { 4 | "firstName": "Julieta", 5 | "lastName": "Lamont" 6 | }, 7 | "recipes": [ 8 | { 9 | "issueDate": "2021-01-20", 10 | "recipient": { 11 | "firstName": "Sayer", 12 | "lastName": "Tomaselli" 13 | }, 14 | "content": [ 15 | { 16 | "drug": "Acetylcholinesterase inhibitors", 17 | "amount": 37, 18 | "instruction": "Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh." 19 | }, 20 | { 21 | "drug": "NMDA receptor antagonists", 22 | "amount": 12, 23 | "instruction": "Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat." 24 | }, 25 | { 26 | "drug": "Aducanumab", 27 | "amount": 3, 28 | "instruction": "Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;" 29 | } 30 | ] 31 | } 32 | ] 33 | } 34 | ] -------------------------------------------------------------------------------- /monolithic/monolithic-hexagonal/monolithic-hexagonal-persistence/src/main/java/com/epam/training/microservices/monolithic/repository/PharmacyRepositoryImpl.java: -------------------------------------------------------------------------------- 1 | package com.epam.training.microservices.monolithic.repository; 2 | 3 | import com.epam.training.microservices.monolithic.jpa.entity.pharmacy.PharmacyEntity; 4 | import com.epam.training.microservices.monolithic.jpa.repository.PharmacyJpaRepository; 5 | import com.epam.training.microservices.monolithic.model.pharmacy.Pharmacy; 6 | import com.epam.training.microservices.monolithic.transformer.PharmacyTransformer; 7 | import lombok.Getter; 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Component; 10 | 11 | import java.util.Optional; 12 | 13 | @Component 14 | @RequiredArgsConstructor 15 | public class PharmacyRepositoryImpl 16 | extends BasicCrudRepository 17 | implements PharmacyRepository { 18 | 19 | @Getter 20 | private final PharmacyJpaRepository jpaRepository; 21 | 22 | @Getter 23 | private final PharmacyTransformer transformer; 24 | 25 | @Override 26 | public Optional findPharmacyByName(String name) { 27 | return jpaRepository.findPharmacyByName(name) 28 | .map(transformer::toModel); 29 | } 30 | } 31 | --------------------------------------------------------------------------------