Skip to content

Commit fa332cd

Browse files
authored
[DANON-72] Search Eureka and Okapi tenant metadata tables (#122)
1 parent a68aa82 commit fa332cd

2 files changed

Lines changed: 81 additions & 22 deletions

File tree

src/main/java/org/folio/anonymization/jobs/TenantInfoRedaction.java

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package org.folio.anonymization.jobs;
22

3+
import static dev.tamboui.toolkit.Toolkit.row;
4+
import static dev.tamboui.toolkit.Toolkit.spacer;
5+
import static dev.tamboui.toolkit.Toolkit.text;
6+
37
import java.util.List;
48
import org.folio.anonymization.domain.db.GlobalFieldReference;
59
import org.folio.anonymization.domain.job.Job;
@@ -9,7 +13,6 @@
913
import org.folio.anonymization.domain.job.SharedExecutionContext;
1014
import org.folio.anonymization.domain.job.TenantExecutionContext;
1115
import org.folio.anonymization.jobs.templates.RedactPart;
12-
import org.folio.anonymization.repository.UtilRepository;
1316
import org.springframework.beans.factory.annotation.Autowired;
1417
import org.springframework.stereotype.Component;
1518

@@ -21,21 +24,48 @@ public class TenantInfoRedaction implements JobFactory {
2124
new GlobalFieldReference("public", "tenant_info", "updated_by_username")
2225
);
2326

24-
@Autowired
25-
private SharedExecutionContext context;
27+
private static final GlobalFieldReference TENANT_ID_FIELD = new GlobalFieldReference(
28+
"public",
29+
"tenant_info",
30+
"tenant_id"
31+
);
2632

2733
@Autowired
28-
private UtilRepository utilRepository;
34+
private SharedExecutionContext context;
2935

3036
@Override
3137
public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
38+
boolean tenantIsInTable = context
39+
.create()
40+
.fetchExists(
41+
context
42+
.create()
43+
.selectOne()
44+
.from(TENANT_ID_FIELD.table())
45+
.where(TENANT_ID_FIELD.field(null, String.class).eq(tenant.tenant().id()))
46+
);
47+
3248
return List.of(
3349
new JobBuilder(
3450
"Tenant metadata redaction",
3551
"Redacts information about the user who created/updated this tenant",
3652
tenant,
3753
context,
38-
JobConfigurationProperty.fromFieldList(FIELDS, tenant, utilRepository),
54+
FIELDS
55+
.stream()
56+
.map(field -> {
57+
if (!tenantIsInTable) {
58+
return new JobConfigurationProperty(
59+
field,
60+
row(text(field.toString()).crossedOut(), spacer(1), text("(not present for tenant)").italic()),
61+
true,
62+
true
63+
);
64+
} else {
65+
return new JobConfigurationProperty(field, text(field.toString()), true, false);
66+
}
67+
})
68+
.toList(),
3969
ctx ->
4070
new Job(ctx, List.of("redact"))
4171
// we will only update one row so no need to batch
@@ -48,9 +78,7 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
4878
new RedactPart(
4979
"Redact " + field.toString(),
5080
field,
51-
new GlobalFieldReference("public", "tenant_info", "tenant_id")
52-
.field(null, String.class)
53-
.eq(tenant.tenant().id())
81+
TENANT_ID_FIELD.field(null, String.class).eq(tenant.tenant().id())
5482
)
5583
)
5684
.toList()

src/main/java/org/folio/anonymization/repository/TenantRepository.java

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.Objects;
1010
import java.util.function.Function;
1111
import java.util.stream.Collectors;
12+
import java.util.stream.Stream;
1213
import lombok.extern.log4j.Log4j2;
1314
import org.folio.anonymization.domain.db.ModuleTable;
1415
import org.folio.anonymization.domain.folio.Tenant;
@@ -23,7 +24,10 @@
2324
@Repository
2425
public class TenantRepository {
2526

27+
// relational from Eureka
2628
private static final Table<?> TENANT_TABLE = table(name("public", "tenant"));
29+
// JSON blob from Okapi
30+
private static final Table<?> TENANTS_TABLE = table(name("public", "tenants"));
2731
private static final String MOD_CONSORTIA_KEYCLOAK_SCHEMA = "consortia_keycloak";
2832

2933
@Autowired
@@ -59,21 +63,48 @@ public Map<String, Tenant> getAllTenants() {
5963
}
6064

6165
protected Map<String, Tenant> getTenantsWithoutConsortiaInfo() {
62-
return create
63-
.select(field("name"), field("description"))
64-
.from(TENANT_TABLE)
65-
.fetch()
66-
.stream()
67-
.map(record ->
68-
new Tenant(
69-
record.get("name", String.class),
70-
record.get("name", String.class),
71-
Objects.requireNonNullElse(record.get("description", String.class), ""),
72-
null,
73-
false
74-
)
66+
return Stream
67+
.concat(
68+
utilRepository.doesTableExist("public", "tenant")
69+
? create
70+
.select(field("name"), field("description"))
71+
.from(TENANT_TABLE)
72+
.fetch()
73+
.stream()
74+
.map(record ->
75+
new Tenant(
76+
record.get("name", String.class),
77+
record.get("name", String.class),
78+
Objects.requireNonNullElse(record.get("description", String.class), ""),
79+
null,
80+
false
81+
)
82+
)
83+
: Stream.empty(),
84+
utilRepository.doesTableExist("public", "tenants")
85+
? create
86+
.select(
87+
field("tenantjson->'descriptor'->>'id'").as("id"),
88+
field("tenantjson->'descriptor'->>'name'").as("name"),
89+
field("tenantjson->'descriptor'->>'description'").as("description")
90+
)
91+
.from(TENANTS_TABLE)
92+
.where(field("tenantjson->'descriptor'->>'id'").ne("supertenant"))
93+
.fetch()
94+
.stream()
95+
.map(record ->
96+
new Tenant(
97+
record.get("id", String.class),
98+
record.get("name", String.class),
99+
Objects.requireNonNullElse(record.get("description", String.class), ""),
100+
null,
101+
false
102+
)
103+
)
104+
: Stream.empty()
75105
)
76-
.collect(Collectors.toMap(Tenant::id, Function.identity()));
106+
// tenants table has better data than tenant table, so use its data when possible
107+
.collect(Collectors.toMap(Tenant::id, Function.identity(), (a, b) -> b));
77108
}
78109

79110
public List<ModuleTable> getModuleTablesWithSizes(String tenantId) {

0 commit comments

Comments
 (0)