Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CIRC-2116] Allowed SP endpoint should support patronGroupId parameter #1483

Closed
wants to merge 25 commits into from
Closed
Changes from 2 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
19bf73c
[CIRC-2051] Add ecsRequestRouting parameter to allowed-service-points…
roman-barannyk Apr 15, 2024
e131373
Merge remote-tracking branch 'origin/ecs-tlr-feature' into ecs-tlr-fe…
roman-barannyk Apr 23, 2024
6e3315d
conflicts resolving
roman-barannyk Apr 23, 2024
ae6991d
conflicts resolving
roman-barannyk Apr 24, 2024
32b7e00
CIRC-2081: Fetch TLR settings from mod-settings (#1467)
OleksandrVidinieiev Apr 26, 2024
3167b20
CIRC-2072 Create a facade for instance search
MagzhanArtykov Apr 30, 2024
6676cde
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 2, 2024
1c1cd46
CIRC-2072 Added API test
MagzhanArtykov May 13, 2024
6797c1b
CIRC-2072 Added API test
MagzhanArtykov May 15, 2024
eac3e54
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 20, 2024
1b29087
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 21, 2024
a6e440e
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 23, 2024
1c88c01
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 24, 2024
be46a67
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 24, 2024
9d68320
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 27, 2024
af5a9f7
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 27, 2024
f86281c
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 27, 2024
0702200
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 27, 2024
0b2acfd
CIRC-2072 Create a facade for instance search
MagzhanArtykov May 28, 2024
123dca6
Merge pull request #1471 from folio-org/CIRC-2072b
MagzhanArtykov May 29, 2024
ba47983
Merge branch 'master' into ecs-tlr-feature
OleksandrVidinieiev May 30, 2024
3f6bd4f
CIRC-2101: Fetch item details across tenants (#1474)
OleksandrVidinieiev Jun 6, 2024
5cff758
Merge branch 'master' into ecs-tlr-feature
alexanderkurash Jun 21, 2024
ea17564
CIRC-2109 Pass additional includeRoutingServicePoints parameter when …
alexanderkurash Jul 3, 2024
c6742f8
CIRC-2116 Allowed SP endpoint should support patronGroupId parameter
MagzhanArtykov Jul 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
@@ -649,7 +649,7 @@
},
{
"id": "allowed-service-points",
"version": "1.0",
"version": "1.2",
"handlers": [
{
"methods": [
10 changes: 9 additions & 1 deletion ramls/circulation.raml
Original file line number Diff line number Diff line change
@@ -343,6 +343,14 @@ resourceTypes:
description: "Instance ID"
pattern: "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89abAB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$"
required: false
useStubItem:
description: "When true, allows to apply circulation rules based on patron group only"
type: boolean
required: false
ecsRequestRouting:
description: "When true, returns only service points with ecsRequestRouting"
type: boolean
required: false
responses:
200:
description: "List of allowed service points was retrieved successfully"
@@ -364,4 +372,4 @@ resourceTypes:
description: "Internal server error"
body:
text/plain:
example: "Internal server error"
example: "Internal server error"
Original file line number Diff line number Diff line change
@@ -19,6 +19,9 @@ public class AllowedServicePointsRequest {
private String requesterId;
private String instanceId;
private String itemId;
private String requestId;
private boolean useStubItem;
private boolean ecsRequestRouting;

public boolean isForTitleLevelRequest() {
return instanceId != null;
@@ -27,7 +30,6 @@ public boolean isForTitleLevelRequest() {
public boolean isForItemLevelRequest() {
return itemId != null;
}
private String requestId;

public AllowedServicePointsRequest updateWithRequestInformation(Request request) {
log.debug("updateWithRequestInformation:: parameters request: {}", request);
Original file line number Diff line number Diff line change
@@ -206,22 +206,24 @@ public CompletableFuture<Result<Collection<ServicePoint>>> findServicePointsById
.thenApply(r -> r.map(MultipleRecords::getRecords));
}

public CompletableFuture<Result<Collection<ServicePoint>>> fetchPickupLocationServicePoints() {
public CompletableFuture<Result<Collection<ServicePoint>>> fetchServicePointsByIndexName(
String indexName) {

return createServicePointsFetcher().find(MultipleCqlIndexValuesCriteria.builder()
.indexName("pickupLocation")
.indexName(indexName)
.indexOperator(CqlQuery::matchAny)
.value("true")
.build())
.thenApply(r -> r.map(MultipleRecords::getRecords));
}

public CompletableFuture<Result<Collection<ServicePoint>>> fetchPickupLocationServicePointsByIds(
Set<String> ids) {
public CompletableFuture<Result<Collection<ServicePoint>>>
fetchPickupLocationServicePointsByIdsAndIndexName(Set<String> ids, String indexName) {

log.debug("filterIdsByServicePointsAndPickupLocationExistence:: parameters ids: {}",
() -> collectionAsString(ids));
log.debug("filterIdsByServicePointsAndPickupLocationExistence:: parameters ids: {}, " +
"indexName: {}", () -> collectionAsString(ids), () -> indexName);

Result<CqlQuery> pickupLocationQuery = exactMatch("pickupLocation", "true");
Result<CqlQuery> pickupLocationQuery = exactMatch(indexName, "true");

return createServicePointsFetcher().findByIdIndexAndQuery(ids, "id", pickupLocationQuery)
.thenApply(r -> r.map(MultipleRecords::getRecords));
Original file line number Diff line number Diff line change
@@ -53,7 +53,8 @@ private void get(RoutingContext routingContext) {

ofAsync(routingContext)
.thenApply(r -> r.next(AllowedServicePointsResource::buildRequest))
.thenCompose(r -> r.after(new AllowedServicePointsService(clients)::getAllowedServicePoints))
.thenCompose(r -> r.after(request -> new AllowedServicePointsService(
clients, request.isEcsRequestRouting()).getAllowedServicePoints(request)))
.thenApply(r -> r.map(AllowedServicePointsResource::toJson))
.thenApply(r -> r.map(JsonHttpResponse::ok))
.exceptionally(CommonFailures::failedDueToServerError)
@@ -67,25 +68,12 @@ private static Result<AllowedServicePointsRequest> buildRequest(RoutingContext r
.map(String::toUpperCase)
.map(Request.Operation::valueOf)
.orElse(null);

AllowedServicePointsRequest request = new AllowedServicePointsRequest(operation,
queryParams.get("requesterId"), queryParams.get("instanceId"), queryParams.get("itemId"),
queryParams.get("requestId"));

return validateAllowedServicePointsRequest(request);
}

private static Result<AllowedServicePointsRequest> validateAllowedServicePointsRequest(
AllowedServicePointsRequest allowedServicePointsRequest) {

log.debug("validateAllowedServicePointsRequest:: parameters allowedServicePointsRequest: {}",
allowedServicePointsRequest);

Request.Operation operation = allowedServicePointsRequest.getOperation();
String requesterId = allowedServicePointsRequest.getRequesterId();
String instanceId = allowedServicePointsRequest.getInstanceId();
String itemId = allowedServicePointsRequest.getItemId();
String requestId = allowedServicePointsRequest.getRequestId();
String requesterId = queryParams.get("requesterId");
String instanceId = queryParams.get("instanceId");
String itemId = queryParams.get("itemId");
String requestId = queryParams.get("requestId");
String useStubItem = queryParams.get("useStubItem");
String ecsRequestRouting = queryParams.get("ecsRequestRouting");

List<String> errors = new ArrayList<>();

@@ -110,7 +98,8 @@ private static Result<AllowedServicePointsRequest> validateAllowedServicePointsR
log.warn("Request ID is not a valid UUID: {}", requestId);
errors.add(String.format("Request ID is not a valid UUID: %s.", requestId));
}

validateBoolean(useStubItem, "useStubItem", errors);
validateBoolean(ecsRequestRouting, "ecsRequestRouting", errors);
// Checking parameter combinations

boolean allowedCombinationOfParametersDetected = false;
@@ -154,7 +143,16 @@ private static Result<AllowedServicePointsRequest> validateAllowedServicePointsR
return failed(new BadRequestFailure(errorMessage));
}

return succeeded(allowedServicePointsRequest);
return succeeded(new AllowedServicePointsRequest(operation, requesterId, instanceId, itemId,
requestId, Boolean.parseBoolean(useStubItem), Boolean.parseBoolean(ecsRequestRouting)));
}

private static void validateBoolean(String parameter, String parameterName, List<String> errors) {
if (parameter != null && !"true".equals(parameter) && !"false".equals(parameter)) {
log.warn("validateBoolean:: {} is not a valid boolean: {}",
parameterName, parameter);
errors.add(String.format("%s is not a valid boolean: %s.", parameterName, parameter));
}
}

private static JsonObject toJson(Map<RequestType, Set<AllowedServicePoint>> allowedServicePoints) {
Original file line number Diff line number Diff line change
@@ -57,6 +57,8 @@

public class AllowedServicePointsService {
private static final Logger log = LogManager.getLogger(MethodHandles.lookup().lookupClass());
private static final String ECS_REQUEST_ROUTING_INDEX_NAME = "ecsRequestRouting";
private static final String PICKUP_LOCATION_INDEX_NAME = "pickupLocation";
private final ItemRepository itemRepository;
private final UserRepository userRepository;
private final RequestRepository requestRepository;
@@ -65,8 +67,9 @@ public class AllowedServicePointsService {
private final ItemByInstanceIdFinder itemFinder;
private final ConfigurationRepository configurationRepository;
private final InstanceRepository instanceRepository;
private final String indexName;

public AllowedServicePointsService(Clients clients) {
public AllowedServicePointsService(Clients clients, boolean isEcsRequestRouting) {
itemRepository = new ItemRepository(clients);
userRepository = new UserRepository(clients);
requestRepository = new RequestRepository(clients);
@@ -75,6 +78,7 @@ public AllowedServicePointsService(Clients clients) {
configurationRepository = new ConfigurationRepository(clients);
instanceRepository = new InstanceRepository(clients);
itemFinder = new ItemByInstanceIdFinder(clients.holdingsStorage(), itemRepository);
indexName = isEcsRequestRouting ? ECS_REQUEST_ROUTING_INDEX_NAME : PICKUP_LOCATION_INDEX_NAME;
}

public CompletableFuture<Result<Map<RequestType, Set<AllowedServicePoint>>>>
@@ -353,7 +357,7 @@ private Map<RequestType, Set<AllowedServicePoint>> combineAllowedServicePoints(
}

private CompletableFuture<Result<Set<AllowedServicePoint>>> fetchAllowedServicePoints() {
return servicePointRepository.fetchPickupLocationServicePoints()
return servicePointRepository.fetchServicePointsByIndexName(indexName)
.thenApply(r -> r.map(servicePoints -> servicePoints.stream()
.map(AllowedServicePoint::new)
.collect(Collectors.toSet())));
@@ -365,7 +369,7 @@ private CompletableFuture<Result<Set<AllowedServicePoint>>> fetchPickupLocationS
log.debug("filterIdsByServicePointsAndPickupLocationExistence:: parameters ids: {}",
() -> collectionAsString(ids));

return servicePointRepository.fetchPickupLocationServicePointsByIds(ids)
return servicePointRepository.fetchPickupLocationServicePointsByIdsAndIndexName(ids, indexName)
.thenApply(servicePointsResult -> servicePointsResult
.map(servicePoints -> servicePoints.stream()
.map(AllowedServicePoint::new)
Loading