diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/api/StudioDataAggregationService.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/api/StudioDataAggregationService.java new file mode 100644 index 0000000..bc810e7 --- /dev/null +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/api/StudioDataAggregationService.java @@ -0,0 +1,29 @@ +package com.gamedoora.backend.proxy.aggregation.api; + +import com.gamedoora.backend.proxy.aggregation.assembler.StudioDataAggregatorAssembler; +import com.gamedoora.model.dto.GdUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(value = "/aggregate/studios") +public class StudioDataAggregationService { + private StudioDataAggregatorAssembler studioDataAggregatorAssembler; + + @RequestMapping(value = "/users", produces = MediaType.APPLICATION_JSON_VALUE) + public GdUser getStudiosByUser(@RequestParam("email") String email){ + return getStudioDataAggregatorAssembler().getStudiosByUser(email); + } + + public StudioDataAggregatorAssembler getStudioDataAggregatorAssembler() { + return studioDataAggregatorAssembler; + } + + @Autowired + public void setStudioDataAggregatorAssembler(StudioDataAggregatorAssembler studioDataAggregatorAssembler) { + this.studioDataAggregatorAssembler = studioDataAggregatorAssembler; + } +} diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/api/UserDataAggregationService.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/api/UserDataAggregationService.java index 7c28c1a..c7637a6 100644 --- a/src/main/java/com/gamedoora/backend/proxy/aggregation/api/UserDataAggregationService.java +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/api/UserDataAggregationService.java @@ -4,6 +4,7 @@ import com.gamedoora.model.dto.GdUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -17,6 +18,21 @@ public class UserDataAggregationService { public GdUser getUserProfileByEmail(@RequestParam("emailId") String email){ return getAggregatorAssembler().getUserByEmail(email); } + + @PostMapping(value = "/roles", + produces = MediaType.APPLICATION_JSON_VALUE, + consumes = MediaType.APPLICATION_JSON_VALUE) + public void getUserProfileByRoles(@RequestParam("user") GdUser user){ + getAggregatorAssembler().addRoles(user); + } + + @PostMapping(value = "/skills", + produces = MediaType.APPLICATION_JSON_VALUE, + consumes = MediaType.APPLICATION_JSON_VALUE) + public void getUserProfileBySkills(@RequestParam("user") GdUser user){ + getAggregatorAssembler().addSkills(user); + } + public UserDataAggregatorAssembler getAggregatorAssembler() { return aggregatorAssembler; } diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/assembler/StudioDataAggregatorAssembler.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/assembler/StudioDataAggregatorAssembler.java new file mode 100644 index 0000000..c8affe7 --- /dev/null +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/assembler/StudioDataAggregatorAssembler.java @@ -0,0 +1,35 @@ +package com.gamedoora.backend.proxy.aggregation.assembler; + +import com.gamedoora.backend.proxy.aggregation.routes.StudioProfileRoute; +import com.gamedoora.model.dto.GdUser; +import com.gamedoora.model.dto.StudiosDTO; +import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +public class StudioDataAggregatorAssembler { + private ProducerTemplate producerTemplate; + + @Autowired + private CamelContext camelContext; + private StudioProfileRoute studioProfileRoute; + + public GdUser getStudiosByUser(String email){ + List studioDTOList = getProducerTemplate().requestBody("direct:studioUserQuery" , email, ArrayList.class); + return GdUser + .builder() + .studios(studioDTOList) + .build(); + } + + public ProducerTemplate getProducerTemplate() { + return producerTemplate; + } + + public void setProducerTemplate(ProducerTemplate producerTemplate) { + this.producerTemplate = producerTemplate; + } +} diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/assembler/UserDataAggregatorAssembler.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/assembler/UserDataAggregatorAssembler.java index 5a39930..2b9d73f 100644 --- a/src/main/java/com/gamedoora/backend/proxy/aggregation/assembler/UserDataAggregatorAssembler.java +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/assembler/UserDataAggregatorAssembler.java @@ -1,5 +1,6 @@ package com.gamedoora.backend.proxy.aggregation.assembler; +import com.gamedoora.backend.proxy.aggregation.exceptions.ClientResponseException; import com.gamedoora.backend.proxy.aggregation.routes.UserProfileRoute; import com.gamedoora.model.dto.GdUser; import com.gamedoora.model.dto.RoleDTO; @@ -7,9 +8,7 @@ import com.gamedoora.model.dto.UserDTO; import lombok.extern.slf4j.Slf4j; import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; import org.apache.camel.ProducerTemplate; -import org.apache.camel.support.DefaultExchange; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -37,6 +36,24 @@ public GdUser getUserByEmail(String email){ .build(); } + public void addRoles(GdUser user) throws ClientResponseException{ + List roleDTOList = user.getRoles(); + if(roleDTOList.isEmpty() || user.getUser().getEmail().isEmpty()){ + throw new ClientResponseException("No Roles found", 400); + } + + getProducerTemplate().requestBody("direct:addUserRoleQuery", roleDTOList, ArrayList.class); + } + + public void addSkills(GdUser user)throws ClientResponseException{ + List skillsDTOList = user.getSkills(); + if(skillsDTOList.isEmpty() || user.getUser().getEmail().isEmpty()){ + throw new ClientResponseException("No Roles found", 400); + } + + getProducerTemplate().requestBody("direct:addUserSkillQuery", skillsDTOList, ArrayList.class); + } + public ProducerTemplate getProducerTemplate() { return producerTemplate; } diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/config/CamelConfig.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/config/CamelConfig.java deleted file mode 100644 index 62e7578..0000000 --- a/src/main/java/com/gamedoora/backend/proxy/aggregation/config/CamelConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gamedoora.backend.proxy.aggregation.config; - -import org.apache.camel.CamelContext; -import org.apache.camel.spring.SpringCamelContext; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class CamelConfig { - @Autowired - private ApplicationContext applicationContext; - -// @Bean -// public CamelContext camelContext() { -// return new SpringCamelContext(applicationContext); -// } - } diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/config/FeignClientConfig.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/config/FeignClientConfig.java deleted file mode 100644 index d491c23..0000000 --- a/src/main/java/com/gamedoora/backend/proxy/aggregation/config/FeignClientConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gamedoora.backend.proxy.aggregation.config; - -import com.gamedoora.backend.proxy.aggregation.exceptions.FeignCustomErrorDecoder; -import feign.Logger; -import feign.Retryer; -import feign.codec.ErrorDecoder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class FeignClientConfig { - @Bean - Logger.Level loggerLevel(){ - return Logger.Level.FULL; - } - @Bean - public ErrorDecoder errorDecoder(){ - return new FeignCustomErrorDecoder(); - } -// @Bean -// public Retryer retryer() { -// return new Retryer.Default(100, 2000, 3); -// } -} diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/apis/StudioServicesApi.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/apis/StudioServicesApi.java new file mode 100644 index 0000000..72fdad1 --- /dev/null +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/apis/StudioServicesApi.java @@ -0,0 +1,21 @@ +package com.gamedoora.backend.proxy.aggregation.enrichment.apis; + +import com.gamedoora.model.dto.StudiosDTO; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +@RefreshScope +@FeignClient(value = "studiosClient", url = "{services.studios.url}") +public interface StudioServicesApi { + + @GetMapping( + value = "/users/{email}", + produces = {MediaType.APPLICATION_JSON_VALUE}) + ResponseEntity > getStudiosByUser(@PathVariable String email); +} diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/apis/UserServicesApi.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/apis/UserServicesApi.java index 8d80f76..7dc4827 100644 --- a/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/apis/UserServicesApi.java +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/apis/UserServicesApi.java @@ -49,11 +49,22 @@ ResponseEntity updateUsers( @GetMapping( value = "/roles/{name}", produces = {MediaType.APPLICATION_JSON_VALUE}) - ResponseEntity> getAllUsersByRoles(@PathVariable String name)//confirm mapping - ; + ResponseEntity> getAllUsersByRoles(@PathVariable String name);//confirm mapping @GetMapping( value = "/email", produces = {MediaType.APPLICATION_JSON_VALUE}) ResponseEntity getUserByEmail(@RequestParam(required = true) String email); + + @PostMapping( + value = "/roles", + consumes = {MediaType.APPLICATION_JSON_VALUE}, + produces = {MediaType.APPLICATION_JSON_VALUE}) + ResponseEntity addRoles(@RequestBody UserDTO usersDto); // email part will be in userDto + + @PostMapping( + value = "/skills", + consumes = {MediaType.APPLICATION_JSON_VALUE}, + produces = {MediaType.APPLICATION_JSON_VALUE}) + ResponseEntity addSkills(@RequestBody UserDTO usersDto); } diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/RetriableStudiosServicesClient.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/RetriableStudiosServicesClient.java new file mode 100644 index 0000000..8ecd791 --- /dev/null +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/RetriableStudiosServicesClient.java @@ -0,0 +1,38 @@ +package com.gamedoora.backend.proxy.aggregation.enrichment.clients; + +import com.gamedoora.model.dto.StudiosDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.retry.support.RetryTemplate; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class RetriableStudiosServicesClient { + + private StudioServicesClient studioServicesClient; + + private RetryTemplate retryTemplate; + + public List getStudiosForUserByEmail(String email){ + return getRetryTemplate().execute(retryContext -> getStudioServicesClient().getStudiosByUser(email)); + } + + public StudioServicesClient getStudioServicesClient() { + return studioServicesClient; + } + + @Autowired + public void setStudioServicesClient(StudioServicesClient studioServicesClient) { + this.studioServicesClient = studioServicesClient; + } + + public RetryTemplate getRetryTemplate() { + return retryTemplate; + } + + @Autowired + public void setRetryTemplate(RetryTemplate retryTemplate) { + this.retryTemplate = retryTemplate; + } +} diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/RetriableUsersServicesClient.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/RetriableUsersServicesClient.java index 6a2ae10..b806d0b 100644 --- a/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/RetriableUsersServicesClient.java +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/RetriableUsersServicesClient.java @@ -1,13 +1,10 @@ package com.gamedoora.backend.proxy.aggregation.enrichment.clients; -import com.gamedoora.model.dto.SkillsDTO; import com.gamedoora.model.dto.UserDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.retry.support.RetryTemplate; import org.springframework.stereotype.Component; -import java.util.List; - @Component public class RetriableUsersServicesClient { private UserServicesClient userServicesClient; @@ -18,6 +15,13 @@ public UserDTO getRolesForUserByEmail(String email){ }); } + public void addRolesForUser(UserDTO userDTO){ + getRetryTemplate().execute(retryContext -> getUserServicesClient().addRoleToUser(userDTO)); + } + + public void addSkillsForUser(UserDTO userDTO){ + getRetryTemplate().execute(retryContext -> getUserServicesClient().addSkillToUser(userDTO)); + } public RetryTemplate getRetryTemplate() { return retryTemplate; diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/StudioServicesClient.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/StudioServicesClient.java new file mode 100644 index 0000000..b7b52ba --- /dev/null +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/StudioServicesClient.java @@ -0,0 +1,27 @@ +package com.gamedoora.backend.proxy.aggregation.enrichment.clients; + +import com.gamedoora.backend.proxy.aggregation.enrichment.apis.StudioServicesApi; +import com.gamedoora.model.dto.StudiosDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class StudioServicesClient { + + private StudioServicesApi studioServicesApi; + + public StudioServicesApi getStudioServicesApi() { + return studioServicesApi; + } + + @Autowired + public void setStudioServicesApi(StudioServicesApi studioServicesApi) { + this.studioServicesApi = studioServicesApi; + } + + public List getStudiosByUser(String email) { + return getStudioServicesApi().getStudiosByUser(email).getBody(); + } +} diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/UserServicesClient.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/UserServicesClient.java index 3bb7673..c46ff11 100644 --- a/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/UserServicesClient.java +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/enrichment/clients/UserServicesClient.java @@ -22,4 +22,8 @@ public void setUserServicesApi(UserServicesApi userServicesApi) { UserDTO getUserByEmail(@NonNull String email){ return getUserServicesApi().getUserByEmail(email).getBody(); } + + UserDTO addRoleToUser(UserDTO userDTO){return getUserServicesApi().addRoles(userDTO).getBody();} + + UserDTO addSkillToUser(UserDTO userDTO){return getUserServicesApi().addSkills(userDTO).getBody();} } diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/routes/StudioProfileRoute.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/routes/StudioProfileRoute.java new file mode 100644 index 0000000..8ff535a --- /dev/null +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/routes/StudioProfileRoute.java @@ -0,0 +1,24 @@ +package com.gamedoora.backend.proxy.aggregation.routes; + +import com.gamedoora.backend.proxy.aggregation.enrichment.clients.RetriableStudiosServicesClient; +import feign.FeignException; +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +@Component +public class StudioProfileRoute extends RouteBuilder { + + private RetriableStudiosServicesClient studiosServicesClient; + + @Override + public void configure() throws Exception{ + onException(FeignException.class) + .maximumRedeliveries(3) + .logStackTrace(true) + .handled(false); + + from("direct:studioQuery") + .to("bean:retriableStudiosServicesClient?method=getStudioForUserByEmail") + .end(); + } +} diff --git a/src/main/java/com/gamedoora/backend/proxy/aggregation/routes/UserProfileRoute.java b/src/main/java/com/gamedoora/backend/proxy/aggregation/routes/UserProfileRoute.java index 0e9b871..7ff4a8e 100644 --- a/src/main/java/com/gamedoora/backend/proxy/aggregation/routes/UserProfileRoute.java +++ b/src/main/java/com/gamedoora/backend/proxy/aggregation/routes/UserProfileRoute.java @@ -3,11 +3,8 @@ import com.gamedoora.backend.proxy.aggregation.enrichment.clients.RetriableRolesServicesClient; import com.gamedoora.backend.proxy.aggregation.enrichment.clients.RetriableSkillsServicesClient; import com.gamedoora.backend.proxy.aggregation.enrichment.clients.RetriableUsersServicesClient; -import com.gamedoora.backend.proxy.aggregation.exceptions.ClientResponseException; import feign.FeignException; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy; -import org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy; import org.springframework.stereotype.Component; @Component @@ -32,6 +29,12 @@ public void configure() throws Exception { from("direct:userSkillsQuery") .to("bean:retriableSkillsServicesClient?method=getSkillsForUserByEmail") .end(); + from("direct:addUserRoleQuery") + .to("bean:retriableUsersServicesClient?method=addRolesForUser") + .end(); + from("direct:addUserSkillQuery") + .to("bean:retriableUsersServicesClient?method=addSkillsForUser") + .end(); }