diff --git a/BuildingBlocks/src/BuildingBlocks.Application/FluentValidation/NumberOfBytesValidator.cs b/BuildingBlocks/src/BuildingBlocks.Application/FluentValidation/NumberOfBytesValidator.cs index a475449c37..015c7d786c 100644 --- a/BuildingBlocks/src/BuildingBlocks.Application/FluentValidation/NumberOfBytesValidator.cs +++ b/BuildingBlocks/src/BuildingBlocks.Application/FluentValidation/NumberOfBytesValidator.cs @@ -4,7 +4,7 @@ namespace Backbone.BuildingBlocks.Application.FluentValidation; -public class NumberOfBytesValidator : PropertyValidator, ILengthValidator +public class NumberOfBytesValidator : PropertyValidator, ILengthValidator { public NumberOfBytesValidator(int min, int max) { @@ -51,7 +51,7 @@ protected override string GetDefaultMessageTemplate(string errorCode) public static class NumberOfBytesValidatorRuleBuilderExtensions { - public static IRuleBuilderOptions NumberOfBytes(this IRuleBuilder ruleBuilder, + public static IRuleBuilderOptions NumberOfBytes(this IRuleBuilder ruleBuilder, int minNumberOfBytes, int maxNumberOfBytes) { return ruleBuilder diff --git a/Modules/Files/src/Files.Domain/Entities/File.cs b/Modules/Files/src/Files.Domain/Entities/File.cs index 9f69b8d208..03cc683e17 100644 --- a/Modules/Files/src/Files.Domain/Entities/File.cs +++ b/Modules/Files/src/Files.Domain/Entities/File.cs @@ -6,6 +6,7 @@ namespace Backbone.Modules.Files.Domain.Entities; public class File { + // ReSharper disable once UnusedMember.Local private File() { // This constructor is for EF Core only; initializing the properties with null is therefore not a problem diff --git a/Modules/Relationships/src/Relationships.Application/Extensions/ChangeHistoryExtensions.cs b/Modules/Relationships/src/Relationships.Application/Extensions/ChangeHistoryExtensions.cs deleted file mode 100644 index 5e687a37e1..0000000000 --- a/Modules/Relationships/src/Relationships.Application/Extensions/ChangeHistoryExtensions.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Backbone.BuildingBlocks.Application.Abstractions.Exceptions; -using Backbone.Modules.Relationships.Domain.Entities; -using ApplicationException = Backbone.BuildingBlocks.Application.Abstractions.Exceptions.ApplicationException; - -namespace Backbone.Modules.Relationships.Application.Extensions; - -public static class ChangeHistoryExtensions -{ - public static RelationshipChange GetLatestOpenOfTypeOrNull(this IRelationshipChangeLog changes, RelationshipChangeType type) - { - var change = changes.LastOrDefault(c => c.Type == type && c.Status == RelationshipChangeStatus.Pending); - return change; - } - - - public static RelationshipChange GetLatestOfType(this IRelationshipChangeLog changes, RelationshipChangeType type) - { - var change = changes.LastOrDefault(c => c.Type == type) ?? throw new ApplicationException(GenericApplicationErrors.NotFound(nameof(RelationshipChange))); - return change; - } -} diff --git a/Modules/Relationships/src/Relationships.Application/Infrastructure/BlobOptions.cs b/Modules/Relationships/src/Relationships.Application/Infrastructure/BlobOptions.cs index 1a2c2eec66..8e7c732de6 100644 --- a/Modules/Relationships/src/Relationships.Application/Infrastructure/BlobOptions.cs +++ b/Modules/Relationships/src/Relationships.Application/Infrastructure/BlobOptions.cs @@ -2,5 +2,5 @@ public class BlobOptions { - public string RootFolder { get; set; } + public string? RootFolder { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Infrastructure/Persistence/Repository/IRelationshipsRepository.cs b/Modules/Relationships/src/Relationships.Application/Infrastructure/Persistence/Repository/IRelationshipsRepository.cs index b0a0383a5e..f7f0c0e803 100644 --- a/Modules/Relationships/src/Relationships.Application/Infrastructure/Persistence/Repository/IRelationshipsRepository.cs +++ b/Modules/Relationships/src/Relationships.Application/Infrastructure/Persistence/Repository/IRelationshipsRepository.cs @@ -10,10 +10,10 @@ public interface IRelationshipsRepository { Task> FindRelationshipsWithIds(IEnumerable ids, IdentityAddress identityAddress, PaginationFilter paginationFilter, CancellationToken cancellationToken, bool track = false); Task> FindChangesWithIds(IEnumerable ids, RelationshipChangeType? relationshipChangeType, - RelationshipChangeStatus? relationshipChangeStatus, OptionalDateRange modifiedAt, OptionalDateRange createdAt, OptionalDateRange completedAt, IdentityAddress createdBy, - IdentityAddress completedBy, IdentityAddress identityAddress, PaginationFilter paginationFilter, CancellationToken cancellationToken, bool onlyPeerChanges = false, bool track = false); + RelationshipChangeStatus? relationshipChangeStatus, OptionalDateRange? modifiedAt, OptionalDateRange? createdAt, OptionalDateRange? completedAt, IdentityAddress? createdBy, + IdentityAddress? completedBy, IdentityAddress activeIdentity, PaginationFilter paginationFilter, CancellationToken cancellationToken, bool onlyPeerChanges = false, bool track = false); Task FindRelationship(RelationshipId id, IdentityAddress identityAddress, CancellationToken cancellationToken, bool track = false); - Task FindRelationshipChange(RelationshipChangeId id, IdentityAddress identityAddress, CancellationToken cancellationToken, bool track = false); + Task FindRelationshipChange(RelationshipChangeId id, IdentityAddress identityAddress, CancellationToken cancellationToken, bool track = false); Task Add(Relationship relationship, CancellationToken cancellationToken); Task Update(Relationship relationship); diff --git a/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Commands/CreateRelationshipTemplate/CreateRelationshipTemplateCommand.cs b/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Commands/CreateRelationshipTemplate/CreateRelationshipTemplateCommand.cs index dfd092e771..c6b8546881 100644 --- a/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Commands/CreateRelationshipTemplate/CreateRelationshipTemplateCommand.cs +++ b/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Commands/CreateRelationshipTemplate/CreateRelationshipTemplateCommand.cs @@ -10,5 +10,5 @@ public class CreateRelationshipTemplateCommand : IMapTo, I { public DateTime? ExpiresAt { get; set; } public int? MaxNumberOfAllocations { get; set; } - public byte[] Content { get; set; } + public required byte[] Content { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Commands/CreateRelationshipTemplate/CreateRelationshipTemplateResponse.cs b/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Commands/CreateRelationshipTemplate/CreateRelationshipTemplateResponse.cs index 9e506cbc0e..f92db7a4bf 100644 --- a/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Commands/CreateRelationshipTemplate/CreateRelationshipTemplateResponse.cs +++ b/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Commands/CreateRelationshipTemplate/CreateRelationshipTemplateResponse.cs @@ -6,6 +6,6 @@ namespace Backbone.Modules.Relationships.Application.RelationshipTemplates.Comma public class CreateRelationshipTemplateResponse : IMapTo { - public RelationshipTemplateId Id { get; set; } - public DateTime CreatedAt { get; set; } + public required RelationshipTemplateId Id { get; set; } + public required DateTime CreatedAt { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Queries/GetRelationshipTemplate/GetRelationshipTemplateQuery.cs b/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Queries/GetRelationshipTemplate/GetRelationshipTemplateQuery.cs index faf58a4555..fd44e1e592 100644 --- a/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Queries/GetRelationshipTemplate/GetRelationshipTemplateQuery.cs +++ b/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Queries/GetRelationshipTemplate/GetRelationshipTemplateQuery.cs @@ -6,5 +6,5 @@ namespace Backbone.Modules.Relationships.Application.RelationshipTemplates.Queri public class GetRelationshipTemplateQuery : IRequest { - public RelationshipTemplateId Id { get; set; } + public required RelationshipTemplateId Id { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Queries/ListRelationshipTemplates/ListRelationshipTemplatesQuery.cs b/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Queries/ListRelationshipTemplates/ListRelationshipTemplatesQuery.cs index 16a8e6e6e8..57f4349cd7 100644 --- a/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Queries/ListRelationshipTemplates/ListRelationshipTemplatesQuery.cs +++ b/Modules/Relationships/src/Relationships.Application/RelationshipTemplates/Queries/ListRelationshipTemplates/ListRelationshipTemplatesQuery.cs @@ -6,10 +6,10 @@ namespace Backbone.Modules.Relationships.Application.RelationshipTemplates.Queri public class ListRelationshipTemplatesQuery : IRequest { - public ListRelationshipTemplatesQuery(PaginationFilter paginationFilter, IEnumerable ids) + public ListRelationshipTemplatesQuery(PaginationFilter paginationFilter, IEnumerable? ids) { PaginationFilter = paginationFilter; - Ids = ids == null ? null : new List(ids); + Ids = ids == null ? [] : new List(ids); } public PaginationFilter PaginationFilter { get; set; } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships.Application.csproj b/Modules/Relationships/src/Relationships.Application/Relationships.Application.csproj index 75991db824..dd8421092d 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships.Application.csproj +++ b/Modules/Relationships/src/Relationships.Application/Relationships.Application.csproj @@ -1,4 +1,7 @@ + + enable + diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/AcceptRelationshipChangeRequest/AcceptRelationshipChangeRequestCommand.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/AcceptRelationshipChangeRequest/AcceptRelationshipChangeRequestCommand.cs index 3fd7a04c04..0eca283bb9 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/AcceptRelationshipChangeRequest/AcceptRelationshipChangeRequestCommand.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/AcceptRelationshipChangeRequest/AcceptRelationshipChangeRequestCommand.cs @@ -5,7 +5,7 @@ namespace Backbone.Modules.Relationships.Application.Relationships.Commands.Acce public class AcceptRelationshipChangeRequestCommand : IRequest { - public RelationshipId Id { get; set; } - public RelationshipChangeId ChangeId { get; set; } - public byte[] ResponseContent { get; set; } + public required RelationshipId Id { get; set; } + public required RelationshipChangeId ChangeId { get; set; } + public byte[]? ResponseContent { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/CreateRelationship/CreateRelationshipCommand.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/CreateRelationship/CreateRelationshipCommand.cs index 2a3f992e2e..48a519a100 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/CreateRelationship/CreateRelationshipCommand.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/CreateRelationship/CreateRelationshipCommand.cs @@ -7,6 +7,6 @@ namespace Backbone.Modules.Relationships.Application.Relationships.Commands.Crea [ApplyQuotasForMetrics("NumberOfRelationships")] public class CreateRelationshipCommand : IRequest { - public RelationshipTemplateId RelationshipTemplateId { get; set; } - public byte[] Content { get; set; } + public required RelationshipTemplateId RelationshipTemplateId { get; set; } + public byte[]? Content { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/CreateRelationship/Handler.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/CreateRelationship/Handler.cs index ed0809fcec..31502f74cd 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/CreateRelationship/Handler.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/CreateRelationship/Handler.cs @@ -17,9 +17,9 @@ public class Handler : IRequestHandler Handle(CreateRelationshipCommand request, CancellationToken cancellationToken) @@ -77,12 +81,11 @@ private async Task CreateAndSaveRelationship() _request.Content); await _relationshipsRepository.Add(_relationship, _cancellationToken); - } private void PublishIntegrationEvent() { - var change = _relationship.Changes.FirstOrDefault(); + var change = _relationship.Changes.First(); // there is always one change, because the relationship was just created var evt = new RelationshipChangeCreatedIntegrationEvent(change); _eventBus.Publish(evt); } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/RejectRelationshipChangeRequest/RejectRelationshipChangeRequestCommand.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/RejectRelationshipChangeRequest/RejectRelationshipChangeRequestCommand.cs index a3b630a959..b8578f4910 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/RejectRelationshipChangeRequest/RejectRelationshipChangeRequestCommand.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/RejectRelationshipChangeRequest/RejectRelationshipChangeRequestCommand.cs @@ -5,7 +5,7 @@ namespace Backbone.Modules.Relationships.Application.Relationships.Commands.Reje public class RejectRelationshipChangeRequestCommand : IRequest { - public RelationshipId Id { get; set; } - public RelationshipChangeId ChangeId { get; set; } - public byte[] ResponseContent { get; set; } + public required RelationshipId Id { get; set; } + public required RelationshipChangeId ChangeId { get; set; } + public byte[]? ResponseContent { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/RevokeRelationshipChangeRequest/RevokeRelationshipChangeRequestCommand.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/RevokeRelationshipChangeRequest/RevokeRelationshipChangeRequestCommand.cs index fba41e80ae..aaf52cd6d4 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Commands/RevokeRelationshipChangeRequest/RevokeRelationshipChangeRequestCommand.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Commands/RevokeRelationshipChangeRequest/RevokeRelationshipChangeRequestCommand.cs @@ -5,7 +5,7 @@ namespace Backbone.Modules.Relationships.Application.Relationships.Commands.Revo public class RevokeRelationshipChangeRequestCommand : IRequest { - public RelationshipId Id { get; set; } - public RelationshipChangeId ChangeId { get; set; } - public byte[] ResponseContent { get; set; } + public required RelationshipId Id { get; set; } + public required RelationshipChangeId ChangeId { get; set; } + public byte[]? ResponseContent { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipChangeDTO.cs b/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipChangeDTO.cs index fa3f1987c7..8c60ee9e4e 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipChangeDTO.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipChangeDTO.cs @@ -7,30 +7,30 @@ namespace Backbone.Modules.Relationships.Application.Relationships.DTOs; public class RelationshipChangeDTO : IMapTo { - public RelationshipChangeId Id { get; set; } + public required RelationshipChangeId Id { get; set; } - public RelationshipId RelationshipId { get; set; } + public required RelationshipId RelationshipId { get; set; } - public RelationshipChangeRequestDTO Request { get; set; } - public RelationshipChangeResponseDTO Response { get; set; } + public required RelationshipChangeRequestDTO Request { get; set; } + public required RelationshipChangeResponseDTO? Response { get; set; } - public RelationshipChangeType Type { get; set; } + public required RelationshipChangeType Type { get; set; } - public RelationshipChangeStatus Status { get; set; } + public required RelationshipChangeStatus Status { get; set; } } public class RelationshipChangeRequestDTO : IMapTo { - public DateTime CreatedAt { get; set; } - public IdentityAddress CreatedBy { get; set; } - public DeviceId CreatedByDevice { get; set; } - public byte[] Content { get; set; } + public required DateTime CreatedAt { get; set; } + public required IdentityAddress CreatedBy { get; set; } + public required DeviceId CreatedByDevice { get; set; } + public required byte[]? Content { get; set; } } public class RelationshipChangeResponseDTO : IMapTo { - public DateTime CreatedAt { get; set; } - public IdentityAddress CreatedBy { get; set; } - public DeviceId CreatedByDevice { get; set; } - public byte[] Content { get; set; } + public required DateTime CreatedAt { get; set; } + public required IdentityAddress CreatedBy { get; set; } + public required DeviceId CreatedByDevice { get; set; } + public required byte[]? Content { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipDTO.cs b/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipDTO.cs index 223498ba6f..11a722bba1 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipDTO.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipDTO.cs @@ -7,14 +7,14 @@ namespace Backbone.Modules.Relationships.Application.Relationships.DTOs; public class RelationshipDTO : IMapTo { - public RelationshipId Id { get; set; } - public RelationshipTemplateId RelationshipTemplateId { get; set; } + public required RelationshipId Id { get; set; } + public required RelationshipTemplateId RelationshipTemplateId { get; set; } - public IdentityAddress From { get; set; } - public IdentityAddress To { get; set; } - public IEnumerable Changes { get; set; } + public required IdentityAddress From { get; set; } + public required IdentityAddress To { get; set; } + public required IEnumerable Changes { get; set; } - public DateTime CreatedAt { get; set; } + public required DateTime CreatedAt { get; set; } - public RelationshipStatus Status { get; set; } + public required RelationshipStatus Status { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipMetadataDTO.cs b/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipMetadataDTO.cs index 8b2af13981..6ac84aa5da 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipMetadataDTO.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipMetadataDTO.cs @@ -7,42 +7,42 @@ namespace Backbone.Modules.Relationships.Application.Relationships.DTOs; public class RelationshipMetadataDTO : IMapTo { - public RelationshipId Id { get; set; } - public RelationshipTemplateId RelationshipTemplateId { get; set; } + public required RelationshipId Id { get; set; } + public required RelationshipTemplateId RelationshipTemplateId { get; set; } - public IdentityAddress From { get; set; } - public IdentityAddress To { get; set; } - public IEnumerable Changes { get; set; } + public required IdentityAddress From { get; set; } + public required IdentityAddress To { get; set; } + public required IEnumerable Changes { get; set; } - public DateTime CreatedAt { get; set; } + public required DateTime CreatedAt { get; set; } - public RelationshipStatus Status { get; private set; } + public RelationshipStatus Status { get; set; } } public class RelationshipChangeMetadataDTO : IMapTo { - public RelationshipChangeId Id { get; set; } + public required RelationshipChangeId Id { get; set; } - public RelationshipId RelationshipId { get; set; } + public required RelationshipId RelationshipId { get; set; } - public RelationshipChangeRequestMetadataDTO Request { get; set; } - public RelationshipChangeResponseMetadataDTO Response { get; set; } + public required RelationshipChangeRequestMetadataDTO Request { get; set; } + public required RelationshipChangeResponseMetadataDTO? Response { get; set; } - public RelationshipChangeType Type { get; set; } + public required RelationshipChangeType Type { get; set; } - public RelationshipChangeStatus Status { get; set; } + public required RelationshipChangeStatus Status { get; set; } } public class RelationshipChangeRequestMetadataDTO : IMapTo { - public DateTime CreatedAt { get; set; } - public IdentityAddress CreatedBy { get; set; } - public DeviceId CreatedByDevice { get; set; } + public required DateTime CreatedAt { get; set; } + public required IdentityAddress CreatedBy { get; set; } + public required DeviceId CreatedByDevice { get; set; } } public class RelationshipChangeResponseMetadataDTO : IMapTo { - public DateTime CreatedAt { get; set; } - public IdentityAddress CreatedBy { get; set; } - public DeviceId CreatedByDevice { get; set; } + public required DateTime CreatedAt { get; set; } + public required IdentityAddress CreatedBy { get; set; } + public required DeviceId CreatedByDevice { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipTemplateDTO.cs b/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipTemplateDTO.cs index 74cfa1d9b9..ab94a754e6 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipTemplateDTO.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/DTOs/RelationshipTemplateDTO.cs @@ -7,14 +7,14 @@ namespace Backbone.Modules.Relationships.Application.Relationships.DTOs; public class RelationshipTemplateDTO : IMapTo { - public RelationshipTemplateId Id { get; set; } + public required RelationshipTemplateId Id { get; set; } - public IdentityAddress CreatedBy { get; set; } - public DeviceId CreatedByDevice { get; set; } + public required IdentityAddress CreatedBy { get; set; } + public required DeviceId CreatedByDevice { get; set; } public int? MaxNumberOfAllocations { get; set; } public DateTime? ExpiresAt { get; set; } - public byte[] Content { get; set; } + public byte[]? Content { get; set; } - public DateTime CreatedAt { get; set; } + public required DateTime CreatedAt { get; set; } public DateTime? DeletedAt { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/GetChange/GetChangeQuery.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/GetChange/GetChangeQuery.cs index 59dae60153..c8b64cc5ac 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/GetChange/GetChangeQuery.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/GetChange/GetChangeQuery.cs @@ -6,5 +6,5 @@ namespace Backbone.Modules.Relationships.Application.Relationships.Queries.GetCh public class GetChangeQuery : IRequest { - public RelationshipChangeId Id { get; set; } + public required RelationshipChangeId Id { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/GetRelationship/GetRelationshipQuery.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/GetRelationship/GetRelationshipQuery.cs index 0107fe0a93..3a93f43459 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/GetRelationship/GetRelationshipQuery.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/GetRelationship/GetRelationshipQuery.cs @@ -6,5 +6,5 @@ namespace Backbone.Modules.Relationships.Application.Relationships.Queries.GetRe public class GetRelationshipQuery : IRequest { - public RelationshipId Id { get; set; } + public required RelationshipId Id { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListChanges/ListChangesQuery.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListChanges/ListChangesQuery.cs index b5dcba8863..d63a4d2806 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListChanges/ListChangesQuery.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListChanges/ListChangesQuery.cs @@ -9,7 +9,7 @@ namespace Backbone.Modules.Relationships.Application.Relationships.Queries.ListC public class ListChangesQuery : IRequest { - public ListChangesQuery(PaginationFilter paginationFilter, IEnumerable ids, OptionalDateRange createdAt, OptionalDateRange completedAt, OptionalDateRange modifiedAt, RelationshipChangeStatus? status, RelationshipChangeType? type, IdentityAddress createdBy, IdentityAddress completedBy, bool onlyPeerChanges) + public ListChangesQuery(PaginationFilter paginationFilter, IEnumerable ids, OptionalDateRange? createdAt, OptionalDateRange? completedAt, OptionalDateRange? modifiedAt, RelationshipChangeStatus? status, RelationshipChangeType? type, IdentityAddress? createdBy, IdentityAddress? completedBy, bool onlyPeerChanges) { PaginationFilter = paginationFilter; Ids = ids; @@ -25,12 +25,12 @@ public ListChangesQuery(PaginationFilter paginationFilter, IEnumerable Ids { get; set; } - public OptionalDateRange CreatedAt { get; set; } - public OptionalDateRange CompletedAt { get; set; } - public OptionalDateRange ModifiedAt { get; } + public OptionalDateRange? CreatedAt { get; set; } + public OptionalDateRange? CompletedAt { get; set; } + public OptionalDateRange? ModifiedAt { get; } public RelationshipChangeStatus? Status { get; } - public IdentityAddress CreatedBy { get; set; } - public IdentityAddress CompletedBy { get; set; } + public IdentityAddress? CreatedBy { get; set; } + public IdentityAddress? CompletedBy { get; set; } public bool OnlyPeerChanges { get; set; } public RelationshipChangeType? Type { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListChanges/ListChangesQueryValidator.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListChanges/ListChangesQueryValidator.cs index 3bbe123529..9a7940ae19 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListChanges/ListChangesQueryValidator.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListChanges/ListChangesQueryValidator.cs @@ -11,6 +11,6 @@ public class ListChangesQueryValidator : AbstractValidator public ListChangesQueryValidator() { RuleFor(query => query.CreatedAt) - .IsValidRange().WithErrorCode(GenericApplicationErrors.Validation.InvalidPropertyValue().Code); + .IsValidRange().WithErrorCode(GenericApplicationErrors.Validation.InvalidPropertyValue().Code); } } diff --git a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListRelationships/ListRelationshipsQuery.cs b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListRelationships/ListRelationshipsQuery.cs index d510a7d547..47243c6b50 100644 --- a/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListRelationships/ListRelationshipsQuery.cs +++ b/Modules/Relationships/src/Relationships.Application/Relationships/Queries/ListRelationships/ListRelationshipsQuery.cs @@ -6,10 +6,10 @@ namespace Backbone.Modules.Relationships.Application.Relationships.Queries.ListR public class ListRelationshipsQuery : IRequest { - public ListRelationshipsQuery(PaginationFilter paginationFilter, IEnumerable ids) + public ListRelationshipsQuery(PaginationFilter paginationFilter, IEnumerable? ids) { PaginationFilter = paginationFilter; - Ids = ids == null ? null : new List(ids); + Ids = ids == null ? [] : new List(ids); } public PaginationFilter PaginationFilter { get; set; } diff --git a/Modules/Relationships/src/Relationships.Common/FluentValidation/RangeValidator.cs b/Modules/Relationships/src/Relationships.Common/FluentValidation/RangeValidator.cs index 2374ada170..ff88f5d60f 100644 --- a/Modules/Relationships/src/Relationships.Common/FluentValidation/RangeValidator.cs +++ b/Modules/Relationships/src/Relationships.Common/FluentValidation/RangeValidator.cs @@ -19,9 +19,9 @@ public override bool IsValid(ValidationContext context, TProperty value) } } -public static class NumberOfBytesValidatorRuleBuilderExtensions +public static class RangeValidatorRuleBuilderExtensions { - public static IRuleBuilderOptions IsValidRange(this IRuleBuilder ruleBuilder) where TProperty : Range + public static IRuleBuilderOptions IsValidRange(this IRuleBuilder ruleBuilder) where TProperty : Range? { return ruleBuilder .SetValidator(new RangeValidator()); diff --git a/Modules/Relationships/src/Relationships.Common/Range.cs b/Modules/Relationships/src/Relationships.Common/Range.cs index ce17726358..bbda087593 100644 --- a/Modules/Relationships/src/Relationships.Common/Range.cs +++ b/Modules/Relationships/src/Relationships.Common/Range.cs @@ -2,8 +2,6 @@ public class Range { - public Range() { } - public Range(T from, T to) { From = from; @@ -15,22 +13,20 @@ public Range(T from, T to) public bool HasFrom() { - return !From.Equals(default(T)); + return !Equals(From, default(T)); } public bool HasTo() { - return !To.Equals(default(T)); + return !Equals(To, default(T)); } } public class OptionalDateRange : Range { - public OptionalDateRange() { } + public OptionalDateRange() : base(null, null) { } public OptionalDateRange(DateTime? from, DateTime? to) : base(from, to) { - From = from; - To = to; } } diff --git a/Modules/Relationships/src/Relationships.Common/Relationships.Common.csproj b/Modules/Relationships/src/Relationships.Common/Relationships.Common.csproj index 502a925bb2..2e10c0ff24 100644 --- a/Modules/Relationships/src/Relationships.Common/Relationships.Common.csproj +++ b/Modules/Relationships/src/Relationships.Common/Relationships.Common.csproj @@ -1,7 +1,11 @@ - - - + + enable + + + + + diff --git a/Modules/Relationships/src/Relationships.ConsumerApi/Configuration.cs b/Modules/Relationships/src/Relationships.ConsumerApi/Configuration.cs index 67f81e1f61..a16ebf0f2c 100644 --- a/Modules/Relationships/src/Relationships.ConsumerApi/Configuration.cs +++ b/Modules/Relationships/src/Relationships.ConsumerApi/Configuration.cs @@ -16,7 +16,7 @@ public class InfrastructureConfiguration [Required] public SqlDatabaseConfiguration SqlDatabase { get; set; } = new(); - public BlobStorageConfiguration BlobStorage { get; set; } + public BlobStorageConfiguration? BlobStorage { get; set; } public class BlobStorageConfiguration { diff --git a/Modules/Relationships/src/Relationships.ConsumerApi/Controllers/RelationshipsController.cs b/Modules/Relationships/src/Relationships.ConsumerApi/Controllers/RelationshipsController.cs index 927dae985b..7a3db9491c 100644 --- a/Modules/Relationships/src/Relationships.ConsumerApi/Controllers/RelationshipsController.cs +++ b/Modules/Relationships/src/Relationships.ConsumerApi/Controllers/RelationshipsController.cs @@ -68,12 +68,12 @@ public async Task ListRelationships([FromQuery] PaginationFilter public async Task ListChanges( [FromQuery] PaginationFilter paginationFilter, [FromQuery] IEnumerable ids, - [FromQuery] OptionalDateRange createdAt, - [FromQuery] OptionalDateRange completedAt, - [FromQuery] OptionalDateRange modifiedAt, + [FromQuery] OptionalDateRange? createdAt, + [FromQuery] OptionalDateRange? completedAt, + [FromQuery] OptionalDateRange? modifiedAt, [FromQuery] bool? onlyPeerChanges, - [FromQuery] IdentityAddress createdBy, - [FromQuery] IdentityAddress completedBy, + [FromQuery] IdentityAddress? createdBy, + [FromQuery] IdentityAddress? completedBy, [FromQuery] string? status, [FromQuery] string? type, CancellationToken cancellationToken) { diff --git a/Modules/Relationships/src/Relationships.Domain/Entities/Relationship.cs b/Modules/Relationships/src/Relationships.Domain/Entities/Relationship.cs index 57079dadf3..8a9a14ae76 100644 --- a/Modules/Relationships/src/Relationships.Domain/Entities/Relationship.cs +++ b/Modules/Relationships/src/Relationships.Domain/Entities/Relationship.cs @@ -8,13 +8,20 @@ namespace Backbone.Modules.Relationships.Domain.Entities; public class Relationship { - private readonly RelationshipChangeLog _changes = new(); + private readonly RelationshipChangeLog _changes = []; -#pragma warning disable CS8618 - private Relationship() { } -#pragma warning restore CS8618 + // ReSharper disable once UnusedMember.Local + private Relationship() + { + // This constructor is for EF Core only; initializing the properties with null is therefore not a problem + Id = null!; + RelationshipTemplateId = null!; + RelationshipTemplate = null!; + From = null!; + To = null!; + } - public Relationship(RelationshipTemplate relationshipTemplate, IdentityAddress from, DeviceId fromDevice, byte[] requestContent) + public Relationship(RelationshipTemplate relationshipTemplate, IdentityAddress from, DeviceId fromDevice, byte[]? requestContent) { Id = RelationshipId.New(); RelationshipTemplateId = relationshipTemplate.Id; @@ -136,6 +143,6 @@ private void EnsureCanBeTerminated() var existingChange = GetPendingChangeOrNull(); if (existingChange != null) - throw new DomainException(DomainErrors.PendingChangeAlreadyExisits(existingChange.Id)); + throw new DomainException(DomainErrors.PendingChangeAlreadyExists(existingChange.Id)); } } diff --git a/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipChange.cs b/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipChange.cs index ef5ef418cb..eda4a4821d 100644 --- a/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipChange.cs +++ b/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipChange.cs @@ -87,9 +87,14 @@ protected virtual void EnsureCanBeRevoked(IdentityAddress by, byte[]? content) public class RelationshipChangeRequest { -#pragma warning disable CS8618 - private RelationshipChangeRequest() { } -#pragma warning restore CS8618 + // ReSharper disable once UnusedMember.Local + private RelationshipChangeRequest() + { + // This constructor is for EF Core only; initializing the properties with null is therefore not a problem + Id = null!; + CreatedBy = null!; + CreatedByDevice = null!; + } public RelationshipChangeRequest(RelationshipChangeId changeId, IdentityAddress createdBy, DeviceId createdByDevice, byte[]? content = null) { @@ -117,9 +122,14 @@ public void LoadContent(byte[] content) public class RelationshipChangeResponse { -#pragma warning disable CS8618 - private RelationshipChangeResponse() { } -#pragma warning restore CS8618 + // ReSharper disable once UnusedMember.Local + private RelationshipChangeResponse() + { + // This constructor is for EF Core only; initializing the properties with null is therefore not a problem + Id = null!; + CreatedBy = null!; + CreatedByDevice = null!; + } public RelationshipChangeResponse(RelationshipChangeId changeId, IdentityAddress createdBy, DeviceId createdByDevice, byte[]? content = null) { diff --git a/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipCreationChange.cs b/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipCreationChange.cs index 6d5206eb62..bb2bc31d61 100644 --- a/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipCreationChange.cs +++ b/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipCreationChange.cs @@ -6,7 +6,10 @@ namespace Backbone.Modules.Relationships.Domain.Entities; public class RelationshipCreationChange : RelationshipChange { - private RelationshipCreationChange() { } + // ReSharper disable once UnusedMember.Local + private RelationshipCreationChange() + { + } internal RelationshipCreationChange(Relationship relationship, IdentityAddress createdBy, DeviceId createdByDevice, byte[]? requestContent) : base(relationship, createdBy, createdByDevice, RelationshipChangeType.Creation, requestContent) { } diff --git a/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipTemplate.cs b/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipTemplate.cs index 352cbcedbd..71e2cea922 100644 --- a/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipTemplate.cs +++ b/Modules/Relationships/src/Relationships.Domain/Entities/RelationshipTemplate.cs @@ -8,9 +8,14 @@ namespace Backbone.Modules.Relationships.Domain.Entities; public class RelationshipTemplate { -#pragma warning disable CS8618 - private RelationshipTemplate() { } -#pragma warning restore CS8618 + // ReSharper disable once UnusedMember.Local + private RelationshipTemplate() + { + // This constructor is for EF Core only; initializing the properties with null is therefore not a problem + Id = null!; + CreatedBy = null!; + CreatedByDevice = null!; + } public RelationshipTemplate(IdentityAddress createdBy, DeviceId createdByDevice, int? maxNumberOfAllocations, DateTime? expiresAt, byte[] content) { @@ -37,7 +42,7 @@ public RelationshipTemplate(IdentityAddress createdBy, DeviceId createdByDevice, public DateTime CreatedAt { get; set; } public DateTime? DeletedAt { get; set; } - public List Allocations { get; set; } = new(); + public List Allocations { get; set; } = []; public void AllocateFor(IdentityAddress identity, DeviceId device) { diff --git a/Modules/Relationships/src/Relationships.Domain/Errors/DomainErrors.cs b/Modules/Relationships/src/Relationships.Domain/Errors/DomainErrors.cs index 797eddee83..3f0d42a1b8 100644 --- a/Modules/Relationships/src/Relationships.Domain/Errors/DomainErrors.cs +++ b/Modules/Relationships/src/Relationships.Domain/Errors/DomainErrors.cs @@ -32,9 +32,9 @@ public static DomainError OnlyActiveRelationshipsCanBeTerminated() return new DomainError("error.platform.relationships.onlyActiveRelationshipsCanBeTerminated", "Only active relationships can be terminated."); } - public static DomainError PendingChangeAlreadyExisits(RelationshipChangeId? changeId = null) + public static DomainError PendingChangeAlreadyExists(RelationshipChangeId? changeId = null) { - return new DomainError("error.platform.relationships.pendingChangeAlreadyExisits", $"There is already a pending change for this relationship. Change ID: {changeId}"); + return new DomainError("error.platform.relationships.pendingChangeAlreadyExists", $"There is already a pending change for this relationship. Change ID: {changeId}"); } public static DomainError ContentIsRequiredForCompletingRelationships() diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Extensions/RelationshipChangeQueryableExtensions.cs b/Modules/Relationships/src/Relationships.Infrastructure/Extensions/RelationshipChangeQueryableExtensions.cs index 963b26dad3..705def78a8 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Extensions/RelationshipChangeQueryableExtensions.cs +++ b/Modules/Relationships/src/Relationships.Infrastructure/Extensions/RelationshipChangeQueryableExtensions.cs @@ -7,18 +7,18 @@ namespace Backbone.Modules.Relationships.Infrastructure.Extensions; public static class RelationshipChangeQueryableExtensions { - public static IQueryable CompletedAt(this IQueryable query, OptionalDateRange completedAt) + public static IQueryable CompletedAt(this IQueryable query, OptionalDateRange? completedAt) { var newQuery = query; if (completedAt == null) return newQuery; - if (completedAt.From != default) - newQuery = newQuery.Where(r => r.Response.CreatedAt >= completedAt.From); + if (completedAt.From.HasValue) + newQuery = newQuery.Where(r => r.Response != null && r.Response.CreatedAt >= completedAt.From); - if (completedAt.To != default) - newQuery = newQuery.Where(r => r.Response.CreatedAt <= completedAt.To); + if (completedAt.To.HasValue) + newQuery = newQuery.Where(r => r.Response != null && r.Response.CreatedAt <= completedAt.To); return newQuery; } @@ -37,9 +37,6 @@ public static IQueryable CreatedAt(this IQueryable r.Request.CreatedAt >= createdAt.From); @@ -53,9 +50,6 @@ public static IQueryable ModifiedAt(this IQueryable c.Request.CreatedAt >= modifiedAt.From || c.Response != null && c.Response.CreatedAt >= modifiedAt.From); @@ -72,33 +66,33 @@ public static IQueryable Pending(this IQueryable r.Status == RelationshipChangeStatus.Pending); } - public static IQueryable WithType(this IQueryable query, RelationshipChangeType? type) + public static IQueryable WithType(this IQueryable query, RelationshipChangeType type) { - return type != null ? query.Where(r => r.Type == type) : query; + return query.Where(r => r.Type == type); } - public static IQueryable WithStatus(this IQueryable query, RelationshipChangeStatus? status) + public static IQueryable WithStatus(this IQueryable query, RelationshipChangeStatus status) { - return status != null ? query.Where(r => r.Status == status) : query; + return query.Where(r => r.Status == status); } - public static IQueryable WithRelationshipParticipant(this IQueryable query, IdentityAddress identityId) + public static IQueryable WithRelationshipParticipant(this IQueryable query, IdentityAddress identityAddress) { - return query.Where(r => r.Relationship.From == identityId || r.Relationship.To == identityId); + return query.Where(r => r.Relationship.From == identityAddress || r.Relationship.To == identityAddress); } public static IQueryable CreatedBy(this IQueryable query, IdentityAddress identityId) { - return identityId != null ? query.Where(r => r.Request.CreatedBy == identityId) : query; + return query.Where(r => r.Request.CreatedBy == identityId); } public static IQueryable CompletedBy(this IQueryable query, IdentityAddress identityId) { - return identityId != null ? query.Where(r => r.Response != null && r.Response.CreatedBy == identityId) : query; + return query.Where(r => r.Response != null && r.Response.CreatedBy == identityId); } public static IQueryable WithId(this IQueryable query, RelationshipChangeId id) { - return id != null ? query.Where(r => r.Id == id) : query; + return query.Where(r => r.Id == id); } } diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Extensions/RelationshipQueryableExtensions.cs b/Modules/Relationships/src/Relationships.Infrastructure/Extensions/RelationshipQueryableExtensions.cs index 0bd903b5df..e682fb6c90 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Extensions/RelationshipQueryableExtensions.cs +++ b/Modules/Relationships/src/Relationships.Infrastructure/Extensions/RelationshipQueryableExtensions.cs @@ -1,6 +1,5 @@ using Backbone.BuildingBlocks.Application.Abstractions.Exceptions; using Backbone.DevelopmentKit.Identity.ValueObjects; -using Backbone.Modules.Relationships.Common; using Backbone.Modules.Relationships.Domain.Entities; using Backbone.Modules.Relationships.Domain.Ids; using Microsoft.EntityFrameworkCore; @@ -9,26 +8,6 @@ namespace Backbone.Modules.Relationships.Infrastructure.Extensions; public static class RelationshipQueryableExtensions { - public static IQueryable NotTerminated(this IQueryable query) - { - return query.Where(r => r.Status != RelationshipStatus.Terminated); - } - - public static IQueryable Pending(this IQueryable query) - { - return query.Where(r => r.Status == RelationshipStatus.Pending); - } - - public static IQueryable To(this IQueryable query, IdentityAddress to) - { - return query.Where(r => r.To == to); - } - - public static IQueryable From(this IQueryable query, IdentityAddress from) - { - return query.Where(r => r.From == from); - } - public static IQueryable BetweenParticipants(this IQueryable query, IdentityAddress participant1, IdentityAddress participant2) { return query.WithParticipant(participant1).WithParticipant(participant2); @@ -44,28 +23,7 @@ public static IQueryable WithIdIn(this IQueryable qu return query.Where(r => ids.Contains(r.Id)); } - public static IQueryable WithId(this IQueryable query, RelationshipId relationshipId) - { - return query.Where(r => r.Id == relationshipId); - } - - public static IQueryable CreatedAt(this IQueryable query, OptionalDateRange createdAt) - { - var newQuery = query; - - if (createdAt == null) - return newQuery; - - if (createdAt.From != default) - newQuery = newQuery.Where(r => r.CreatedAt >= createdAt.From); - - if (createdAt.To != default) - newQuery = newQuery.Where(r => r.CreatedAt <= createdAt.To); - - return newQuery; - } - - public static async Task FirstWithIdOrDefault(this IQueryable query, RelationshipId relationshipId, CancellationToken cancellationToken) + public static async Task FirstWithIdOrDefault(this IQueryable query, RelationshipId relationshipId, CancellationToken cancellationToken) { return await query.FirstOrDefaultAsync(r => r.Id == relationshipId, cancellationToken); } diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/IServiceCollectionExtensions.cs b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/IServiceCollectionExtensions.cs index 276829f56d..aedb944573 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/IServiceCollectionExtensions.cs +++ b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/IServiceCollectionExtensions.cs @@ -14,7 +14,7 @@ public static class IServiceCollectionExtensions public static void AddDatabase(this IServiceCollection services, Action setupOptions) { var options = new DbOptions(); - setupOptions?.Invoke(options); + setupOptions.Invoke(options); services.AddDatabase(options); } @@ -47,14 +47,12 @@ public static void AddDatabase(this IServiceCollection services, DbOptions optio throw new Exception($"Unsupported database provider: {options.Provider}"); } }); - services - .AddDbContext(dbContextOptions => { }); } public class DbOptions { - public string Provider { get; set; } - public string DbConnectionString { get; set; } + public string Provider { get; set; } = null!; + public string DbConnectionString { get; set; } = null!; public RetryOptions RetryOptions { get; set; } = new(); } diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/RelationshipsDbContext.cs b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/RelationshipsDbContext.cs index 2d40e1a255..6c36ebd74e 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/RelationshipsDbContext.cs +++ b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/RelationshipsDbContext.cs @@ -14,9 +14,9 @@ public RelationshipsDbContext(DbContextOptions options) public RelationshipsDbContext(DbContextOptions options, IServiceProvider serviceProvider) : base(options, serviceProvider) { } - public DbSet Relationships { get; set; } - public DbSet RelationshipChanges { get; set; } - public DbSet RelationshipTemplates { get; set; } + public DbSet Relationships { get; set; } = null!; + public DbSet RelationshipChanges { get; set; } = null!; + public DbSet RelationshipTemplates { get; set; } = null!; // protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) // { diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/Repository/RelationshipsRepository.cs b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/Repository/RelationshipsRepository.cs index d42abc5b7f..be700a155f 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/Repository/RelationshipsRepository.cs +++ b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/Repository/RelationshipsRepository.cs @@ -22,41 +22,45 @@ public class RelationshipsRepository : IRelationshipsRepository private readonly IQueryable _readOnlyRelationships; private readonly IQueryable _readOnlyChanges; private readonly RelationshipsDbContext _dbContext; - private readonly ILogger _logger; - public RelationshipsRepository(RelationshipsDbContext dbContext, ILogger logger) + public RelationshipsRepository(RelationshipsDbContext dbContext) { _relationships = dbContext.Relationships; _readOnlyRelationships = dbContext.Relationships.AsNoTracking(); _changes = dbContext.RelationshipChanges; _readOnlyChanges = dbContext.RelationshipChanges.AsNoTracking(); _dbContext = dbContext; - _logger = logger; } public async Task> FindChangesWithIds(IEnumerable ids, RelationshipChangeType? relationshipChangeType, RelationshipChangeStatus? relationshipChangeStatus, - OptionalDateRange modifiedAt, OptionalDateRange createdAt, OptionalDateRange completedAt, - IdentityAddress createdBy, IdentityAddress completedBy, IdentityAddress identityAddress, + OptionalDateRange? modifiedAt, OptionalDateRange? createdAt, OptionalDateRange? completedAt, + IdentityAddress? createdBy, IdentityAddress? completedBy, IdentityAddress activeIdentity, PaginationFilter paginationFilter, CancellationToken cancellationToken, bool onlyPeerChanges = false, bool track = false) { var query = (track ? _changes : _readOnlyChanges) .AsQueryable() .IncludeAll(_dbContext) - .WithType(relationshipChangeType) - .WithStatus(relationshipChangeStatus) - .ModifiedAt(modifiedAt) - .CreatedAt(createdAt) - .CompletedAt(completedAt) - .CreatedBy(createdBy) - .CompletedBy(completedBy) - .WithRelationshipParticipant(identityAddress); - + .WithRelationshipParticipant(activeIdentity); + + if (relationshipChangeType.HasValue) + query = query.WithType(relationshipChangeType.Value); + if (relationshipChangeStatus.HasValue) + query = query.WithStatus(relationshipChangeStatus.Value); + if (modifiedAt != null) + query = query.ModifiedAt(modifiedAt); + if (createdAt != null) + query = query.CreatedAt(createdAt); + if (completedAt != null) + query = query.CompletedAt(completedAt); + if (createdBy != null) + query = query.CreatedBy(createdBy); + if (completedBy != null) + query = query.CompletedBy(completedBy); if (ids.Any()) query = query.WithIdIn(ids); - if (onlyPeerChanges) - query = query.OnlyPeerChanges(identityAddress); + query = query.OnlyPeerChanges(activeIdentity); var changes = await query.OrderAndPaginate(d => d.CreatedAt, paginationFilter, cancellationToken); @@ -74,7 +78,7 @@ public async Task FindRelationship(RelationshipId id, IdentityAddr return relationship; } - public async Task FindRelationshipChange(RelationshipChangeId id, + public async Task FindRelationshipChange(RelationshipChangeId id, IdentityAddress identityAddress, CancellationToken cancellationToken, bool track = false) { var change = await (track ? _changes : _readOnlyChanges) diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipChangeIdEntityFrameworkValueConverter.cs b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipChangeIdEntityFrameworkValueConverter.cs index 39becddaa8..1029a45287 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipChangeIdEntityFrameworkValueConverter.cs +++ b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipChangeIdEntityFrameworkValueConverter.cs @@ -7,9 +7,9 @@ public class RelationshipChangeIdEntityFrameworkValueConverter : ValueConverter< { public RelationshipChangeIdEntityFrameworkValueConverter() : this(null) { } - public RelationshipChangeIdEntityFrameworkValueConverter(ConverterMappingHints mappingHints) + public RelationshipChangeIdEntityFrameworkValueConverter(ConverterMappingHints? mappingHints) : base( - id => id == null ? null : id.StringValue, + id => id.StringValue, value => RelationshipChangeId.Parse(value), mappingHints ) diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipIdEntityFrameworkValueConverter.cs b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipIdEntityFrameworkValueConverter.cs index 9b4b381c9d..235515f14d 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipIdEntityFrameworkValueConverter.cs +++ b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipIdEntityFrameworkValueConverter.cs @@ -7,9 +7,9 @@ public class RelationshipIdEntityFrameworkValueConverter : ValueConverter id == null ? null : id.StringValue, + id => id.StringValue, value => RelationshipId.Parse(value), mappingHints ) diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipTemplateIdEntityFrameworkValueConverter.cs b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipTemplateIdEntityFrameworkValueConverter.cs index a344cbdca5..9d2e80ffc4 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipTemplateIdEntityFrameworkValueConverter.cs +++ b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/Database/ValueConverters/RelationshipTemplateIdEntityFrameworkValueConverter.cs @@ -7,9 +7,9 @@ public class RelationshipTemplateIdEntityFrameworkValueConverter : ValueConverte { public RelationshipTemplateIdEntityFrameworkValueConverter() : this(null) { } - public RelationshipTemplateIdEntityFrameworkValueConverter(ConverterMappingHints mappingHints) + public RelationshipTemplateIdEntityFrameworkValueConverter(ConverterMappingHints? mappingHints) : base( - id => id == null ? null : id.StringValue, + id => id.StringValue, value => RelationshipTemplateId.Parse(value), mappingHints ) diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/IServiceCollectionExtensions.cs b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/IServiceCollectionExtensions.cs index 18625fc310..c29644c3ba 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Persistence/IServiceCollectionExtensions.cs +++ b/Modules/Relationships/src/Relationships.Infrastructure/Persistence/IServiceCollectionExtensions.cs @@ -12,7 +12,7 @@ public static class IServiceCollectionExtensions public static void AddPersistence(this IServiceCollection services, Action setupOptions) { var options = new PersistenceOptions(); - setupOptions?.Invoke(options); + setupOptions.Invoke(options); services.AddPersistence(options); } @@ -35,6 +35,6 @@ public static void AddPersistence(this IServiceCollection services, PersistenceO public class PersistenceOptions { - public global::Backbone.Modules.Relationships.Infrastructure.Persistence.Database.IServiceCollectionExtensions.DbOptions DbOptions { get; set; } = new(); - public BlobStorageOptions BlobStorageOptions { get; set; } + public Database.IServiceCollectionExtensions.DbOptions DbOptions { get; set; } = new(); + public BlobStorageOptions? BlobStorageOptions { get; set; } } diff --git a/Modules/Relationships/src/Relationships.Infrastructure/Relationships.Infrastructure.csproj b/Modules/Relationships/src/Relationships.Infrastructure/Relationships.Infrastructure.csproj index d50732d786..2ea5663bb4 100644 --- a/Modules/Relationships/src/Relationships.Infrastructure/Relationships.Infrastructure.csproj +++ b/Modules/Relationships/src/Relationships.Infrastructure/Relationships.Infrastructure.csproj @@ -1,5 +1,9 @@ + + enable + + diff --git a/Modules/Relationships/test/Relationships.Application.Tests/Relationships.Application.Tests.csproj b/Modules/Relationships/test/Relationships.Application.Tests/Relationships.Application.Tests.csproj index 9c5994e3fd..ea549a4966 100644 --- a/Modules/Relationships/test/Relationships.Application.Tests/Relationships.Application.Tests.csproj +++ b/Modules/Relationships/test/Relationships.Application.Tests/Relationships.Application.Tests.csproj @@ -2,6 +2,7 @@ false + enable diff --git a/Modules/Relationships/test/Relationships.Application.Tests/Tests/RelationshipTemplates/Commands/CreateRelationshipTemplate/HandlerTests.cs b/Modules/Relationships/test/Relationships.Application.Tests/Tests/RelationshipTemplates/Commands/CreateRelationshipTemplate/HandlerTests.cs index 3ac43f56de..7149e43b03 100644 --- a/Modules/Relationships/test/Relationships.Application.Tests/Tests/RelationshipTemplates/Commands/CreateRelationshipTemplate/HandlerTests.cs +++ b/Modules/Relationships/test/Relationships.Application.Tests/Tests/RelationshipTemplates/Commands/CreateRelationshipTemplate/HandlerTests.cs @@ -32,7 +32,7 @@ public async void Triggers_RelationshipTemplateCreatedIntegrationEvent() var command = new CreateRelationshipTemplateCommand { ExpiresAt = DateTime.UtcNow, - Content = new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 } + Content = [1, 1, 1, 1, 1, 1, 1, 1] }; var relationshipTemplatesRepository = A.Fake(); diff --git a/Modules/Relationships/test/Relationships.Domain.Tests/Extensions/IChangeLogExtensions.cs b/Modules/Relationships/test/Relationships.Domain.Tests/Extensions/IChangeLogExtensions.cs index bfc177d3e7..cd1d64efcf 100644 --- a/Modules/Relationships/test/Relationships.Domain.Tests/Extensions/IChangeLogExtensions.cs +++ b/Modules/Relationships/test/Relationships.Domain.Tests/Extensions/IChangeLogExtensions.cs @@ -4,17 +4,17 @@ namespace Backbone.Modules.Relationships.Domain.Tests.Extensions; public static class IChangeLogExtensions { - public static RelationshipChange GetOpenCreation(this IRelationshipChangeLog changes) + public static RelationshipChange? GetOpenCreation(this IRelationshipChangeLog changes) { return changes.GetLatestOfTypeOrNull(RelationshipChangeType.Creation, c => !c.IsCompleted); } - public static RelationshipChange GetOpenTermination(this IRelationshipChangeLog changes) + public static RelationshipChange? GetOpenTermination(this IRelationshipChangeLog changes) { return changes.GetLatestOfTypeOrNull(RelationshipChangeType.Termination, c => !c.IsCompleted); } - public static RelationshipChange GetOpenTerminationCancellation(this IRelationshipChangeLog changes) + public static RelationshipChange? GetOpenTerminationCancellation(this IRelationshipChangeLog changes) { return changes.GetLatestOfTypeOrNull(RelationshipChangeType.TerminationCancellation, c => !c.IsCompleted); } diff --git a/Modules/Relationships/test/Relationships.Domain.Tests/Relationships.Domain.Tests.csproj b/Modules/Relationships/test/Relationships.Domain.Tests/Relationships.Domain.Tests.csproj index 14b10f26dd..bf2be2ffb5 100644 --- a/Modules/Relationships/test/Relationships.Domain.Tests/Relationships.Domain.Tests.csproj +++ b/Modules/Relationships/test/Relationships.Domain.Tests/Relationships.Domain.Tests.csproj @@ -2,6 +2,7 @@ false + enable diff --git a/Modules/Relationships/test/Relationships.Domain.Tests/Tests/RelationshipTests.cs b/Modules/Relationships/test/Relationships.Domain.Tests/Tests/RelationshipTests.cs index 580ba6fe3a..88d263df65 100644 --- a/Modules/Relationships/test/Relationships.Domain.Tests/Tests/RelationshipTests.cs +++ b/Modules/Relationships/test/Relationships.Domain.Tests/Tests/RelationshipTests.cs @@ -13,16 +13,16 @@ namespace Backbone.Modules.Relationships.Domain.Tests.Tests; public class RelationshipTests { - private static readonly IdentityAddress FROM_IDENTITY = IdentityAddress.Create(new byte[] { 1, 1, 1 }, "id1"); + private static readonly IdentityAddress FROM_IDENTITY = IdentityAddress.Create([1, 1, 1], "id1"); private static readonly DeviceId FROM_DEVICE = DeviceId.New(); - private static readonly IdentityAddress TO_IDENTITY = IdentityAddress.Create(new byte[] { 2, 2, 2 }, "id1"); + private static readonly IdentityAddress TO_IDENTITY = IdentityAddress.Create([2, 2, 2], "id1"); private static readonly DeviceId TO_DEVICE = DeviceId.New(); - private static readonly byte[] REQUEST_CONTENT = { 1, 1, 1 }; - private static readonly byte[] RESPONSE_CONTENT = { 2, 2, 2 }; + private static readonly byte[] REQUEST_CONTENT = [1, 1, 1]; + private static readonly byte[] RESPONSE_CONTENT = [2, 2, 2]; - private static readonly RelationshipTemplate TEMPLATE = new(TO_IDENTITY, TO_DEVICE, 1, SystemTime.UtcNow.AddDays(1), new byte[] { 0 }); + private static readonly RelationshipTemplate TEMPLATE = new(TO_IDENTITY, TO_DEVICE, 1, SystemTime.UtcNow.AddDays(1), [0]); #region Creation @@ -52,7 +52,7 @@ public void New_Relationship_Has_Correct_Data() public void Accepting_CreationRequest_Changes_Relevant_Data() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; relationship.AcceptChange(change.Id, TO_IDENTITY, TO_DEVICE, RESPONSE_CONTENT); @@ -70,7 +70,7 @@ public void Accepting_CreationRequest_Changes_Relevant_Data() public void Cannot_Accept_CreationRequests_Without_Content() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; Action acting = () => relationship.AcceptChange(change.Id, TO_IDENTITY, TO_DEVICE, null); acting.Should().Throw().WithError(DomainErrors.ContentIsRequiredForCompletingRelationships()); @@ -80,7 +80,7 @@ public void Cannot_Accept_CreationRequests_Without_Content() public void Cannot_Accept_Already_Completed_CreationRequests() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; relationship.AcceptChange(change.Id, TO_IDENTITY, TO_DEVICE, RESPONSE_CONTENT); Action acting = () => relationship.AcceptChange(change.Id, TO_IDENTITY, TO_DEVICE, RESPONSE_CONTENT); @@ -91,7 +91,7 @@ public void Cannot_Accept_Already_Completed_CreationRequests() public void Relationship_Cannot_Be_Accepted_By_Creator() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; Action acting = () => relationship.AcceptChange(change.Id, FROM_IDENTITY, FROM_DEVICE, RESPONSE_CONTENT); acting.Should().Throw().WithError(DomainErrors.ChangeRequestCannotBeAcceptedByCreator()); @@ -105,7 +105,7 @@ public void Relationship_Cannot_Be_Accepted_By_Creator() public void Rejecting_CreationRequest_Sets_Relevant_Data() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; relationship.RejectChange(change.Id, TO_IDENTITY, TO_DEVICE, RESPONSE_CONTENT); @@ -123,7 +123,7 @@ public void Rejecting_CreationRequest_Sets_Relevant_Data() public void Cannot_Reject_CreationRequests_Without_Content() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; Action acting = () => relationship.RejectChange(change.Id, TO_IDENTITY, TO_DEVICE, null); acting.Should().Throw().WithError(DomainErrors.ContentIsRequiredForCompletingRelationships()); @@ -133,7 +133,7 @@ public void Cannot_Reject_CreationRequests_Without_Content() public void Cannot_Reject_Already_Completed_CreationRequests() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; relationship.RejectChange(change.Id, TO_IDENTITY, TO_DEVICE, RESPONSE_CONTENT); Action acting = () => relationship.RejectChange(change.Id, TO_IDENTITY, TO_DEVICE, RESPONSE_CONTENT); @@ -144,7 +144,7 @@ public void Cannot_Reject_Already_Completed_CreationRequests() public void CreationRequest_Cannot_Be_Rejected_By_Creator() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; Action acting = () => relationship.RejectChange(change.Id, FROM_IDENTITY, FROM_DEVICE, RESPONSE_CONTENT); acting.Should().Throw().WithError(DomainErrors.ChangeRequestCannotBeRejectedByCreator()); @@ -158,7 +158,7 @@ public void CreationRequest_Cannot_Be_Rejected_By_Creator() public void Revoking_CreationRequest_Sets_Relevant_Data() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; relationship.RevokeChange(change.Id, FROM_IDENTITY, FROM_DEVICE, RESPONSE_CONTENT); @@ -176,7 +176,7 @@ public void Revoking_CreationRequest_Sets_Relevant_Data() public void Cannot_Revoke_CreationRequests_Without_Content() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; Action acting = () => relationship.RevokeChange(change.Id, FROM_IDENTITY, FROM_DEVICE, null); acting.Should().Throw().WithError(DomainErrors.ContentIsRequiredForCompletingRelationships()); @@ -186,7 +186,7 @@ public void Cannot_Revoke_CreationRequests_Without_Content() public void Cannot_Revoke_Already_Completed_CreationRequests() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; relationship.RevokeChange(change.Id, FROM_IDENTITY, FROM_DEVICE, RESPONSE_CONTENT); Action acting = () => relationship.RevokeChange(change.Id, FROM_IDENTITY, FROM_DEVICE, RESPONSE_CONTENT); @@ -197,7 +197,7 @@ public void Cannot_Revoke_Already_Completed_CreationRequests() public void CreationRequest_Cannot_Be_Revoked_By_Recipient() { var relationship = CreatePendingRelationship(); - var change = relationship.Changes.GetOpenCreation(); + var change = relationship.Changes.GetOpenCreation()!; Action acting = () => relationship.RevokeChange(change.Id, TO_IDENTITY, TO_DEVICE, RESPONSE_CONTENT); acting.Should().Throw().WithError(DomainErrors.ChangeRequestCanOnlyBeRevokedByCreator()); @@ -249,7 +249,7 @@ public void Requesting_Termination_Sets_Relevant_Data() relationship.Changes.Should().HaveCount(2); - var termination = relationship.Changes.GetOpenTermination(); + var termination = relationship.Changes.GetOpenTermination()!; termination.Should().NotBeNull(); termination.Status.Should().Be(RelationshipChangeStatus.Pending); termination.Request.Should().NotBeNull(); @@ -274,7 +274,7 @@ public void Cannot_Request_Termination_For_Pending_Relationships() public void Accepting_TerminationRequest_Changes_Relevant_Data() { var relationship = CreateRelationshipWithOpenTermination(); - var change = relationship.Changes.GetOpenTermination(); + var change = relationship.Changes.GetOpenTermination()!; relationship.AcceptChange(change.Id, TO_IDENTITY, TO_DEVICE, null); @@ -291,7 +291,7 @@ public void Accepting_TerminationRequest_Changes_Relevant_Data() public void Cannot_Accept_Already_Completed_TerminationRequests() { var relationship = CreateRelationshipWithOpenTermination(); - var change = relationship.Changes.GetOpenTermination(); + var change = relationship.Changes.GetOpenTermination()!; relationship.AcceptChange(change.Id, TO_IDENTITY, TO_DEVICE, RESPONSE_CONTENT); @@ -303,7 +303,7 @@ public void Cannot_Accept_Already_Completed_TerminationRequests() public void TerminationRequest_Cannot_Be_Accepted_By_Creator() { var relationship = CreateRelationshipWithOpenTermination(); - var change = relationship.Changes.GetOpenTermination(); + var change = relationship.Changes.GetOpenTermination()!; Action acting = () => relationship.AcceptChange(change.Id, FROM_IDENTITY, FROM_DEVICE, null); acting.Should().Throw().WithError(DomainErrors.ChangeRequestCannotBeAcceptedByCreator()); @@ -317,7 +317,7 @@ public void TerminationRequest_Cannot_Be_Accepted_By_Creator() public void Rejecting_TerminationRequest_Changes_Relevant_Data() { var relationship = CreateRelationshipWithOpenTermination(); - var change = relationship.Changes.GetOpenTermination(); + var change = relationship.Changes.GetOpenTermination()!; relationship.RejectChange(change.Id, TO_IDENTITY, TO_DEVICE, null); @@ -334,7 +334,7 @@ public void Rejecting_TerminationRequest_Changes_Relevant_Data() public void Cannot_Reject_Already_Completed_TerminationRequests() { var relationship = CreateRelationshipWithOpenTermination(); - var change = relationship.Changes.GetOpenTermination(); + var change = relationship.Changes.GetOpenTermination()!; relationship.RejectChange(change.Id, TO_IDENTITY, TO_DEVICE, RESPONSE_CONTENT); @@ -346,7 +346,7 @@ public void Cannot_Reject_Already_Completed_TerminationRequests() public void TerminationRequest_Cannot_Be_Rejected_By_Creator() { var relationship = CreateRelationshipWithOpenTermination(); - var change = relationship.Changes.GetOpenTermination(); + var change = relationship.Changes.GetOpenTermination()!; Action acting = () => relationship.RejectChange(change.Id, FROM_IDENTITY, FROM_DEVICE, null); acting.Should().Throw().WithError(DomainErrors.ChangeRequestCannotBeRejectedByCreator()); @@ -360,7 +360,7 @@ public void TerminationRequest_Cannot_Be_Rejected_By_Creator() public void Revoking_TerminationRequest_Sets_Relevant_Data() { var relationship = CreateRelationshipWithOpenTermination(); - var change = relationship.Changes.GetOpenTermination(); + var change = relationship.Changes.GetOpenTermination()!; relationship.RevokeChange(change.Id, FROM_IDENTITY, FROM_DEVICE, null); @@ -377,7 +377,7 @@ public void Revoking_TerminationRequest_Sets_Relevant_Data() public void Cannot_Revoke_Already_Completed_TerminationRequests() { var relationship = CreateRelationshipWithOpenTermination(); - var change = relationship.Changes.GetOpenTermination(); + var change = relationship.Changes.GetOpenTermination()!; relationship.RevokeChange(change.Id, FROM_IDENTITY, FROM_DEVICE, RESPONSE_CONTENT); @@ -389,7 +389,7 @@ public void Cannot_Revoke_Already_Completed_TerminationRequests() public void TerminationRequest_Cannot_Be_Revoked_By_Recipient() { var relationship = CreateRelationshipWithOpenTermination(); - var change = relationship.Changes.GetOpenTermination(); + var change = relationship.Changes.GetOpenTermination()!; Action acting = () => relationship.RevokeChange(change.Id, TO_IDENTITY, TO_DEVICE, null); acting.Should().Throw().WithError(DomainErrors.ChangeRequestCanOnlyBeRevokedByCreator());