Skip to content

Commit 26e9e89

Browse files
Copilotyanavasileva
authored andcommitted
Initial plan
1 parent 893bd64 commit 26e9e89

File tree

29 files changed

+2072
-56
lines changed

29 files changed

+2072
-56
lines changed

data-migrator/core/src/main/java/io/camunda/migration/data/HistoryMigrator.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.camunda.migration.data.impl.history.ProcessInstanceMigrator;
2323
import io.camunda.migration.data.impl.history.UserTaskMigrator;
2424
import io.camunda.migration.data.impl.history.VariableMigrator;
25+
import io.camunda.migration.data.impl.history.AuditLogMigrator;
2526
import io.camunda.migration.data.impl.clients.DbClient;
2627
import io.camunda.migration.data.impl.util.ExceptionUtils;
2728
import io.camunda.migration.data.impl.util.PrintUtils;
@@ -63,6 +64,9 @@ public class HistoryMigrator {
6364
@Autowired
6465
protected DecisionInstanceMigrator decisionInstanceMigrator;
6566

67+
@Autowired
68+
protected AuditLogMigrator auditLogMigrator;
69+
6670
@Autowired
6771
protected DbClient dbClient;
6872

@@ -106,6 +110,7 @@ public void migrate() {
106110
migrateDecisionRequirementsDefinitions();
107111
migrateDecisionDefinitions();
108112
migrateDecisionInstances();
113+
migrateAuditLogs();
109114
}
110115

111116
public void migrateProcessDefinitions() {
@@ -144,6 +149,10 @@ public void migrateDecisionInstances() {
144149
decisionInstanceMigrator.migrate();
145150
}
146151

152+
public void migrateAuditLogs() {
153+
auditLogMigrator.migrate();
154+
}
155+
147156
public void setRequestedEntityTypes(List<TYPE> requestedEntityTypes) {
148157
this.requestedEntityTypes = requestedEntityTypes;
149158
}
@@ -159,5 +168,6 @@ public void setMode(MigratorMode mode) {
159168
processInstanceMigrator.setMode(mode);
160169
userTaskMigrator.setMode(mode);
161170
variableMigrator.setMode(mode);
171+
auditLogMigrator.setMode(mode);
162172
}
163173
}

data-migrator/core/src/main/java/io/camunda/migration/data/RuntimeMigrator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ protected void migrate() {
8484
if (skipReason == null && shouldStartProcessInstance(c7ProcessInstanceId)) {
8585
startProcessInstance(c7ProcessInstanceId, createTime);
8686
} else if (isUnknown(c7ProcessInstanceId)) {
87-
dbClient.insert(c7ProcessInstanceId, null, createTime, TYPE.RUNTIME_PROCESS_INSTANCE, skipReason);
87+
dbClient.insert(c7ProcessInstanceId, (Long) null, createTime, TYPE.RUNTIME_PROCESS_INSTANCE, skipReason);
8888
} else {
8989
dbClient.updateSkipReason(c7ProcessInstanceId, TYPE.RUNTIME_PROCESS_INSTANCE, skipReason);
9090
}
@@ -131,7 +131,7 @@ protected void handleVariableInterceptorException(VariableInterceptorException e
131131
RuntimeMigratorLogs.stacktrace(e);
132132

133133
if (MIGRATE.equals(mode)) {
134-
dbClient.insert(c7ProcessInstanceId, null, createTime, TYPE.RUNTIME_PROCESS_INSTANCE, e.getMessage());
134+
dbClient.insert(c7ProcessInstanceId, (Long) null, createTime, TYPE.RUNTIME_PROCESS_INSTANCE, e.getMessage());
135135
} else if (RETRY_SKIPPED.equals(mode)) {
136136
dbClient.updateSkipReason(c7ProcessInstanceId, TYPE.RUNTIME_PROCESS_INSTANCE, e.getMessage());
137137
}

data-migrator/core/src/main/java/io/camunda/migration/data/config/InterceptorConfiguration.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.camunda.migration.data.impl.interceptor.PrimitiveVariableTransformer;
2424
import io.camunda.migration.data.impl.interceptor.SpinJsonVariableTransformer;
2525
import io.camunda.migration.data.impl.interceptor.SpinXmlVariableTransformer;
26+
import io.camunda.migration.data.impl.interceptor.history.entity.AuditLogTransformer;
2627
import io.camunda.migration.data.impl.interceptor.history.entity.DecisionDefinitionTransformer;
2728
import io.camunda.migration.data.impl.interceptor.history.entity.DecisionInstanceTransformer;
2829
import io.camunda.migration.data.impl.interceptor.history.entity.DecisionRequirementsDefinitionTransformer;
@@ -367,4 +368,9 @@ public UserTaskTransformer userTaskTransformer() {
367368
public VariableTransformer variableTransformer() {
368369
return new VariableTransformer();
369370
}
371+
372+
@Bean
373+
public AuditLogTransformer auditLogTransformer() {
374+
return new AuditLogTransformer();
375+
}
370376
}

data-migrator/core/src/main/java/io/camunda/migration/data/config/MigratorAutoConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import io.camunda.migration.data.impl.clients.DbClient;
2727
import io.camunda.migration.data.impl.VariableService;
2828
import io.camunda.migration.data.impl.RuntimeValidator;
29+
import io.camunda.migration.data.impl.history.AuditLogMigrator;
2930
import io.camunda.migration.data.impl.identity.AuthorizationManager;
3031
import io.camunda.migration.data.impl.history.DecisionDefinitionMigrator;
3132
import io.camunda.migration.data.impl.history.DecisionInstanceMigrator;
@@ -86,6 +87,7 @@
8687
ProcessInstanceMigrator.class,
8788
UserTaskMigrator.class,
8889
VariableMigrator.class,
90+
AuditLogMigrator.class,
8991
SchemaShutdownCleaner.class
9092
})
9193
@Configuration

data-migrator/core/src/main/java/io/camunda/migration/data/constants/MigratorConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ protected MigratorConstants() {}
1717
* collide with actual Zeebe partition keys during migration.
1818
*/
1919
public static int C7_HISTORY_PARTITION_ID = 4095;
20+
public static int C7_AUDIT_LOG_ENTITY_VERSION = -4095;
2021

2122
public static final String LEGACY_ID_VAR_NAME = "legacyId";
2223
public static final String C8_DEFAULT_TENANT = "<default>";

data-migrator/core/src/main/java/io/camunda/migration/data/impl/clients/C7Client.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.camunda.bpm.engine.history.HistoricProcessInstance;
4040
import org.camunda.bpm.engine.history.HistoricTaskInstance;
4141
import org.camunda.bpm.engine.history.HistoricVariableInstance;
42+
import org.camunda.bpm.engine.history.UserOperationLogEntry;
4243
import org.camunda.bpm.engine.identity.Tenant;
4344
import org.camunda.bpm.engine.impl.AuthorizationQueryImpl;
4445
import org.camunda.bpm.engine.impl.HistoricActivityInstanceQueryImpl;
@@ -47,6 +48,7 @@
4748
import org.camunda.bpm.engine.impl.HistoricProcessInstanceQueryImpl;
4849
import org.camunda.bpm.engine.impl.HistoricTaskInstanceQueryImpl;
4950
import org.camunda.bpm.engine.impl.HistoricVariableInstanceQueryImpl;
51+
import org.camunda.bpm.engine.impl.UserOperationLogQueryImpl;
5052
import org.camunda.bpm.engine.impl.ProcessDefinitionQueryImpl;
5153
import org.camunda.bpm.engine.impl.TenantQueryImpl;
5254
import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl;
@@ -493,6 +495,33 @@ public void fetchAndHandleHistoricFlowNodes(Consumer<HistoricActivityInstance> c
493495
.callback(callback);
494496
}
495497

498+
/**
499+
* Processes historic user operation log entries with pagination using the provided callback consumer.
500+
*/
501+
public void fetchAndHandleUserOperationLogEntries(Consumer<UserOperationLogEntry> callback, Date timestampAfter) {
502+
UserOperationLogQueryImpl query = (UserOperationLogQueryImpl) historyService.createUserOperationLogQuery()
503+
.orderByTimestamp()
504+
.asc();
505+
506+
if (timestampAfter != null) {
507+
query.afterTimestamp(timestampAfter);
508+
}
509+
510+
new Pagination<UserOperationLogEntry>()
511+
.pageSize(properties.getPageSize())
512+
.query(query)
513+
.maxCount(query::count)
514+
.callback(callback);
515+
}
516+
517+
/**
518+
* Gets a single user operation log entry by ID.
519+
*/
520+
public UserOperationLogEntry getUserOperationLogEntry(String c7Id) {
521+
var query = historyService.createUserOperationLogQuery().operationId(c7Id);
522+
return callApi(query::singleResult, format(FAILED_TO_FETCH_HISTORIC_ELEMENT, "UserOperationLogEntry", c7Id));
523+
}
524+
496525
/**
497526
* Fetches tenant entities
498527
*/

data-migrator/core/src/main/java/io/camunda/migration/data/impl/clients/C8Client.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_FETCH_PROCESS_DEFINITION_XML;
1515
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_FETCH_VARIABLE;
1616
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_FIND_PROCESS_INSTANCE_BY_KEY;
17+
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_INSERT_AUDIT_LOG;
1718
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_INSERT_DECISION_DEFINITION;
1819
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_INSERT_DECISION_INSTANCE;
1920
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_INSERT_DECISION_INSTANCE_INPUT;
@@ -33,6 +34,7 @@
3334
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_SEARCH_FLOW_NODE_INSTANCES;
3435
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_SEARCH_PROCESS_DEFINITIONS;
3536
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_SEARCH_PROCESS_INSTANCE;
37+
import static io.camunda.migration.data.impl.logging.C8ClientLogs.FAILED_TO_SEARCH_USER_TASKS;
3638
import static io.camunda.migration.data.impl.util.ConverterUtil.getTenantId;
3739
import static io.camunda.migration.data.impl.util.ExceptionUtils.callApi;
3840

@@ -56,6 +58,8 @@
5658
import io.camunda.db.rdbms.read.domain.FlowNodeInstanceDbQuery;
5759
import io.camunda.db.rdbms.read.domain.ProcessDefinitionDbQuery;
5860
import io.camunda.db.rdbms.read.domain.ProcessInstanceDbQuery;
61+
import io.camunda.db.rdbms.read.domain.UserTaskDbQuery;
62+
import io.camunda.db.rdbms.sql.AuditLogMapper;
5963
import io.camunda.db.rdbms.sql.DecisionDefinitionMapper;
6064
import io.camunda.db.rdbms.sql.DecisionInstanceMapper;
6165
import io.camunda.db.rdbms.sql.DecisionRequirementsMapper;
@@ -65,6 +69,7 @@
6569
import io.camunda.db.rdbms.sql.ProcessInstanceMapper;
6670
import io.camunda.db.rdbms.sql.UserTaskMapper;
6771
import io.camunda.db.rdbms.sql.VariableMapper;
72+
import io.camunda.db.rdbms.write.domain.AuditLogDbModel;
6873
import io.camunda.db.rdbms.write.domain.DecisionDefinitionDbModel;
6974
import io.camunda.db.rdbms.write.domain.DecisionInstanceDbModel;
7075
import io.camunda.db.rdbms.write.domain.DecisionRequirementsDbModel;
@@ -133,6 +138,9 @@ public class C8Client {
133138
@Autowired(required = false)
134139
protected DecisionRequirementsMapper decisionRequirementsMapper;
135140

141+
@Autowired(required = false)
142+
protected AuditLogMapper auditLogMapper;
143+
136144
/**
137145
* Creates a new process instance with the given BPMN process ID and variables.
138146
*/
@@ -332,13 +340,27 @@ public void insertFlowNodeInstance(FlowNodeInstanceDbModel dbModel) {
332340
callApi(() -> flowNodeInstanceMapper.insert(new BatchInsertDto(List.of(dbModel))), FAILED_TO_INSERT_FLOW_NODE_INSTANCE);
333341
}
334342

343+
/**
344+
* Inserts an AuditLog into the database.
345+
*/
346+
public void insertAuditLog(AuditLogDbModel dbModel) {
347+
callApi(() -> auditLogMapper.insert(new BatchInsertDto(List.of(dbModel))), FAILED_TO_INSERT_AUDIT_LOG);
348+
}
349+
335350
/**
336351
* Searches for FlowNodeInstances matching the query.
337352
*/
338353
public List<FlowNodeInstanceDbModel> searchFlowNodeInstances(FlowNodeInstanceDbQuery query) {
339354
return callApi(() -> flowNodeInstanceMapper.search(query), FAILED_TO_SEARCH_FLOW_NODE_INSTANCES);
340355
}
341356

357+
/**
358+
* Searches for User tasks matching the query.
359+
*/
360+
public List<UserTaskDbModel> searchUserTasks(UserTaskDbQuery query){
361+
return callApi(() -> userTaskMapper.search(query), FAILED_TO_SEARCH_USER_TASKS);
362+
}
363+
342364
/**
343365
* Searches for ProcessDefinitions matching the query.
344366
*/

data-migrator/core/src/main/java/io/camunda/migration/data/impl/clients/DbClient.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ public List<String> findAllC7Ids() {
9999
* Updates a record by setting the key for an existing ID and type.
100100
*/
101101
public void updateC8KeyByC7IdAndType(String c7Id, Long c8Key, TYPE type) {
102+
updateC8KeyByC7IdAndType(c7Id, (c8Key == null) ? null : c8Key.toString(), type);
103+
}
104+
105+
/**
106+
* Updates a record by setting the key for an existing ID and type.
107+
*/
108+
public void updateC8KeyByC7IdAndType(String c7Id, String c8Key, TYPE type) {
102109
DbClientLogs.updatingC8KeyForC7Id(c7Id, c8Key);
103110
var model = createIdKeyDbModel(c7Id, null, c8Key, type);
104111
callApi(() -> idKeyMapper.updateC8KeyByC7IdAndType(model), FAILED_TO_UPDATE_KEY + c8Key);
@@ -132,6 +139,13 @@ public void insert(String c7Id, Long c8Key, TYPE type) {
132139
* Inserts a new process instance record into the mapping table.
133140
*/
134141
public void insert(String c7Id, Long c8Key, Date createTime, TYPE type, String skipReason) {
142+
insert(c7Id, (c8Key == null) ? null : c8Key.toString(), createTime, type, skipReason);
143+
}
144+
145+
/**
146+
* Inserts a new process instance record into the mapping table.
147+
*/
148+
public void insert(String c7Id, String c8Key, Date createTime, TYPE type, String skipReason) {
135149
String finalSkipReason = properties.getSaveSkipReason() ? skipReason : null;
136150
DbClientLogs.insertingRecord(c7Id, createTime, null, finalSkipReason);
137151
var model = createIdKeyDbModel(c7Id, createTime, c8Key, type, finalSkipReason);
@@ -201,7 +215,7 @@ protected void deleteByC7Id(String c7Id) {
201215
/**
202216
* Creates a new IdKeyDbModel instance with the provided parameters including skip reason.
203217
*/
204-
protected IdKeyDbModel createIdKeyDbModel(String c7Id, Date createTime, Long c8Key, TYPE type, String skipReason) {
218+
protected IdKeyDbModel createIdKeyDbModel(String c7Id, Date createTime, String c8Key, TYPE type, String skipReason) {
205219
var keyIdDbModel = new IdKeyDbModel();
206220
keyIdDbModel.setC7Id(c7Id);
207221
keyIdDbModel.setCreateTime(createTime);
@@ -214,7 +228,7 @@ protected IdKeyDbModel createIdKeyDbModel(String c7Id, Date createTime, Long c8K
214228
/**
215229
* Creates a new IdKeyDbModel instance with the provided parameters.
216230
*/
217-
protected IdKeyDbModel createIdKeyDbModel(String c7Id, Date createTime, Long c8Key, TYPE type) {
231+
protected IdKeyDbModel createIdKeyDbModel(String c7Id, Date createTime, String c8Key, TYPE type) {
218232
return createIdKeyDbModel(c7Id, createTime, c8Key, type, null);
219233
}
220234
}

0 commit comments

Comments
 (0)