diff --git a/src/modules/Elsa.MongoDb/Common/MongoDbStore.cs b/src/modules/Elsa.MongoDb/Common/MongoDbStore.cs index e69eec992..3b3140cc1 100644 --- a/src/modules/Elsa.MongoDb/Common/MongoDbStore.cs +++ b/src/modules/Elsa.MongoDb/Common/MongoDbStore.cs @@ -1,4 +1,5 @@ using System.Linq.Expressions; +using Elsa.Extensions; using Elsa.MongoDb.Extensions; using JetBrains.Annotations; using MongoDB.Driver; @@ -163,12 +164,21 @@ public class MongoDbStore where TDocument : class /// Deletes documents using a query. /// /// The number of documents deleted. - public async Task DeleteWhereAsync(Func, IMongoQueryable> query, CancellationToken cancellationToken = default) + public async Task DeleteWhereAsync(Func, IMongoQueryable> query, Expression> keySelector, CancellationToken cancellationToken = default) + { + var key = keySelector.GetPropertyName(); + return await DeleteWhereAsync(query, key, cancellationToken); + } + + /// + /// Deletes documents using a query. + /// + /// The number of documents deleted. + public async Task DeleteWhereAsync(Func, IMongoQueryable> query, string key = "Id", CancellationToken cancellationToken = default) { var documentsToDelete = await query(_collection.AsQueryable()).ToListAsync(cancellationToken); var count = documentsToDelete.LongCount(); - - var filter = documentsToDelete.BuildIdFilterForList(); + var filter = documentsToDelete.BuildIdFilterForList(key); await _collection.DeleteManyAsync(filter, cancellationToken); return count; diff --git a/src/modules/Elsa.MongoDb/Extensions/DocumentExtensions.cs b/src/modules/Elsa.MongoDb/Extensions/DocumentExtensions.cs index 47ef99c61..18cfdd05c 100644 --- a/src/modules/Elsa.MongoDb/Extensions/DocumentExtensions.cs +++ b/src/modules/Elsa.MongoDb/Extensions/DocumentExtensions.cs @@ -42,11 +42,12 @@ public static class DocumentExtensions /// Builds a filter expression for the Id property name of the specified documents. /// /// The documents. + /// The key. /// The type of the document. /// The type does not have an Id property. - public static FilterDefinition BuildIdFilterForList(this IEnumerable documents) + public static FilterDefinition BuildIdFilterForList(this IEnumerable documents, string key = "Id") { - var propertyName = "Id"; + var propertyName = key; var idProperty = typeof(TDocument).GetProperty(propertyName); if (idProperty == null) { diff --git a/src/modules/Elsa.MongoDb/Modules/Identity/ApplicationStore.cs b/src/modules/Elsa.MongoDb/Modules/Identity/ApplicationStore.cs index 70c9f5ead..aef3a8e17 100644 --- a/src/modules/Elsa.MongoDb/Modules/Identity/ApplicationStore.cs +++ b/src/modules/Elsa.MongoDb/Modules/Identity/ApplicationStore.cs @@ -27,7 +27,7 @@ public class MongoApplicationStore : IApplicationStore /// public async Task DeleteAsync(ApplicationFilter filter, CancellationToken cancellationToken = default) => - await _applicationMongoDbStore.DeleteWhereAsync(query => Filter(query, filter), cancellationToken); + await _applicationMongoDbStore.DeleteWhereAsync(query => Filter(query, filter), x => x.Id, cancellationToken); /// public async Task FindAsync(ApplicationFilter filter, CancellationToken cancellationToken = default) => diff --git a/src/modules/Elsa.MongoDb/Modules/Identity/RoleStore.cs b/src/modules/Elsa.MongoDb/Modules/Identity/RoleStore.cs index 895540ae3..66bfc1e7a 100644 --- a/src/modules/Elsa.MongoDb/Modules/Identity/RoleStore.cs +++ b/src/modules/Elsa.MongoDb/Modules/Identity/RoleStore.cs @@ -25,12 +25,13 @@ public class MongoRoleStore : IRoleStore public async Task SaveAsync(Role application, CancellationToken cancellationToken = default) => await _roleMongoDbStore.SaveAsync(application, cancellationToken); + /// public async Task AddAsync(Role role, CancellationToken cancellationToken = default) => await _roleMongoDbStore.SaveAsync(role, cancellationToken); /// public async Task DeleteAsync(RoleFilter filter, CancellationToken cancellationToken = default) => - await _roleMongoDbStore.DeleteWhereAsync(query => Filter(query, filter), cancellationToken); + await _roleMongoDbStore.DeleteWhereAsync(query => Filter(query, filter), x => x.Id, cancellationToken); /// public async Task FindAsync(RoleFilter filter, CancellationToken cancellationToken = default) => diff --git a/src/modules/Elsa.MongoDb/Modules/Identity/UserStore.cs b/src/modules/Elsa.MongoDb/Modules/Identity/UserStore.cs index 00963febf..46526ef92 100644 --- a/src/modules/Elsa.MongoDb/Modules/Identity/UserStore.cs +++ b/src/modules/Elsa.MongoDb/Modules/Identity/UserStore.cs @@ -27,7 +27,7 @@ public class MongoUserStore : IUserStore /// public async Task DeleteAsync(UserFilter filter, CancellationToken cancellationToken = default) => - await _userMongoDbStore.DeleteWhereAsync(query => Filter(query, filter), cancellationToken); + await _userMongoDbStore.DeleteWhereAsync(query => Filter(query, filter), x => x.Id, cancellationToken); /// public async Task FindAsync(UserFilter filter, CancellationToken cancellationToken = default) => diff --git a/src/modules/Elsa.MongoDb/Modules/Management/WorkflowInstanceStore.cs b/src/modules/Elsa.MongoDb/Modules/Management/WorkflowInstanceStore.cs index ca4a06744..fc5ef5c38 100644 --- a/src/modules/Elsa.MongoDb/Modules/Management/WorkflowInstanceStore.cs +++ b/src/modules/Elsa.MongoDb/Modules/Management/WorkflowInstanceStore.cs @@ -85,7 +85,7 @@ public class MongoWorkflowInstanceStore : IWorkflowInstanceStore /// public async Task DeleteAsync(WorkflowInstanceFilter filter, CancellationToken cancellationToken = default) => - await _mongoDbStore.DeleteWhereAsync(query => Filter(query, filter), cancellationToken); + await _mongoDbStore.DeleteWhereAsync(query => Filter(query, filter), x => x.Id, cancellationToken); /// public async Task SaveAsync(WorkflowInstance instance, CancellationToken cancellationToken = default) => diff --git a/src/modules/Elsa.MongoDb/Modules/Runtime/BookmarkStore.cs b/src/modules/Elsa.MongoDb/Modules/Runtime/BookmarkStore.cs index 24f93626f..aa2b9356c 100644 --- a/src/modules/Elsa.MongoDb/Modules/Runtime/BookmarkStore.cs +++ b/src/modules/Elsa.MongoDb/Modules/Runtime/BookmarkStore.cs @@ -31,7 +31,7 @@ public class MongoBookmarkStore : IBookmarkStore /// public async ValueTask DeleteAsync(BookmarkFilter filter, CancellationToken cancellationToken = default) => - await _mongoDbStore.DeleteWhereAsync(query => Filter(query, filter), cancellationToken); + await _mongoDbStore.DeleteWhereAsync(query => Filter(query, filter), x => x.BookmarkId, cancellationToken); private IMongoQueryable Filter(IMongoQueryable queryable, BookmarkFilter filter) => (filter.Apply(queryable) as IMongoQueryable)!; diff --git a/src/modules/Elsa.MongoDb/Modules/Runtime/TriggerStore.cs b/src/modules/Elsa.MongoDb/Modules/Runtime/TriggerStore.cs index 566501bdf..0f8c1541b 100644 --- a/src/modules/Elsa.MongoDb/Modules/Runtime/TriggerStore.cs +++ b/src/modules/Elsa.MongoDb/Modules/Runtime/TriggerStore.cs @@ -49,7 +49,7 @@ public class MongoTriggerStore : ITriggerStore /// public async ValueTask DeleteManyAsync(TriggerFilter filter, CancellationToken cancellationToken = default) => - await _mongoDbStore.DeleteWhereAsync(query => Filter(query, filter), cancellationToken); + await _mongoDbStore.DeleteWhereAsync(query => Filter(query, filter), x => x.Id, cancellationToken); private static IMongoQueryable Filter(IMongoQueryable queryable, TriggerFilter filter) => (filter.Apply(queryable) as IMongoQueryable)!; diff --git a/src/modules/Elsa.MongoDb/Modules/Runtime/WorkflowExecutionLogStore.cs b/src/modules/Elsa.MongoDb/Modules/Runtime/WorkflowExecutionLogStore.cs index 9e9d50b4c..39b7c26b5 100644 --- a/src/modules/Elsa.MongoDb/Modules/Runtime/WorkflowExecutionLogStore.cs +++ b/src/modules/Elsa.MongoDb/Modules/Runtime/WorkflowExecutionLogStore.cs @@ -66,7 +66,7 @@ public class MongoWorkflowExecutionLogStore : IWorkflowExecutionLogStore /// public async Task DeleteManyAsync(WorkflowExecutionLogRecordFilter filter, CancellationToken cancellationToken = default) { - return await _mongoDbStore.DeleteWhereAsync(queryable => Filter(queryable, filter), cancellationToken); + return await _mongoDbStore.DeleteWhereAsync(queryable => Filter(queryable, filter), x => x.Id, cancellationToken); } private IMongoQueryable Filter(IMongoQueryable queryable, WorkflowExecutionLogRecordFilter filter) => diff --git a/src/modules/Elsa.MongoDb/Modules/Runtime/WorkflowStateStore.cs b/src/modules/Elsa.MongoDb/Modules/Runtime/WorkflowStateStore.cs index 84477215e..9ccb3f0ba 100644 --- a/src/modules/Elsa.MongoDb/Modules/Runtime/WorkflowStateStore.cs +++ b/src/modules/Elsa.MongoDb/Modules/Runtime/WorkflowStateStore.cs @@ -52,7 +52,7 @@ public class MongoWorkflowStateStore : IWorkflowStateStore /// public async Task DeleteManyAsync(WorkflowStateFilter filter, CancellationToken cancellationToken = default) { - return await _mongoDbStore.DeleteWhereAsync(queryable => Filter(queryable, filter), cancellationToken); + return await _mongoDbStore.DeleteWhereAsync(queryable => Filter(queryable, filter), x => x.Id, cancellationToken); } private IMongoQueryable Filter(IMongoQueryable queryable, WorkflowStateFilter filter) => (filter.Apply(queryable) as IMongoQueryable)!;