Skip to content

Commit 9a4f60e

Browse files
CIRCSTORE-344 Fix issues causing migration to v14.0.0 failure (#345)
* CIRCSTORE-344 Add request without item * CIRCSTORE-344 Change request UUID * CIRCSTORE-344 Fix NPE in TLR migration * CIRCSTORE-344 Remove malformed request * CIRCSTORE-344 Add request without ID * CIRCSTORE-344 Change item ID * CIRCSTORE-344 Add script to delete position * CIRCSTORE-344 Remove unnecessary steps * CIRCSTORE-344 Change error message * CIRCSTORE-344 add test for position removal * CIRCSTORE-344 change TLR migration version from 13.2.0 to 14.0.0 Co-authored-by: Oleksandr Vidinieiev <[email protected]>
1 parent 25e7a84 commit 9a4f60e

File tree

5 files changed

+74
-15
lines changed

5 files changed

+74
-15
lines changed

src/main/java/org/folio/service/tlr/TlrDataMigrationService.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public class TlrDataMigrationService {
5757
// safe number of UUIDs which fits into Okapi's URL length limit (4096 characters)
5858
private static final int BATCH_SIZE = 80;
5959

60-
private static final String TLR_MIGRATION_MODULE_VERSION = "mod-circulation-storage-13.2.0";
60+
private static final String TLR_MIGRATION_MODULE_VERSION = "mod-circulation-storage-14.0.0";
6161
private static final String REQUEST_TABLE = "request";
6262
private static final String ITEMS_STORAGE_URL = "/item-storage/items";
6363
private static final String HOLDINGS_STORAGE_URL = "/holdings-storage/holdings";
@@ -284,16 +284,23 @@ private void buildNewRequest(RequestMigrationContext context) {
284284
JsonObject item = migratedRequest.getJsonObject(ITEM_KEY);
285285
JsonObject instance = new JsonObject();
286286

287-
write(instance, TITLE_KEY, item.getString(TITLE_KEY));
288-
write(instance, IDENTIFIERS_KEY, item.getJsonArray(IDENTIFIERS_KEY));
287+
if (item != null) {
288+
write(instance, TITLE_KEY, item.getString(TITLE_KEY));
289+
write(instance, IDENTIFIERS_KEY, item.getJsonArray(IDENTIFIERS_KEY));
290+
291+
item.remove(TITLE_KEY);
292+
item.remove(IDENTIFIERS_KEY);
293+
}
294+
else {
295+
log.warn("'item' field is missing from request {}, 'instance' field will not be " +
296+
"added", context.getRequestId());
297+
}
298+
289299
write(migratedRequest, INSTANCE_ID_KEY, instanceId);
290300
write(migratedRequest, HOLDINGS_RECORD_ID_KEY, holdingsRecordId);
291301
write(migratedRequest, REQUEST_LEVEL_KEY, ITEM_REQUEST_LEVEL);
292302
write(migratedRequest, INSTANCE_KEY, instance);
293303

294-
item.remove(TITLE_KEY);
295-
item.remove(IDENTIFIERS_KEY);
296-
297304
context.setNewRequest(migratedRequest);
298305
}
299306

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
UPDATE ${myuniversity}_${mymodule}.request
2+
SET jsonb = jsonb - 'position'
3+
WHERE jsonb->>'position' IS NOT NULL
4+
AND jsonb->>'status' IN ('Closed - Unfilled', 'Closed - Pickup expired', 'Closed - Cancelled', 'Closed - Filled');

src/main/resources/templates/db_scripts/schema.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,11 @@
392392
"run": "after",
393393
"snippetPath": "add_staff_slips_hold_transit.sql",
394394
"fromModuleVersion": "12.3.0"
395+
},
396+
{
397+
"run": "after",
398+
"snippetPath": "removePositionFromClosedRequests.sql",
399+
"fromModuleVersion": "14.0.0"
395400
}
396401
]
397402
}

src/test/java/org/folio/rest/api/TenantRefApiTests.java

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
import static java.util.stream.Collectors.toList;
1616
import static java.util.stream.Collectors.toMap;
1717
import static org.folio.HttpStatus.HTTP_CREATED;
18+
import static org.folio.rest.jaxrs.model.Request.Status.CLOSED_CANCELLED;
19+
import static org.folio.rest.jaxrs.model.Request.Status.CLOSED_FILLED;
20+
import static org.folio.rest.jaxrs.model.Request.Status.CLOSED_PICKUP_EXPIRED;
21+
import static org.folio.rest.jaxrs.model.Request.Status.CLOSED_UNFILLED;
1822

1923
import java.io.InputStream;
2024
import java.nio.charset.StandardCharsets;
@@ -27,13 +31,15 @@
2731
import java.util.Objects;
2832
import java.util.UUID;
2933
import java.util.concurrent.CompletableFuture;
34+
import java.util.stream.Stream;
3035
import java.util.stream.StreamSupport;
3136

