Skip to content

Commit a4ea7ef

Browse files
authored
[DANON-73] Exclude system users from anonymization (#123)
1 parent fa332cd commit a4ea7ef

15 files changed

Lines changed: 273 additions & 14 deletions

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.folio.anonymization.jobs.templates.BatchGenerationFromTablePart;
1313
import org.folio.anonymization.jobs.templates.ReplaceValueFromListPart;
1414
import org.folio.anonymization.util.RandomValueUtils;
15+
import org.folio.anonymization.util.SystemUserExclusionUtil;
1516
import org.springframework.beans.factory.annotation.Autowired;
1617
import org.springframework.stereotype.Component;
1718

@@ -121,7 +122,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
121122
field,
122123
condition,
123124
replacementValues(field, Math.max(end - start, 5))
124-
)
125+
),
126+
SystemUserExclusionUtil.getExclusionCondition(field, tenant)
125127
)
126128
)
127129
.toList()

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.folio.anonymization.jobs.templates.ReplaceValuePart;
3535
import org.folio.anonymization.util.NumberUtils;
3636
import org.folio.anonymization.util.RandomValueUtils;
37+
import org.folio.anonymization.util.SystemUserExclusionUtil;
3738
import org.jooq.Condition;
3839
import org.jooq.Field;
3940
import org.jooq.JSONB;
@@ -445,7 +446,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
445446
"Redact " + field.toString() + " with refId " + r.get("refId") + " on " + label,
446447
field.withJsonPath(field.jsonPath() + "." + r.get("refId")),
447448
condition
448-
)
449+
),
450+
SystemUserExclusionUtil.getExclusionCondition(field, tenant)
449451
)
450452
)
451453
);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.folio.anonymization.domain.job.TenantExecutionContext;
1414
import org.folio.anonymization.jobs.templates.BatchGenerationFromTablePart;
1515
import org.folio.anonymization.jobs.templates.ReplaceJSONBValuePart;
16+
import org.folio.anonymization.util.SystemUserExclusionUtil;
1617
import org.jooq.Field;
1718
import org.jooq.JSONB;
1819
import org.springframework.beans.factory.annotation.Autowired;
@@ -60,7 +61,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
6061
field,
6162
condition,
6263
RANDOM_DOB_SQL
63-
)
64+
),
65+
SystemUserExclusionUtil.getExclusionCondition(field, tenant)
6466
)
6567
)
6668
.toList()

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.folio.anonymization.jobs.templates.BatchGenerationFromTablePart;
1313
import org.folio.anonymization.jobs.templates.ReplaceValueFromListPart;
1414
import org.folio.anonymization.util.RandomValueUtils;
15+
import org.folio.anonymization.util.SystemUserExclusionUtil;
1516
import org.springframework.beans.factory.annotation.Autowired;
1617
import org.springframework.stereotype.Component;
1718

@@ -68,7 +69,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
6869
field,
6970
condition,
7071
RandomValueUtils.emails(Math.max(end - start, 5))
71-
)
72+
),
73+
SystemUserExclusionUtil.getExclusionCondition(field, tenant)
7274
)
7375
)
7476
.toList()

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.folio.anonymization.jobs.templates.BatchGenerationFromTablePart;
1313
import org.folio.anonymization.jobs.templates.ReplaceValueFromListPart;
1414
import org.folio.anonymization.util.RandomValueUtils;
15+
import org.folio.anonymization.util.SystemUserExclusionUtil;
1516
import org.springframework.beans.factory.annotation.Autowired;
1617
import org.springframework.stereotype.Component;
1718

@@ -89,7 +90,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
8990
field,
9091
condition,
9192
RandomValueUtils.firstNames(Math.max(end - start, 5))
92-
)
93+
),
94+
SystemUserExclusionUtil.getExclusionCondition(field, tenant)
9395
)
9496
)
9597
.toList()

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.folio.anonymization.jobs.templates.BatchGenerationFromTablePart;
1313
import org.folio.anonymization.jobs.templates.ReplaceValueFromListPart;
1414
import org.folio.anonymization.util.RandomValueUtils;
15+
import org.folio.anonymization.util.SystemUserExclusionUtil;
1516
import org.springframework.beans.factory.annotation.Autowired;
1617
import org.springframework.stereotype.Component;
1718

