| | | 1 | | using Elsa.Persistence.VNext; |
| | | 2 | | using Elsa.Persistence.VNext.Builders; |
| | | 3 | | using Elsa.Persistence.VNext.Contracts; |
| | | 4 | | |
| | | 5 | | namespace Elsa.UserTasks.Persistence.VNext; |
| | | 6 | | |
| | | 7 | | public sealed class UserTaskPersistenceSchemaProvider : IPersistenceSchemaProvider |
| | | 8 | | { |
| | | 9 | | public PersistenceSchema DescribeSchema() |
| | | 10 | | { |
| | 1 | 11 | | var schema = new PersistenceSchemaBuilder("Elsa.UserTasks").Version(1); |
| | 2 | 12 | | schema.StorageUnit("UserTasks", storage => storage |
| | 2 | 13 | | .RequiredField("Id", PersistenceColumnType.String, 450).RequiredField("TenantId", PersistenceColumnType.Stri |
| | 2 | 14 | | .RequiredField("WorkflowDefinitionId", PersistenceColumnType.String, 450).RequiredField("WorkflowInstanceId" |
| | 2 | 15 | | .RequiredField("ActivityInstanceId", PersistenceColumnType.String, 450).RequiredField("BookmarkId", Persiste |
| | 2 | 16 | | .RequiredField("MaterializationKey", PersistenceColumnType.String, 900).RequiredField("Title", PersistenceCo |
| | 2 | 17 | | .Field("Summary", PersistenceColumnType.Text).Field("Reference", PersistenceColumnType.String, length: 500). |
| | 2 | 18 | | .RequiredField("TagsJson", PersistenceColumnType.Json).Field("Requester", PersistenceColumnType.Json).Field( |
| | 2 | 19 | | .Field("RequesterProvider", PersistenceColumnType.String, length: 200).Field("RequesterType", PersistenceCol |
| | 2 | 20 | | .Field("RequesterId", PersistenceColumnType.String, length: 450).Field("RequesterDisplayName", PersistenceCo |
| | 2 | 21 | | .Field("AssigneeProvider", PersistenceColumnType.String, length: 200).Field("AssigneeType", PersistenceColum |
| | 2 | 22 | | .Field("HealthSeverity", PersistenceColumnType.String, length: 32).Field("HealthCode", PersistenceColumnType |
| | 2 | 23 | | .RequiredField("Status", PersistenceColumnType.String, 32).RequiredField("Priority", PersistenceColumnType.I |
| | 2 | 24 | | .RequiredField("IsOverdue", PersistenceColumnType.Boolean).RequiredField("TimeoutEnabled", PersistenceColumn |
| | 2 | 25 | | .RequiredField("CancellationEnabled", PersistenceColumnType.Boolean).RequiredField("AllowManagerExclusionOve |
| | 2 | 26 | | .Field("MembershipResolutionMode", PersistenceColumnType.String, length: 32).RequiredField("Revision", Persi |
| | 2 | 27 | | .RequiredField("InstructionsJson", PersistenceColumnType.Json).RequiredField("TaskDataJson", PersistenceColu |
| | 2 | 28 | | .Field("FormReferenceJson", PersistenceColumnType.Json).Field("PinnedFormJson", PersistenceColumnType.Json). |
| | 2 | 29 | | .RequiredField("InvitationDefinitionsJson", PersistenceColumnType.Json).RequiredField("CompletionDataJson", |
| | 2 | 30 | | .RequiredField("HealthIssuesJson", PersistenceColumnType.Json).Field("CompletionActionKey", PersistenceColum |
| | 2 | 31 | | .RequiredField("CreatedAt", PersistenceColumnType.DateTimeOffset).RequiredField("UpdatedAt", PersistenceColu |
| | 2 | 32 | | .Field("AssignedAt", PersistenceColumnType.DateTimeOffset).Field("CompletedAt", PersistenceColumnType.DateTi |
| | 2 | 33 | | .Key("PK_UserTasks", "Id").Index("IX_UserTasks_Tenant_MaterializationKey", ["TenantId", "MaterializationKey" |
| | 2 | 34 | | .Index("IX_UserTasks_Tenant_BookmarkId", ["TenantId", "BookmarkId"], unique: true).Index("IX_UserTasks_Tenan |
| | 2 | 35 | | // Status alone, deliberately: resolving an invitation token hash is tenant-agnostic by |
| | 2 | 36 | | // design, and the store only serves a query whose filter set exactly matches an index. |
| | 2 | 37 | | .Index("IX_UserTasks_Status", ["Status"]) |
| | 2 | 38 | | .Index("IX_UserTasks_Tenant_Assignee", ["TenantId", "AssigneeProvider", "AssigneeType", "AssigneeId"]).Index |
| | 2 | 39 | | .Index("IX_UserTasks_Tenant_DueAt", ["TenantId", "DueAt"]).Index("IX_UserTasks_Tenant_WorkflowDefinition", [ |
| | 2 | 40 | | .Index("IX_UserTasks_Tenant_WorkflowInstance", ["TenantId", "WorkflowInstanceId"]).Index("IX_UserTasks_Tenan |
| | 2 | 41 | | .Index("IX_UserTasks_Tenant_CreatedAt", ["TenantId", "CreatedAt"]).Index("IX_UserTasks_Tenant_CompletedAt", |
| | 1 | 42 | | AddParticipantUnit(schema, "UserTaskCandidates", includeSource: true); |
| | 1 | 43 | | AddParticipantUnit(schema, "UserTaskSnapshotMembers", includeSource: false); |
| | 1 | 44 | | AddParticipantUnit(schema, "UserTaskExclusions", includeSource: false); |
| | 2 | 45 | | schema.StorageUnit("UserTaskEvents", storage => storage |
| | 2 | 46 | | .RequiredField("Id", PersistenceColumnType.String, 450).RequiredField("TenantId", PersistenceColumnType.Stri |
| | 2 | 47 | | .RequiredField("Revision", PersistenceColumnType.Int32).RequiredField("EventType", PersistenceColumnType.Str |
| | 2 | 48 | | .Field("OperationId", PersistenceColumnType.String, length: 450).Field("ActorProvider", PersistenceColumnTyp |
| | 2 | 49 | | .Field("ActorId", PersistenceColumnType.String, length: 450).Field("Actor", PersistenceColumnType.Json).Fiel |
| | 2 | 50 | | .Key("PK_UserTaskEvents", "Id").Index("IX_UserTaskEvents_Task_Revision", ["TaskId", "Revision"], unique: tru |
| | 2 | 51 | | schema.StorageUnit("UserTaskOperations", storage => storage |
| | 2 | 52 | | .RequiredField("Id", PersistenceColumnType.String, 450).RequiredField("TenantId", PersistenceColumnType.Stri |
| | 2 | 53 | | .RequiredField("OperationId", PersistenceColumnType.String, 450).RequiredField("Kind", PersistenceColumnType |
| | 2 | 54 | | .RequiredField("RequestHash", PersistenceColumnType.String, 128).RequiredField("Status", PersistenceColumnTy |
| | 2 | 55 | | .Field("ErrorCode", PersistenceColumnType.String, length: 200).RequiredField("Attempts", PersistenceColumnTy |
| | 2 | 56 | | .Field("ProtectedPayloadJson", PersistenceColumnType.Json).RequiredField("CreatedAt", PersistenceColumnType. |
| | 2 | 57 | | .Key("PK_UserTaskOperations", "Id").Index("IX_UserTaskOperations_Tenant_Task_Operation", ["TenantId", "TaskI |
| | 2 | 58 | | schema.StorageUnit("UserTaskInvitations", storage => storage |
| | 2 | 59 | | .RequiredField("Id", PersistenceColumnType.String, 450).RequiredField("TenantId", PersistenceColumnType.Stri |
| | 2 | 60 | | .Field("SiblingGroupId", PersistenceColumnType.String, length: 450).Field("RecipientJson", PersistenceColumn |
| | 2 | 61 | | .Field("ChallengeJson", PersistenceColumnType.Json) |
| | 2 | 62 | | .RequiredField("Status", PersistenceColumnType.String, 32).RequiredField("IssuedAt", PersistenceColumnType.D |
| | 2 | 63 | | .Field("VerifiedAt", PersistenceColumnType.DateTimeOffset).Field("ConsumedAt", PersistenceColumnType.DateTim |
| | 2 | 64 | | .Key("PK_UserTaskInvitations", "Id").Index("IX_UserTaskInvitations_TokenHash", "TokenHash", unique: true).In |
| | 2 | 65 | | schema.StorageUnit("UserTaskInvitationDeliveries", storage => storage |
| | 2 | 66 | | .RequiredField("Id", PersistenceColumnType.String, 450).RequiredField("TenantId", PersistenceColumnType.Stri |
| | 2 | 67 | | .RequiredField("InvitationId", PersistenceColumnType.String, 450).RequiredField("DispatcherProvider", Persis |
| | 2 | 68 | | .Field("DeliveryMetadataJson", PersistenceColumnType.Json).RequiredField("Status", PersistenceColumnType.Str |
| | 2 | 69 | | .RequiredField("AvailableAt", PersistenceColumnType.DateTimeOffset).RequiredField("ExpiresAt", PersistenceCo |
| | 2 | 70 | | .RequiredField("CreatedAt", PersistenceColumnType.DateTimeOffset).Field("DeliveredAt", PersistenceColumnType |
| | 2 | 71 | | .Key("PK_UserTaskInvitationDeliveries", "Id").Index("IX_UserTaskInvitationDeliveries_Tenant_Status_Available |
| | 2 | 72 | | .Index("IX_UserTaskInvitationDeliveries_Tenant_Invitation", ["TenantId", "InvitationId"], unique: true), @na |
| | 2 | 73 | | schema.StorageUnit("UserTaskGuestSessions", storage => storage |
| | 2 | 74 | | .RequiredField("Id", PersistenceColumnType.String, 450).RequiredField("TenantId", PersistenceColumnType.Stri |
| | 2 | 75 | | .RequiredField("InvitationId", PersistenceColumnType.String, 450).RequiredField("SessionTokenHash", Persiste |
| | 2 | 76 | | .RequiredField("CapabilitiesJson", PersistenceColumnType.Json).RequiredField("IssuedAt", PersistenceColumnTy |
| | 2 | 77 | | .Key("PK_UserTaskGuestSessions", "Id").Index("IX_UserTaskGuestSessions_SessionTokenHash", "SessionTokenHash" |
| | 1 | 78 | | return schema.Build(); |
| | | 79 | | } |
| | | 80 | | |
| | 3 | 81 | | private static void AddParticipantUnit(PersistenceSchemaBuilder schema, string name, bool includeSource) => schema.S |
| | 3 | 82 | | { |
| | 3 | 83 | | storage.RequiredField("Id", PersistenceColumnType.String, 450).RequiredField("TenantId", PersistenceColumnType.S |
| | 3 | 84 | | .RequiredField("Provider", PersistenceColumnType.String, 200).RequiredField("ParticipantKey", PersistenceCol |
| | 3 | 85 | | .RequiredField("ParticipantId", PersistenceColumnType.String, 450).Field("DisplayName", PersistenceColumnTyp |
| | 3 | 86 | | if (includeSource) |
| | 1 | 87 | | storage.RequiredField("Source", PersistenceColumnType.String, 32).Field("SourceGroupProvider", PersistenceCo |
| | 3 | 88 | | storage.RequiredField("CreatedAt", PersistenceColumnType.DateTimeOffset).Key($"PK_{name}", "Id"); |
| | 3 | 89 | | if (includeSource) |
| | 1 | 90 | | storage.Index($"IX_{name}_Tenant_Task_Participant", ["TenantId", "TaskId", "Provider", "ParticipantType", "P |
| | 3 | 91 | | else |
| | 2 | 92 | | storage.Index($"IX_{name}_Tenant_Task_Participant", ["TenantId", "TaskId", "Provider", "ParticipantType", "P |
| | 3 | 93 | | storage.Index($"IX_{name}_Tenant_Participant", ["TenantId", "Provider", "ParticipantType", "ParticipantId"]) |
| | 3 | 94 | | .Index($"IX_{name}_Tenant_Task_ParticipantKey", ["TenantId", "TaskId", "ParticipantKey"]); |
| | 6 | 95 | | }, @namespace: "Elsa.UserTasks"); |
| | | 96 | | } |