diff --git a/src/main/java/io/zeebe/exporter/proto/RecordTransformer.java b/src/main/java/io/zeebe/exporter/proto/RecordTransformer.java index 019c816..80ef5ad 100644 --- a/src/main/java/io/zeebe/exporter/proto/RecordTransformer.java +++ b/src/main/java/io/zeebe/exporter/proto/RecordTransformer.java @@ -102,6 +102,7 @@ public final class RecordTransformer { TRANSFORMERS.put(ValueType.SIGNAL_SUBSCRIPTION, RecordTransformer::toSignalSubscriptionRecord); TRANSFORMERS.put(ValueType.FORM, RecordTransformer::toFormRecord); TRANSFORMERS.put(ValueType.RESOURCE_DELETION, RecordTransformer::toResourceDeletionRecord); + TRANSFORMERS.put(ValueType.USER_TASK, RecordTransformer::toUserTaskRecord); VALUE_TYPE_MAPPING.put(ValueType.DEPLOYMENT, RecordMetadata.ValueType.DEPLOYMENT); VALUE_TYPE_MAPPING.put( @@ -144,6 +145,7 @@ public final class RecordTransformer { VALUE_TYPE_MAPPING.put( ValueType.COMMAND_DISTRIBUTION, RecordMetadata.ValueType.COMMAND_DISTRIBUTION); VALUE_TYPE_MAPPING.put(ValueType.FORM, RecordMetadata.ValueType.FORM); + VALUE_TYPE_MAPPING.put(ValueType.USER_TASK, RecordMetadata.ValueType.USER_TASK); } private RecordTransformer() {} @@ -787,6 +789,29 @@ private static Schema.ResourceDeletionRecord toResourceDeletionRecord(Record record) { + final var value = record.getValue(); + + return Schema.UserTaskRecord.newBuilder() + .setUserTaskKey(value.getUserTaskKey()) + .setAssignee(value.getAssignee()) + .setCandidateGroups(value.getCandidateGroups()) + .setCandidateUsers(value.getCandidateUsers()) + .setDueDate(value.getDueDate()) + .setFollowUpDate(value.getFollowUpDate()) + .setFormKey(value.getFormKey()) + .setVariables(toStruct(value.getVariables())) + .setBpmnProcessId(value.getBpmnProcessId()) + .setProcessDefinitionVersion(value.getProcessDefinitionVersion()) + .setProcessDefinitionKey(value.getProcessDefinitionKey()) + .setProcessInstanceKey(value.getProcessInstanceKey()) + .setElementId(value.getElementId()) + .setElementInstanceKey(value.getElementInstanceKey()) + .setMetadata(toMetadata(record)) + .setTenantId(toTenantId(value)) + .build(); + } + private static Struct toStruct(Map map) { final Struct.Builder builder = Struct.newBuilder(); diff --git a/src/main/proto/schema.proto b/src/main/proto/schema.proto index 0d31327..0740937 100644 --- a/src/main/proto/schema.proto +++ b/src/main/proto/schema.proto @@ -490,4 +490,23 @@ message ResourceDeletionRecord { RecordMetadata metadata = 1; int64 resourceKey = 2; string tenantId = 3; +} + +message UserTaskRecord { + RecordMetadata metadata = 1; + int64 userTaskKey = 2; + string assignee = 3; + string candidateGroups = 4; + string candidateUsers = 5; + string dueDate = 6; + string followUpDate = 7; + int64 formKey = 8; + google.protobuf.Struct variables = 9; + string bpmnProcessId = 10; + int32 processDefinitionVersion = 11; + int64 processDefinitionKey = 12; + int64 processInstanceKey = 13; + string elementId = 14; + int64 elementInstanceKey = 15; + string tenantId = 16; } \ No newline at end of file diff --git a/src/test/java/io/zeebe/exporter/proto/RecordTransformTest.java b/src/test/java/io/zeebe/exporter/proto/RecordTransformTest.java index b466301..68d43ba 100644 --- a/src/test/java/io/zeebe/exporter/proto/RecordTransformTest.java +++ b/src/test/java/io/zeebe/exporter/proto/RecordTransformTest.java @@ -934,6 +934,50 @@ public void shouldTransformResourceDeletionRecord() { assertThat(transformedRecord.getTenantId()).isEqualTo(recordValue.getTenantId()); } + @Test + public void shouldTransformUserTaskRecord() { + // given + final var recordValue = mockUserTaskRecordValue(); + final Record mockedRecord = + mockRecord(recordValue, ValueType.USER_TASK, UserTaskIntent.CREATED); + + // when + final var transformedRecord = + (Schema.UserTaskRecord) RecordTransformer.toProtobufMessage(mockedRecord); + + // then + assertMetadata(transformedRecord.getMetadata(), "USER_TASK", "CREATED"); + + assertThat(transformedRecord.getUserTaskKey()) + .isEqualTo(recordValue.getUserTaskKey()); + assertThat(transformedRecord.getAssignee()) + .isEqualTo(recordValue.getAssignee()); + assertThat(transformedRecord.getCandidateGroups()) + .isEqualTo(recordValue.getCandidateGroups()); + assertThat(transformedRecord.getCandidateUsers()) + .isEqualTo(recordValue.getCandidateUsers()); + assertThat(transformedRecord.getDueDate()) + .isEqualTo(recordValue.getDueDate()); + assertThat(transformedRecord.getFollowUpDate()) + .isEqualTo(recordValue.getFollowUpDate()); + assertThat(transformedRecord.getFormKey()) + .isEqualTo(recordValue.getFormKey()); + assertThat(transformedRecord.getBpmnProcessId()) + .isEqualTo(recordValue.getBpmnProcessId()); + assertThat(transformedRecord.getProcessDefinitionVersion()) + .isEqualTo(recordValue.getProcessDefinitionVersion()); + assertThat(transformedRecord.getProcessDefinitionKey()) + .isEqualTo(recordValue.getProcessDefinitionKey()); + assertThat(transformedRecord.getProcessInstanceKey()) + .isEqualTo(recordValue.getProcessInstanceKey()); + assertThat(transformedRecord.getElementId()) + .isEqualTo(recordValue.getElementId()); + assertThat(transformedRecord.getElementInstanceKey()) + .isEqualTo(recordValue.getElementInstanceKey()); + assertThat(transformedRecord.getTenantId()).isEqualTo(recordValue.getTenantId()); + assertVariables(transformedRecord.getVariables()); + } + private void assertEvaluatedDecision( final Schema.DecisionEvaluationRecord.EvaluatedDecision transformedRecord, final EvaluatedDecisionValue recordValue) { @@ -1383,6 +1427,26 @@ private ResourceDeletionRecordValue mockResourceDeletionRecordValue() { when(value.getTenantId()).thenReturn(TENANT_ID); return value; } + private UserTaskRecordValue mockUserTaskRecordValue() { + final var value = mock(UserTaskRecordValue.class); + when(value.getUserTaskKey()).thenReturn(1L); + when(value.getAssignee()).thenReturn("assignee"); + when(value.getCandidateGroups()).thenReturn("candidate-groups"); + when(value.getCandidateUsers()).thenReturn("candidate-users"); + when(value.getDueDate()).thenReturn("2024-04-01T12:00:00Z"); + when(value.getFollowUpDate()).thenReturn("2024-04-02T12:00:00Z"); + when(value.getFormKey()).thenReturn(2L); + when(value.getVariables()).thenReturn(VARIABLES); + when(value.getBpmnProcessId()).thenReturn("bpmn-process-id"); + when(value.getProcessDefinitionVersion()).thenReturn(3); + when(value.getProcessDefinitionKey()).thenReturn(4L); + when(value.getProcessInstanceKey()).thenReturn(5L); + when(value.getElementId()).thenReturn("element-id"); + when(value.getElementInstanceKey()).thenReturn(6L); + when(value.getTenantId()).thenReturn(TENANT_ID); + return value; + } + private void assertVariables(final Struct payload) { assertThat(payload.getFieldsCount()).isEqualTo(1);