@@ -88,7 +89,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
8889
field,
8990
condition,
9091
RandomValueUtils.lastNames(Math.max(end - start, 5))
91-
)
92+
),
93+
SystemUserExclusionUtil.getExclusionCondition(field, tenant)
9294
)
9395
)
9496
.toList()

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.folio.anonymization.jobs.templates.BatchGenerationFromTablePart;
1313
import org.folio.anonymization.jobs.templates.ReplaceValueFromListPart;
1414
import org.folio.anonymization.util.RandomValueUtils;
15+
import org.folio.anonymization.util.SystemUserExclusionUtil;
1516
import org.springframework.beans.factory.annotation.Autowired;
1617
import org.springframework.stereotype.Component;
1718

@@ -58,7 +59,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
5859
field,
5960
condition,
6061
RandomValueUtils.middleNames(Math.max(end - start, 5))
61-
)
62+
),
63+
SystemUserExclusionUtil.getExclusionCondition(field, tenant)
6264
)
6365
)
6466
.toList()

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.folio.anonymization.jobs.templates.ReplaceJSONBValuePart;
1616
import org.folio.anonymization.jobs.templates.ReplaceValuePart;
1717
import org.folio.anonymization.util.RandomValueUtils;
18+
import org.folio.anonymization.util.SystemUserExclusionUtil;
1819
import org.jooq.Field;
1920
import org.jooq.JSONB;
2021
import org.springframework.beans.factory.annotation.Autowired;
@@ -104,7 +105,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
104105
baseReplacement
105106
);
106107
}
107-
}
108+
},
109+
SystemUserExclusionUtil.getExclusionCondition(field, tenant)
108110
)
109111
)
110112
.toList()

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

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@
2121
import org.folio.anonymization.jobs.templates.BatchGenerationFromTablePart;
2222
import org.folio.anonymization.jobs.templates.CreateTablePart;
2323
import org.folio.anonymization.jobs.templates.DropTablePart;
24+
import org.folio.anonymization.jobs.templates.ExcludeGeneratedValuesPart;
25+
import org.folio.anonymization.jobs.templates.FindSystemUsersPart;
2426
import org.folio.anonymization.jobs.templates.GenerateValuesPart;
2527
import org.folio.anonymization.jobs.templates.InsertIntoTablePart;
2628
import org.folio.anonymization.jobs.templates.ReplaceJSONBValuePart;
2729
import org.folio.anonymization.jobs.templates.ReplaceValuePart;
2830
import org.folio.anonymization.util.DBUtils;
2931
import org.folio.anonymization.util.RandomValueUtils;
32+
import org.folio.anonymization.util.SystemUserExclusionUtil;
3033
import org.jooq.Field;
3134
import org.jooq.JSONB;
3235
import org.jooq.Table;
@@ -37,6 +40,9 @@
3740
@Component
3841
public class UserBarcodeAnonymization implements JobFactory {
3942

43+
// used to find system user barcodes that should be excluded from anonymization
44+
private static final FieldReference USERS_TABLE_FIELD = new FieldReference("users", "users", "jsonb", "$.barcode");
45+
4046
private static final List<FieldReference> FIELDS = List.of(
4147
new FieldReference("circulation_storage", "actual_cost_record", "jsonb", "$.user.barcode"),
4248
new FieldReference("circulation_storage", "request", "jsonb", "$.requester.barcode"),
@@ -50,7 +56,7 @@ public class UserBarcodeAnonymization implements JobFactory {
5056
new FieldReference("requests_mediated", "mediated_request", "requester_barcode"),
5157
new FieldReference("requests_mediated", "mediated_request", "proxy_barcode"),
5258
new FieldReference("users", "user_tenant", "barcode"),
53-
new FieldReference("users", "users", "jsonb", "$.barcode")
59+
USERS_TABLE_FIELD
5460
);
5561

5662
@Autowired
@@ -82,7 +88,9 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
8288
.toList(),
8389
ctx -> {
8490
Table<?> tempTableFinal = table(name("public", "_danon_" + ctx.tenant().tenant().id() + "_user_barcodes"));
85-
Table<?> tempTableStaging = table(name("public", "_danon_" + ctx.tenant().tenant().id() + "_user_barcodes_staging"));
91+
Table<?> tempTableStaging = table(
92+
name("public", "_danon_" + ctx.tenant().tenant().id() + "_user_barcodes_staging")
93+
);
8694

8795
Field<String> originalValue = field("original_value", SQLDataType.VARCHAR.notNull());
8896
Field<String> newValue = field("new_value", SQLDataType.VARCHAR.null_());
@@ -95,6 +103,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
95103
"enumerate",
96104
"generate-new-values-prep",
97105
"generate-new-values",
106+
"exclude-system-user-values-prep",
107+
"exclude-system-user-values",
98108
"apply-new-values-prep",
99109
"apply-new-values",
100110
"cleanup"
@@ -169,6 +179,30 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
169179
);
170180
}
171181

182+
job.scheduleParts(
183+
"exclude-system-user-values-prep",
184+
List.of(
185+
new FindSystemUsersPart(
186+
"Find system user values",
187+
USERS_TABLE_FIELD.table(tenant.tenant()),
188+
field("{0}->>'barcode'", String.class, USERS_TABLE_FIELD.baseColumn(tenant.tenant(), JSONB.class)),
189+
systemUserValues ->
190+
job.scheduleParts(
191+
"exclude-system-user-values",
192+
List.of(
193+
new ExcludeGeneratedValuesPart(
194+
"Exclude system user values from anonymization",
195+
tempTableFinal,
196+
originalValue,
197+
newValue,
198+
systemUserValues
199+
)
200+
)
201+
)
202+
)
203+
)
204+
);
205+
172206
job.scheduleParts(
173207
"apply-new-values-prep",
174208
JobConfigurationProperty
@@ -205,7 +239,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
205239
)
206240
);
207241
}
208-
}
242+
},
243+
SystemUserExclusionUtil.getExclusionCondition(field, tenant)
209244
)
210245
)
211246
.toList()

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import org.folio.anonymization.jobs.templates.BatchGenerationFromTablePart;
2222
import org.folio.anonymization.jobs.templates.CreateTablePart;
2323
import org.folio.anonymization.jobs.templates.DropTablePart;
24+
import org.folio.anonymization.jobs.templates.ExcludeGeneratedValuesPart;
25+
import org.folio.anonymization.jobs.templates.FindSystemUsersPart;
2426
import org.folio.anonymization.jobs.templates.GenerateValuesPart;
2527
import org.folio.anonymization.jobs.templates.InsertIntoTablePart;
2628
import org.folio.anonymization.jobs.templates.ReplaceJSONBValuePart;
@@ -37,11 +39,19 @@
3739
@Component
3840
public class UserExternalSystemIdAnonymization implements JobFactory {
3941

42+
// special handling to capture system user ones from here that should not be anonymized
43+
private static final FieldReference USERS_TABLE_FIELD = new FieldReference(
44+
"users",
45+
"users",
46+
"jsonb",
47+
"$.externalSystemId"
48+
);
49+
4050
private static final List<FieldReference> FIELDS = List.of(
4151
new FieldReference("oa", "party", "p_orcid_id"),
4252
new FieldReference("users", "staging_users", "jsonb", "$.externalSystemId"),
4353
new FieldReference("users", "user_tenant", "external_system_id"),
44-
new FieldReference("users", "users", "jsonb", "$.externalSystemId")
54+
USERS_TABLE_FIELD
4555
);
4656

4757
@Autowired
@@ -90,6 +100,8 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
90100
"enumerate",
91101
"generate-new-values-prep",
92102
"generate-new-values",
103+
"exclude-system-user-values-prep",
104+
"exclude-system-user-values",
93105
"apply-new-values-prep",
94106
"apply-new-values",
95107
"cleanup"
@@ -164,6 +176,34 @@ public List<JobBuilder> getBuilders(TenantExecutionContext tenant) {
164176
);
165177
}
166178

179+
job.scheduleParts(
180+
"exclude-system-user-values-prep",
181+
List.of(
182+
new FindSystemUsersPart(
183+
"Find system user values",
184+
USERS_TABLE_FIELD.table(tenant.tenant()),
185+
field(
186+
"{0}->>'externalSystemId'",
187+
String.class,
188+
USERS_TABLE_FIELD.baseColumn(tenant.tenant(), JSONB.class)
189+
),
190+
systemUserValues ->
191+
job.scheduleParts(
192+
"exclude-system-user-values",
193+
List.of(
194+
new ExcludeGeneratedValuesPart(
195+
"Exclude system user values from anonymization",
196+
tempTableFinal,
197+
originalValue,
198+
newValue,
199+
systemUserValues
200+
)
201+
)
202+
)
203+
)
204+
)
205+
);
206+
167207
job.scheduleParts(
168208
"apply-new-values-prep",
169209
JobConfigurationProperty

0 commit comments

Comments
 (0)