From 35d67ce0e865876846326891db1e2e82e3f74b30 Mon Sep 17 00:00:00 2001 From: Saba-Zedginidze-EPAM <148070844+Saba-Zedginidze-EPAM@users.noreply.github.com> Date: Tue, 26 Mar 2024 23:19:33 +0400 Subject: [PATCH] [MODORDSTOR-364] Create routing_list table and API for it (#390) * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it * Fix failing unit tests * [MODORDSTOR-364] Create routing_list table and API for it * [MODORDSTOR-364] Create routing_list table and API for it --- descriptors/ModuleDescriptor-template.json | 71 +++++++++++++++- ramls/acq-models | 2 +- ramls/routing-list.raml | 82 +++++++++++++++++++ .../java/org/folio/models/TableNames.java | 5 +- .../org/folio/rest/impl/RoutingListsAPI.java | 55 +++++++++++++ .../templates/db_scripts/schema.json | 20 +++++ .../org/folio/rest/impl/EntitiesCrudTest.java | 1 + .../java/org/folio/rest/utils/TestData.java | 4 + .../org/folio/rest/utils/TestEntities.java | 3 +- .../c0d13648-347b-4ac9-8c2f-5bc47248b871.json | 10 +++ 10 files changed, 248 insertions(+), 5 deletions(-) create mode 100644 ramls/routing-list.raml create mode 100644 src/main/java/org/folio/rest/impl/RoutingListsAPI.java create mode 100644 src/test/resources/mockdata/routing-lists/c0d13648-347b-4ac9-8c2f-5bc47248b871.json diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index 4fa4f38a..15a5024b 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -592,6 +592,37 @@ } ] }, + { + "id": "orders-storage.routing-lists", + "version": "1.0", + "handlers": [ + { + "methods": ["GET"], + "pathPattern": "/orders-storage/routing-lists", + "permissionsRequired": ["orders-storage.routing-lists.collection.get"] + }, + { + "methods": ["POST"], + "pathPattern": "/orders-storage/routing-lists", + "permissionsRequired": ["orders-storage.routing-lists.item.post"] + }, + { + "methods": ["GET"], + "pathPattern": "/orders-storage/routing-lists/{id}", + "permissionsRequired": ["orders-storage.routing-lists.item.get"] + }, + { + "methods": ["PUT"], + "pathPattern": "/orders-storage/routing-lists/{id}", + "permissionsRequired": ["orders-storage.routing-lists.item.put"] + }, + { + "methods": ["DELETE"], + "pathPattern": "/orders-storage/routing-lists/{id}", + "permissionsRequired": ["orders-storage.routing-lists.item.delete"] + } + ] + }, { "id": "_tenant", "version": "2.0", @@ -1330,6 +1361,43 @@ ], "visible": false }, + { + "permissionName" : "orders-storage.routing-lists.collection.get", + "displayName" : "routing-lists-collection get", + "description" : "Get a collection of routing lists" + }, + { + "permissionName" : "orders-storage.routing-lists.item.post", + "displayName" : "routing-lists-item post", + "description" : "Create a new routing list" + }, + { + "permissionName" : "orders-storage.routing-lists.item.get", + "displayName" : "routing-lists-item get", + "description" : "Fetch a routing list" + }, + { + "permissionName" : "orders-storage.routing-lists.item.put", + "displayName" : "routing-lists-item put", + "description" : "Update a outing list" + }, + { + "permissionName" : "orders-storage.routing-lists.item.delete", + "displayName" : "routing-lists-item delete", + "description" : "Delete a routing list" + }, + { + "permissionName" : "orders-storage.routing-lists.all", + "displayName" : "All routing list perms", + "description" : "All permissions for the routing list", + "subPermissions" : [ + "orders-storage.routing-lists.collection.get", + "orders-storage.routing-lists.item.post", + "orders-storage.routing-lists.item.get", + "orders-storage.routing-lists.item.put", + "orders-storage.routing-lists.item.delete" + ] + }, { "permissionName" : "orders-storage.module.all", "displayName" : "All orders-storage-module perms", @@ -1355,7 +1423,8 @@ "orders-storage.export-history.all", "orders-storage.audit-outbox.all", "orders-storage.claiming.all", - "orders-storage.custom-fields.all" + "orders-storage.custom-fields.all", + "orders-storage.routing-lists.all" ] } ], diff --git a/ramls/acq-models b/ramls/acq-models index 032bb471..849ea407 160000 --- a/ramls/acq-models +++ b/ramls/acq-models @@ -1 +1 @@ -Subproject commit 032bb4715b2911dd002c8e29d3f5a67c886d3e46 +Subproject commit 849ea407d139eb301e28fca5290842883001685e diff --git a/ramls/routing-list.raml b/ramls/routing-list.raml new file mode 100644 index 00000000..70b12361 --- /dev/null +++ b/ramls/routing-list.raml @@ -0,0 +1,82 @@ +#%RAML 1.0 +title: "mod-orders-storage" +baseUri: http://github.com/folio-org/mod-orders-storage +version: v1.0 + +documentation: + - title: Routing List + content: This module implements the CRUD interface for Routing Lists. + +types: + routing-list: !include acq-models/mod-orders-storage/schemas/routing_list.json + routing-list-collection: !include acq-models/mod-orders-storage/schemas/routing_list_collection.json + error: !include raml-util/schemas/error.schema + errors: !include raml-util/schemas/errors.schema + UUID: + 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}$ + +traits: + orderable: !include raml-util/traits/orderable.raml + pageable: !include raml-util/traits/pageable.raml + searchable: !include raml-util/traits/searchable.raml + validate: !include raml-util/traits/validation.raml + +resourceTypes: + collection: !include raml-util/rtypes/collection.raml + collection-item: !include raml-util/rtypes/item-collection.raml + +/orders-storage/routing-lists: + type: + collection: + exampleCollection: !include acq-models/mod-orders-storage/examples/routing_list_collection.sample + exampleItem: !include acq-models/mod-orders-storage/examples/routing_list_get.sample + schemaCollection: routing-list-collection + schemaItem: routing-list + get: + description: Get collection of routing lists + is: [ + searchable: { description: "CQL query", example: "name=MyRoutingList" }, + pageable + ] + post: + description: Create a new routing list record + body: + application/json: + type: routing-list + example: + strict: false + value: !include acq-models/mod-orders-storage/examples/routing_list_get.sample + responses: + 201: + description: "Returns a newly created item, with server-controlled fields like 'id' populated" + body: + application/json: + example: !include acq-models/mod-orders-storage/examples/routing_list_get.sample + 400: + description: "Bad request, e.g. malformed request body or query parameter. Details of the error (e.g. name of the parameter or line/character number with malformed data) provided in the response." + body: + application/json: + type: error + 401: + description: "Not authorized to perform requested action" + body: + application/json: + type: error + 500: + description: "Internal server error, e.g. due to misconfiguration" + body: + application/json: + type: error + /{id}: + uriParameters: + id: + description: The UUID of a Routing List + type: UUID + displayName: Routing List + description: Get, Delete or Update a specific routing list + type: + collection-item: + exampleItem: !include acq-models/mod-orders-storage/examples/routing_list_get.sample + schema: routing-list + diff --git a/src/main/java/org/folio/models/TableNames.java b/src/main/java/org/folio/models/TableNames.java index 6666fc03..90a13ddb 100644 --- a/src/main/java/org/folio/models/TableNames.java +++ b/src/main/java/org/folio/models/TableNames.java @@ -8,7 +8,8 @@ public final class TableNames { public static final String TITLES_TABLE = "titles"; public static final String RECEIVING_HISTORY_VIEW_TABLE = "receiving_history_view"; public static final String EXPORT_HISTORY_TABLE = "export_history"; + public static final String ROUTING_LIST_TABLE = "routing_list"; + + private TableNames() { } - private TableNames() { - } } diff --git a/src/main/java/org/folio/rest/impl/RoutingListsAPI.java b/src/main/java/org/folio/rest/impl/RoutingListsAPI.java new file mode 100644 index 00000000..eaea0ff0 --- /dev/null +++ b/src/main/java/org/folio/rest/impl/RoutingListsAPI.java @@ -0,0 +1,55 @@ +package org.folio.rest.impl; + +import io.vertx.core.AsyncResult; +import io.vertx.core.Context; +import io.vertx.core.Handler; +import org.folio.rest.annotations.Validate; +import org.folio.rest.jaxrs.model.RoutingList; +import org.folio.rest.jaxrs.model.RoutingListCollection; +import org.folio.rest.jaxrs.resource.OrdersStorageRoutingLists; +import org.folio.rest.persist.PgUtil; + +import javax.ws.rs.core.Response; +import java.util.Map; + +import static org.folio.models.TableNames.ROUTING_LIST_TABLE; + +public class RoutingListsAPI implements OrdersStorageRoutingLists { + + @Override + @Validate + public void getOrdersStorageRoutingLists(String query, String totalRecords, int offset, int limit,Map okapiHeaders, + Handler> asyncResultHandler, Context vertxContext) { + PgUtil.get(ROUTING_LIST_TABLE, RoutingList.class, RoutingListCollection.class, query, offset, limit, okapiHeaders, + vertxContext, GetOrdersStorageRoutingListsResponse.class, asyncResultHandler); + } + + @Override + @Validate + public void postOrdersStorageRoutingLists(RoutingList entity, Map okapiHeaders, + Handler> asyncResultHandler, Context vertxContext) { + PgUtil.post(ROUTING_LIST_TABLE, entity, okapiHeaders, vertxContext, PostOrdersStorageRoutingListsResponse.class, asyncResultHandler); + } + + @Override + @Validate + public void getOrdersStorageRoutingListsById(String id, Map okapiHeaders, + Handler> asyncResultHandler, Context vertxContext) { + PgUtil.getById(ROUTING_LIST_TABLE, RoutingList.class, id, okapiHeaders,vertxContext, GetOrdersStorageRoutingListsByIdResponse.class, asyncResultHandler); + } + + @Override + @Validate + public void deleteOrdersStorageRoutingListsById(String id, Map okapiHeaders, + Handler> asyncResultHandler, Context vertxContext) { + PgUtil.deleteById(ROUTING_LIST_TABLE, id, okapiHeaders, vertxContext, DeleteOrdersStorageRoutingListsByIdResponse.class, asyncResultHandler); + } + + @Override + @Validate + public void putOrdersStorageRoutingListsById(String id, RoutingList entity, Map okapiHeaders, + Handler> asyncResultHandler, Context vertxContext) { + PgUtil.put(ROUTING_LIST_TABLE, entity, id, okapiHeaders, vertxContext, PutOrdersStorageRoutingListsByIdResponse.class, asyncResultHandler); + } + +} diff --git a/src/main/resources/templates/db_scripts/schema.json b/src/main/resources/templates/db_scripts/schema.json index fd5b93bd..d589ef58 100644 --- a/src/main/resources/templates/db_scripts/schema.json +++ b/src/main/resources/templates/db_scripts/schema.json @@ -687,6 +687,26 @@ "removeAccents": true } ] + }, + { + "tableName": "routing_list", + "fromModuleVersion": "mod-orders-storage-13.8.0", + "withOptimisticLocking": "failOnConflict", + "withMetadata": true, + "foreignKeys": [ + { + "fieldName": "poLineId", + "targetTable": "po_line", + "targetTableAlias": "poLine", + "tableAlias": "routing_list" + } + ], + "uniqueIndex": [ + { + "fieldName": "name", + "caseSensitive": false + } + ] } ] } diff --git a/src/test/java/org/folio/rest/impl/EntitiesCrudTest.java b/src/test/java/org/folio/rest/impl/EntitiesCrudTest.java index cf66d616..55e0204e 100644 --- a/src/test/java/org/folio/rest/impl/EntitiesCrudTest.java +++ b/src/test/java/org/folio/rest/impl/EntitiesCrudTest.java @@ -29,6 +29,7 @@ public class EntitiesCrudTest extends TestBase { public static Stream deleteOrder() { return Stream.of( + TestEntities.ROUTING_LIST, TestEntities.PIECE, TestEntities.TITLES, TestEntities.ORDER_INVOICE_RELNS, diff --git a/src/test/java/org/folio/rest/utils/TestData.java b/src/test/java/org/folio/rest/utils/TestData.java index 1588c9ad..aad196ab 100644 --- a/src/test/java/org/folio/rest/utils/TestData.java +++ b/src/test/java/org/folio/rest/utils/TestData.java @@ -70,6 +70,10 @@ public interface ExportHistory { String EXPORT_HISTORY_2 = "mockdata/export-history/99fb699a-cdf1-11e9-a9d9-f2801f1b9aa2.json"; } + public interface RoutingList { + String DEFAULT = "mockdata/routing-lists/c0d13648-347b-4ac9-8c2f-5bc47248b871.json"; + } + public interface CustomFields { String PO = "data/custom-fields/custom-field-po.json"; String POL = "data/custom-fields/custom-field-pol.json"; diff --git a/src/test/java/org/folio/rest/utils/TestEntities.java b/src/test/java/org/folio/rest/utils/TestEntities.java index 368113f5..414916fc 100644 --- a/src/test/java/org/folio/rest/utils/TestEntities.java +++ b/src/test/java/org/folio/rest/utils/TestEntities.java @@ -19,7 +19,8 @@ public enum TestEntities { REASON_FOR_CLOSURE("/orders-storage/configuration/reasons-for-closure", ReasonForClosure.class, TestData.ReasonForClosure.DEFAULT, "reason", "New reason for closure", 1), PREFIX("/orders-storage/configuration/prefixes", Prefix.class, TestData.Prefix.DEFAULT , "description", "New description", 1), SUFFIX("/orders-storage/configuration/suffixes", Suffix.class, TestData.Suffix.DEFAULT, "description", "New description", 1), - EXPORT_HISTORY("/orders-storage/export-history", ExportHistory.class, TestData.ExportHistory.EXPORT_HISTORY_1, "exportType", "BURSAR_FEES_FINES", 1); + EXPORT_HISTORY("/orders-storage/export-history", ExportHistory.class, TestData.ExportHistory.EXPORT_HISTORY_1, "exportType", "BURSAR_FEES_FINES", 1), + ROUTING_LIST("/orders-storage/routing-lists", RoutingList.class, TestData.RoutingList.DEFAULT, "notes", "Updated notes", 0); TestEntities(String endpoint, Class clazz, String sampleFileName, String updatedFieldName, String updatedFieldValue, int initialQuantity) { this.endpoint = endpoint; diff --git a/src/test/resources/mockdata/routing-lists/c0d13648-347b-4ac9-8c2f-5bc47248b871.json b/src/test/resources/mockdata/routing-lists/c0d13648-347b-4ac9-8c2f-5bc47248b871.json new file mode 100644 index 00000000..2214076b --- /dev/null +++ b/src/test/resources/mockdata/routing-lists/c0d13648-347b-4ac9-8c2f-5bc47248b871.json @@ -0,0 +1,10 @@ +{ + "id": "c0d13648-347b-4ac9-8c2f-5bc47248b871", + "_version": 1, + "name": "List name", + "notes": "Original notes", + "userIds": [ + "d926d900-e27d-46d6-bba8-31e9d5c2cf44" + ], + "poLineId": "baec48dd-1594-2712-be8f-de336bc83fcc" +}