From 66548af71fa7cc69e54342434249543f24a879b0 Mon Sep 17 00:00:00 2001 From: vijay-eis Date: Mon, 14 Oct 2024 15:04:35 -0400 Subject: [PATCH] Added new endpoint to get service points based on the item --- descriptors/ModuleDescriptor-template.json | 8 ++ ramls/patron.raml | 26 +++++ .../rest/impl/PatronServicesResourceImpl.java | 15 +++ .../rest/impl/PatronResourceImplTest.java | 96 ++++++++++++++++++- ...allowed_service_points_item_not_found.json | 8 ++ 5 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/PatronServicesResourceImpl/allowed_service_points_item_not_found.json diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index 76c93a90..cb18fed9 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -102,6 +102,14 @@ "modulePermissions": [ "circulation.requests.allowed-service-points.get" ] + }, + { + "methods": ["GET"], + "pathPattern": "/patron/account/{accountId}/item/{itemId}/allowed-service-points", + "permissionsRequired": ["patron.hold.allowed-service-points.get"], + "modulePermissions": [ + "circulation.requests.allowed-service-points.get" + ] } ] } diff --git a/ramls/patron.raml b/ramls/patron.raml index b9f8f782..231ec6f4 100644 --- a/ramls/patron.raml +++ b/ramls/patron.raml @@ -358,6 +358,32 @@ traits: description: The UUID of a FOLIO hold request type: string pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$ + /allowed-service-points: + displayName: Allowed service points + description: Services that provides a list of allowed pickup service points + get: + description: | + Returns a list of pickup service points allowed for a particular patron and item + is: [ validate ] + responses: + 200: + description: | + Successfully returns a list of allowed service points + body: + application/json: + type: allowedServicePoints + example: !include examples/allowed-service-points-response.json + 422: + description: Validation error + body: + application/json: + type: errors + 500: + description: | + Internal server error, e.g. due to misconfiguration + body: + text/plain: + example: internal server error, contact administrator /instance: /{instanceId}: uriParameters: diff --git a/src/main/java/org/folio/rest/impl/PatronServicesResourceImpl.java b/src/main/java/org/folio/rest/impl/PatronServicesResourceImpl.java index 9f119c34..21dd9bb1 100644 --- a/src/main/java/org/folio/rest/impl/PatronServicesResourceImpl.java +++ b/src/main/java/org/folio/rest/impl/PatronServicesResourceImpl.java @@ -675,6 +675,16 @@ public void postPatronAccountInstanceHoldByIdAndInstanceId(String id, } } + @Override + public void getPatronAccountItemAllowedServicePointsByIdAndItemId(String requesterId, String itemId, + Map okapiHeaders, Handler> asyncResultHandler, Context vertxContext) { + var httpClient = HttpClientFactory.getHttpClient(vertxContext.owner()); + var queryParameters = Map.of("operation", "create", + "requesterId", requesterId, "itemId", itemId); + + getAllowedServicePoints(okapiHeaders, asyncResultHandler, httpClient, queryParameters); + } + @Override public void getPatronAccountInstanceAllowedServicePointsByIdAndInstanceId(String requesterId, String instanceId, Map okapiHeaders, @@ -684,6 +694,11 @@ public void getPatronAccountInstanceAllowedServicePointsByIdAndInstanceId(String var queryParameters = Map.of("operation", "create", "requesterId", requesterId, "instanceId", instanceId); + getAllowedServicePoints(okapiHeaders, asyncResultHandler, httpClient, queryParameters); + } + + private void getAllowedServicePoints(Map okapiHeaders, Handler> asyncResultHandler, + VertxOkapiHttpClient httpClient, Map queryParameters) { new EcsTlrSettingsService() .isEcsTlrFeatureEnabled(httpClient, okapiHeaders) .thenApply(this::getAllowedServicePointsUrl) diff --git a/src/test/java/org/folio/rest/impl/PatronResourceImplTest.java b/src/test/java/org/folio/rest/impl/PatronResourceImplTest.java index 9dce1abe..ef04a500 100644 --- a/src/test/java/org/folio/rest/impl/PatronResourceImplTest.java +++ b/src/test/java/org/folio/rest/impl/PatronResourceImplTest.java @@ -1301,9 +1301,88 @@ public final void testDeletePatronAccountByIdItemByItemIdHoldByHoldIdWithErrors( // Test done logger.info("Test done"); } + @Test + final void allowedServicePointsForItemShouldSucceed() { + logger.info("Testing allowed service points for Item"); + + var response = given() + .header(tenantHeader) + .header(urlHeader) + .header(contentTypeHeader) + .pathParam("accountId", goodUserId) + .pathParam("itemId", goodItemId) + .log().all() + .when() + .contentType(ContentType.JSON) + .get(accountPath + itemPath + allowedServicePointsPath) + .then() + .log().all() + .and().assertThat().contentType(ContentType.JSON) + .and().assertThat().statusCode(200) + .extract() + .asString(); + + final JsonObject expectedJson = new JsonObject(readMockFile(MOCK_DATA_FOLDER + + "/allowed_sp_mod_patron_expected_response.json")); + verifyAllowedServicePoints(expectedJson, new JsonObject(response)); + logger.info("Test done"); + } @Test - final void allowedServicePointsShouldSucceed() { + final void allowedServicePointsForItemShouldFailWhenModCirculationFails() { + logger.info("Testing allowed service points for item"); + + given() + .header(tenantHeader) + .header(urlHeader) + .header(contentTypeHeader) + .header(new Header(okapiBadDataHeader, "500")) + .pathParam("accountId", goodUserId) + .pathParam("itemId", goodItemId) + .log().all() + .when() + .contentType(ContentType.JSON) + .get(accountPath + itemPath + allowedServicePointsPath) + .then() + .log().all() + .and().assertThat().contentType(TEXT) + .and().assertThat().statusCode(500) + .extract() + .asString(); + + logger.info("Test done"); + } + + @Test + final void allowedServicePointsForItemShouldProxyModCirculationErrors() { + logger.info("Testing allowed service points for item"); + + var response = given() + .header(tenantHeader) + .header(urlHeader) + .header(contentTypeHeader) + .header(new Header(okapiBadDataHeader, "422")) + .pathParam("accountId", goodUserId) + .pathParam("itemId", goodItemId) + .log().all() + .when() + .contentType(ContentType.JSON) + .get(accountPath + itemPath + allowedServicePointsPath) + .then() + .log().all() + .and().assertThat().contentType(JSON) + .and().assertThat().statusCode(422) + .extract() + .asString(); + + final var expected = readMockFile(MOCK_DATA_FOLDER + + "/allowed_service_points_instance_not_found.json"); + assertEquals(new JsonObject(expected), new JsonObject(response)); + + logger.info("Test done"); + } + @Test + final void allowedServicePointsForInstanceShouldSucceed() { logger.info("Testing allowed service points"); var response = given() @@ -1330,7 +1409,7 @@ final void allowedServicePointsShouldSucceed() { } @Test - final void allowedServicePointsShouldFailWhenModCirculationFails() { + final void allowedServicePointsForInstanceShouldFailWhenModCirculationFails() { logger.info("Testing allowed service points"); given() @@ -1355,7 +1434,7 @@ final void allowedServicePointsShouldFailWhenModCirculationFails() { } @Test - final void allowedServicePointsShouldProxyModCirculationErrors() { + final void allowedServicePointsForInstanceShouldProxyModCirculationErrors() { logger.info("Testing allowed service points"); var response = given() @@ -2195,7 +2274,16 @@ else if (req.path().equals("/circulation/requests/allowed-service-points")) { .setStatusCode(200) .putHeader("content-type", "application/json") .end(readMockFile(MOCK_DATA_FOLDER + "/allowed_sp_mod_circulation_response.json")); - } else { + } + else if ("create".equals(req.getParam("operation")) + && goodUserId.equals(req.getParam("requesterId")) + && goodItemId.equals(req.getParam("itemId"))) { + req.response() + .setStatusCode(200) + .putHeader("content-type", "application/json") + .end(readMockFile(MOCK_DATA_FOLDER + "/allowed_sp_mod_circulation_response.json")); + } + else { req.response() .setStatusCode(400) .putHeader("content-type", "text/plain") diff --git a/src/test/resources/PatronServicesResourceImpl/allowed_service_points_item_not_found.json b/src/test/resources/PatronServicesResourceImpl/allowed_service_points_item_not_found.json new file mode 100644 index 00000000..d71de612 --- /dev/null +++ b/src/test/resources/PatronServicesResourceImpl/allowed_service_points_item_not_found.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "message": "Item with ID d5a2f197-23d9-4153-9d79-da7a9f2d4a0d was not found", + "parameters": [] + } + ] +}