|
1 | 1 | package org.folio.service.finance; |
2 | 2 |
|
| 3 | +import static one.util.streamex.StreamEx.ofSubLists; |
3 | 4 | import static org.folio.orders.utils.CacheUtils.buildAsyncCache; |
| 5 | +import static org.folio.orders.utils.HelperUtils.collectResultsOnSuccess; |
| 6 | +import static org.folio.orders.utils.QueryUtils.convertIdsToCqlQuery; |
4 | 7 | import static org.folio.orders.utils.ResourcePathResolver.FISCAL_YEARS; |
5 | 8 | import static org.folio.orders.utils.ResourcePathResolver.LEDGER_CURRENT_FISCAL_YEAR; |
6 | 9 | import static org.folio.orders.utils.ResourcePathResolver.resourceByIdPath; |
7 | 10 | import static org.folio.orders.utils.ResourcePathResolver.resourcesPath; |
| 11 | +import static org.folio.rest.RestConstants.MAX_IDS_FOR_GET_RQ_15; |
8 | 12 | import static org.folio.rest.core.exceptions.ErrorCodes.CURRENT_FISCAL_YEAR_NOT_FOUND; |
9 | 13 |
|
10 | 14 | import java.time.Instant; |
11 | 15 | import java.time.ZoneId; |
| 16 | +import java.util.ArrayList; |
| 17 | +import java.util.Collection; |
12 | 18 | import java.util.Collections; |
13 | 19 | import java.util.Date; |
| 20 | +import java.util.LinkedHashSet; |
14 | 21 | import java.util.List; |
15 | 22 | import java.util.Objects; |
| 23 | +import java.util.Set; |
16 | 24 | import java.util.concurrent.CompletionException; |
| 25 | +import java.util.stream.Collectors; |
17 | 26 |
|
18 | 27 | import com.github.benmanes.caffeine.cache.AsyncCache; |
19 | 28 | import io.vertx.core.Vertx; |
@@ -103,12 +112,32 @@ private Future<String> getSeriesByFiscalYearId(String fiscalYearId, RequestConte |
103 | 112 | .toCompletionStage().toCompletableFuture())); |
104 | 113 | } |
105 | 114 |
|
106 | | - private Future<FiscalYear> getFiscalYearById(String fiscalYearId, RequestContext requestContext) { |
| 115 | + public Future<FiscalYear> getFiscalYearById(String fiscalYearId, RequestContext requestContext) { |
107 | 116 | var requestEntry = new RequestEntry(FISCAL_YEAR_BY_ID_ENDPOINT).withId(fiscalYearId); |
108 | 117 | return restClient.get(requestEntry, FiscalYear.class, requestContext) |
109 | 118 | .onFailure(t -> log.error("Unable to fetch fiscal year by id: {}", fiscalYearId, t)); |
110 | 119 | } |
111 | 120 |
|
| 121 | + public Future<List<FiscalYear>> getAllFiscalYears(Collection<String> fiscalYearIds, RequestContext requestContext) { |
| 122 | + Set<String> uniqueFiscalYearIds = new LinkedHashSet<>(fiscalYearIds); |
| 123 | + return collectResultsOnSuccess( |
| 124 | + ofSubLists(new ArrayList<>(uniqueFiscalYearIds), MAX_IDS_FOR_GET_RQ_15) |
| 125 | + .map(ids-> getAllFiscalYearsByIds(ids, requestContext)) |
| 126 | + .toList()) |
| 127 | + .map(lists -> lists.stream() |
| 128 | + .flatMap(Collection::stream) |
| 129 | + .toList()); |
| 130 | + } |
| 131 | + |
| 132 | + private Future<List<FiscalYear>> getAllFiscalYearsByIds(Collection<String> ids, RequestContext requestContext) { |
| 133 | + String query = convertIdsToCqlQuery(ids); |
| 134 | + RequestEntry requestEntry = new RequestEntry(FISCAL_YEARS_ENDPOINT).withQuery(query) |
| 135 | + .withLimit(MAX_IDS_FOR_GET_RQ_15) |
| 136 | + .withOffset(0); |
| 137 | + return restClient.get(requestEntry, FiscalYearCollection.class, requestContext) |
| 138 | + .map(FiscalYearCollection::getFiscalYears); |
| 139 | + } |
| 140 | + |
112 | 141 | private Future<String> getCurrentFiscalYearForSeries(String series, RequestContext requestContext) { |
113 | 142 | var cacheKey = CACHE_KEY_TEMPLATE.formatted(series, TenantTool.tenantId(requestContext.getHeaders())); |
114 | 143 | return Future.fromCompletionStage(currentFiscalYearCacheBySeries.get(cacheKey, (key, executor) -> |
|
0 commit comments