-
Notifications
You must be signed in to change notification settings - Fork 1
/
TailormapDatabaseMigration.java
63 lines (53 loc) · 2 KB
/
TailormapDatabaseMigration.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
* Copyright (C) 2023 B3Partners B.V.
*
* SPDX-License-Identifier: MIT
*/
package org.tailormap.api.configuration;
import jakarta.annotation.PostConstruct;
import java.util.List;
import org.flywaydb.core.api.output.MigrateResult;
import org.springframework.context.annotation.Configuration;
import org.tailormap.api.configuration.ddl.FlywayMigrationResult;
import org.tailormap.api.persistence.Catalog;
import org.tailormap.api.persistence.json.CatalogNode;
import org.tailormap.api.repository.CatalogRepository;
import org.tailormap.api.security.InternalAdminAuthentication;
/**
* Migrate the database using JPA entities, after Flyway has migrated and the entity manager is
* initialized. When using Flyway callbacks, we can't use JPA.
*/
@Configuration
public class TailormapDatabaseMigration {
private final CatalogRepository catalogRepository;
private final FlywayMigrationResult migrationResult;
public TailormapDatabaseMigration(
CatalogRepository catalogRepository, FlywayMigrationResult migrationResult) {
this.catalogRepository = catalogRepository;
this.migrationResult = migrationResult;
}
@PostConstruct
public void databaseMigration() {
MigrateResult migrateResult = migrationResult.getMigrateResult();
if (migrateResult == null || migrateResult.migrationsExecuted == 0) {
return;
}
// We can use the migration result to execute code when a specific migration has been executed
// to upgrade old database contents, such as jsonb values.
InternalAdminAuthentication.setInSecurityContext();
try {
if (migrateResult.migrations.stream().anyMatch(m -> "1".equals(m.version))) {
createRootCatalog();
}
} finally {
InternalAdminAuthentication.clearSecurityContextAuthentication();
}
}
private void createRootCatalog() {
Catalog catalog =
new Catalog()
.setId(Catalog.MAIN)
.setNodes(List.of(new CatalogNode().root(true).title("root").id("root")));
catalogRepository.save(catalog);
}
}