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"
+}