Skip to content

Commit

Permalink
CIRC-1933: Implementation for Search Slips API (#1391)
Browse files Browse the repository at this point in the history
* CIRC-1933 Implementation of search slips API

* CIRC-1933 Tests

* CIRC-1933 Address review comments

* CIRC-1933 Fix code smells
OleksandrVidinieiev authored Dec 26, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent 2ea8d87 commit d73104b
Showing 8 changed files with 402 additions and 293 deletions.
19 changes: 18 additions & 1 deletion descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
@@ -69,6 +69,7 @@
"circulation.search-slips.get"
],
"modulePermissions": [
"modperms.circulation.search-slips.get"
]
}
]
@@ -1557,7 +1558,8 @@
"circulation.requests.hold-shelf-clearance-report.get",
"circulation.requests.allowed-service-points.get",
"circulation.inventory.items-in-transit-report.get",
"circulation.pick-slips.get"
"circulation.pick-slips.get",
"circulation.search-slips.get"
]
},
{
@@ -2321,6 +2323,21 @@
],
"visible": false
},
{
"permissionName": "modperms.circulation.search-slips.get",
"displayName": "module permissions for one op",
"description": "to reduce X-Okapi-Token size",
"subPermissions": [
"circulation.internal.fetch-items",
"circulation-storage.requests.item.get",
"circulation-storage.requests.collection.get",
"users.item.get",
"users.collection.get",
"addresstypes.item.get",
"addresstypes.collection.get"
],
"visible": false
},
{
"permissionName": "circulation.internal.fetch-items",
"displayName" : "Fetch item(s)",
8 changes: 4 additions & 4 deletions ramls/staff-slips.raml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#%RAML 1.0
title: Stuff Slips
title: Staff Slips
version: v0.3
protocols: [ HTTP, HTTPS ]
baseUri: http://localhost:9130
@@ -9,7 +9,7 @@ documentation:
content: <b>API for staff slips generation</b>

types:
stuff-slips: !include staff-slips-response.json
staff-slips: !include staff-slips-response.json

traits:
language: !include raml-util/traits/language.raml
@@ -23,10 +23,10 @@ resourceTypes:
type:
collection-get:
exampleCollection: !include examples/staff-slips-response.json
schemaCollection: stuff-slips
schemaCollection: staff-slips
/search-slips:
/{servicePointId}:
type:
collection-get:
exampleCollection: !include examples/staff-slips-response.json
schemaCollection: stuff-slips
schemaCollection: staff-slips
Original file line number Diff line number Diff line change
@@ -25,6 +25,7 @@
import java.util.Arrays;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;

public class RequestTypeItemStatusWhiteList {
private static EnumMap<ItemStatus, Boolean> recallRules;
@@ -161,4 +162,13 @@ public static List<RequestType> getRequestTypesAllowedForItemStatus(ItemStatus i
.filter(requestType -> requestsRulesMap.get(requestType).get(itemStatus))
.toList();
}

public static List<ItemStatus> getItemStatusesAllowedForRequestType(RequestType requestType) {
return requestsRulesMap.get(requestType)
.entrySet()
.stream()
.filter(entry -> Boolean.TRUE.equals(entry.getValue()))
.map(Map.Entry::getKey)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -47,7 +47,6 @@ public class TemplateContextUtil {
private static final String FEE_ACTION = "feeAction";
private static final String UNLIMITED = "unlimited";
public static final String CURRENT_DATE_TIME = "currentDateTime";
private static final String PICK_SLIPS_KEY = "pickSlips";
private static final String ADDITIONAL_INFO_KEY = "additionalInfo";

private TemplateContextUtil() {
@@ -120,25 +119,30 @@ public static JsonObject createStaffSlipContext(Request request) {
return createStaffSlipContext(request.getItem(), request);
}

public static JsonObject addPrimaryServicePointNameToStaffSlipContext(JsonObject entries, ServicePoint primaryServicePoint) {
log.debug("addPrimaryServicePointNameToStaffSlipContext:: parameters entries: {} primaryServicePoint: {}", entries, primaryServicePoint);
public static JsonObject addPrimaryServicePointNameToStaffSlipContext(JsonObject entries,
ServicePoint primaryServicePoint, String slipsCollectionName) {

log.debug("addPrimaryServicePointNameToStaffSlipContext:: parameters entries: {}, " +
"primaryServicePoint: {}, slipsCollectionName: {}", entries, primaryServicePoint, slipsCollectionName);
if (primaryServicePoint == null) {
log.info("addPrimaryServicePointNameToStaffSlipContext:: primaryServicePoint object is null");
return entries;
}

if (entries == null) {
log.info("addPrimaryServicePointNameToStaffSlipContext:: entries JsonObject is null, primaryServicePointName: {}", primaryServicePoint.getName());
log.info("addPrimaryServicePointNameToStaffSlipContext:: entries JsonObject is null, " +
"primaryServicePointName: {}", primaryServicePoint.getName());
return new JsonObject();
}

entries.getJsonArray(PICK_SLIPS_KEY)
entries.getJsonArray(slipsCollectionName)
.stream()
.map(JsonObject.class::cast)
.map(pickSlip -> pickSlip.getJsonObject(ITEM))
.forEach(item -> item.put("effectiveLocationPrimaryServicePointName", primaryServicePoint.getName()));

log.info("addPrimaryServicePointNameToStaffSlipContext:: Result entries: {}, primaryServicePointName: {}", entries, primaryServicePoint.getName());
log.debug("addPrimaryServicePointNameToStaffSlipContext:: Result entries: {}, " +
"primaryServicePointName: {}", () -> entries, primaryServicePoint::getName);

return entries;
}
135 changes: 3 additions & 132 deletions src/main/java/org/folio/circulation/resources/PickSlipsResource.java
Original file line number Diff line number Diff line change
@@ -1,142 +1,13 @@
package org.folio.circulation.resources;

import static java.util.Collections.emptyList;
import static java.util.concurrent.CompletableFuture.completedFuture;
import static java.util.stream.Collectors.toSet;
import static org.folio.circulation.support.fetching.MultipleCqlIndexValuesCriteria.byIndex;
import static org.folio.circulation.support.fetching.RecordFetching.findWithMultipleCqlIndexValues;
import static org.folio.circulation.support.http.client.CqlQuery.exactMatch;
import static org.folio.circulation.support.results.Result.succeeded;
import static org.folio.circulation.support.results.ResultBinding.flatMapResult;
import static org.folio.circulation.support.utils.LogUtil.multipleRecordsAsString;

import java.lang.invoke.MethodHandles;
import java.util.Collection;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;

import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.folio.circulation.domain.Item;
import org.folio.circulation.domain.ItemStatus;
import org.folio.circulation.domain.Location;
import org.folio.circulation.domain.MultipleRecords;
import org.folio.circulation.domain.Request;
import org.folio.circulation.domain.RequestStatus;
import org.folio.circulation.domain.RequestType;
import org.folio.circulation.domain.notice.TemplateContextUtil;
import org.folio.circulation.infrastructure.storage.ServicePointRepository;
import org.folio.circulation.infrastructure.storage.inventory.ItemRepository;
import org.folio.circulation.infrastructure.storage.inventory.LocationRepository;
import org.folio.circulation.infrastructure.storage.users.AddressTypeRepository;
import org.folio.circulation.infrastructure.storage.users.DepartmentRepository;
import org.folio.circulation.infrastructure.storage.users.PatronGroupRepository;
import org.folio.circulation.infrastructure.storage.users.UserRepository;
import org.folio.circulation.support.Clients;
import org.folio.circulation.support.RouteRegistration;
import org.folio.circulation.support.http.client.CqlQuery;
import org.folio.circulation.support.http.server.JsonHttpResponse;
import org.folio.circulation.support.http.server.WebContext;
import org.folio.circulation.support.results.Result;
import static org.folio.circulation.domain.ItemStatus.PAGED;
import static org.folio.circulation.domain.RequestType.PAGE;

import io.vertx.core.http.HttpClient;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;

public class PickSlipsResource extends SlipsResource {
private static final Logger log = LogManager.getLogger(MethodHandles.lookup().lookupClass());
private static final String PICK_SLIPS_KEY = "pickSlips";
private final String rootPath;


public PickSlipsResource(String rootPath, HttpClient client) {
super(client);
this.rootPath = rootPath;
}

@Override
public void register(Router router) {
RouteRegistration routeRegistration = new RouteRegistration(rootPath, router);
routeRegistration.getMany(this::getMany);
}

protected void getMany(RoutingContext routingContext) {
final WebContext context = new WebContext(routingContext);
final Clients clients = Clients.create(context, client);

final var userRepository = new UserRepository(clients);
final var itemRepository = new ItemRepository(clients);
final AddressTypeRepository addressTypeRepository = new AddressTypeRepository(clients);
final ServicePointRepository servicePointRepository = new ServicePointRepository(clients);
final PatronGroupRepository patronGroupRepository = new PatronGroupRepository(clients);
final DepartmentRepository departmentRepository = new DepartmentRepository(clients);
final UUID servicePointId = UUID.fromString(
routingContext.request().getParam(SERVICE_POINT_ID_PARAM));

fetchLocationsForServicePoint(servicePointId, clients)
.thenComposeAsync(r -> r.after(locations -> fetchPagedItemsForLocations(locations,
itemRepository, LocationRepository.using(clients, servicePointRepository))))
.thenComposeAsync(r -> r.after(items -> fetchOpenPageRequestsForItems(items, clients)))
.thenComposeAsync(r -> r.after(userRepository::findUsersForRequests))
.thenComposeAsync(result -> result.after(patronGroupRepository::findPatronGroupsForRequestsUsers))
.thenComposeAsync(r -> r.after(departmentRepository::findDepartmentsForRequestUsers))
.thenComposeAsync(r -> r.after(addressTypeRepository::findAddressTypesForRequests))
.thenComposeAsync(r -> r.after(servicePointRepository::findServicePointsForRequests))
.thenApply(flatMapResult(requests -> mapResultToJson(requests, PICK_SLIPS_KEY)))
.thenComposeAsync(r -> r.combineAfter(() -> servicePointRepository.getServicePointById(servicePointId),
TemplateContextUtil::addPrimaryServicePointNameToStaffSlipContext))
.thenApply(r -> r.map(JsonHttpResponse::ok))
.thenAccept(context::writeResultToHttpResponse);
}

private CompletableFuture<Result<Collection<Item>>> fetchPagedItemsForLocations(
MultipleRecords<Location> multipleLocations,
ItemRepository itemRepository, LocationRepository locationRepository) {

log.debug("fetchPagedItemsForLocations:: parameters multipleLocations: {}",
() -> multipleRecordsAsString(multipleLocations));
Collection<Location> locations = multipleLocations.getRecords();

Set<String> locationIds = locations.stream()
.map(Location::getId)
.filter(StringUtils::isNoneBlank)
.collect(toSet());

if (locationIds.isEmpty()) {
log.info("fetchPagedItemsForLocations:: locationIds is empty");

return completedFuture(succeeded(emptyList()));
}

Result<CqlQuery> statusQuery = exactMatch(STATUS_NAME_KEY, ItemStatus.PAGED.getValue());

return itemRepository.findByIndexNameAndQuery(locationIds, EFFECTIVE_LOCATION_ID_KEY, statusQuery)
.thenComposeAsync(r -> r.after(items -> fetchLocationDetailsForItems(items, locations,
locationRepository)));
}

private CompletableFuture<Result<MultipleRecords<Request>>> fetchOpenPageRequestsForItems(
Collection<Item> items, Clients clients) {

Set<String> itemIds = items.stream()
.map(Item::getItemId)
.filter(StringUtils::isNoneBlank)
.collect(toSet());

if (itemIds.isEmpty()) {
log.info("fetchOpenPageRequestsForItems:: itemIds is empty");

return completedFuture(succeeded(MultipleRecords.empty()));
}

final Result<CqlQuery> typeQuery = exactMatch(REQUEST_TYPE_KEY, RequestType.PAGE.getValue());
final Result<CqlQuery> statusQuery = exactMatch(STATUS_KEY, RequestStatus.OPEN_NOT_YET_FILLED.getValue());
final Result<CqlQuery> statusAndTypeQuery = typeQuery.combine(statusQuery, CqlQuery::and);

return findWithMultipleCqlIndexValues(clients.requestsStorage(), REQUESTS_KEY, Request::from)
.find(byIndex(ITEM_ID_KEY, itemIds).withQuery(statusAndTypeQuery))
.thenApply(flatMapResult(requests -> matchItemsToRequests(requests, items)));
super(rootPath, client, "pickSlips", PAGE, PAGED);
}
}
Original file line number Diff line number Diff line change
@@ -1,46 +1,13 @@
package org.folio.circulation.resources;

import static org.folio.circulation.support.results.Result.ofAsync;
import static org.folio.circulation.support.results.ResultBinding.flatMapResult;

import java.util.concurrent.CompletableFuture;

import org.folio.circulation.domain.MultipleRecords;
import org.folio.circulation.domain.Request;
import org.folio.circulation.support.RouteRegistration;
import org.folio.circulation.support.http.server.JsonHttpResponse;
import org.folio.circulation.support.http.server.WebContext;
import org.folio.circulation.support.results.Result;
import static org.folio.circulation.domain.RequestType.HOLD;
import static org.folio.circulation.domain.RequestTypeItemStatusWhiteList.getItemStatusesAllowedForRequestType;

import io.vertx.core.http.HttpClient;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;

public class SearchSlipsResource extends SlipsResource {
private static final String SEARCH_SLIPS_KEY = "searchSlips";
private final String rootPath;

public SearchSlipsResource(String rootPath, HttpClient client) {
super(client);
this.rootPath = rootPath;
}

@Override
public void register(Router router) {
RouteRegistration routeRegistration = new RouteRegistration(rootPath, router);
routeRegistration.getMany(this::getMany);
}

protected void getMany(RoutingContext routingContext) {
final WebContext context = new WebContext(routingContext);

fetchHoldRequests()
.thenApply(flatMapResult(requests -> mapResultToJson(requests, SEARCH_SLIPS_KEY)))
.thenApply(r -> r.map(JsonHttpResponse::ok))
.thenAccept(context::writeResultToHttpResponse);
}

private CompletableFuture<Result<MultipleRecords<Request>>> fetchHoldRequests() {
return ofAsync(MultipleRecords.empty());
super(rootPath, client, "searchSlips", HOLD, getItemStatusesAllowedForRequestType(HOLD));
}
}
173 changes: 148 additions & 25 deletions src/main/java/org/folio/circulation/resources/SlipsResource.java
Original file line number Diff line number Diff line change
@@ -5,8 +5,11 @@
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.toSet;
import static org.folio.circulation.support.fetching.MultipleCqlIndexValuesCriteria.byIndex;
import static org.folio.circulation.support.fetching.RecordFetching.findWithCqlQuery;
import static org.folio.circulation.support.fetching.RecordFetching.findWithMultipleCqlIndexValues;
import static org.folio.circulation.support.http.client.CqlQuery.exactMatch;
import static org.folio.circulation.support.http.client.CqlQuery.exactMatchAny;
import static org.folio.circulation.support.results.Result.succeeded;
import static org.folio.circulation.support.results.ResultBinding.flatMapResult;
import static org.folio.circulation.support.utils.LogUtil.collectionAsString;
@@ -20,46 +23,110 @@
import java.util.UUID;
import java.util.concurrent.CompletableFuture;

import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.folio.circulation.domain.Item;
import org.folio.circulation.domain.ItemStatus;
import org.folio.circulation.domain.Location;
import org.folio.circulation.domain.MultipleRecords;
import org.folio.circulation.domain.Request;
import org.folio.circulation.domain.RequestStatus;
import org.folio.circulation.domain.RequestType;
import org.folio.circulation.domain.ServicePoint;
import org.folio.circulation.domain.notice.TemplateContextUtil;
import org.folio.circulation.infrastructure.storage.ServicePointRepository;
import org.folio.circulation.infrastructure.storage.inventory.ItemRepository;
import org.folio.circulation.infrastructure.storage.inventory.LocationRepository;
import org.folio.circulation.infrastructure.storage.users.AddressTypeRepository;
import org.folio.circulation.infrastructure.storage.users.DepartmentRepository;
import org.folio.circulation.infrastructure.storage.users.PatronGroupRepository;
import org.folio.circulation.infrastructure.storage.users.UserRepository;
import org.folio.circulation.storage.mappers.LocationMapper;
import org.folio.circulation.support.Clients;
import org.folio.circulation.support.RouteRegistration;
import org.folio.circulation.support.http.client.CqlQuery;
import org.folio.circulation.support.http.client.PageLimit;
import org.folio.circulation.support.http.server.JsonHttpResponse;
import org.folio.circulation.support.http.server.WebContext;
import org.folio.circulation.support.results.Result;

import io.vertx.core.http.HttpClient;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;

public abstract class SlipsResource extends Resource {
protected static final String LOCATIONS_KEY = "locations";
protected static final String STATUS_KEY = "status";
protected static final String REQUESTS_KEY = "requests";
protected static final String ITEM_ID_KEY = "itemId";
protected static final String STATUS_NAME_KEY = "status.name";
protected static final String REQUEST_TYPE_KEY = "requestType";
protected static final String TOTAL_RECORDS_KEY = "totalRecords";
protected static final String SERVICE_POINT_ID_PARAM = "servicePointId";
protected static final String EFFECTIVE_LOCATION_ID_KEY = "effectiveLocationId";
protected static final String PRIMARY_SERVICE_POINT_KEY = "primaryServicePoint";

protected static final PageLimit LOCATIONS_LIMIT = PageLimit.oneThousand();
protected static final Logger log = LogManager.getLogger(MethodHandles.lookup().lookupClass());


protected SlipsResource(HttpClient client) {
private static final Logger log = LogManager.getLogger(MethodHandles.lookup().lookupClass());
private static final PageLimit LOCATIONS_LIMIT = PageLimit.oneThousand();
private static final String LOCATIONS_KEY = "locations";
private static final String STATUS_KEY = "status";
private static final String REQUESTS_KEY = "requests";
private static final String ITEM_ID_KEY = "itemId";
private static final String STATUS_NAME_KEY = "status.name";
private static final String REQUEST_TYPE_KEY = "requestType";
private static final String TOTAL_RECORDS_KEY = "totalRecords";
private static final String SERVICE_POINT_ID_PARAM = "servicePointId";
private static final String EFFECTIVE_LOCATION_ID_KEY = "effectiveLocationId";
private static final String PRIMARY_SERVICE_POINT_KEY = "primaryServicePoint";

private final String rootPath;
private final String collectionName;
private final RequestType requestType;
private final Collection<ItemStatus> itemStatuses;

protected SlipsResource(String rootPath, HttpClient client, String collectionName,
RequestType requestType, ItemStatus itemStatus) {

this(rootPath, client, collectionName, requestType, List.of(itemStatus));
}

protected SlipsResource(String rootPath, HttpClient client, String collectionName,
RequestType requestType, Collection<ItemStatus> itemStatuses) {

super(client);
this.rootPath = rootPath;
this.requestType = requestType;
this.itemStatuses = itemStatuses;
this.collectionName = collectionName;
}

@Override
public void register(Router router) {
RouteRegistration routeRegistration = new RouteRegistration(rootPath, router);
routeRegistration.getMany(this::getMany);
}

protected abstract void getMany(RoutingContext routingContext);
private void getMany(RoutingContext routingContext) {
final WebContext context = new WebContext(routingContext);
final Clients clients = Clients.create(context, client);

final var userRepository = new UserRepository(clients);
final var itemRepository = new ItemRepository(clients);
final var addressTypeRepository = new AddressTypeRepository(clients);
final var servicePointRepository = new ServicePointRepository(clients);
final var patronGroupRepository = new PatronGroupRepository(clients);
final var departmentRepository = new DepartmentRepository(clients);
final UUID servicePointId = UUID.fromString(
routingContext.request().getParam(SERVICE_POINT_ID_PARAM));

protected CompletableFuture<Result<MultipleRecords<Location>>> fetchLocationsForServicePoint(
fetchLocationsForServicePoint(servicePointId, clients)
.thenComposeAsync(r -> r.after(locations -> fetchItemsForLocations(locations,
itemRepository, LocationRepository.using(clients, servicePointRepository))))
.thenComposeAsync(r -> r.after(items -> fetchRequests(items, clients)))
.thenComposeAsync(r -> r.after(userRepository::findUsersForRequests))
.thenComposeAsync(result -> result.after(patronGroupRepository::findPatronGroupsForRequestsUsers))
.thenComposeAsync(r -> r.after(departmentRepository::findDepartmentsForRequestUsers))
.thenComposeAsync(r -> r.after(addressTypeRepository::findAddressTypesForRequests))
.thenComposeAsync(r -> r.after(servicePointRepository::findServicePointsForRequests))
.thenApply(flatMapResult(this::mapResultToJson))
.thenComposeAsync(r -> r.combineAfter(() -> servicePointRepository.getServicePointById(servicePointId),
this::addPrimaryServicePointNameToStaffSlipContext))
.thenApply(r -> r.map(JsonHttpResponse::ok))
.thenAccept(context::writeResultToHttpResponse);
}

private CompletableFuture<Result<MultipleRecords<Location>>> fetchLocationsForServicePoint(
UUID servicePointId, Clients clients) {

log.debug("fetchLocationsForServicePoint:: parameters servicePointId: {}", servicePointId);
@@ -68,7 +135,58 @@ protected CompletableFuture<Result<MultipleRecords<Location>>> fetchLocationsFor
.findByQuery(exactMatch(PRIMARY_SERVICE_POINT_KEY, servicePointId.toString()), LOCATIONS_LIMIT);
}

protected CompletableFuture<Result<Collection<Item>>> fetchLocationDetailsForItems(
private CompletableFuture<Result<Collection<Item>>> fetchItemsForLocations(
MultipleRecords<Location> multipleLocations,
ItemRepository itemRepository, LocationRepository locationRepository) {

log.debug("fetchPagedItemsForLocations:: parameters multipleLocations: {}",
() -> multipleRecordsAsString(multipleLocations));
Collection<Location> locations = multipleLocations.getRecords();
Set<String> locationIds = locations.stream()
.map(Location::getId)
.filter(StringUtils::isNoneBlank)
.collect(toSet());

if (locationIds.isEmpty()) {
log.info("fetchPagedItemsForLocations:: locationIds is empty");

return completedFuture(succeeded(emptyList()));
}

List<String> itemStatusValues = itemStatuses.stream()
.map(ItemStatus::getValue)
.toList();
Result<CqlQuery> statusQuery = exactMatchAny(STATUS_NAME_KEY, itemStatusValues);

return itemRepository.findByIndexNameAndQuery(locationIds, EFFECTIVE_LOCATION_ID_KEY, statusQuery)
.thenComposeAsync(r -> r.after(items -> fetchLocationDetailsForItems(items, locations,
locationRepository)));
}

private CompletableFuture<Result<MultipleRecords<Request>>> fetchRequests(
Collection<Item> items, Clients clients) {

Set<String> itemIds = items.stream()
.map(Item::getItemId)
.filter(StringUtils::isNoneBlank)
.collect(toSet());

if (itemIds.isEmpty()) {
log.info("fetchOpenPageRequestsForItems:: itemIds is empty");

return completedFuture(succeeded(MultipleRecords.empty()));
}

final Result<CqlQuery> typeQuery = exactMatch(REQUEST_TYPE_KEY, requestType.getValue());
final Result<CqlQuery> statusQuery = exactMatch(STATUS_KEY, RequestStatus.OPEN_NOT_YET_FILLED.getValue());
final Result<CqlQuery> statusAndTypeQuery = typeQuery.combine(statusQuery, CqlQuery::and);

return findWithMultipleCqlIndexValues(clients.requestsStorage(), REQUESTS_KEY, Request::from)
.find(byIndex(ITEM_ID_KEY, itemIds).withQuery(statusAndTypeQuery))
.thenApply(flatMapResult(requests -> matchItemsToRequests(requests, items)));
}

private CompletableFuture<Result<Collection<Item>>> fetchLocationDetailsForItems(
MultipleRecords<Item> items, Collection<Location> locationsForServicePoint,
LocationRepository locationRepository) {

@@ -93,7 +211,7 @@ protected CompletableFuture<Result<Collection<Item>>> fetchLocationDetailsForIte
.thenApply(flatMapResult(locations -> matchLocationsToItems(items, locations)));
}

protected Result<Collection<Item>> matchLocationsToItems(
private Result<Collection<Item>> matchLocationsToItems(
MultipleRecords<Item> items, Collection<Location> locations) {

log.debug("matchLocationsToItems:: parameters items: {}, locations: {}",
@@ -108,7 +226,7 @@ protected Result<Collection<Item>> matchLocationsToItems(
.getRecords());
}

protected Result<MultipleRecords<Request>> matchItemsToRequests(
private Result<MultipleRecords<Request>> matchItemsToRequests(
MultipleRecords<Request> requests, Collection<Item> items) {

Map<String, Item> itemMap = items.stream()
@@ -118,17 +236,22 @@ protected Result<MultipleRecords<Request>> matchItemsToRequests(
itemMap.getOrDefault(request.getItemId(), null))));
}

protected Result<JsonObject> mapResultToJson(MultipleRecords<Request> requests,
String slipsKey) {

private Result<JsonObject> mapResultToJson(MultipleRecords<Request> requests) {
log.debug("mapResultToJson:: parameters requests: {}", () -> multipleRecordsAsString(requests));
List<JsonObject> representations = requests.getRecords().stream()
.map(TemplateContextUtil::createStaffSlipContext)
.toList();
JsonObject jsonRepresentations = new JsonObject()
.put(slipsKey, representations)
.put(collectionName, representations)
.put(TOTAL_RECORDS_KEY, representations.size());

return succeeded(jsonRepresentations);
}

private JsonObject addPrimaryServicePointNameToStaffSlipContext(JsonObject context,
ServicePoint servicePoint) {

return TemplateContextUtil.addPrimaryServicePointNameToStaffSlipContext(
context, servicePoint, collectionName);
}
}

Large diffs are not rendered by default.

0 comments on commit d73104b

Please sign in to comment.