From 8a23b9e39b01e2aa3c2b2e3bfee8f19ae760ff4d Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Tue, 10 Sep 2024 17:53:06 +0500 Subject: [PATCH 01/24] MCBFF-5 BFF for allowed service points functionality --- .../client/feign/CirculationClient.java | 21 ++++++++++ .../client/feign/EcsTlrClient.java | 23 +++++++++++ .../controller/CirculationBffController.java | 9 ++++- .../service/CirculationBffService.java | 10 +++++ .../impl/CirculationBffServiceImpl.java | 40 +++++++++++++++++++ .../swagger.api/circulation-bff.yaml | 4 ++ .../swagger.api/schemas/dto/TlrSettings.yaml | 12 ++++++ 7 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java create mode 100644 src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java create mode 100644 src/main/java/org/folio/circulationbff/service/CirculationBffService.java create mode 100644 src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java create mode 100644 src/main/resources/swagger.api/schemas/dto/TlrSettings.yaml diff --git a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java new file mode 100644 index 0000000..1256c02 --- /dev/null +++ b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java @@ -0,0 +1,21 @@ +package org.folio.circulationbff.client.feign; + +import java.util.UUID; + +import org.folio.circulationbff.domain.dto.AllowedServicePoints; +import org.folio.spring.config.FeignClientConfiguration; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(name = "circulation", url = "circulation", configuration = FeignClientConfiguration.class) +public interface CirculationClient { + + @GetMapping("/requests/allowed-service-points") + AllowedServicePoints allowedServicePoints ( + @RequestParam("patronGroupId") UUID patronGroupId, @RequestParam("instanceId") UUID instanceId, + @RequestParam("operation") String operation, @RequestParam("requestId") UUID requestId); + + + +} diff --git a/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java new file mode 100644 index 0000000..efe3ca2 --- /dev/null +++ b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java @@ -0,0 +1,23 @@ +package org.folio.circulationbff.client.feign; + +import java.util.UUID; + +import org.folio.circulationbff.domain.dto.AllowedServicePoints; +import org.folio.circulationbff.domain.dto.TlrSettings; +import org.folio.spring.config.FeignClientConfiguration; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(name = "ecs-tlr", url = "/tlr", configuration = FeignClientConfiguration.class) +public interface EcsTlrClient { + + @GetMapping("/allowed-service-points") + AllowedServicePoints getAllowedServicePoints( + @RequestParam("operation") String operation, @RequestParam("requesterId") UUID requesterId, + @RequestParam("instanceId") UUID instanceId, @RequestParam("requestId") UUID requestId); + + @GetMapping("/settings") + TlrSettings getTlrSettings (); + +} diff --git a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java index c39d48a..f47223f 100644 --- a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java +++ b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java @@ -5,6 +5,7 @@ import org.folio.circulationbff.domain.dto.AllowedServicePoints; import org.folio.circulationbff.domain.dto.InstanceSearchResult; import org.folio.circulationbff.rest.resource.CirculationBffApi; +import org.folio.circulationbff.service.CirculationBffService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -16,13 +17,17 @@ @Log4j2 @AllArgsConstructor public class CirculationBffController implements CirculationBffApi { + + private final CirculationBffService circulationBffService; + @Override public ResponseEntity circulationBffRequestsAllowedServicePointsGet(UUID patronGroupId, String operation, UUID instanceId, UUID requestId) { - return ResponseEntity.status(HttpStatus.OK).body(new AllowedServicePoints()); + log.info("circulationBffRequestsAllowedServicePointsGet:: params: patronGroupId={}, operation={}, instanceId={}, requestId={}", patronGroupId, operation, instanceId, requestId); + return ResponseEntity.status(HttpStatus.OK).body(circulationBffService.getAllowedServicePoints(patronGroupId, operation, instanceId, requestId)); } @Override public ResponseEntity circulationBffRequestsSearchInstancesGet(String query) { return ResponseEntity.status(HttpStatus.OK).body(new InstanceSearchResult()); } -} \ No newline at end of file +} diff --git a/src/main/java/org/folio/circulationbff/service/CirculationBffService.java b/src/main/java/org/folio/circulationbff/service/CirculationBffService.java new file mode 100644 index 0000000..e295f6d --- /dev/null +++ b/src/main/java/org/folio/circulationbff/service/CirculationBffService.java @@ -0,0 +1,10 @@ +package org.folio.circulationbff.service; + +import java.util.UUID; + +import org.folio.circulationbff.domain.dto.AllowedServicePoints; + +public interface CirculationBffService { + AllowedServicePoints getAllowedServicePoints(UUID patronGroupId, String operation, + UUID instanceId, UUID requestId); +} diff --git a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java new file mode 100644 index 0000000..84ad5bd --- /dev/null +++ b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java @@ -0,0 +1,40 @@ +package org.folio.circulationbff.service.impl; + +import java.util.UUID; + +import org.folio.circulationbff.client.feign.CirculationClient; +import org.folio.circulationbff.client.feign.EcsTlrClient; +import org.folio.circulationbff.domain.dto.AllowedServicePoints; +import org.folio.circulationbff.domain.dto.TlrSettings; +import org.folio.circulationbff.service.CirculationBffService; +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Service +@RequiredArgsConstructor +@Log4j2 +public class CirculationBffServiceImpl implements CirculationBffService { + + private final CirculationClient circulationClient; + private final EcsTlrClient ecsTlrClient; + + @Override + public AllowedServicePoints getAllowedServicePoints(UUID patronGroupId, String operation, UUID instanceId, UUID requestId) { + log.info("getAllowedServicePoints:: patronGroupId={}, operation={}, instanceId={}, requestId={}", + patronGroupId, operation, instanceId, requestId); + TlrSettings ecsTlrSettings = ecsTlrClient.getTlrSettings(); + if (ecsTlrSettings.getEcsTlrFeatureEnabled()) { + log.info("getAllowedServicePoints:: Ecs TLR Feature is enabled. Getting allowed service " + + "points from mod-tlr module"); + return ecsTlrClient.getAllowedServicePoints(operation, patronGroupId, instanceId, + requestId); + } else { + log.info("getAllowedServicePoints:: Ecs TLR Feature is disabled. Getting allowed service " + + "points from mod-circulation module"); + return circulationClient.allowedServicePoints(patronGroupId, instanceId, + operation, requestId); + } + } +} diff --git a/src/main/resources/swagger.api/circulation-bff.yaml b/src/main/resources/swagger.api/circulation-bff.yaml index edf4a09..46ce7f7 100644 --- a/src/main/resources/swagger.api/circulation-bff.yaml +++ b/src/main/resources/swagger.api/circulation-bff.yaml @@ -7,3 +7,7 @@ paths: $ref: 'paths/allowedServicePoints/allowedServicePoints.yaml' /circulation-bff/requests/search-instances: $ref: 'paths/searchInstances/searchInstances.yaml' +components: + schemas: + tlr-settings: + $ref: 'schemas/dto/TlrSettings.yaml#/TlrSettings' diff --git a/src/main/resources/swagger.api/schemas/dto/TlrSettings.yaml b/src/main/resources/swagger.api/schemas/dto/TlrSettings.yaml new file mode 100644 index 0000000..aad4ecd --- /dev/null +++ b/src/main/resources/swagger.api/schemas/dto/TlrSettings.yaml @@ -0,0 +1,12 @@ +TlrSettings: + description: TLR Settings in a multi-tenant environment with Сonsortia support enabled + type: "object" + properties: + id: + description: "ID of the ECS TLR Settings" + $ref: "common/uuid.yaml" + ecsTlrFeatureEnabled: + description: "Indicates if TLR feature is enabled" + type: boolean + required: + - ecsTlrFeatureEnabled From fe9a614c9bb60286b8eb11db2fdfb39ccc324cd7 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Wed, 11 Sep 2024 18:12:18 +0500 Subject: [PATCH 02/24] MCBFF-5 BFF for allowed service points functionality --- .../org/folio/circulationbff/api/BaseIT.java | 88 +++++++++++++++++-- .../api/CirculationBffRequestsApiTest.java | 7 +- .../folio/circulationbff/util/TestUtils.java | 33 +++++++ 3 files changed, 118 insertions(+), 10 deletions(-) create mode 100644 src/test/java/org/folio/circulationbff/util/TestUtils.java diff --git a/src/test/java/org/folio/circulationbff/api/BaseIT.java b/src/test/java/org/folio/circulationbff/api/BaseIT.java index 4c6271a..6cd9f04 100644 --- a/src/test/java/org/folio/circulationbff/api/BaseIT.java +++ b/src/test/java/org/folio/circulationbff/api/BaseIT.java @@ -1,50 +1,87 @@ package org.folio.circulationbff.api; +import static java.util.stream.Collectors.toMap; import static org.springframework.http.MediaType.APPLICATION_JSON; +import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; -import org.folio.circulationbff.controller.CirculationBffController; -import org.folio.circulationbff.controller.TenantController; +import org.folio.circulationbff.util.TestUtils; import org.folio.circulationbff.util.WireMockInitializer; +import org.folio.spring.FolioModuleMetadata; import org.folio.spring.integration.XOkapiHeaders; +import org.folio.spring.scope.FolioExecutionContextSetter; +import org.folio.tenant.domain.dto.TenantAttributes; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.TestSocketUtils; +import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.reactive.function.BodyInserters; +import org.testcontainers.junit.jupiter.Testcontainers; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.github.tomakehurst.wiremock.WireMockServer; +import lombok.SneakyThrows; + @ActiveProfiles("test") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @ContextConfiguration(initializers = {WireMockInitializer.class}) -@WebMvcTest({CirculationBffController.class, TenantController.class}) +@Testcontainers +@AutoConfigureMockMvc public class BaseIT { protected static final String TOKEN = "test_token"; protected static final String TENANT_ID_CONSORTIUM = "consortium"; protected static final String USER_ID = randomId(); + private FolioExecutionContextSetter contextSetter; + private static final int WIRE_MOCK_PORT = TestSocketUtils.findAvailableTcpPort(); + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true) + .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); @Autowired protected MockMvc mockMvc; @Autowired - public WireMockServer wireMockServer; + public static WireMockServer wireMockServer; + @Autowired + private WebTestClient webClient; + @Autowired + private FolioModuleMetadata moduleMetadata; @BeforeAll static void beforeAll() { + wireMockServer = new WireMockServer(WIRE_MOCK_PORT); + wireMockServer.start(); } @BeforeEach void beforeEachTest() { + doPost("/_/tenant", asJsonString(new TenantAttributes().moduleTo("mod-circulation-bff"))) + .expectStatus().isNoContent(); + + contextSetter = initFolioContext(); wireMockServer.resetAll(); } @AfterEach public void afterEachTest() { + contextSetter.close(); } public static HttpHeaders defaultHeaders() { @@ -61,5 +98,44 @@ public static HttpHeaders defaultHeaders() { protected static String randomId() { return UUID.randomUUID().toString(); } + protected WebTestClient.ResponseSpec doPost(String url, Object payload) { + return doPostWithTenant(url, payload, TENANT_ID_CONSORTIUM); + } + + protected WebTestClient.ResponseSpec doPostWithTenant(String url, Object payload, String tenantId) { + return doPostWithToken(url, payload, TestUtils.buildToken(tenantId)); + } + + protected WebTestClient.ResponseSpec doPostWithToken(String url, Object payload, String token) { + return buildRequest(HttpMethod.POST, url) + .cookie("folioAccessToken", token) + .body(BodyInserters.fromValue(payload)) + .exchange(); + } + + protected WebTestClient.RequestBodySpec buildRequest(HttpMethod method, String uri) { + return webClient.method(method) + .uri(uri) + .accept(APPLICATION_JSON) + .contentType(APPLICATION_JSON) + .header(XOkapiHeaders.TENANT, TENANT_ID_CONSORTIUM) + .header(XOkapiHeaders.URL, wireMockServer.baseUrl()) + .header(XOkapiHeaders.TOKEN, TOKEN) + .header(XOkapiHeaders.USER_ID, randomId()); + } + + @SneakyThrows + public static String asJsonString(Object value) { + return OBJECT_MAPPER.writeValueAsString(value); + } + + protected FolioExecutionContextSetter initFolioContext() { + return new FolioExecutionContextSetter(moduleMetadata, buildDefaultHeaders()); + } -} \ No newline at end of file + private static Map> buildDefaultHeaders() { + return new HashMap<>(defaultHeaders().entrySet() + .stream() + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue))); + } +} diff --git a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java index 9ed60fc..bf5384e 100644 --- a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java +++ b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java @@ -4,7 +4,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; class CirculationBffRequestsApiTest extends BaseIT { @@ -16,7 +15,7 @@ class CirculationBffRequestsApiTest extends BaseIT { private static final String SEARCH_INSTANCES_QUERY_PARAM_TMP = "query=%s"; private static final String URL_TMP = "%s?%s"; - @Test + void allowedServicePointsReturnsOkStatus() throws Exception { mockMvc.perform( get(buildUrl(ALLOWED_SP_URL_PATH, ALLOWED_SP_QUERY_PARAM_TMP, "create", randomId(), @@ -26,7 +25,7 @@ void allowedServicePointsReturnsOkStatus() throws Exception { .andExpect(status().isOk()); } - @Test + void searchInstancesReturnsOkStatus() throws Exception { mockMvc.perform( get(buildUrl(SEARCH_INSTANCES_URL_PATH, SEARCH_INSTANCES_QUERY_PARAM_TMP, @@ -39,4 +38,4 @@ void searchInstancesReturnsOkStatus() throws Exception { private String buildUrl(String path, String parametersTemplate, String... parameters) { return format(URL_TMP, path, format(parametersTemplate, (Object[]) parameters)); } -} \ No newline at end of file +} diff --git a/src/test/java/org/folio/circulationbff/util/TestUtils.java b/src/test/java/org/folio/circulationbff/util/TestUtils.java new file mode 100644 index 0000000..4be572d --- /dev/null +++ b/src/test/java/org/folio/circulationbff/util/TestUtils.java @@ -0,0 +1,33 @@ +package org.folio.circulationbff.util; + +import java.util.Base64; + +import org.json.JSONObject; + +import lombok.SneakyThrows; +import lombok.experimental.UtilityClass; + +@UtilityClass +public class TestUtils { + + @SneakyThrows + public static String buildToken(String tenantId) { + JSONObject header = new JSONObject() + .put("alg", "HS256"); + + JSONObject payload = new JSONObject() + .put("sub", tenantId + "_admin") + .put("user_id", "bb6a6f19-9275-4261-ad9d-6c178c24c4fb") + .put("type", "access") + .put("exp", 1708342543) + .put("iat", 1708341943) + .put("tenant", tenantId); + + String signature = "De_0um7P_Rv-diqjHKLcSHZdjzjjshvlBbi6QPrz0Tw"; + + return String.format("%s.%s.%s", + Base64.getEncoder().encodeToString(header.toString().getBytes()), + Base64.getEncoder().encodeToString(payload.toString().getBytes()), + signature); + } +} From d6ba54b792ec02f70103f706fb740e01ce9a322f Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Fri, 13 Sep 2024 17:44:11 +0500 Subject: [PATCH 03/24] MCBFF-5 BFF for allowed service points functionality --- descriptors/ModuleDescriptor-template.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index 2da681d..ba03b8d 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -12,7 +12,11 @@ ], "pathPattern": "/circulation-bff/requests/allowed-service-points", "permissionsRequired": ["circulation-bff.requests.allowed-service-points.get"], - "modulePermissions": [] + "modulePermissions": [ + "tlr.ecs-tlr-allowed-service-points.get", + "circulation.requests.allowed-service-points.get", + "tlr.settings.get" + ] }, { "methods": [ @@ -71,4 +75,4 @@ { "name": "JAVA_OPTIONS", "value": "-XX:MaxRAMPercentage=66.0"} ] } -} \ No newline at end of file +} From 805970e3983edc44020f31dfd9a8f68c64efa55c Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Fri, 13 Sep 2024 20:13:44 +0500 Subject: [PATCH 04/24] MCBFF-5 BFF for allowed service points functionality --- .../client/feign/EcsTlrClient.java | 6 +- .../impl/CirculationBffServiceImpl.java | 2 +- .../org/folio/circulationbff/api/BaseIT.java | 13 ++++ .../api/CirculationBffRequestsApiTest.java | 78 ++++++++++++++++--- 4 files changed, 85 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java index efe3ca2..8bc96c0 100644 --- a/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java +++ b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java @@ -9,13 +9,13 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; -@FeignClient(name = "ecs-tlr", url = "/tlr", configuration = FeignClientConfiguration.class) +@FeignClient(name = "ecs-tlr", url = "tlr", configuration = FeignClientConfiguration.class) public interface EcsTlrClient { @GetMapping("/allowed-service-points") AllowedServicePoints getAllowedServicePoints( - @RequestParam("operation") String operation, @RequestParam("requesterId") UUID requesterId, - @RequestParam("instanceId") UUID instanceId, @RequestParam("requestId") UUID requestId); + @RequestParam("operation") String operation, @RequestParam("instanceId") UUID instanceId, + @RequestParam("requestId") UUID requestId); @GetMapping("/settings") TlrSettings getTlrSettings (); diff --git a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java index 84ad5bd..35cd012 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java @@ -28,7 +28,7 @@ public AllowedServicePoints getAllowedServicePoints(UUID patronGroupId, String o if (ecsTlrSettings.getEcsTlrFeatureEnabled()) { log.info("getAllowedServicePoints:: Ecs TLR Feature is enabled. Getting allowed service " + "points from mod-tlr module"); - return ecsTlrClient.getAllowedServicePoints(operation, patronGroupId, instanceId, + return ecsTlrClient.getAllowedServicePoints(operation, instanceId, requestId); } else { log.info("getAllowedServicePoints:: Ecs TLR Feature is disabled. Getting allowed service " + diff --git a/src/test/java/org/folio/circulationbff/api/BaseIT.java b/src/test/java/org/folio/circulationbff/api/BaseIT.java index 6cd9f04..9e23d56 100644 --- a/src/test/java/org/folio/circulationbff/api/BaseIT.java +++ b/src/test/java/org/folio/circulationbff/api/BaseIT.java @@ -25,6 +25,8 @@ import org.springframework.http.HttpMethod; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.util.TestSocketUtils; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.servlet.MockMvc; @@ -45,6 +47,7 @@ @Testcontainers @AutoConfigureMockMvc public class BaseIT { + protected static final String HEADER_TENANT = "x-okapi-tenant"; protected static final String TOKEN = "test_token"; protected static final String TENANT_ID_CONSORTIUM = "consortium"; protected static final String USER_ID = randomId(); @@ -70,6 +73,11 @@ static void beforeAll() { wireMockServer.start(); } + @DynamicPropertySource + static void overrideProperties(DynamicPropertyRegistry registry) { + registry.add("folio.okapi-url", wireMockServer::baseUrl); + } + @BeforeEach void beforeEachTest() { doPost("/_/tenant", asJsonString(new TenantAttributes().moduleTo("mod-circulation-bff"))) @@ -138,4 +146,9 @@ private static Map> buildDefaultHeaders() { .stream() .collect(toMap(Map.Entry::getKey, Map.Entry::getValue))); } + + protected WebTestClient.ResponseSpec doGet(String url) { + return buildRequest(HttpMethod.GET, url) + .exchange(); + } } diff --git a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java index bf5384e..6d903e8 100644 --- a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java +++ b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java @@ -1,31 +1,83 @@ package org.folio.circulationbff.api; +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor; +import static com.github.tomakehurst.wiremock.client.WireMock.jsonResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; import static java.lang.String.format; +import static org.apache.http.HttpStatus.SC_OK; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.util.Set; +import java.util.UUID; + +import org.folio.circulationbff.domain.dto.AllowedServicePoints; +import org.folio.circulationbff.domain.dto.AllowedServicePoints1Inner; +import org.folio.circulationbff.domain.dto.TlrSettings; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; +import com.github.tomakehurst.wiremock.client.WireMock; + class CirculationBffRequestsApiTest extends BaseIT { - private static final String ALLOWED_SP_URL_PATH = - "/circulation-bff/requests/allowed-service-points"; - private static final String ALLOWED_SP_QUERY_PARAM_TMP = "operation=%s&instanceId=%s&patronGroupId=%s"; private static final String SEARCH_INSTANCES_URL_PATH = "/circulation-bff/requests/search-instances"; + + private static final String ALLOWED_SERVICE_POINT_PATH = "/circulation-bff/requests/allowed" + + "-service-points"; private static final String SEARCH_INSTANCES_QUERY_PARAM_TMP = "query=%s"; private static final String URL_TMP = "%s?%s"; + private static final String TLR_SETTINGS_URL = "/tlr/settings"; + private static final String TLR_ALLOWED_SERVICE_POINT_URL = "/tlr/allowed-service-points"; - void allowedServicePointsReturnsOkStatus() throws Exception { - mockMvc.perform( - get(buildUrl(ALLOWED_SP_URL_PATH, ALLOWED_SP_QUERY_PARAM_TMP, "create", randomId(), - randomId())) - .headers(defaultHeaders()) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); + @BeforeEach + public void beforeEach() { + wireMockServer.resetAll(); } + @Test + void allowedServicePointsReturnsOkStatus() { + TlrSettings tlrSettings = new TlrSettings(); + tlrSettings.setEcsTlrFeatureEnabled(true); + + var allowedSpResponseConsortium = new AllowedServicePoints(); + allowedSpResponseConsortium.setHold(Set.of( + buildAllowedServicePoint("SP_consortium_1"), + buildAllowedServicePoint("SP_consortium_2"))); + + wireMockServer.stubFor(WireMock.get(urlMatching(TLR_SETTINGS_URL)) + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) + .willReturn(jsonResponse(asJsonString(tlrSettings), SC_OK))); + + var operation = "create"; + var instanceId = UUID.randomUUID(); + var requestId = UUID.randomUUID(); + var patronGroupId = UUID.randomUUID(); + + wireMockServer.stubFor(WireMock.get(urlPathEqualTo(TLR_ALLOWED_SERVICE_POINT_URL)) + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) + .willReturn(jsonResponse(asJsonString(allowedSpResponseConsortium), SC_OK))); + + doGet( + ALLOWED_SERVICE_POINT_PATH + format("?operation=create&requestId=%s&instanceId=%s&patronGroupId=%s", + requestId, instanceId, patronGroupId)) + .expectStatus().isEqualTo(200) + .expectBody().json("{}"); + + wireMockServer.verify(getRequestedFor(urlPathEqualTo( + TLR_ALLOWED_SERVICE_POINT_URL)) + .withQueryParam("requestId", equalTo(requestId.toString())) + .withQueryParam("instanceId", equalTo(instanceId.toString())) + .withQueryParam("operation", equalTo(operation)) + ); + } + + @Test void searchInstancesReturnsOkStatus() throws Exception { mockMvc.perform( get(buildUrl(SEARCH_INSTANCES_URL_PATH, SEARCH_INSTANCES_QUERY_PARAM_TMP, @@ -38,4 +90,10 @@ void searchInstancesReturnsOkStatus() throws Exception { private String buildUrl(String path, String parametersTemplate, String... parameters) { return format(URL_TMP, path, format(parametersTemplate, (Object[]) parameters)); } + + private AllowedServicePoints1Inner buildAllowedServicePoint(String name) { + return new AllowedServicePoints1Inner() + .id(randomId()) + .name(name); + } } From 7d16dbc02e615107d413272f1e53970ab448a9f1 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Fri, 13 Sep 2024 20:22:01 +0500 Subject: [PATCH 05/24] MCBFF-5 BFF for allowed service points functionality --- src/test/java/org/folio/circulationbff/api/BaseIT.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/org/folio/circulationbff/api/BaseIT.java b/src/test/java/org/folio/circulationbff/api/BaseIT.java index 9e23d56..e8c3bdd 100644 --- a/src/test/java/org/folio/circulationbff/api/BaseIT.java +++ b/src/test/java/org/folio/circulationbff/api/BaseIT.java @@ -15,6 +15,7 @@ import org.folio.spring.integration.XOkapiHeaders; import org.folio.spring.scope.FolioExecutionContextSetter; import org.folio.tenant.domain.dto.TenantAttributes; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -73,6 +74,11 @@ static void beforeAll() { wireMockServer.start(); } + @AfterAll + static void tearDown() { + wireMockServer.stop();; + } + @DynamicPropertySource static void overrideProperties(DynamicPropertyRegistry registry) { registry.add("folio.okapi-url", wireMockServer::baseUrl); From 245ea9e6701bf7c41eb4520e2f074f69a0eda68f Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Fri, 13 Sep 2024 20:35:26 +0500 Subject: [PATCH 06/24] MCBFF-5 BFF for allowed service points functionality --- .../api/CirculationBffRequestsApiTest.java | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java index 6d903e8..24f5de2 100644 --- a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java +++ b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java @@ -33,6 +33,8 @@ class CirculationBffRequestsApiTest extends BaseIT { private static final String TLR_SETTINGS_URL = "/tlr/settings"; private static final String TLR_ALLOWED_SERVICE_POINT_URL = "/tlr/allowed-service-points"; + private static final String CIRCULATION_ALLOWED_SERVICE_POINT_URL = "/circulation/requests" + + "/allowed-service-points"; @BeforeEach public void beforeEach() { @@ -40,7 +42,7 @@ public void beforeEach() { } @Test - void allowedServicePointsReturnsOkStatus() { + void allowedServicePointsCallsTlrWhenEcsTlrEnabled() { TlrSettings tlrSettings = new TlrSettings(); tlrSettings.setEcsTlrFeatureEnabled(true); @@ -77,6 +79,44 @@ void allowedServicePointsReturnsOkStatus() { ); } + @Test + void allowedServicePointsCallsCirculationWhenEcsTlrDisabled() { + TlrSettings tlrSettings = new TlrSettings(); + tlrSettings.setEcsTlrFeatureEnabled(false); + + var allowedSpResponseConsortium = new AllowedServicePoints(); + allowedSpResponseConsortium.setHold(Set.of( + buildAllowedServicePoint("SP_consortium_1"), + buildAllowedServicePoint("SP_consortium_2"))); + + wireMockServer.stubFor(WireMock.get(urlMatching(TLR_SETTINGS_URL)) + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) + .willReturn(jsonResponse(asJsonString(tlrSettings), SC_OK))); + + + var operation = "create"; + var instanceId = UUID.randomUUID(); + var requestId = UUID.randomUUID(); + var patronGroupId = UUID.randomUUID(); + + wireMockServer.stubFor(WireMock.get(urlPathEqualTo(CIRCULATION_ALLOWED_SERVICE_POINT_URL)) + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) + .willReturn(jsonResponse(asJsonString(allowedSpResponseConsortium), SC_OK))); + + doGet( + ALLOWED_SERVICE_POINT_PATH + format("?operation=create&requestId=%s&instanceId=%s&patronGroupId=%s", + requestId, instanceId, patronGroupId)) + .expectStatus().isEqualTo(200) + .expectBody().json("{}"); + + wireMockServer.verify(getRequestedFor(urlPathEqualTo( + CIRCULATION_ALLOWED_SERVICE_POINT_URL)) + .withQueryParam("requestId", equalTo(requestId.toString())) + .withQueryParam("instanceId", equalTo(instanceId.toString())) + .withQueryParam("operation", equalTo(operation)) + ); + } + @Test void searchInstancesReturnsOkStatus() throws Exception { mockMvc.perform( From d4f11fb98ed402ce4b461dc0b3c2ab1410672f81 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Fri, 13 Sep 2024 20:40:12 +0500 Subject: [PATCH 07/24] MCBFF-5 BFF for allowed service points functionality --- src/test/java/org/folio/circulationbff/api/BaseIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/folio/circulationbff/api/BaseIT.java b/src/test/java/org/folio/circulationbff/api/BaseIT.java index e8c3bdd..ac97e5b 100644 --- a/src/test/java/org/folio/circulationbff/api/BaseIT.java +++ b/src/test/java/org/folio/circulationbff/api/BaseIT.java @@ -76,7 +76,7 @@ static void beforeAll() { @AfterAll static void tearDown() { - wireMockServer.stop();; + wireMockServer.stop(); } @DynamicPropertySource From 9d5b03dde2acbea440a9d658409330abe5badd9a Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Fri, 20 Sep 2024 16:26:00 +0500 Subject: [PATCH 08/24] MCBFF-5 BFF for allowed service points functionality --- .../client/feign/CirculationClient.java | 5 ++- .../service/SettingsService.java | 5 +++ .../impl/CirculationBffServiceImpl.java | 6 +-- .../service/impl/SettingsServiceImpl.java | 45 +++++++++++++++++++ .../swagger.api/circulation-bff.yaml | 2 + .../schemas/dto/CirculationSettings.yaml | 17 +++++++ .../response/circulationSettingsResponse.yaml | 11 +++++ 7 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/folio/circulationbff/service/SettingsService.java create mode 100644 src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java create mode 100644 src/main/resources/swagger.api/schemas/dto/CirculationSettings.yaml create mode 100644 src/main/resources/swagger.api/schemas/response/circulationSettingsResponse.yaml diff --git a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java index 1256c02..b4cbbad 100644 --- a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java +++ b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java @@ -3,6 +3,7 @@ import java.util.UUID; import org.folio.circulationbff.domain.dto.AllowedServicePoints; +import org.folio.circulationbff.domain.dto.CirculationSettingsResponse; import org.folio.spring.config.FeignClientConfiguration; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -16,6 +17,6 @@ AllowedServicePoints allowedServicePoints ( @RequestParam("patronGroupId") UUID patronGroupId, @RequestParam("instanceId") UUID instanceId, @RequestParam("operation") String operation, @RequestParam("requestId") UUID requestId); - - + @GetMapping("/settings?query=name=ecsTlrFeature") + CirculationSettingsResponse getEcsTlrCirculationSettings(); } diff --git a/src/main/java/org/folio/circulationbff/service/SettingsService.java b/src/main/java/org/folio/circulationbff/service/SettingsService.java new file mode 100644 index 0000000..6810af2 --- /dev/null +++ b/src/main/java/org/folio/circulationbff/service/SettingsService.java @@ -0,0 +1,5 @@ +package org.folio.circulationbff.service; + +public interface SettingsService { + boolean isEcsTlrFeatureEnabled(); +} diff --git a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java index 35cd012..a239f53 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java @@ -5,8 +5,8 @@ import org.folio.circulationbff.client.feign.CirculationClient; import org.folio.circulationbff.client.feign.EcsTlrClient; import org.folio.circulationbff.domain.dto.AllowedServicePoints; -import org.folio.circulationbff.domain.dto.TlrSettings; import org.folio.circulationbff.service.CirculationBffService; +import org.folio.circulationbff.service.SettingsService; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -19,13 +19,13 @@ public class CirculationBffServiceImpl implements CirculationBffService { private final CirculationClient circulationClient; private final EcsTlrClient ecsTlrClient; + private final SettingsService settingsService; @Override public AllowedServicePoints getAllowedServicePoints(UUID patronGroupId, String operation, UUID instanceId, UUID requestId) { log.info("getAllowedServicePoints:: patronGroupId={}, operation={}, instanceId={}, requestId={}", patronGroupId, operation, instanceId, requestId); - TlrSettings ecsTlrSettings = ecsTlrClient.getTlrSettings(); - if (ecsTlrSettings.getEcsTlrFeatureEnabled()) { + if (settingsService.isEcsTlrFeatureEnabled()) { log.info("getAllowedServicePoints:: Ecs TLR Feature is enabled. Getting allowed service " + "points from mod-tlr module"); return ecsTlrClient.getAllowedServicePoints(operation, instanceId, diff --git a/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java new file mode 100644 index 0000000..0e26e3a --- /dev/null +++ b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java @@ -0,0 +1,45 @@ +package org.folio.circulationbff.service.impl; + +import org.folio.circulationbff.client.feign.CirculationClient; +import org.folio.circulationbff.client.feign.EcsTlrClient; +import org.folio.circulationbff.service.SettingsService; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Service +@RequiredArgsConstructor +@Log4j2 +public class SettingsServiceImpl implements SettingsService { + + private final EcsTlrClient ecsTlrClient; + private final CirculationClient circulationClient; + + @Override + public boolean isEcsTlrFeatureEnabled() { + return getCirculationSettings(); + } + + private boolean getTlrSettings() { + return ecsTlrClient.getTlrSettings().getEcsTlrFeatureEnabled(); + } + + private boolean getCirculationSettings() { + log.info("getCirculationSettings:: Getting circulation settings"); + var circulationSettingsResponse = circulationClient.getEcsTlrCirculationSettings(); + if (circulationSettingsResponse.getTotalRecords() > 0) { + try { + var circulationSettings = circulationSettingsResponse.getCirculationSettings().get(0); + JsonNode jsonNode = new ObjectMapper().readTree(circulationSettings.getValue()); + return jsonNode.get("enabled").asBoolean(); + } catch (Exception e) { + log.error("getCirculationSettings:: Failed to parse circulation settings", e); + } + } + return false; + } +} diff --git a/src/main/resources/swagger.api/circulation-bff.yaml b/src/main/resources/swagger.api/circulation-bff.yaml index 46ce7f7..8fa4766 100644 --- a/src/main/resources/swagger.api/circulation-bff.yaml +++ b/src/main/resources/swagger.api/circulation-bff.yaml @@ -11,3 +11,5 @@ components: schemas: tlr-settings: $ref: 'schemas/dto/TlrSettings.yaml#/TlrSettings' + circulationSettingsResponse: + $ref: 'schemas/response/circulationSettingsResponse.yaml' diff --git a/src/main/resources/swagger.api/schemas/dto/CirculationSettings.yaml b/src/main/resources/swagger.api/schemas/dto/CirculationSettings.yaml new file mode 100644 index 0000000..450e30f --- /dev/null +++ b/src/main/resources/swagger.api/schemas/dto/CirculationSettings.yaml @@ -0,0 +1,17 @@ +CirculationSettings: + description: Circulation Settings in a data tenant + type: "object" + properties: + id: + description: "ID of the Circulation Settings" + $ref: "common/uuid.yaml" + name: + description: "Name of the Circulation Settings" + $ref: "common/uuid.yaml" + value: + description: "Value of the Circulation Settings" + type: string + required: + - id + - name + - value diff --git a/src/main/resources/swagger.api/schemas/response/circulationSettingsResponse.yaml b/src/main/resources/swagger.api/schemas/response/circulationSettingsResponse.yaml new file mode 100644 index 0000000..137a18d --- /dev/null +++ b/src/main/resources/swagger.api/schemas/response/circulationSettingsResponse.yaml @@ -0,0 +1,11 @@ +description: "Circulation settings search result response" +type: "object" +properties: + totalRecords: + type: "integer" + description: "Amount of settings found" + circulationSettings: + type: "array" + description: "List of settings found" + items: + $ref: "../dto/CirculationSettings.yaml#/CirculationSettings" From 32aa1574195199461cfd6d7cd007d9bc5c4e3dcd Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Mon, 23 Sep 2024 11:10:22 +0500 Subject: [PATCH 09/24] MCBFF-5 BFF for allowed service points functionality --- descriptors/ModuleDescriptor-template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index ba03b8d..5466157 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -11,7 +11,7 @@ "GET" ], "pathPattern": "/circulation-bff/requests/allowed-service-points", - "permissionsRequired": ["circulation-bff.requests.allowed-service-points.get"], + "permissionsRequired": [], "modulePermissions": [ "tlr.ecs-tlr-allowed-service-points.get", "circulation.requests.allowed-service-points.get", From 2b1008a48d688b7421ace089ba6c292aae3da779 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Mon, 23 Sep 2024 14:25:13 +0500 Subject: [PATCH 10/24] MCBFF-5 BFF for allowed service points functionality --- descriptors/ModuleDescriptor-template.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index 5466157..17c4bd7 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -15,7 +15,9 @@ "modulePermissions": [ "tlr.ecs-tlr-allowed-service-points.get", "circulation.requests.allowed-service-points.get", - "tlr.settings.get" + "tlr.settings.get", + "circulation.settings.item.get", + "circulation.settings.collection.get" ] }, { From b013d64763494c13ccc5d6ae90f7b435868c2048 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Mon, 23 Sep 2024 14:45:38 +0500 Subject: [PATCH 11/24] MCBFF-5 BFF for allowed service points functionality --- .../circulationbff/service/impl/SettingsServiceImpl.java | 3 +-- .../swagger.api/schemas/dto/CirculationSettings.yaml | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java index 0e26e3a..a7026db 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java @@ -34,8 +34,7 @@ private boolean getCirculationSettings() { if (circulationSettingsResponse.getTotalRecords() > 0) { try { var circulationSettings = circulationSettingsResponse.getCirculationSettings().get(0); - JsonNode jsonNode = new ObjectMapper().readTree(circulationSettings.getValue()); - return jsonNode.get("enabled").asBoolean(); + return circulationSettings.getValue().getEnabled(); } catch (Exception e) { log.error("getCirculationSettings:: Failed to parse circulation settings", e); } diff --git a/src/main/resources/swagger.api/schemas/dto/CirculationSettings.yaml b/src/main/resources/swagger.api/schemas/dto/CirculationSettings.yaml index 450e30f..3d1a8d6 100644 --- a/src/main/resources/swagger.api/schemas/dto/CirculationSettings.yaml +++ b/src/main/resources/swagger.api/schemas/dto/CirculationSettings.yaml @@ -10,7 +10,11 @@ CirculationSettings: $ref: "common/uuid.yaml" value: description: "Value of the Circulation Settings" - type: string + type: object + properties: + enabled: + description: "Whether the setting is enabled" + type: boolean required: - id - name From 52da6e25e9b68869f8133c8df45eebb839c17924 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Tue, 24 Sep 2024 11:21:18 +0500 Subject: [PATCH 12/24] MCBFF-5 BFF for allowed service points functionality --- .../client/feign/CirculationClient.java | 5 +++-- .../client/feign/EcsTlrClient.java | 4 ++-- .../controller/CirculationBffController.java | 9 ++++++--- .../service/CirculationBffService.java | 2 +- .../service/impl/CirculationBffServiceImpl.java | 16 +++++++++------- .../resources/swagger.api/parameters/itemId.yaml | 6 ++++++ .../swagger.api/parameters/requesterId.yaml | 6 ++++++ .../allowedServicePoints.yaml | 5 ++++- 8 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/swagger.api/parameters/itemId.yaml create mode 100644 src/main/resources/swagger.api/parameters/requesterId.yaml diff --git a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java index b4cbbad..61f4058 100644 --- a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java +++ b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java @@ -14,8 +14,9 @@ public interface CirculationClient { @GetMapping("/requests/allowed-service-points") AllowedServicePoints allowedServicePoints ( - @RequestParam("patronGroupId") UUID patronGroupId, @RequestParam("instanceId") UUID instanceId, - @RequestParam("operation") String operation, @RequestParam("requestId") UUID requestId); + @RequestParam("operation") String operation, @RequestParam("requesterId") UUID requesterId, + @RequestParam("instanceId") UUID instanceId, @RequestParam("itemId") UUID itemId, + @RequestParam("requestId") UUID requestId, @RequestParam("patronGroupId") UUID patronGroupId); @GetMapping("/settings?query=name=ecsTlrFeature") CirculationSettingsResponse getEcsTlrCirculationSettings(); diff --git a/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java index 8bc96c0..b3f830c 100644 --- a/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java +++ b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java @@ -13,8 +13,8 @@ public interface EcsTlrClient { @GetMapping("/allowed-service-points") - AllowedServicePoints getAllowedServicePoints( - @RequestParam("operation") String operation, @RequestParam("instanceId") UUID instanceId, + AllowedServicePoints getAllowedServicePoints(@RequestParam("operation") String operation, + @RequestParam("requesterId") UUID requesterId, @RequestParam("instanceId") UUID instanceId, @RequestParam("requestId") UUID requestId); @GetMapping("/settings") diff --git a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java index f47223f..99dd18c 100644 --- a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java +++ b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java @@ -21,9 +21,12 @@ public class CirculationBffController implements CirculationBffApi { private final CirculationBffService circulationBffService; @Override - public ResponseEntity circulationBffRequestsAllowedServicePointsGet(UUID patronGroupId, String operation, UUID instanceId, UUID requestId) { - log.info("circulationBffRequestsAllowedServicePointsGet:: params: patronGroupId={}, operation={}, instanceId={}, requestId={}", patronGroupId, operation, instanceId, requestId); - return ResponseEntity.status(HttpStatus.OK).body(circulationBffService.getAllowedServicePoints(patronGroupId, operation, instanceId, requestId)); + public ResponseEntity circulationBffRequestsAllowedServicePointsGet( + UUID patronGroupId, String operation, UUID instanceId, UUID requestId, UUID requesterId, UUID itemId) { + log.info("circulationBffRequestsAllowedServicePointsGet:: params: " + + "patronGroupId={}, operation={}, instanceId={}, requestId={}, requesterId={}, itemId={}", + patronGroupId, operation, instanceId, requestId, requesterId, itemId); + return ResponseEntity.status(HttpStatus.OK).body(circulationBffService.getAllowedServicePoints(patronGroupId, operation, instanceId, requestId, requesterId, itemId)); } @Override diff --git a/src/main/java/org/folio/circulationbff/service/CirculationBffService.java b/src/main/java/org/folio/circulationbff/service/CirculationBffService.java index e295f6d..7d6de6c 100644 --- a/src/main/java/org/folio/circulationbff/service/CirculationBffService.java +++ b/src/main/java/org/folio/circulationbff/service/CirculationBffService.java @@ -6,5 +6,5 @@ public interface CirculationBffService { AllowedServicePoints getAllowedServicePoints(UUID patronGroupId, String operation, - UUID instanceId, UUID requestId); + UUID instanceId, UUID requestId, UUID requesterId, UUID itemId); } diff --git a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java index a239f53..912fb7f 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java @@ -22,19 +22,21 @@ public class CirculationBffServiceImpl implements CirculationBffService { private final SettingsService settingsService; @Override - public AllowedServicePoints getAllowedServicePoints(UUID patronGroupId, String operation, UUID instanceId, UUID requestId) { - log.info("getAllowedServicePoints:: patronGroupId={}, operation={}, instanceId={}, requestId={}", - patronGroupId, operation, instanceId, requestId); + public AllowedServicePoints getAllowedServicePoints(UUID patronGroupId, String operation, + UUID instanceId, UUID requestId, + UUID requesterId, UUID itemId) { + log.info("getAllowedServicePoints:: params: patronGroupId={}, operation={}, instanceId={}, " + + "requestId={}, requesterId={}, itemId={}", patronGroupId, operation, instanceId, requestId, + requesterId, itemId); if (settingsService.isEcsTlrFeatureEnabled()) { log.info("getAllowedServicePoints:: Ecs TLR Feature is enabled. Getting allowed service " + "points from mod-tlr module"); - return ecsTlrClient.getAllowedServicePoints(operation, instanceId, - requestId); + return ecsTlrClient.getAllowedServicePoints(operation, requesterId, instanceId, requestId); } else { log.info("getAllowedServicePoints:: Ecs TLR Feature is disabled. Getting allowed service " + "points from mod-circulation module"); - return circulationClient.allowedServicePoints(patronGroupId, instanceId, - operation, requestId); + return circulationClient.allowedServicePoints(operation, requesterId, + instanceId, itemId, requestId, patronGroupId); } } } diff --git a/src/main/resources/swagger.api/parameters/itemId.yaml b/src/main/resources/swagger.api/parameters/itemId.yaml new file mode 100644 index 0000000..d85219d --- /dev/null +++ b/src/main/resources/swagger.api/parameters/itemId.yaml @@ -0,0 +1,6 @@ +name: itemId +in: query +required: false +schema: + type: string + format: uuid diff --git a/src/main/resources/swagger.api/parameters/requesterId.yaml b/src/main/resources/swagger.api/parameters/requesterId.yaml new file mode 100644 index 0000000..72623d5 --- /dev/null +++ b/src/main/resources/swagger.api/parameters/requesterId.yaml @@ -0,0 +1,6 @@ +name: requesterId +in: query +required: false +schema: + type: string + format: uuid diff --git a/src/main/resources/swagger.api/paths/allowedServicePoints/allowedServicePoints.yaml b/src/main/resources/swagger.api/paths/allowedServicePoints/allowedServicePoints.yaml index edf97d4..613b54c 100644 --- a/src/main/resources/swagger.api/paths/allowedServicePoints/allowedServicePoints.yaml +++ b/src/main/resources/swagger.api/paths/allowedServicePoints/allowedServicePoints.yaml @@ -5,6 +5,9 @@ get: - $ref: '../../parameters/patronGroupId.yaml' - $ref: '../../parameters/instanceId.yaml' - $ref: '../../parameters/requestId.yaml' + - $ref: '../../parameters/requesterId.yaml' + - $ref: '../../parameters/itemId.yaml' + tags: - getAllowedServicePoints responses: @@ -19,4 +22,4 @@ get: '422': $ref: '../../responses/unprocessableEntityResponse.yaml' '500': - $ref: '../../responses/internalServerErrorResponse.yaml' \ No newline at end of file + $ref: '../../responses/internalServerErrorResponse.yaml' From 17c9e982bde53e84c6223be6925cdf8ca1e939b0 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Tue, 24 Sep 2024 12:13:31 +0500 Subject: [PATCH 13/24] MCBFF-5 BFF for allowed service points functionality --- src/main/resources/swagger.api/parameters/operation.yaml | 4 ++-- src/main/resources/swagger.api/parameters/patronGroupId.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/swagger.api/parameters/operation.yaml b/src/main/resources/swagger.api/parameters/operation.yaml index 26e0b9b..5453c6e 100644 --- a/src/main/resources/swagger.api/parameters/operation.yaml +++ b/src/main/resources/swagger.api/parameters/operation.yaml @@ -1,8 +1,8 @@ name: operation in: query -required: false +required: true schema: type: string enum: - create - - replace \ No newline at end of file + - replace diff --git a/src/main/resources/swagger.api/parameters/patronGroupId.yaml b/src/main/resources/swagger.api/parameters/patronGroupId.yaml index b5e6b2a..1faf680 100644 --- a/src/main/resources/swagger.api/parameters/patronGroupId.yaml +++ b/src/main/resources/swagger.api/parameters/patronGroupId.yaml @@ -1,6 +1,6 @@ name: patronGroupId in: query -required: true +required: false schema: type: string - format: uuid \ No newline at end of file + format: uuid From aee1becd8cbd989e4ed966b11373ccd7cfc9990e Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Tue, 24 Sep 2024 14:30:38 +0500 Subject: [PATCH 14/24] MCBFF-5 BFF for allowed service points functionality --- .../client/feign/UserTenantsClient.java | 15 ++++++ .../controller/CirculationBffController.java | 5 +- .../service/CirculationBffService.java | 2 +- .../service/SettingsService.java | 2 +- .../service/UserTenantsService.java | 6 +++ .../impl/CirculationBffServiceImpl.java | 5 +- .../service/impl/SettingsServiceImpl.java | 11 ++-- .../service/impl/UserTenantsServiceImpl.java | 53 +++++++++++++++++++ .../swagger.api/circulation-bff.yaml | 2 + .../allowedServicePoints.yaml | 7 ++- .../swagger.api/schemas/dto/UserTenant.yaml | 41 ++++++++++++++ .../schemas/dto/UserTenantCollection.yaml | 17 ++++++ .../api/CirculationBffRequestsApiTest.java | 22 +++++--- 13 files changed, 171 insertions(+), 17 deletions(-) create mode 100644 src/main/java/org/folio/circulationbff/client/feign/UserTenantsClient.java create mode 100644 src/main/java/org/folio/circulationbff/service/UserTenantsService.java create mode 100644 src/main/java/org/folio/circulationbff/service/impl/UserTenantsServiceImpl.java create mode 100644 src/main/resources/swagger.api/schemas/dto/UserTenant.yaml create mode 100644 src/main/resources/swagger.api/schemas/dto/UserTenantCollection.yaml diff --git a/src/main/java/org/folio/circulationbff/client/feign/UserTenantsClient.java b/src/main/java/org/folio/circulationbff/client/feign/UserTenantsClient.java new file mode 100644 index 0000000..f534d26 --- /dev/null +++ b/src/main/java/org/folio/circulationbff/client/feign/UserTenantsClient.java @@ -0,0 +1,15 @@ +package org.folio.circulationbff.client.feign; + + +import org.folio.circulationbff.domain.dto.UserTenantCollection; +import org.folio.spring.config.FeignClientConfiguration; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(name = "user-tenants", url = "user-tenants", configuration = FeignClientConfiguration.class) +public interface UserTenantsClient { + + @GetMapping() + UserTenantCollection getUserTenants(@RequestParam(name = "limit", required = false) Integer limit); +} diff --git a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java index 99dd18c..31d1927 100644 --- a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java +++ b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java @@ -22,11 +22,12 @@ public class CirculationBffController implements CirculationBffApi { @Override public ResponseEntity circulationBffRequestsAllowedServicePointsGet( - UUID patronGroupId, String operation, UUID instanceId, UUID requestId, UUID requesterId, UUID itemId) { + String tenantId, String operation, UUID patronGroupId, UUID instanceId, UUID requestId, + UUID requesterId, UUID itemId) { log.info("circulationBffRequestsAllowedServicePointsGet:: params: " + "patronGroupId={}, operation={}, instanceId={}, requestId={}, requesterId={}, itemId={}", patronGroupId, operation, instanceId, requestId, requesterId, itemId); - return ResponseEntity.status(HttpStatus.OK).body(circulationBffService.getAllowedServicePoints(patronGroupId, operation, instanceId, requestId, requesterId, itemId)); + return ResponseEntity.status(HttpStatus.OK).body(circulationBffService.getAllowedServicePoints(tenantId, patronGroupId, operation, instanceId, requestId, requesterId, itemId)); } @Override diff --git a/src/main/java/org/folio/circulationbff/service/CirculationBffService.java b/src/main/java/org/folio/circulationbff/service/CirculationBffService.java index 7d6de6c..d60ac18 100644 --- a/src/main/java/org/folio/circulationbff/service/CirculationBffService.java +++ b/src/main/java/org/folio/circulationbff/service/CirculationBffService.java @@ -5,6 +5,6 @@ import org.folio.circulationbff.domain.dto.AllowedServicePoints; public interface CirculationBffService { - AllowedServicePoints getAllowedServicePoints(UUID patronGroupId, String operation, + AllowedServicePoints getAllowedServicePoints(String tenantId, UUID patronGroupId, String operation, UUID instanceId, UUID requestId, UUID requesterId, UUID itemId); } diff --git a/src/main/java/org/folio/circulationbff/service/SettingsService.java b/src/main/java/org/folio/circulationbff/service/SettingsService.java index 6810af2..1c8b61d 100644 --- a/src/main/java/org/folio/circulationbff/service/SettingsService.java +++ b/src/main/java/org/folio/circulationbff/service/SettingsService.java @@ -1,5 +1,5 @@ package org.folio.circulationbff.service; public interface SettingsService { - boolean isEcsTlrFeatureEnabled(); + boolean isEcsTlrFeatureEnabled(String tenantId); } diff --git a/src/main/java/org/folio/circulationbff/service/UserTenantsService.java b/src/main/java/org/folio/circulationbff/service/UserTenantsService.java new file mode 100644 index 0000000..0cab6d6 --- /dev/null +++ b/src/main/java/org/folio/circulationbff/service/UserTenantsService.java @@ -0,0 +1,6 @@ +package org.folio.circulationbff.service; + + +public interface UserTenantsService { + boolean isCentralTenant(String tenantId); +} diff --git a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java index 912fb7f..b44e1b3 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java @@ -22,13 +22,14 @@ public class CirculationBffServiceImpl implements CirculationBffService { private final SettingsService settingsService; @Override - public AllowedServicePoints getAllowedServicePoints(UUID patronGroupId, String operation, + public AllowedServicePoints getAllowedServicePoints(String tenantId, UUID patronGroupId, + String operation, UUID instanceId, UUID requestId, UUID requesterId, UUID itemId) { log.info("getAllowedServicePoints:: params: patronGroupId={}, operation={}, instanceId={}, " + "requestId={}, requesterId={}, itemId={}", patronGroupId, operation, instanceId, requestId, requesterId, itemId); - if (settingsService.isEcsTlrFeatureEnabled()) { + if (settingsService.isEcsTlrFeatureEnabled(tenantId)) { log.info("getAllowedServicePoints:: Ecs TLR Feature is enabled. Getting allowed service " + "points from mod-tlr module"); return ecsTlrClient.getAllowedServicePoints(operation, requesterId, instanceId, requestId); diff --git a/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java index a7026db..b450692 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java @@ -3,11 +3,9 @@ import org.folio.circulationbff.client.feign.CirculationClient; import org.folio.circulationbff.client.feign.EcsTlrClient; import org.folio.circulationbff.service.SettingsService; +import org.folio.circulationbff.service.UserTenantsService; import org.springframework.stereotype.Service; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -18,13 +16,18 @@ public class SettingsServiceImpl implements SettingsService { private final EcsTlrClient ecsTlrClient; private final CirculationClient circulationClient; + private final UserTenantsService userTenantsService; @Override - public boolean isEcsTlrFeatureEnabled() { + public boolean isEcsTlrFeatureEnabled(String tenantId) { + if (userTenantsService.isCentralTenant(tenantId)) { + return getTlrSettings(); + } return getCirculationSettings(); } private boolean getTlrSettings() { + log.info("getTlrSettings:: Getting TLR settings"); return ecsTlrClient.getTlrSettings().getEcsTlrFeatureEnabled(); } diff --git a/src/main/java/org/folio/circulationbff/service/impl/UserTenantsServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/UserTenantsServiceImpl.java new file mode 100644 index 0000000..187237f --- /dev/null +++ b/src/main/java/org/folio/circulationbff/service/impl/UserTenantsServiceImpl.java @@ -0,0 +1,53 @@ +package org.folio.circulationbff.service.impl; + +import java.util.List; + +import org.folio.circulationbff.client.feign.UserTenantsClient; +import org.folio.circulationbff.domain.dto.UserTenant; +import org.folio.circulationbff.domain.dto.UserTenantCollection; +import org.folio.circulationbff.service.UserTenantsService; +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Service +@RequiredArgsConstructor +@Log4j2 +public class UserTenantsServiceImpl implements UserTenantsService { + + private final UserTenantsClient userTenantsClient; + + @Override + public boolean isCentralTenant(String tenantId) { + UserTenant firstUserTenant = findFirstUserTenant(); + if (firstUserTenant == null) { + log.info("processUserGroupEvent: Failed to get user-tenants info"); + return false; + } + String centralTenantId = firstUserTenant.getCentralTenantId(); + if (centralTenantId != null && centralTenantId.equals(tenantId)) { + log.info("isCentralTenant: tenantId={} is central tenant", tenantId); + return true; + } + return false; + } + + private UserTenant findFirstUserTenant() { + log.info("findFirstUserTenant:: finding first userTenant"); + UserTenant firstUserTenant = null; + UserTenantCollection userTenantCollection = userTenantsClient.getUserTenants(1); + log.info("findFirstUserTenant:: userTenantCollection: {}", () -> userTenantCollection); + if (userTenantCollection != null) { + log.info("findFirstUserTenant:: userTenantCollection: {}", () -> userTenantCollection); + List userTenants = userTenantCollection.getUserTenants(); + if (!userTenants.isEmpty()) { + firstUserTenant = userTenants.get(0); + log.info("findFirstUserTenant:: found userTenant: {}", firstUserTenant); + } + } + log.info("findFirstUserTenant:: result: {}", firstUserTenant); + return firstUserTenant; + } +} + diff --git a/src/main/resources/swagger.api/circulation-bff.yaml b/src/main/resources/swagger.api/circulation-bff.yaml index 8fa4766..7f66f55 100644 --- a/src/main/resources/swagger.api/circulation-bff.yaml +++ b/src/main/resources/swagger.api/circulation-bff.yaml @@ -13,3 +13,5 @@ components: $ref: 'schemas/dto/TlrSettings.yaml#/TlrSettings' circulationSettingsResponse: $ref: 'schemas/response/circulationSettingsResponse.yaml' + userTenantCollection: + $ref: 'schemas/dto/UserTenantCollection.yaml#/UserTenantCollection' diff --git a/src/main/resources/swagger.api/paths/allowedServicePoints/allowedServicePoints.yaml b/src/main/resources/swagger.api/paths/allowedServicePoints/allowedServicePoints.yaml index 613b54c..2a2ae5e 100644 --- a/src/main/resources/swagger.api/paths/allowedServicePoints/allowedServicePoints.yaml +++ b/src/main/resources/swagger.api/paths/allowedServicePoints/allowedServicePoints.yaml @@ -7,7 +7,12 @@ get: - $ref: '../../parameters/requestId.yaml' - $ref: '../../parameters/requesterId.yaml' - $ref: '../../parameters/itemId.yaml' - + - in: header + name: X-Okapi-Tenant + required: true + schema: + type: string + description: The tenant ID for the request tags: - getAllowedServicePoints responses: diff --git a/src/main/resources/swagger.api/schemas/dto/UserTenant.yaml b/src/main/resources/swagger.api/schemas/dto/UserTenant.yaml new file mode 100644 index 0000000..5fe37d4 --- /dev/null +++ b/src/main/resources/swagger.api/schemas/dto/UserTenant.yaml @@ -0,0 +1,41 @@ +UserTenant: + description: Primary tenant of a user used for single-sign-on + type: "object" + properties: + id: + description: "UUID of the user tenant" + $ref: "common/uuid.yaml" + userId: + description: "UUID of the user" + $ref: "common/uuid.yaml" + username: + description: "The user name" + type: string + tenantId: + description: "Primary tenant of the user for single-sign-on" + type: string + centralTenantId: + description: "Central tenant id in the consortium" + type: string + phoneNumber: + description: "The user's primary phone number" + type: string + mobilePhoneNumber: + description: "The user's mobile phone number" + type: string + email: + description: "The user's email address" + type: string + barcode: + description: "The barcode of the user's" + type: string + externalSystemId: + description: "The externalSystemId of the user's" + type: string + consortiumId: + description: "UUID of the consortiumId" + $ref: "common/uuid.yaml" + additionalProperties: true + required: + - userId + - tenantId diff --git a/src/main/resources/swagger.api/schemas/dto/UserTenantCollection.yaml b/src/main/resources/swagger.api/schemas/dto/UserTenantCollection.yaml new file mode 100644 index 0000000..494f2ab --- /dev/null +++ b/src/main/resources/swagger.api/schemas/dto/UserTenantCollection.yaml @@ -0,0 +1,17 @@ +UserTenantCollection: + type: object + description: Collection of primary tenant records + properties: + userTenants: + description: List of primary tenant records + type: array + id: userTenants + items: + type: object + $ref: "UserTenant.yaml#/UserTenant" + totalRecords: + type: integer + additionalProperties: true + required: + - userTenants + - totalRecords diff --git a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java index 24f5de2..356fc38 100644 --- a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java +++ b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java @@ -10,11 +10,15 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.util.List; import java.util.Set; import java.util.UUID; import org.folio.circulationbff.domain.dto.AllowedServicePoints; import org.folio.circulationbff.domain.dto.AllowedServicePoints1Inner; +import org.folio.circulationbff.domain.dto.CirculationSettings; +import org.folio.circulationbff.domain.dto.CirculationSettingsResponse; +import org.folio.circulationbff.domain.dto.CirculationSettingsValue; import org.folio.circulationbff.domain.dto.TlrSettings; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,7 +35,7 @@ class CirculationBffRequestsApiTest extends BaseIT { private static final String SEARCH_INSTANCES_QUERY_PARAM_TMP = "query=%s"; private static final String URL_TMP = "%s?%s"; - private static final String TLR_SETTINGS_URL = "/tlr/settings"; + private static final String CIRCULATION_SETTINGS_URL = "/settings?query=name=ecsTlrFeature"; private static final String TLR_ALLOWED_SERVICE_POINT_URL = "/tlr/allowed-service-points"; private static final String CIRCULATION_ALLOWED_SERVICE_POINT_URL = "/circulation/requests" + "/allowed-service-points"; @@ -43,17 +47,23 @@ public void beforeEach() { @Test void allowedServicePointsCallsTlrWhenEcsTlrEnabled() { - TlrSettings tlrSettings = new TlrSettings(); - tlrSettings.setEcsTlrFeatureEnabled(true); + var circulationSettingsResponse = new CirculationSettingsResponse(); + circulationSettingsResponse.setTotalRecords(1); + circulationSettingsResponse.setCirculationSettings(List.of( + new CirculationSettings() + .name("ecsTlrFeature") + .value(new CirculationSettingsValue().enabled(true)) + )); + var allowedSpResponseConsortium = new AllowedServicePoints(); allowedSpResponseConsortium.setHold(Set.of( buildAllowedServicePoint("SP_consortium_1"), buildAllowedServicePoint("SP_consortium_2"))); - wireMockServer.stubFor(WireMock.get(urlMatching(TLR_SETTINGS_URL)) + wireMockServer.stubFor(WireMock.get(urlMatching(CIRCULATION_SETTINGS_URL)) .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) - .willReturn(jsonResponse(asJsonString(tlrSettings), SC_OK))); + .willReturn(jsonResponse(asJsonString(circulationSettingsResponse), SC_OK))); var operation = "create"; @@ -89,7 +99,7 @@ void allowedServicePointsCallsCirculationWhenEcsTlrDisabled() { buildAllowedServicePoint("SP_consortium_1"), buildAllowedServicePoint("SP_consortium_2"))); - wireMockServer.stubFor(WireMock.get(urlMatching(TLR_SETTINGS_URL)) + wireMockServer.stubFor(WireMock.get(urlMatching(CIRCULATION_SETTINGS_URL)) .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) .willReturn(jsonResponse(asJsonString(tlrSettings), SC_OK))); From e7e9f165168ed03a5aab6b009496046937c1f6d5 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Tue, 24 Sep 2024 14:48:07 +0500 Subject: [PATCH 15/24] MCBFF-5 BFF for allowed service points functionality --- descriptors/ModuleDescriptor-template.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index 17c4bd7..3da5a80 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -17,7 +17,8 @@ "circulation.requests.allowed-service-points.get", "tlr.settings.get", "circulation.settings.item.get", - "circulation.settings.collection.get" + "circulation.settings.collection.get", + "user-tenants.collection.get" ] }, { From 7f82eae87fbafb15c9327fcc5afba732325f3428 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Tue, 24 Sep 2024 14:59:32 +0500 Subject: [PATCH 16/24] MCBFF-5 BFF for allowed service points functionality --- .../circulationbff/controller/CirculationBffController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java index 31d1927..0499536 100644 --- a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java +++ b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java @@ -22,12 +22,13 @@ public class CirculationBffController implements CirculationBffApi { @Override public ResponseEntity circulationBffRequestsAllowedServicePointsGet( - String tenantId, String operation, UUID patronGroupId, UUID instanceId, UUID requestId, + String operation, String tenantId, UUID patronGroupId, UUID instanceId, UUID requestId, UUID requesterId, UUID itemId) { log.info("circulationBffRequestsAllowedServicePointsGet:: params: " + "patronGroupId={}, operation={}, instanceId={}, requestId={}, requesterId={}, itemId={}", patronGroupId, operation, instanceId, requestId, requesterId, itemId); - return ResponseEntity.status(HttpStatus.OK).body(circulationBffService.getAllowedServicePoints(tenantId, patronGroupId, operation, instanceId, requestId, requesterId, itemId)); + return ResponseEntity.status(HttpStatus.OK).body(circulationBffService.getAllowedServicePoints( + tenantId, patronGroupId, operation, instanceId, requestId, requesterId, itemId)); } @Override From 174885bc056f50983c7c5f45fa12673e3d0997d4 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Tue, 24 Sep 2024 15:31:36 +0500 Subject: [PATCH 17/24] MCBFF-5 BFF for allowed service points functionality --- .../folio/circulationbff/client/feign/EcsTlrClient.java | 2 +- .../service/impl/CirculationBffServiceImpl.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java index b3f830c..7d7473b 100644 --- a/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java +++ b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java @@ -15,7 +15,7 @@ public interface EcsTlrClient { @GetMapping("/allowed-service-points") AllowedServicePoints getAllowedServicePoints(@RequestParam("operation") String operation, @RequestParam("requesterId") UUID requesterId, @RequestParam("instanceId") UUID instanceId, - @RequestParam("requestId") UUID requestId); + @RequestParam("requestId") UUID requestId, @RequestParam("itemId") UUID itemId); @GetMapping("/settings") TlrSettings getTlrSettings (); diff --git a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java index b44e1b3..a26522a 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java @@ -7,6 +7,7 @@ import org.folio.circulationbff.domain.dto.AllowedServicePoints; import org.folio.circulationbff.service.CirculationBffService; import org.folio.circulationbff.service.SettingsService; +import org.folio.circulationbff.service.UserTenantsService; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -20,7 +21,7 @@ public class CirculationBffServiceImpl implements CirculationBffService { private final CirculationClient circulationClient; private final EcsTlrClient ecsTlrClient; private final SettingsService settingsService; - + private final UserTenantsService userTenantsService; @Override public AllowedServicePoints getAllowedServicePoints(String tenantId, UUID patronGroupId, String operation, @@ -29,10 +30,11 @@ public AllowedServicePoints getAllowedServicePoints(String tenantId, UUID patron log.info("getAllowedServicePoints:: params: patronGroupId={}, operation={}, instanceId={}, " + "requestId={}, requesterId={}, itemId={}", patronGroupId, operation, instanceId, requestId, requesterId, itemId); - if (settingsService.isEcsTlrFeatureEnabled(tenantId)) { + if (settingsService.isEcsTlrFeatureEnabled(tenantId) && userTenantsService.isCentralTenant(tenantId)) { log.info("getAllowedServicePoints:: Ecs TLR Feature is enabled. Getting allowed service " + "points from mod-tlr module"); - return ecsTlrClient.getAllowedServicePoints(operation, requesterId, instanceId, requestId); + return ecsTlrClient.getAllowedServicePoints(operation, requesterId, instanceId, requestId, + itemId); } else { log.info("getAllowedServicePoints:: Ecs TLR Feature is disabled. Getting allowed service " + "points from mod-circulation module"); From 2f0a2c116d0bb021b79c41f2916dc5325e43f6de Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Wed, 25 Sep 2024 18:34:00 +0500 Subject: [PATCH 18/24] MCBFF-5 BFF for allowed service points functionality --- .../org/folio/circulationbff/api/BaseIT.java | 11 +-- .../api/CirculationBffRequestsApiTest.java | 85 ++++++++++++------- 2 files changed, 61 insertions(+), 35 deletions(-) diff --git a/src/test/java/org/folio/circulationbff/api/BaseIT.java b/src/test/java/org/folio/circulationbff/api/BaseIT.java index ac97e5b..51b2856 100644 --- a/src/test/java/org/folio/circulationbff/api/BaseIT.java +++ b/src/test/java/org/folio/circulationbff/api/BaseIT.java @@ -51,6 +51,7 @@ public class BaseIT { protected static final String HEADER_TENANT = "x-okapi-tenant"; protected static final String TOKEN = "test_token"; protected static final String TENANT_ID_CONSORTIUM = "consortium"; + protected static final String TENANT_ID_COLLEGE = "college"; protected static final String USER_ID = randomId(); private FolioExecutionContextSetter contextSetter; private static final int WIRE_MOCK_PORT = TestSocketUtils.findAvailableTcpPort(); @@ -121,18 +122,18 @@ protected WebTestClient.ResponseSpec doPostWithTenant(String url, Object payload } protected WebTestClient.ResponseSpec doPostWithToken(String url, Object payload, String token) { - return buildRequest(HttpMethod.POST, url) + return buildRequest(HttpMethod.POST, url, TENANT_ID_CONSORTIUM) .cookie("folioAccessToken", token) .body(BodyInserters.fromValue(payload)) .exchange(); } - protected WebTestClient.RequestBodySpec buildRequest(HttpMethod method, String uri) { + protected WebTestClient.RequestBodySpec buildRequest(HttpMethod method, String uri, String tenantId) { return webClient.method(method) .uri(uri) .accept(APPLICATION_JSON) .contentType(APPLICATION_JSON) - .header(XOkapiHeaders.TENANT, TENANT_ID_CONSORTIUM) + .header(XOkapiHeaders.TENANT, tenantId) .header(XOkapiHeaders.URL, wireMockServer.baseUrl()) .header(XOkapiHeaders.TOKEN, TOKEN) .header(XOkapiHeaders.USER_ID, randomId()); @@ -153,8 +154,8 @@ private static Map> buildDefaultHeaders() { .collect(toMap(Map.Entry::getKey, Map.Entry::getValue))); } - protected WebTestClient.ResponseSpec doGet(String url) { - return buildRequest(HttpMethod.GET, url) + protected WebTestClient.ResponseSpec doGet(String url, String tenantId) { + return buildRequest(HttpMethod.GET, url, tenantId) .exchange(); } } diff --git a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java index 356fc38..5022228 100644 --- a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java +++ b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java @@ -3,6 +3,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor; import static com.github.tomakehurst.wiremock.client.WireMock.jsonResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.matching; import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching; import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; import static java.lang.String.format; @@ -20,11 +21,14 @@ import org.folio.circulationbff.domain.dto.CirculationSettingsResponse; import org.folio.circulationbff.domain.dto.CirculationSettingsValue; import org.folio.circulationbff.domain.dto.TlrSettings; +import org.folio.circulationbff.domain.dto.UserTenant; +import org.folio.circulationbff.domain.dto.UserTenantCollection; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.stubbing.StubMapping; class CirculationBffRequestsApiTest extends BaseIT { private static final String SEARCH_INSTANCES_URL_PATH = @@ -35,7 +39,9 @@ class CirculationBffRequestsApiTest extends BaseIT { private static final String SEARCH_INSTANCES_QUERY_PARAM_TMP = "query=%s"; private static final String URL_TMP = "%s?%s"; - private static final String CIRCULATION_SETTINGS_URL = "/settings?query=name=ecsTlrFeature"; + private static final String CIRCULATION_SETTINGS_URL = "/circulation/settings"; + private static final String TLR_SETTINGS_URL = "/tlr/settings"; + private static final String USER_TENANTS_URL = "/user-tenants"; private static final String TLR_ALLOWED_SERVICE_POINT_URL = "/tlr/allowed-service-points"; private static final String CIRCULATION_ALLOWED_SERVICE_POINT_URL = "/circulation/requests" + "/allowed-service-points"; @@ -46,24 +52,21 @@ public void beforeEach() { } @Test - void allowedServicePointsCallsTlrWhenEcsTlrEnabled() { - var circulationSettingsResponse = new CirculationSettingsResponse(); - circulationSettingsResponse.setTotalRecords(1); - circulationSettingsResponse.setCirculationSettings(List.of( - new CirculationSettings() - .name("ecsTlrFeature") - .value(new CirculationSettingsValue().enabled(true)) - )); - + void callsModTlrWhenEcsTlrEnabledInCentralTenant() { - var allowedSpResponseConsortium = new AllowedServicePoints(); - allowedSpResponseConsortium.setHold(Set.of( - buildAllowedServicePoint("SP_consortium_1"), - buildAllowedServicePoint("SP_consortium_2"))); + var userTenant = new UserTenant(UUID.randomUUID().toString(), TENANT_ID_CONSORTIUM); + userTenant.setCentralTenantId(TENANT_ID_CONSORTIUM); + wireMockServer.stubFor(WireMock.get(urlPathEqualTo(USER_TENANTS_URL)) + .withQueryParam("limit", matching("\\d*")) // matches any integer or no value + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) + .willReturn(jsonResponse(asJsonString(new UserTenantCollection().addUserTenantsItem(userTenant)), + SC_OK))); - wireMockServer.stubFor(WireMock.get(urlMatching(CIRCULATION_SETTINGS_URL)) + TlrSettings tlrSettings = new TlrSettings(); + tlrSettings.setEcsTlrFeatureEnabled(true); + wireMockServer.stubFor(WireMock.get(urlMatching(TLR_SETTINGS_URL)) .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) - .willReturn(jsonResponse(asJsonString(circulationSettingsResponse), SC_OK))); + .willReturn(jsonResponse(asJsonString(tlrSettings), SC_OK))); var operation = "create"; @@ -71,13 +74,23 @@ void allowedServicePointsCallsTlrWhenEcsTlrEnabled() { var requestId = UUID.randomUUID(); var patronGroupId = UUID.randomUUID(); + var allowedSpResponseConsortium = new AllowedServicePoints(); + allowedSpResponseConsortium.setHold(Set.of( + buildAllowedServicePoint("SP_consortium_1"), + buildAllowedServicePoint("SP_consortium_2"))); wireMockServer.stubFor(WireMock.get(urlPathEqualTo(TLR_ALLOWED_SERVICE_POINT_URL)) .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) .willReturn(jsonResponse(asJsonString(allowedSpResponseConsortium), SC_OK))); + List stubs = wireMockServer.getStubMappings(); + // Print all stub mappings + for (StubMapping stub : stubs) { + System.out.println(stub); + } + doGet( ALLOWED_SERVICE_POINT_PATH + format("?operation=create&requestId=%s&instanceId=%s&patronGroupId=%s", - requestId, instanceId, patronGroupId)) + requestId, instanceId, patronGroupId), TENANT_ID_CONSORTIUM) .expectStatus().isEqualTo(200) .expectBody().json("{}"); @@ -90,32 +103,44 @@ void allowedServicePointsCallsTlrWhenEcsTlrEnabled() { } @Test - void allowedServicePointsCallsCirculationWhenEcsTlrDisabled() { - TlrSettings tlrSettings = new TlrSettings(); - tlrSettings.setEcsTlrFeatureEnabled(false); + void callsCirculationWhenEcsTlrDisabledOnDataTenant() { + var userTenant = new UserTenant(UUID.randomUUID().toString(), TENANT_ID_COLLEGE); + userTenant.setCentralTenantId(TENANT_ID_CONSORTIUM); + wireMockServer.stubFor(WireMock.get(urlPathEqualTo(USER_TENANTS_URL)) + .withQueryParam("limit", matching("\\d*")) + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_COLLEGE)) + .willReturn(jsonResponse(asJsonString(new UserTenantCollection().addUserTenantsItem(userTenant)), + SC_OK))); + + var circulationSettingsResponse = new CirculationSettingsResponse(); + circulationSettingsResponse.setTotalRecords(1); + circulationSettingsResponse.setCirculationSettings(List.of( + new CirculationSettings() + .name("ecsTlrFeature") + .value(new CirculationSettingsValue().enabled(true)) + )); + wireMockServer.stubFor(WireMock.get(urlPathEqualTo(CIRCULATION_SETTINGS_URL)) + .withQueryParam("query", equalTo("name=ecsTlrFeature")) + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_COLLEGE)) + .willReturn(jsonResponse(asJsonString(circulationSettingsResponse), + SC_OK))); var allowedSpResponseConsortium = new AllowedServicePoints(); allowedSpResponseConsortium.setHold(Set.of( buildAllowedServicePoint("SP_consortium_1"), buildAllowedServicePoint("SP_consortium_2"))); - - wireMockServer.stubFor(WireMock.get(urlMatching(CIRCULATION_SETTINGS_URL)) - .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) - .willReturn(jsonResponse(asJsonString(tlrSettings), SC_OK))); - + wireMockServer.stubFor(WireMock.get(urlPathEqualTo(CIRCULATION_ALLOWED_SERVICE_POINT_URL)) + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_COLLEGE)) + .willReturn(jsonResponse(asJsonString(allowedSpResponseConsortium), SC_OK))); var operation = "create"; var instanceId = UUID.randomUUID(); var requestId = UUID.randomUUID(); var patronGroupId = UUID.randomUUID(); - wireMockServer.stubFor(WireMock.get(urlPathEqualTo(CIRCULATION_ALLOWED_SERVICE_POINT_URL)) - .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) - .willReturn(jsonResponse(asJsonString(allowedSpResponseConsortium), SC_OK))); - doGet( ALLOWED_SERVICE_POINT_PATH + format("?operation=create&requestId=%s&instanceId=%s&patronGroupId=%s", - requestId, instanceId, patronGroupId)) + requestId, instanceId, patronGroupId), TENANT_ID_COLLEGE) .expectStatus().isEqualTo(200) .expectBody().json("{}"); From 5a179ee77a7e091793d4b48c80b9ea5b78ffdba0 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Thu, 26 Sep 2024 12:16:08 +0500 Subject: [PATCH 19/24] MCBFF-5 BFF for allowed service points functionality --- descriptors/ModuleDescriptor-template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index 3da5a80..00c4bf0 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -11,7 +11,7 @@ "GET" ], "pathPattern": "/circulation-bff/requests/allowed-service-points", - "permissionsRequired": [], + "permissionsRequired": ["circulation-bff.requests.allowed-service-points.get"], "modulePermissions": [ "tlr.ecs-tlr-allowed-service-points.get", "circulation.requests.allowed-service-points.get", From d4d6c2686da5fca1443eb01d964ec102b8b124db Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Fri, 27 Sep 2024 21:32:48 +0500 Subject: [PATCH 20/24] MCBFF-5 BFF for allowed service points functionality --- .../client/feign/CirculationClient.java | 4 +- .../controller/CirculationBffController.java | 8 +- .../domain/dto/AllowedServicePointParams.java | 26 ++++++ .../service/CirculationBffService.java | 6 +- .../service/UserTenantsService.java | 1 - .../impl/CirculationBffServiceImpl.java | 21 ++--- .../service/impl/SettingsServiceImpl.java | 51 +++++----- .../api/CirculationBffRequestsApiTest.java | 92 ++++++++++--------- 8 files changed, 118 insertions(+), 91 deletions(-) create mode 100644 src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java diff --git a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java index 61f4058..cd64236 100644 --- a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java +++ b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java @@ -18,6 +18,6 @@ AllowedServicePoints allowedServicePoints ( @RequestParam("instanceId") UUID instanceId, @RequestParam("itemId") UUID itemId, @RequestParam("requestId") UUID requestId, @RequestParam("patronGroupId") UUID patronGroupId); - @GetMapping("/settings?query=name=ecsTlrFeature") - CirculationSettingsResponse getEcsTlrCirculationSettings(); + @GetMapping(value = "/settings") + CirculationSettingsResponse getCirculationSettingsByQuery(@RequestParam("query") String query); } diff --git a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java index 0499536..1232307 100644 --- a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java +++ b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java @@ -2,6 +2,7 @@ import java.util.UUID; +import org.folio.circulationbff.domain.dto.AllowedServicePointParams; import org.folio.circulationbff.domain.dto.AllowedServicePoints; import org.folio.circulationbff.domain.dto.InstanceSearchResult; import org.folio.circulationbff.rest.resource.CirculationBffApi; @@ -24,11 +25,14 @@ public class CirculationBffController implements CirculationBffApi { public ResponseEntity circulationBffRequestsAllowedServicePointsGet( String operation, String tenantId, UUID patronGroupId, UUID instanceId, UUID requestId, UUID requesterId, UUID itemId) { + log.info("circulationBffRequestsAllowedServicePointsGet:: params: " + - "patronGroupId={}, operation={}, instanceId={}, requestId={}, requesterId={}, itemId={}", + "patronGroupId={}, operation={}, instanceId={}, requestId={}, requesterId={}, itemId={}", patronGroupId, operation, instanceId, requestId, requesterId, itemId); + return ResponseEntity.status(HttpStatus.OK).body(circulationBffService.getAllowedServicePoints( - tenantId, patronGroupId, operation, instanceId, requestId, requesterId, itemId)); + new AllowedServicePointParams(operation, patronGroupId, instanceId, requestId, requesterId, + itemId), tenantId)); } @Override diff --git a/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java b/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java new file mode 100644 index 0000000..d52e6a4 --- /dev/null +++ b/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java @@ -0,0 +1,26 @@ +package org.folio.circulationbff.domain.dto; + +import java.util.UUID; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AllowedServicePointParams { + private String operation; + + private UUID patronGroupId; + + private UUID instanceId; + + private UUID requestId; + + private UUID requesterId; + + private UUID itemId; +} diff --git a/src/main/java/org/folio/circulationbff/service/CirculationBffService.java b/src/main/java/org/folio/circulationbff/service/CirculationBffService.java index d60ac18..fc0bcdf 100644 --- a/src/main/java/org/folio/circulationbff/service/CirculationBffService.java +++ b/src/main/java/org/folio/circulationbff/service/CirculationBffService.java @@ -1,10 +1,8 @@ package org.folio.circulationbff.service; -import java.util.UUID; - +import org.folio.circulationbff.domain.dto.AllowedServicePointParams; import org.folio.circulationbff.domain.dto.AllowedServicePoints; public interface CirculationBffService { - AllowedServicePoints getAllowedServicePoints(String tenantId, UUID patronGroupId, String operation, - UUID instanceId, UUID requestId, UUID requesterId, UUID itemId); + AllowedServicePoints getAllowedServicePoints(AllowedServicePointParams allowedServicePointParams, String tenantId); } diff --git a/src/main/java/org/folio/circulationbff/service/UserTenantsService.java b/src/main/java/org/folio/circulationbff/service/UserTenantsService.java index 0cab6d6..cb11378 100644 --- a/src/main/java/org/folio/circulationbff/service/UserTenantsService.java +++ b/src/main/java/org/folio/circulationbff/service/UserTenantsService.java @@ -1,6 +1,5 @@ package org.folio.circulationbff.service; - public interface UserTenantsService { boolean isCentralTenant(String tenantId); } diff --git a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java index a26522a..a8e39ac 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java @@ -1,9 +1,8 @@ package org.folio.circulationbff.service.impl; -import java.util.UUID; - import org.folio.circulationbff.client.feign.CirculationClient; import org.folio.circulationbff.client.feign.EcsTlrClient; +import org.folio.circulationbff.domain.dto.AllowedServicePointParams; import org.folio.circulationbff.domain.dto.AllowedServicePoints; import org.folio.circulationbff.service.CirculationBffService; import org.folio.circulationbff.service.SettingsService; @@ -22,24 +21,20 @@ public class CirculationBffServiceImpl implements CirculationBffService { private final EcsTlrClient ecsTlrClient; private final SettingsService settingsService; private final UserTenantsService userTenantsService; + @Override - public AllowedServicePoints getAllowedServicePoints(String tenantId, UUID patronGroupId, - String operation, - UUID instanceId, UUID requestId, - UUID requesterId, UUID itemId) { - log.info("getAllowedServicePoints:: params: patronGroupId={}, operation={}, instanceId={}, " + - "requestId={}, requesterId={}, itemId={}", patronGroupId, operation, instanceId, requestId, - requesterId, itemId); + public AllowedServicePoints getAllowedServicePoints(AllowedServicePointParams params, String tenantId) { + log.info("getAllowedServicePoints:: params: {}", params); if (settingsService.isEcsTlrFeatureEnabled(tenantId) && userTenantsService.isCentralTenant(tenantId)) { log.info("getAllowedServicePoints:: Ecs TLR Feature is enabled. Getting allowed service " + "points from mod-tlr module"); - return ecsTlrClient.getAllowedServicePoints(operation, requesterId, instanceId, requestId, - itemId); + return ecsTlrClient.getAllowedServicePoints(params.getOperation(), params.getRequesterId(), + params.getInstanceId(), params.getRequestId(), params.getItemId()); } else { log.info("getAllowedServicePoints:: Ecs TLR Feature is disabled. Getting allowed service " + "points from mod-circulation module"); - return circulationClient.allowedServicePoints(operation, requesterId, - instanceId, itemId, requestId, patronGroupId); + return circulationClient.allowedServicePoints(params.getOperation(), params.getRequesterId(), + params.getInstanceId(), params.getItemId(), params.getRequestId(), params.getPatronGroupId()); } } } diff --git a/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java index b450692..700ffa9 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java @@ -14,34 +14,37 @@ @Log4j2 public class SettingsServiceImpl implements SettingsService { - private final EcsTlrClient ecsTlrClient; - private final CirculationClient circulationClient; - private final UserTenantsService userTenantsService; + public static final String ECS_TLR_FEATURE_SETTINGS = "name=ecsTlrFeature"; + private final EcsTlrClient ecsTlrClient; + private final CirculationClient circulationClient; + private final UserTenantsService userTenantsService; - @Override - public boolean isEcsTlrFeatureEnabled(String tenantId) { - if (userTenantsService.isCentralTenant(tenantId)) { - return getTlrSettings(); - } - return getCirculationSettings(); + @Override + public boolean isEcsTlrFeatureEnabled(String tenantId) { + if (userTenantsService.isCentralTenant(tenantId)) { + return getTlrSettings(); } + return getCirculationSettings(); + } - private boolean getTlrSettings() { - log.info("getTlrSettings:: Getting TLR settings"); - return ecsTlrClient.getTlrSettings().getEcsTlrFeatureEnabled(); - } + private boolean getTlrSettings() { + log.debug("getTlrSettings:: Getting TLR settings"); + return ecsTlrClient.getTlrSettings().getEcsTlrFeatureEnabled(); + } - private boolean getCirculationSettings() { - log.info("getCirculationSettings:: Getting circulation settings"); - var circulationSettingsResponse = circulationClient.getEcsTlrCirculationSettings(); - if (circulationSettingsResponse.getTotalRecords() > 0) { - try { - var circulationSettings = circulationSettingsResponse.getCirculationSettings().get(0); - return circulationSettings.getValue().getEnabled(); - } catch (Exception e) { - log.error("getCirculationSettings:: Failed to parse circulation settings", e); - } + private boolean getCirculationSettings() { + log.debug("getCirculationSettings:: Getting circulation settings"); + var circulationSettingsResponse = circulationClient.getCirculationSettingsByQuery(ECS_TLR_FEATURE_SETTINGS); + if (circulationSettingsResponse.getTotalRecords() > 0) { + try { + var circulationSettings = circulationSettingsResponse.getCirculationSettings().get(0); + log.info("getCirculationSettings:: circulation settings: {}", + circulationSettings.getValue()); + return circulationSettings.getValue().getEnabled(); + } catch (Exception e) { + log.error("getCirculationSettings:: Failed to parse circulation settings", e); } - return false; } + return false; + } } diff --git a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java index 5022228..496805c 100644 --- a/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java +++ b/src/test/java/org/folio/circulationbff/api/CirculationBffRequestsApiTest.java @@ -28,7 +28,6 @@ import org.springframework.http.MediaType; import com.github.tomakehurst.wiremock.client.WireMock; -import com.github.tomakehurst.wiremock.stubbing.StubMapping; class CirculationBffRequestsApiTest extends BaseIT { private static final String SEARCH_INSTANCES_URL_PATH = @@ -56,18 +55,9 @@ void callsModTlrWhenEcsTlrEnabledInCentralTenant() { var userTenant = new UserTenant(UUID.randomUUID().toString(), TENANT_ID_CONSORTIUM); userTenant.setCentralTenantId(TENANT_ID_CONSORTIUM); - wireMockServer.stubFor(WireMock.get(urlPathEqualTo(USER_TENANTS_URL)) - .withQueryParam("limit", matching("\\d*")) // matches any integer or no value - .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) - .willReturn(jsonResponse(asJsonString(new UserTenantCollection().addUserTenantsItem(userTenant)), - SC_OK))); - - TlrSettings tlrSettings = new TlrSettings(); - tlrSettings.setEcsTlrFeatureEnabled(true); - wireMockServer.stubFor(WireMock.get(urlMatching(TLR_SETTINGS_URL)) - .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) - .willReturn(jsonResponse(asJsonString(tlrSettings), SC_OK))); - + mockUserTenants(userTenant, TENANT_ID_CONSORTIUM); + mockEcsTlrSettings(true); + mockAllowedServicePoints(TENANT_ID_CONSORTIUM); var operation = "create"; var instanceId = UUID.randomUUID(); @@ -82,12 +72,6 @@ void callsModTlrWhenEcsTlrEnabledInCentralTenant() { .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) .willReturn(jsonResponse(asJsonString(allowedSpResponseConsortium), SC_OK))); - List stubs = wireMockServer.getStubMappings(); - // Print all stub mappings - for (StubMapping stub : stubs) { - System.out.println(stub); - } - doGet( ALLOWED_SERVICE_POINT_PATH + format("?operation=create&requestId=%s&instanceId=%s&patronGroupId=%s", requestId, instanceId, patronGroupId), TENANT_ID_CONSORTIUM) @@ -106,32 +90,9 @@ void callsModTlrWhenEcsTlrEnabledInCentralTenant() { void callsCirculationWhenEcsTlrDisabledOnDataTenant() { var userTenant = new UserTenant(UUID.randomUUID().toString(), TENANT_ID_COLLEGE); userTenant.setCentralTenantId(TENANT_ID_CONSORTIUM); - wireMockServer.stubFor(WireMock.get(urlPathEqualTo(USER_TENANTS_URL)) - .withQueryParam("limit", matching("\\d*")) - .withHeader(HEADER_TENANT, equalTo(TENANT_ID_COLLEGE)) - .willReturn(jsonResponse(asJsonString(new UserTenantCollection().addUserTenantsItem(userTenant)), - SC_OK))); - - var circulationSettingsResponse = new CirculationSettingsResponse(); - circulationSettingsResponse.setTotalRecords(1); - circulationSettingsResponse.setCirculationSettings(List.of( - new CirculationSettings() - .name("ecsTlrFeature") - .value(new CirculationSettingsValue().enabled(true)) - )); - wireMockServer.stubFor(WireMock.get(urlPathEqualTo(CIRCULATION_SETTINGS_URL)) - .withQueryParam("query", equalTo("name=ecsTlrFeature")) - .withHeader(HEADER_TENANT, equalTo(TENANT_ID_COLLEGE)) - .willReturn(jsonResponse(asJsonString(circulationSettingsResponse), - SC_OK))); - - var allowedSpResponseConsortium = new AllowedServicePoints(); - allowedSpResponseConsortium.setHold(Set.of( - buildAllowedServicePoint("SP_consortium_1"), - buildAllowedServicePoint("SP_consortium_2"))); - wireMockServer.stubFor(WireMock.get(urlPathEqualTo(CIRCULATION_ALLOWED_SERVICE_POINT_URL)) - .withHeader(HEADER_TENANT, equalTo(TENANT_ID_COLLEGE)) - .willReturn(jsonResponse(asJsonString(allowedSpResponseConsortium), SC_OK))); + mockUserTenants(userTenant, TENANT_ID_COLLEGE); + mockEcsTlrCirculationSettings(true); + mockAllowedServicePoints(TENANT_ID_COLLEGE); var operation = "create"; var instanceId = UUID.randomUUID(); @@ -171,4 +132,45 @@ private AllowedServicePoints1Inner buildAllowedServicePoint(String name) { .id(randomId()) .name(name); } + + private void mockUserTenants(UserTenant userTenant, String requestTenant) { + wireMockServer.stubFor(WireMock.get(urlPathEqualTo(USER_TENANTS_URL)) + .withQueryParam("limit", matching("\\d*")) + .withHeader(HEADER_TENANT, equalTo(requestTenant)) + .willReturn(jsonResponse(asJsonString(new UserTenantCollection().addUserTenantsItem(userTenant)), + SC_OK))); + } + + private void mockEcsTlrCirculationSettings(boolean enabled) { + var circulationSettingsResponse = new CirculationSettingsResponse(); + circulationSettingsResponse.setTotalRecords(1); + circulationSettingsResponse.setCirculationSettings(List.of( + new CirculationSettings() + .name("ecsTlrFeature") + .value(new CirculationSettingsValue().enabled(enabled)) + )); + wireMockServer.stubFor(WireMock.get(urlPathEqualTo(CIRCULATION_SETTINGS_URL)) + .withQueryParam("query", equalTo("name=ecsTlrFeature")) + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_COLLEGE)) + .willReturn(jsonResponse(asJsonString(circulationSettingsResponse), + SC_OK))); + } + + private void mockEcsTlrSettings(boolean enabled) { + TlrSettings tlrSettings = new TlrSettings(); + tlrSettings.setEcsTlrFeatureEnabled(enabled); + wireMockServer.stubFor(WireMock.get(urlMatching(TLR_SETTINGS_URL)) + .withHeader(HEADER_TENANT, equalTo(TENANT_ID_CONSORTIUM)) + .willReturn(jsonResponse(asJsonString(tlrSettings), SC_OK))); + } + + private void mockAllowedServicePoints(String requestTenant) { + var allowedSpResponseConsortium = new AllowedServicePoints(); + allowedSpResponseConsortium.setHold(Set.of( + buildAllowedServicePoint("SP_consortium_1"), + buildAllowedServicePoint("SP_consortium_2"))); + wireMockServer.stubFor(WireMock.get(urlPathEqualTo(CIRCULATION_ALLOWED_SERVICE_POINT_URL)) + .withHeader(HEADER_TENANT, equalTo(requestTenant)) + .willReturn(jsonResponse(asJsonString(allowedSpResponseConsortium), SC_OK))); + } } From 1631082b552aeaef666b82bc4facfe58c150d05c Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Mon, 30 Sep 2024 11:40:42 +0500 Subject: [PATCH 21/24] MCBFF-5 BFF for allowed service points functionality --- .../client/feign/CirculationClient.java | 10 +++------- .../circulationbff/client/feign/EcsTlrClient.java | 11 ++++------- .../controller/CirculationBffController.java | 11 +++++++++-- .../service/impl/CirculationBffServiceImpl.java | 6 ++---- .../service/impl/SettingsServiceImpl.java | 11 +++-------- 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java index cd64236..5b6d5d8 100644 --- a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java +++ b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java @@ -1,22 +1,18 @@ package org.folio.circulationbff.client.feign; -import java.util.UUID; - +import org.folio.circulationbff.domain.dto.AllowedServicePointParams; import org.folio.circulationbff.domain.dto.AllowedServicePoints; import org.folio.circulationbff.domain.dto.CirculationSettingsResponse; import org.folio.spring.config.FeignClientConfiguration; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.cloud.openfeign.SpringQueryMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = "circulation", url = "circulation", configuration = FeignClientConfiguration.class) public interface CirculationClient { - @GetMapping("/requests/allowed-service-points") - AllowedServicePoints allowedServicePoints ( - @RequestParam("operation") String operation, @RequestParam("requesterId") UUID requesterId, - @RequestParam("instanceId") UUID instanceId, @RequestParam("itemId") UUID itemId, - @RequestParam("requestId") UUID requestId, @RequestParam("patronGroupId") UUID patronGroupId); + AllowedServicePoints allowedServicePoints (@SpringQueryMap AllowedServicePointParams params); @GetMapping(value = "/settings") CirculationSettingsResponse getCirculationSettingsByQuery(@RequestParam("query") String query); diff --git a/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java index 7d7473b..746ce72 100644 --- a/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java +++ b/src/main/java/org/folio/circulationbff/client/feign/EcsTlrClient.java @@ -1,23 +1,20 @@ package org.folio.circulationbff.client.feign; -import java.util.UUID; - +import org.folio.circulationbff.domain.dto.AllowedServicePointParams; import org.folio.circulationbff.domain.dto.AllowedServicePoints; import org.folio.circulationbff.domain.dto.TlrSettings; import org.folio.spring.config.FeignClientConfiguration; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.cloud.openfeign.SpringQueryMap; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = "ecs-tlr", url = "tlr", configuration = FeignClientConfiguration.class) public interface EcsTlrClient { @GetMapping("/allowed-service-points") - AllowedServicePoints getAllowedServicePoints(@RequestParam("operation") String operation, - @RequestParam("requesterId") UUID requesterId, @RequestParam("instanceId") UUID instanceId, - @RequestParam("requestId") UUID requestId, @RequestParam("itemId") UUID itemId); + AllowedServicePoints getAllowedServicePoints(@SpringQueryMap AllowedServicePointParams params); @GetMapping("/settings") - TlrSettings getTlrSettings (); + TlrSettings getTlrSettings(); } diff --git a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java index 1232307..91197da 100644 --- a/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java +++ b/src/main/java/org/folio/circulationbff/controller/CirculationBffController.java @@ -31,8 +31,15 @@ public ResponseEntity circulationBffRequestsAllowedService patronGroupId, operation, instanceId, requestId, requesterId, itemId); return ResponseEntity.status(HttpStatus.OK).body(circulationBffService.getAllowedServicePoints( - new AllowedServicePointParams(operation, patronGroupId, instanceId, requestId, requesterId, - itemId), tenantId)); + AllowedServicePointParams.builder() + .operation(operation) + .patronGroupId(patronGroupId) + .instanceId(instanceId) + .requestId(requestId) + .requesterId(requestId) + .itemId(itemId) + .build(), + tenantId)); } @Override diff --git a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java index a8e39ac..4c8adaa 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/CirculationBffServiceImpl.java @@ -28,13 +28,11 @@ public AllowedServicePoints getAllowedServicePoints(AllowedServicePointParams pa if (settingsService.isEcsTlrFeatureEnabled(tenantId) && userTenantsService.isCentralTenant(tenantId)) { log.info("getAllowedServicePoints:: Ecs TLR Feature is enabled. Getting allowed service " + "points from mod-tlr module"); - return ecsTlrClient.getAllowedServicePoints(params.getOperation(), params.getRequesterId(), - params.getInstanceId(), params.getRequestId(), params.getItemId()); + return ecsTlrClient.getAllowedServicePoints(params); } else { log.info("getAllowedServicePoints:: Ecs TLR Feature is disabled. Getting allowed service " + "points from mod-circulation module"); - return circulationClient.allowedServicePoints(params.getOperation(), params.getRequesterId(), - params.getInstanceId(), params.getItemId(), params.getRequestId(), params.getPatronGroupId()); + return circulationClient.allowedServicePoints(params); } } } diff --git a/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java index 700ffa9..fe22e1f 100644 --- a/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java +++ b/src/main/java/org/folio/circulationbff/service/impl/SettingsServiceImpl.java @@ -22,17 +22,12 @@ public class SettingsServiceImpl implements SettingsService { @Override public boolean isEcsTlrFeatureEnabled(String tenantId) { if (userTenantsService.isCentralTenant(tenantId)) { - return getTlrSettings(); + return ecsTlrClient.getTlrSettings().getEcsTlrFeatureEnabled(); } - return getCirculationSettings(); + return isTlrEnabledInCirculationSettings(); } - private boolean getTlrSettings() { - log.debug("getTlrSettings:: Getting TLR settings"); - return ecsTlrClient.getTlrSettings().getEcsTlrFeatureEnabled(); - } - - private boolean getCirculationSettings() { + private boolean isTlrEnabledInCirculationSettings() { log.debug("getCirculationSettings:: Getting circulation settings"); var circulationSettingsResponse = circulationClient.getCirculationSettingsByQuery(ECS_TLR_FEATURE_SETTINGS); if (circulationSettingsResponse.getTotalRecords() > 0) { From 97859b33a78f164a3f54d4b9d63b6e6a4f2a70fa Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Mon, 30 Sep 2024 11:51:09 +0500 Subject: [PATCH 22/24] MCBFF-5 BFF for allowed service points functionality --- .../org/folio/circulationbff/client/feign/CirculationClient.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java index 5b6d5d8..fa47428 100644 --- a/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java +++ b/src/main/java/org/folio/circulationbff/client/feign/CirculationClient.java @@ -12,6 +12,7 @@ @FeignClient(name = "circulation", url = "circulation", configuration = FeignClientConfiguration.class) public interface CirculationClient { + @GetMapping("/requests/allowed-service-points") AllowedServicePoints allowedServicePoints (@SpringQueryMap AllowedServicePointParams params); @GetMapping(value = "/settings") From 5e3d372919dc2e4138956f691c10a0a20841536c Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Mon, 30 Sep 2024 12:01:03 +0500 Subject: [PATCH 23/24] MCBFF-5 BFF for allowed service points functionality --- .../circulationbff/domain/dto/AllowedServicePointParams.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java b/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java index d52e6a4..7e3706e 100644 --- a/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java +++ b/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java @@ -9,8 +9,6 @@ @Data @Builder -@NoArgsConstructor -@AllArgsConstructor public class AllowedServicePointParams { private String operation; From 0d070a61fee657275e930b2bc5ed06485138ced0 Mon Sep 17 00:00:00 2001 From: MagzhanArtykov Date: Mon, 30 Sep 2024 12:05:49 +0500 Subject: [PATCH 24/24] MCBFF-5 BFF for allowed service points functionality --- .../domain/dto/AllowedServicePointParams.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java b/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java index 7e3706e..8003345 100644 --- a/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java +++ b/src/main/java/org/folio/circulationbff/domain/dto/AllowedServicePointParams.java @@ -2,12 +2,10 @@ import java.util.UUID; -import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.Getter; -@Data +@Getter @Builder public class AllowedServicePointParams { private String operation;