3237
import org.apache.commons.io.IOUtils;
3338
import org.folio.postgres.testing.PostgresTesterContainer;
3439
import org.folio.rest.RestVerticle;
3540
import org.folio.rest.client.TenantClient;
3641
import org.folio.rest.jaxrs.model.Parameter;
42+
import org.folio.rest.jaxrs.model.Request;
3743
import org.folio.rest.jaxrs.model.TenantAttributes;
3844
import org.folio.rest.jaxrs.model.TenantJob;
3945
import org.folio.rest.persist.PostgresClient;
@@ -65,8 +71,8 @@
6571
public class TenantRefApiTests {
6672
protected static final String OLD_MODULE_VERSION = "13.0.0";
6773
protected static final String PREVIOUS_MODULE_VERSION = "13.1.0";
68-
protected static final String MIGRATION_MODULE_VERSION = "13.2.0";
69-
protected static final String NEXT_MODULE_VERSION = "13.4.0";
74+
protected static final String TLR_MIGRATION_MODULE_VERSION = "14.0.0";
75+
protected static final String NEXT_MODULE_VERSION = "14.1.0";
7076
protected static final String MODULE_NAME = "mod_circulation_storage";
7177
protected static final int PORT = NetworkUtils.nextFreePort();
7278
protected static final String URL = "http://localhost:" + PORT;
@@ -169,7 +175,7 @@ public void migrationShouldBeSkippedWhenUpgradingToLowerVersion(final TestContex
169175
public void migrationShouldBeSkippedWhenUpgradingFromAlreadyMigratedVersion(final TestContext context) {
170176
Async async = context.async();
171177

172-
postTenant(context, MIGRATION_MODULE_VERSION, NEXT_MODULE_VERSION)
178+
postTenant(context, TLR_MIGRATION_MODULE_VERSION, NEXT_MODULE_VERSION)
173179
.onSuccess(job -> {
174180
assertThatNoRequestsWereUpdated(context);
175181
async.complete();
@@ -180,7 +186,7 @@ public void migrationShouldBeSkippedWhenUpgradingFromAlreadyMigratedVersion(fina
180186
public void jobCompletedWhenMigrationIsSuccessful(TestContext context) {
181187
Async async = context.async();
182188

183-
postTenant(context, PREVIOUS_MODULE_VERSION, MIGRATION_MODULE_VERSION)
189+
postTenant(context, PREVIOUS_MODULE_VERSION, TLR_MIGRATION_MODULE_VERSION)
184190
.onSuccess(job -> {
185191
context.assertNull(job.getError());
186192
validateMigrationResult(context, async);
@@ -209,7 +215,7 @@ public void jobFailsWhenItemWasNotFound(final TestContext context) {
209215
}
210216

211217
private void jobFailsWhenRemoteCallFails(TestContext context, Async async) {
212-
postTenant(context, PREVIOUS_MODULE_VERSION, MIGRATION_MODULE_VERSION)
218+
postTenant(context, PREVIOUS_MODULE_VERSION, TLR_MIGRATION_MODULE_VERSION)
213219
.onSuccess(job -> {
214220
context.assertTrue(job.getError().contains("Request failed: GET"));
215221
context.assertTrue(job.getError().contains("Response: [404]"));
@@ -231,7 +237,7 @@ public void useDefaultValuesForInstanceIdAndHoldingsRecordIdWhenItemWasNotFound(
231237
String requestId = getId(randomRequest);
232238

233239
postgresClient.update(REQUEST_TABLE_NAME, randomRequest, requestId)
234-
.compose(r -> postTenant(context, PREVIOUS_MODULE_VERSION, MIGRATION_MODULE_VERSION))
240+
.compose(r -> postTenant(context, PREVIOUS_MODULE_VERSION, TLR_MIGRATION_MODULE_VERSION))
235241
.compose(job -> getRequestAsJson(requestId))
236242
.onFailure(context::fail)
237243
.onSuccess(updatedRequest -> {
@@ -261,7 +267,7 @@ public void changesMadeForAllBatchesAreRevertedInCaseOfError(TestContext context
261267
.whenScenarioStateIs(FIRST_CALL_MADE_SCENARIO_STATE)
262268
.willReturn(serverError()));
263269

264-
postTenant(context, PREVIOUS_MODULE_VERSION, MIGRATION_MODULE_VERSION)
270+
postTenant(context, PREVIOUS_MODULE_VERSION, TLR_MIGRATION_MODULE_VERSION)
265271
.onSuccess(job -> {
266272
context.assertFalse(job.getError().isEmpty());
267273
assertThatNoRequestsWereUpdated(context);
@@ -299,11 +305,36 @@ public void jobFailsWhenRequestDoesNotHaveRequiredItemLevelRequestField(TestCont
299305
"request does not contain required ILR fields: " + getId(randomRequest));
300306
}
301307

308+
@Test
309+
public void migrationRemovesPositionFromClosedRequests(TestContext context) {
310+
Async async = context.async();
311+
312+
List<String> closedStatuses = Stream.of(CLOSED_FILLED, CLOSED_UNFILLED, CLOSED_PICKUP_EXPIRED,
313+
CLOSED_CANCELLED)
314+
.map(Request.Status::value)
315+
.collect(toList());
316+
317+
postTenant(context, PREVIOUS_MODULE_VERSION, TLR_MIGRATION_MODULE_VERSION)
318+
.compose(job -> getAllRequestsAsJson())
319+
.onFailure(context::fail)
320+
.onSuccess(requestsAfterMigration -> {
321+
requestsAfterMigration.forEach(request -> {
322+
Integer position = request.getInteger("position");
323+
if (closedStatuses.contains(request.getString("status"))) {
324+
context.assertNull(position);
325+
} else {
326+
context.assertNotNull(position);
327+
}
328+
async.complete();
329+
});
330+
});
331+
}
332+
302333
private void jobFailsWhenRequestValidationFails(TestContext context, Async async,
303334
JsonObject request, String expectedErrorMessage) {
304335

305336
postgresClient.update(REQUEST_TABLE_NAME, request, getId(request))
306-
.compose(r -> postTenant(context, PREVIOUS_MODULE_VERSION, MIGRATION_MODULE_VERSION))
337+
.compose(r -> postTenant(context, PREVIOUS_MODULE_VERSION, TLR_MIGRATION_MODULE_VERSION))
307338
.onFailure(context::fail)
308339
.onSuccess(job -> {
309340
context.assertTrue(job.getError().contains(expectedErrorMessage));

0 commit comments

Comments
 (0)