diff --git a/Backbone.sln.DotSettings b/Backbone.sln.DotSettings index 678e39afaf..2b6eef206f 100644 --- a/Backbone.sln.DotSettings +++ b/Backbone.sln.DotSettings @@ -36,6 +36,7 @@ True True True + True True True True diff --git a/BuildingBlocks/src/BuildingBlocks.Infrastructure/Persistence/BlobStorage/BlobStorageServiceCollectionExtensions.cs b/BuildingBlocks/src/BuildingBlocks.Infrastructure/Persistence/BlobStorage/BlobStorageServiceCollectionExtensions.cs index f2921a0c4c..7ef97b7b47 100644 --- a/BuildingBlocks/src/BuildingBlocks.Infrastructure/Persistence/BlobStorage/BlobStorageServiceCollectionExtensions.cs +++ b/BuildingBlocks/src/BuildingBlocks.Infrastructure/Persistence/BlobStorage/BlobStorageServiceCollectionExtensions.cs @@ -29,7 +29,7 @@ public static void AddBlobStorage(this IServiceCollection services, BlobStorageO services.AddGoogleCloudStorage(googleCloudStorageOptions => { googleCloudStorageOptions.GcpAuthJson = options.ConnectionInfo; - googleCloudStorageOptions.BucketName = options.Container!; + googleCloudStorageOptions.BucketName = options.Container; }); else if (options.CloudProvider.IsNullOrEmpty()) throw new NotSupportedException("No cloud provider was specified."); @@ -41,15 +41,9 @@ public static void AddBlobStorage(this IServiceCollection services, BlobStorageO public class BlobStorageOptions { - /** - * This property will never be null as it makes no sense, but is marked as nullable due to how AddBlobStorage method uses BlobStorageOptions. - */ - public string? CloudProvider { get; set; } + public string CloudProvider { get; set; } = null!; - /** - * This property will never be null as it makes no sense, but is marked as nullable due to how AddBlobStorage method uses BlobStorageOptions. - */ - public string? Container { get; set; } + public string Container { get; set; } = null!; - public string? ConnectionInfo { get; set; } + public string? ConnectionInfo { get; set; } = null; } diff --git a/Modules/Files/src/Files.Application/Files/DTOs/FileMetadataDTO.cs b/Modules/Files/src/Files.Application/Files/DTOs/FileMetadataDTO.cs index f4c4784ddf..8d5f36bf37 100644 --- a/Modules/Files/src/Files.Application/Files/DTOs/FileMetadataDTO.cs +++ b/Modules/Files/src/Files.Application/Files/DTOs/FileMetadataDTO.cs @@ -8,29 +8,29 @@ namespace Backbone.Modules.Files.Application.Files.DTOs; public class FileMetadataDTO : IHaveCustomMapping { - public FileId Id { get; set; } + public required FileId Id { get; set; } - 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 DateTime ModifiedAt { get; set; } - public IdentityAddress ModifiedBy { get; set; } - public DeviceId ModifiedByDevice { get; set; } + public required DateTime ModifiedAt { get; set; } + public required IdentityAddress ModifiedBy { get; set; } + public required DeviceId ModifiedByDevice { get; set; } public DateTime? DeletedAt { get; set; } - public IdentityAddress DeletedBy { get; set; } - public DeviceId DeletedByDevice { get; set; } + public IdentityAddress? DeletedBy { get; set; } + public DeviceId? DeletedByDevice { get; set; } - public IdentityAddress Owner { get; set; } - public byte[] OwnerSignature { get; set; } + public required IdentityAddress Owner { get; set; } + public required byte[] OwnerSignature { get; set; } - public long CipherSize { get; set; } - public byte[] CipherHash { get; set; } + public required long CipherSize { get; set; } + public required byte[] CipherHash { get; set; } - public DateTime ExpiresAt { get; set; } + public required DateTime ExpiresAt { get; set; } - public byte[] EncryptedProperties { get; set; } + public required byte[] EncryptedProperties { get; set; } public void CreateMappings(Profile configuration) { diff --git a/Modules/Files/src/Files.Application/Files/Queries/GetFileContent/GetFileContentQuery.cs b/Modules/Files/src/Files.Application/Files/Queries/GetFileContent/GetFileContentQuery.cs index b03a268cc4..a1261bfbec 100644 --- a/Modules/Files/src/Files.Application/Files/Queries/GetFileContent/GetFileContentQuery.cs +++ b/Modules/Files/src/Files.Application/Files/Queries/GetFileContent/GetFileContentQuery.cs @@ -5,5 +5,5 @@ namespace Backbone.Modules.Files.Application.Files.Queries.GetFileContent; public class GetFileContentQuery : IRequest { - public FileId Id { get; set; } + public required FileId Id { get; set; } } diff --git a/Modules/Files/src/Files.Application/Files/Queries/GetFileContent/GetFileContentResponse.cs b/Modules/Files/src/Files.Application/Files/Queries/GetFileContent/GetFileContentResponse.cs index cad268999e..648b6c2f61 100644 --- a/Modules/Files/src/Files.Application/Files/Queries/GetFileContent/GetFileContentResponse.cs +++ b/Modules/Files/src/Files.Application/Files/Queries/GetFileContent/GetFileContentResponse.cs @@ -2,5 +2,5 @@ public class GetFileContentResponse { - public byte[] FileContent { get; set; } + public required byte[] FileContent { get; set; } } diff --git a/Modules/Files/src/Files.Application/Files/Queries/GetFileMetadata/GetFileMetadataQuery.cs b/Modules/Files/src/Files.Application/Files/Queries/GetFileMetadata/GetFileMetadataQuery.cs index 137a62d0f6..3621b0cc2e 100644 --- a/Modules/Files/src/Files.Application/Files/Queries/GetFileMetadata/GetFileMetadataQuery.cs +++ b/Modules/Files/src/Files.Application/Files/Queries/GetFileMetadata/GetFileMetadataQuery.cs @@ -6,5 +6,5 @@ namespace Backbone.Modules.Files.Application.Files.Queries.GetFileMetadata; public class GetFileMetadataQuery : IRequest { - public FileId Id { get; set; } + public required FileId Id { get; set; } } diff --git a/Modules/Files/src/Files.Application/Infrastructure/Persistence/BlobOptions.cs b/Modules/Files/src/Files.Application/Infrastructure/Persistence/BlobOptions.cs index 48b6842940..ff8a3e34b2 100644 --- a/Modules/Files/src/Files.Application/Infrastructure/Persistence/BlobOptions.cs +++ b/Modules/Files/src/Files.Application/Infrastructure/Persistence/BlobOptions.cs @@ -2,5 +2,5 @@ public class BlobOptions { - public string RootFolder { get; set; } + public required string RootFolder { get; set; } } diff --git a/Modules/Files/src/Files.Application/Infrastructure/Persistence/Repository/IFilesRepository.cs b/Modules/Files/src/Files.Application/Infrastructure/Persistence/Repository/IFilesRepository.cs index 7507e0fc1a..093480cdf8 100644 --- a/Modules/Files/src/Files.Application/Infrastructure/Persistence/Repository/IFilesRepository.cs +++ b/Modules/Files/src/Files.Application/Infrastructure/Persistence/Repository/IFilesRepository.cs @@ -7,7 +7,7 @@ namespace Backbone.Modules.Files.Application.Infrastructure.Persistence.Repository; public interface IFilesRepository { - Task Find(FileId id, CancellationToken cancellationToken, bool track = false, bool fillContent = true); + Task Find(FileId id, CancellationToken cancellationToken, bool track = false, bool fillContent = true); Task> FindFilesByCreator(IEnumerable fileIds, IdentityAddress creatorAddress, PaginationFilter paginationFilter, CancellationToken cancellationToken); Task Add(File file, CancellationToken cancellationToken); } diff --git a/Modules/Files/src/Files.Domain/Entities/File.cs b/Modules/Files/src/Files.Domain/Entities/File.cs index e10bd9f454..9f69b8d208 100644 --- a/Modules/Files/src/Files.Domain/Entities/File.cs +++ b/Modules/Files/src/Files.Domain/Entities/File.cs @@ -6,9 +6,20 @@ namespace Backbone.Modules.Files.Domain.Entities; public class File { -#pragma warning disable CS8618 - private File() { } -#pragma warning restore CS8618 + private File() + { + // This constructor is for EF Core only; initializing the properties with null is therefore not a problem + Id = null!; + CreatedBy = null!; + CreatedByDevice = null!; + ModifiedBy = null!; + ModifiedByDevice = null!; + Owner = null!; + OwnerSignature = null!; + CipherHash = null!; + Content = null!; + EncryptedProperties = null!; + } public File(IdentityAddress createdBy, DeviceId createdByDevice, IdentityAddress owner, byte[] ownerSignature, byte[] cipherHash, byte[] content, long cipherSize, DateTime expiresAt, byte[] encryptedProperties) { diff --git a/Modules/Files/src/Files.Infrastructure/Files.Infrastructure.csproj b/Modules/Files/src/Files.Infrastructure/Files.Infrastructure.csproj index b535e7f37d..3d377fd7c1 100644 --- a/Modules/Files/src/Files.Infrastructure/Files.Infrastructure.csproj +++ b/Modules/Files/src/Files.Infrastructure/Files.Infrastructure.csproj @@ -4,12 +4,6 @@ enable - - - - - - diff --git a/Modules/Files/src/Files.Infrastructure/Persistence/Database/EntityTypeConfigurations/FileEntityTypeConfiguration.cs b/Modules/Files/src/Files.Infrastructure/Persistence/Database/EntityTypeConfigurations/FileEntityTypeConfiguration.cs index c8e30521a8..b406bc11ca 100644 --- a/Modules/Files/src/Files.Infrastructure/Persistence/Database/EntityTypeConfigurations/FileEntityTypeConfiguration.cs +++ b/Modules/Files/src/Files.Infrastructure/Persistence/Database/EntityTypeConfigurations/FileEntityTypeConfiguration.cs @@ -4,7 +4,7 @@ namespace Backbone.Modules.Files.Infrastructure.Persistence.Database.EntityTypeConfigurations; -public class FileEntityTypeConfiguration : IEntityTypeConfiguration +public class FileEntityTypeConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { diff --git a/Modules/Files/src/Files.Infrastructure/Persistence/Database/FilesDbContext.cs b/Modules/Files/src/Files.Infrastructure/Persistence/Database/FilesDbContext.cs index d45bd1875c..c7488e12b2 100644 --- a/Modules/Files/src/Files.Infrastructure/Persistence/Database/FilesDbContext.cs +++ b/Modules/Files/src/Files.Infrastructure/Persistence/Database/FilesDbContext.cs @@ -15,7 +15,7 @@ public FilesDbContext(DbContextOptions options) : base(options) public FilesDbContext(DbContextOptions options, IServiceProvider serviceProvider) : base(options, serviceProvider) { } - public DbSet FileMetadata { get; set; } + public DbSet FileMetadata { get; set; } = null!; protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { diff --git a/Modules/Files/src/Files.Infrastructure/Persistence/Database/IServiceCollectionExtensions.cs b/Modules/Files/src/Files.Infrastructure/Persistence/Database/IServiceCollectionExtensions.cs index e20fb08f5c..928bc4e440 100644 --- a/Modules/Files/src/Files.Infrastructure/Persistence/Database/IServiceCollectionExtensions.cs +++ b/Modules/Files/src/Files.Infrastructure/Persistence/Database/IServiceCollectionExtensions.cs @@ -15,7 +15,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); } @@ -56,8 +56,8 @@ public static void AddDatabase(this IServiceCollection services, DbOptions optio 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/Files/src/Files.Infrastructure/Persistence/Database/Repository/FilesRepository.cs b/Modules/Files/src/Files.Infrastructure/Persistence/Database/Repository/FilesRepository.cs index abb6ab6a9d..cb721aa6e3 100644 --- a/Modules/Files/src/Files.Infrastructure/Persistence/Database/Repository/FilesRepository.cs +++ b/Modules/Files/src/Files.Infrastructure/Persistence/Database/Repository/FilesRepository.cs @@ -38,7 +38,7 @@ public async Task Add(File file, CancellationToken cancellationToken) } - public async Task Find(FileId fileId, CancellationToken cancellationToken, bool track = false, bool fillContent = true) + public async Task Find(FileId fileId, CancellationToken cancellationToken, bool track = false, bool fillContent = true) { var file = await (track ? _files : _readOnlyFiles) .WithId(fileId) diff --git a/Modules/Files/src/Files.Infrastructure/Persistence/Database/ValueConverters/FileIdEntityFrameworkValueConverter.cs b/Modules/Files/src/Files.Infrastructure/Persistence/Database/ValueConverters/FileIdEntityFrameworkValueConverter.cs index 4545be81d6..16ad39e10e 100644 --- a/Modules/Files/src/Files.Infrastructure/Persistence/Database/ValueConverters/FileIdEntityFrameworkValueConverter.cs +++ b/Modules/Files/src/Files.Infrastructure/Persistence/Database/ValueConverters/FileIdEntityFrameworkValueConverter.cs @@ -5,11 +5,11 @@ namespace Backbone.Modules.Files.Infrastructure.Persistence.Database.ValueConver public class FileIdEntityFrameworkValueConverter : ValueConverter { - public FileIdEntityFrameworkValueConverter() : this(null) { } + public FileIdEntityFrameworkValueConverter() : this(new ConverterMappingHints()) { } public FileIdEntityFrameworkValueConverter(ConverterMappingHints mappingHints) : base( - id => id == null ? null : id.StringValue, + id => id.StringValue, value => FileId.Parse(value), mappingHints ) diff --git a/Modules/Files/src/Files.Infrastructure/Persistence/IServiceCollectionExtensions.cs b/Modules/Files/src/Files.Infrastructure/Persistence/IServiceCollectionExtensions.cs index d47f5dbb6d..0d3847a883 100644 --- a/Modules/Files/src/Files.Infrastructure/Persistence/IServiceCollectionExtensions.cs +++ b/Modules/Files/src/Files.Infrastructure/Persistence/IServiceCollectionExtensions.cs @@ -11,7 +11,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); } diff --git a/Modules/Files/src/Files.Jobs.SanityCheck/Files.Jobs.SanityCheck.csproj b/Modules/Files/src/Files.Jobs.SanityCheck/Files.Jobs.SanityCheck.csproj index a338edbbc7..24463953d1 100644 --- a/Modules/Files/src/Files.Jobs.SanityCheck/Files.Jobs.SanityCheck.csproj +++ b/Modules/Files/src/Files.Jobs.SanityCheck/Files.Jobs.SanityCheck.csproj @@ -1,7 +1,6 @@  - dotnet-Files.Jobs.SanityCheck-9f22e8e4-eb64-498c-9599-b971e0419647 Linux ..\..\..\.. enable diff --git a/Modules/Files/src/Files.Jobs.SanityCheck/Infrastructure/SanityCheck/SanityCheck.cs b/Modules/Files/src/Files.Jobs.SanityCheck/Infrastructure/SanityCheck/SanityCheck.cs index 643a164e46..4a9b15b88d 100644 --- a/Modules/Files/src/Files.Jobs.SanityCheck/Infrastructure/SanityCheck/SanityCheck.cs +++ b/Modules/Files/src/Files.Jobs.SanityCheck/Infrastructure/SanityCheck/SanityCheck.cs @@ -15,6 +15,8 @@ public SanityCheck(IDataSource dataSource, IReporter reporter) { _dataSource = dataSource; _reporter = reporter; + _databaseIds = []; + _blobIds = []; } public async Task Run(CancellationToken cancellationToken) diff --git a/Modules/Files/src/Files.Jobs.SanityCheck/Worker.cs b/Modules/Files/src/Files.Jobs.SanityCheck/Worker.cs index fab043f432..6c82448355 100644 --- a/Modules/Files/src/Files.Jobs.SanityCheck/Worker.cs +++ b/Modules/Files/src/Files.Jobs.SanityCheck/Worker.cs @@ -14,6 +14,10 @@ public Worker(IHostApplicationLifetime host, IServiceScopeFactory serviceScopeFa { _host = host; _serviceScopeFactory = serviceScopeFactory; + + // the following fields are initialized in StartAsync, which is always called before any other method + _dataSource = null!; + _reporter = null!; } public async Task StartAsync(CancellationToken cancellationToken) @@ -33,7 +37,7 @@ public Task StopAsync(CancellationToken cancellationToken) return Task.CompletedTask; } - public async Task RunSanityCheck(CancellationToken cancellationToken) + private async Task RunSanityCheck(CancellationToken cancellationToken) { var sanityCheck = new Infrastructure.SanityCheck.SanityCheck(_dataSource, _reporter); diff --git a/Modules/Files/test/Files.Application.Tests/TestData.cs b/Modules/Files/test/Files.Application.Tests/TestData.cs index 662d5415e2..98c2422125 100644 --- a/Modules/Files/test/Files.Application.Tests/TestData.cs +++ b/Modules/Files/test/Files.Application.Tests/TestData.cs @@ -31,9 +31,9 @@ public static class Devices public static class Payloads { - public static readonly byte[] EMPTY = Array.Empty(); - public static readonly byte[] PAYLOAD_1 = { 1, 1, 1 }; - public static readonly byte[] PAYLOAD_2 = { 2, 2, 2 }; - public static readonly byte[] PAYLOAD_3 = { 3, 3, 3 }; + public static readonly byte[] EMPTY = []; + public static readonly byte[] PAYLOAD_1 = [1, 1, 1]; + public static readonly byte[] PAYLOAD_2 = [2, 2, 2]; + public static readonly byte[] PAYLOAD_3 = [3, 3, 3]; } } diff --git a/Modules/Files/test/Files.Jobs.SanityCheck.Tests/Infrastructure/DataSource/FakeDataSource.cs b/Modules/Files/test/Files.Jobs.SanityCheck.Tests/Infrastructure/DataSource/FakeDataSource.cs index 49907c2013..625a7e12a7 100644 --- a/Modules/Files/test/Files.Jobs.SanityCheck.Tests/Infrastructure/DataSource/FakeDataSource.cs +++ b/Modules/Files/test/Files.Jobs.SanityCheck.Tests/Infrastructure/DataSource/FakeDataSource.cs @@ -5,8 +5,8 @@ namespace Backbone.Modules.Files.Jobs.SanityCheck.Tests.Infrastructure.DataSourc public class FakeDataSource : IDataSource { - public List DatabaseIds { get; } = new(); - public List BlobIds { get; } = new(); + public List DatabaseIds { get; } = []; + public List BlobIds { get; } = []; public Task> GetBlobIdsAsync(CancellationToken cancellationToken) {