From 61bcab6d7799b413629e3931877807843a1e4895 Mon Sep 17 00:00:00 2001 From: alex289 Date: Wed, 30 Aug 2023 23:36:48 +0200 Subject: [PATCH] chore: Code Cleanup --- .../CleanArchitecture.Api.csproj | 26 +++---- .../Controllers/TenantController.cs | 12 ++-- .../Extensions/ServiceCollectionExtension.cs | 9 ++- CleanArchitecture.Api/Models/DetailedError.cs | 6 +- .../Models/ResponseMessage.cs | 9 +-- CleanArchitecture.Api/Program.cs | 6 +- ...CleanArchitecture.Application.Tests.csproj | 14 ++-- .../Queries/QueryHandlerBaseFixture.cs | 6 +- .../Tenants/GetAllTenantsTestFixture.cs | 14 ++-- .../Tenants/GetTenantByIdTestFixture.cs | 12 ++-- .../Queries/Users/GetAllUsersTestFixture.cs | 28 ++++---- .../Queries/Users/GetUserByIdTestFixture.cs | 28 ++++---- .../Tenants/GetAllTenantsQueryHandlerTests.cs | 8 +-- .../Tenants/GetTenantByIdQueryHandlerTests.cs | 10 +-- .../CleanArchitecture.Application.csproj | 7 +- .../Extensions/ServiceCollectionExtension.cs | 5 +- .../Tenants/GetAll/GetAllTenantsQuery.cs | 2 +- .../GetTenantByIdQueryHandler.cs | 2 +- .../Services/TenantService.cs | 4 +- .../ViewModels/Tenants/TenantViewModel.cs | 2 +- .../gRPC/TenantsApiImplementation.cs | 4 +- .../CleanArchitecture.Domain.Tests.csproj | 12 ++-- .../CreateTenantCommandHandlerTests.cs | 8 +-- .../CreateTenantCommandTestFixture.cs | 12 ++-- .../CreateTenantCommandValidationTests.cs | 8 +-- .../DeleteTenantCommandHandlerTests.cs | 6 +- .../DeleteTenantCommandTestFixture.cs | 20 +++--- .../DeleteTenantCommandValidationTests.cs | 8 +-- .../UpdateTenantCommandHandlerTests.cs | 10 +-- .../UpdateTenantCommandTestFixture.cs | 15 ++-- .../UpdateTenantCommandValidationTests.cs | 8 +-- .../ChangePasswordCommandValidationTests.cs | 2 +- .../CreateUserCommandHandlerTests.cs | 10 +-- .../CreateUserCommandValidationTests.cs | 4 +- .../DeleteUserCommandValidationTests.cs | 2 +- .../LoginUserCommandValidationTests.cs | 2 +- .../UpdateUserCommandValidationTests.cs | 4 +- CleanArchitecture.Domain/ApiUser.cs | 3 + .../CleanArchitecture.Domain.csproj | 16 ++--- .../Commands/CommandHandlerBase.cs | 2 +- .../CreateTenant/CreateTenantCommand.cs | 6 +- .../CreateTenantCommandHandler.cs | 4 +- .../CreateTenantCommandValidation.cs | 4 +- .../DeleteTenant/DeleteTenantCommand.cs | 2 +- .../DeleteTenantCommandHandler.cs | 8 +-- .../DeleteTenantCommandValidation.cs | 2 +- .../UpdateTenant/UpdateTenantCommand.cs | 6 +- .../UpdateTenantCommandHandler.cs | 6 +- .../UpdateTenantCommandValidation.cs | 4 +- .../CreateUser/CreateUserCommandHandler.cs | 6 +- .../UpdateUser/UpdateUserCommandHandler.cs | 2 +- .../UpdateUser/UpdateUserCommandValidation.cs | 2 +- .../DomainEvents/Message.cs | 2 +- .../DomainEvents/StoredDomainEvent.cs | 15 ++-- .../StoredDomainNotification.cs | 25 +++---- CleanArchitecture.Domain/Entities/Tenant.cs | 10 +-- CleanArchitecture.Domain/Entities/User.cs | 25 ++++--- .../Events/Tenant/TenantCreatedEvent.cs | 4 +- .../Events/Tenant/TenantUpdatedEvent.cs | 4 +- .../Extensions/ServiceCollectionExtension.cs | 2 +- ...anArchitecture.Infrastructure.Tests.csproj | 10 +-- .../CleanArchitecture.Infrastructure.csproj | 12 ++-- .../StoredDomainEventConfiguration.cs | 2 +- .../StoredDomainNotificationConfiguration.cs | 2 +- .../Configurations/UserConfiguration.cs | 1 - .../Database/EventStoreDbContext.cs | 2 +- .../EventSourcing/EventStore.cs | 6 +- .../EventSourcing/EventStoreContext.cs | 15 ++-- .../EventSourcing/IEventStoreContext.cs | 2 +- .../Extensions/ServiceCollectionExtensions.cs | 18 ++--- .../GlobalSuppressions.cs | 12 +++- .../InMemoryBus.cs | 2 +- ...230701135523_AddDomainNotificationStore.cs | 68 +++++++++---------- .../20230701135441_AddEventStore.cs | 60 ++++++++-------- .../Repositories/BaseRepository.cs | 2 +- .../CleanArchitecture.IntegrationTests.csproj | 20 +++--- .../Controller/TenantControllerTests.cs | 66 +++++++++--------- .../Controller/UserControllerTests.cs | 6 +- .../Fixtures/TenantTestFixture.cs | 2 +- .../Fixtures/TestFixtureBase.cs | 3 +- .../gRPC/GetTenantsByIdsTestFixture.cs | 8 +-- .../Fixtures/gRPC/GetUsersByIdsTestFixture.cs | 6 +- .../CleanArchitectureWebApplicationFactory.cs | 14 ++-- .../gRPC/GetTenantsByIdsTests.cs | 4 +- .../CleanArchitecture.Proto.csproj | 14 ++-- .../CleanArchitecture.Shared.csproj | 8 +-- .../Users/UserViewModel.cs | 2 +- .../CleanArchitecture.gRPC.Tests.csproj | 16 ++--- .../Fixtures/TenantTestFixture.cs | 22 +++--- .../Tenants/GetTenantsByIdsTests.cs | 22 +++--- CleanArchitecture.gRPC/CleanArchitecture.cs | 17 ++--- .../CleanArchitecture.gRPC.csproj | 6 +- .../Contexts/TenantsContext.cs | 6 +- .../Contexts/UsersContext.cs | 2 +- .../Extensions/ServiceCollectionExtensions.cs | 4 +- CleanArchitecture.gRPC/ICleanArchitecture.cs | 2 +- .../Interfaces/IUsersContext.cs | 2 +- CleanArchitecture.gRPC/Models/GRPCSettings.cs | 2 +- 98 files changed, 487 insertions(+), 486 deletions(-) diff --git a/CleanArchitecture.Api/CleanArchitecture.Api.csproj b/CleanArchitecture.Api/CleanArchitecture.Api.csproj index 46e1257..ca184ec 100644 --- a/CleanArchitecture.Api/CleanArchitecture.Api.csproj +++ b/CleanArchitecture.Api/CleanArchitecture.Api.csproj @@ -7,26 +7,26 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + - - - - + + + + diff --git a/CleanArchitecture.Api/Controllers/TenantController.cs b/CleanArchitecture.Api/Controllers/TenantController.cs index 639e2c8..0576122 100644 --- a/CleanArchitecture.Api/Controllers/TenantController.cs +++ b/CleanArchitecture.Api/Controllers/TenantController.cs @@ -18,14 +18,14 @@ namespace CleanArchitecture.Api.Controllers; public sealed class TenantController : ApiController { private readonly ITenantService _tenantService; - + public TenantController( INotificationHandler notifications, ITenantService tenantService) : base(notifications) { _tenantService = tenantService; } - + [HttpGet] [SwaggerOperation("Get a list of all tenants")] [SwaggerResponse(200, "Request successful", typeof(ResponseMessage>))] @@ -34,7 +34,7 @@ public sealed class TenantController : ApiController var tenants = await _tenantService.GetAllTenantsAsync(); return Response(tenants); } - + [HttpGet("{id:guid}")] [SwaggerOperation("Get a tenant by id")] [SwaggerResponse(200, "Request successful", typeof(ResponseMessage))] @@ -45,7 +45,7 @@ public sealed class TenantController : ApiController var tenant = await _tenantService.GetTenantByIdAsync(id, isDeleted); return Response(tenant); } - + [HttpPost] [SwaggerOperation("Create a new tenant")] [SwaggerResponse(200, "Request successful", typeof(ResponseMessage))] @@ -54,7 +54,7 @@ public sealed class TenantController : ApiController var tenantId = await _tenantService.CreateTenantAsync(tenant); return Response(tenantId); } - + [HttpPut] [SwaggerOperation("Update an existing tenant")] [SwaggerResponse(200, "Request successful", typeof(ResponseMessage))] @@ -63,7 +63,7 @@ public sealed class TenantController : ApiController await _tenantService.UpdateTenantAsync(tenant); return Response(tenant); } - + [HttpDelete("{id:guid}")] [SwaggerOperation("Delete an existing tenant")] [SwaggerResponse(200, "Request successful", typeof(ResponseMessage))] diff --git a/CleanArchitecture.Api/Extensions/ServiceCollectionExtension.cs b/CleanArchitecture.Api/Extensions/ServiceCollectionExtension.cs index a71b3ed..7224bcc 100644 --- a/CleanArchitecture.Api/Extensions/ServiceCollectionExtension.cs +++ b/CleanArchitecture.Api/Extensions/ServiceCollectionExtension.cs @@ -60,9 +60,12 @@ public static class ServiceCollectionExtension services.AddHttpContextAccessor(); services.AddAuthentication( - options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) + options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer( - jwtOptions => { jwtOptions.TokenValidationParameters = CreateTokenValidationParameters(configuration); }); + jwtOptions => + { + jwtOptions.TokenValidationParameters = CreateTokenValidationParameters(configuration); + }); services .AddOptions() @@ -90,4 +93,4 @@ public static class ServiceCollectionExtension return result; } -} +} \ No newline at end of file diff --git a/CleanArchitecture.Api/Models/DetailedError.cs b/CleanArchitecture.Api/Models/DetailedError.cs index a4f3bd7..f7a1fed 100644 --- a/CleanArchitecture.Api/Models/DetailedError.cs +++ b/CleanArchitecture.Api/Models/DetailedError.cs @@ -4,9 +4,7 @@ namespace CleanArchitecture.Api.Models; public sealed class DetailedError { - [JsonPropertyName("code")] - public string Code { get; init; } = string.Empty; + [JsonPropertyName("code")] public string Code { get; init; } = string.Empty; - [JsonPropertyName("data")] - public object? Data { get; init; } + [JsonPropertyName("data")] public object? Data { get; init; } } \ No newline at end of file diff --git a/CleanArchitecture.Api/Models/ResponseMessage.cs b/CleanArchitecture.Api/Models/ResponseMessage.cs index e425f55..2f971bd 100644 --- a/CleanArchitecture.Api/Models/ResponseMessage.cs +++ b/CleanArchitecture.Api/Models/ResponseMessage.cs @@ -6,15 +6,12 @@ namespace CleanArchitecture.Api.Models; public sealed class ResponseMessage { - [JsonPropertyName("success")] - public bool Success { get; init; } + [JsonPropertyName("success")] public bool Success { get; init; } - [JsonPropertyName("errors")] - public IEnumerable? Errors { get; init; } + [JsonPropertyName("errors")] public IEnumerable? Errors { get; init; } [JsonPropertyName("detailedErrors")] public IEnumerable DetailedErrors { get; init; } = Enumerable.Empty(); - [JsonPropertyName("data")] - public T? Data { get; init; } + [JsonPropertyName("data")] public T? Data { get; init; } } \ No newline at end of file diff --git a/CleanArchitecture.Api/Program.cs b/CleanArchitecture.Api/Program.cs index f940491..b9819e7 100644 --- a/CleanArchitecture.Api/Program.cs +++ b/CleanArchitecture.Api/Program.cs @@ -61,9 +61,9 @@ var app = builder.Build(); using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; - ApplicationDbContext appDbContext = services.GetRequiredService(); - EventStoreDbContext storeDbContext = services.GetRequiredService(); - DomainNotificationStoreDbContext domainStoreDbContext = services.GetRequiredService(); + var appDbContext = services.GetRequiredService(); + var storeDbContext = services.GetRequiredService(); + var domainStoreDbContext = services.GetRequiredService(); appDbContext.EnsureMigrationsApplied(); diff --git a/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj b/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj index 225be5b..6f2f43b 100644 --- a/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj +++ b/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj @@ -8,11 +8,11 @@ - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,8 +24,8 @@ - - + + diff --git a/CleanArchitecture.Application.Tests/Fixtures/Queries/QueryHandlerBaseFixture.cs b/CleanArchitecture.Application.Tests/Fixtures/Queries/QueryHandlerBaseFixture.cs index 63c7502..d04b652 100644 --- a/CleanArchitecture.Application.Tests/Fixtures/Queries/QueryHandlerBaseFixture.cs +++ b/CleanArchitecture.Application.Tests/Fixtures/Queries/QueryHandlerBaseFixture.cs @@ -11,9 +11,9 @@ public class QueryHandlerBaseFixture public QueryHandlerBaseFixture VerifyExistingNotification(string key, string errorCode, string message) { Bus.Received(1).RaiseEventAsync(Arg.Is(notification => - notification.Key == key && - notification.Code == errorCode && - notification.Value == message)); + notification.Key == key && + notification.Code == errorCode && + notification.Value == message)); return this; } diff --git a/CleanArchitecture.Application.Tests/Fixtures/Queries/Tenants/GetAllTenantsTestFixture.cs b/CleanArchitecture.Application.Tests/Fixtures/Queries/Tenants/GetAllTenantsTestFixture.cs index 90763e6..ef21f15 100644 --- a/CleanArchitecture.Application.Tests/Fixtures/Queries/Tenants/GetAllTenantsTestFixture.cs +++ b/CleanArchitecture.Application.Tests/Fixtures/Queries/Tenants/GetAllTenantsTestFixture.cs @@ -10,16 +10,16 @@ namespace CleanArchitecture.Application.Tests.Fixtures.Queries.Tenants; public sealed class GetAllTenantsTestFixture : QueryHandlerBaseFixture { - public GetAllTenantsQueryHandler QueryHandler { get; } - private ITenantRepository TenantRepository { get; } - public GetAllTenantsTestFixture() { TenantRepository = Substitute.For(); - - QueryHandler = new(TenantRepository); + + QueryHandler = new GetAllTenantsQueryHandler(TenantRepository); } - + + public GetAllTenantsQueryHandler QueryHandler { get; } + private ITenantRepository TenantRepository { get; } + public Tenant SetupTenant(bool deleted = false) { var tenant = new Tenant(Guid.NewGuid(), "Tenant 1"); @@ -31,7 +31,7 @@ public sealed class GetAllTenantsTestFixture : QueryHandlerBaseFixture var tenantList = new List { tenant }.BuildMock(); TenantRepository.GetAllNoTracking().Returns(tenantList); - + return tenant; } } \ No newline at end of file diff --git a/CleanArchitecture.Application.Tests/Fixtures/Queries/Tenants/GetTenantByIdTestFixture.cs b/CleanArchitecture.Application.Tests/Fixtures/Queries/Tenants/GetTenantByIdTestFixture.cs index 4ba31ef..ac12b58 100644 --- a/CleanArchitecture.Application.Tests/Fixtures/Queries/Tenants/GetTenantByIdTestFixture.cs +++ b/CleanArchitecture.Application.Tests/Fixtures/Queries/Tenants/GetTenantByIdTestFixture.cs @@ -10,18 +10,18 @@ namespace CleanArchitecture.Application.Tests.Fixtures.Queries.Tenants; public sealed class GetTenantByIdTestFixture : QueryHandlerBaseFixture { - public GetTenantByIdQueryHandler QueryHandler { get; } - private ITenantRepository TenantRepository { get; } - public GetTenantByIdTestFixture() { TenantRepository = Substitute.For(); - - QueryHandler = new( + + QueryHandler = new GetTenantByIdQueryHandler( TenantRepository, Bus); } + public GetTenantByIdQueryHandler QueryHandler { get; } + private ITenantRepository TenantRepository { get; } + public Tenant SetupTenant(bool deleted = false) { var tenant = new Tenant(Guid.NewGuid(), "Tenant 1"); @@ -33,7 +33,7 @@ public sealed class GetTenantByIdTestFixture : QueryHandlerBaseFixture var tenantList = new List { tenant }.BuildMock(); TenantRepository.GetAllNoTracking().Returns(tenantList); - + return tenant; } } \ No newline at end of file diff --git a/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetAllUsersTestFixture.cs b/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetAllUsersTestFixture.cs index 027e8ff..efdabee 100644 --- a/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetAllUsersTestFixture.cs +++ b/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetAllUsersTestFixture.cs @@ -24,13 +24,13 @@ public sealed class GetAllUsersTestFixture : QueryHandlerBaseFixture public void SetupUserAsync() { var user = new User( - ExistingUserId, - Guid.NewGuid(), - "max@mustermann.com", - "Max", - "Mustermann", - "Password", - UserRole.User); + ExistingUserId, + Guid.NewGuid(), + "max@mustermann.com", + "Max", + "Mustermann", + "Password", + UserRole.User); var query = new[] { user }.BuildMock(); @@ -40,13 +40,13 @@ public sealed class GetAllUsersTestFixture : QueryHandlerBaseFixture public void SetupDeletedUserAsync() { var user = new User( - ExistingUserId, - Guid.NewGuid(), - "max@mustermann.com", - "Max", - "Mustermann", - "Password", - UserRole.User); + ExistingUserId, + Guid.NewGuid(), + "max@mustermann.com", + "Max", + "Mustermann", + "Password", + UserRole.User); user.Delete(); diff --git a/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetUserByIdTestFixture.cs b/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetUserByIdTestFixture.cs index 6f306d6..11b407f 100644 --- a/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetUserByIdTestFixture.cs +++ b/CleanArchitecture.Application.Tests/Fixtures/Queries/Users/GetUserByIdTestFixture.cs @@ -25,13 +25,13 @@ public sealed class GetUserByIdTestFixture : QueryHandlerBaseFixture public void SetupUserAsync() { var user = new User( - ExistingUserId, - Guid.NewGuid(), - "max@mustermann.com", - "Max", - "Mustermann", - "Password", - UserRole.User); + ExistingUserId, + Guid.NewGuid(), + "max@mustermann.com", + "Max", + "Mustermann", + "Password", + UserRole.User); var query = new[] { user }.BuildMock(); @@ -41,13 +41,13 @@ public sealed class GetUserByIdTestFixture : QueryHandlerBaseFixture public void SetupDeletedUserAsync() { var user = new User( - ExistingUserId, - Guid.NewGuid(), - "max@mustermann.com", - "Max", - "Mustermann", - "Password", - UserRole.User); + ExistingUserId, + Guid.NewGuid(), + "max@mustermann.com", + "Max", + "Mustermann", + "Password", + UserRole.User); user.Delete(); diff --git a/CleanArchitecture.Application.Tests/Queries/Tenants/GetAllTenantsQueryHandlerTests.cs b/CleanArchitecture.Application.Tests/Queries/Tenants/GetAllTenantsQueryHandlerTests.cs index 882eedf..6940687 100644 --- a/CleanArchitecture.Application.Tests/Queries/Tenants/GetAllTenantsQueryHandlerTests.cs +++ b/CleanArchitecture.Application.Tests/Queries/Tenants/GetAllTenantsQueryHandlerTests.cs @@ -10,12 +10,12 @@ namespace CleanArchitecture.Application.Tests.Queries.Tenants; public sealed class GetAllTenantsQueryHandlerTests { private readonly GetAllTenantsTestFixture _fixture = new(); - + [Fact] public async Task Should_Get_Existing_Tenant() { var tenant = _fixture.SetupTenant(); - + var result = await _fixture.QueryHandler.Handle( new GetAllTenantsQuery(), default); @@ -24,12 +24,12 @@ public sealed class GetAllTenantsQueryHandlerTests tenant.Should().BeEquivalentTo(result.First()); } - + [Fact] public async Task Should_Not_Get_Deleted_Tenant() { _fixture.SetupTenant(true); - + var result = await _fixture.QueryHandler.Handle( new GetAllTenantsQuery(), default); diff --git a/CleanArchitecture.Application.Tests/Queries/Tenants/GetTenantByIdQueryHandlerTests.cs b/CleanArchitecture.Application.Tests/Queries/Tenants/GetTenantByIdQueryHandlerTests.cs index 222d456..230864b 100644 --- a/CleanArchitecture.Application.Tests/Queries/Tenants/GetTenantByIdQueryHandlerTests.cs +++ b/CleanArchitecture.Application.Tests/Queries/Tenants/GetTenantByIdQueryHandlerTests.cs @@ -15,7 +15,7 @@ public sealed class GetTenantByIdQueryHandlerTests public async Task Should_Get_Existing_Tenant() { var tenant = _fixture.SetupTenant(); - + var result = await _fixture.QueryHandler.Handle( new GetTenantByIdQuery(tenant.Id, false), default); @@ -24,12 +24,12 @@ public sealed class GetTenantByIdQueryHandlerTests tenant.Should().BeEquivalentTo(result); } - + [Fact] public async Task Should_Get_Deleted_Tenant() { var tenant = _fixture.SetupTenant(true); - + var result = await _fixture.QueryHandler.Handle( new GetTenantByIdQuery(tenant.Id, true), default); @@ -38,12 +38,12 @@ public sealed class GetTenantByIdQueryHandlerTests tenant.Should().BeEquivalentTo(result); } - + [Fact] public async Task Should_Not_Get_Deleted_Tenant() { var tenant = _fixture.SetupTenant(true); - + var result = await _fixture.QueryHandler.Handle( new GetTenantByIdQuery(tenant.Id, false), default); diff --git a/CleanArchitecture.Application/CleanArchitecture.Application.csproj b/CleanArchitecture.Application/CleanArchitecture.Application.csproj index 2c7102f..3b320a5 100644 --- a/CleanArchitecture.Application/CleanArchitecture.Application.csproj +++ b/CleanArchitecture.Application/CleanArchitecture.Application.csproj @@ -6,14 +6,13 @@ - + - - + + - diff --git a/CleanArchitecture.Application/Extensions/ServiceCollectionExtension.cs b/CleanArchitecture.Application/Extensions/ServiceCollectionExtension.cs index 03d5044..9da4c3b 100644 --- a/CleanArchitecture.Application/Extensions/ServiceCollectionExtension.cs +++ b/CleanArchitecture.Application/Extensions/ServiceCollectionExtension.cs @@ -30,8 +30,9 @@ public static class ServiceCollectionExtension // Tenant services.AddScoped, GetTenantByIdQueryHandler>(); - services.AddScoped>, GetAllTenantsQueryHandler>(); - + services + .AddScoped>, GetAllTenantsQueryHandler>(); + return services; } } \ No newline at end of file diff --git a/CleanArchitecture.Application/Queries/Tenants/GetAll/GetAllTenantsQuery.cs b/CleanArchitecture.Application/Queries/Tenants/GetAll/GetAllTenantsQuery.cs index 09e81a7..e87ddec 100644 --- a/CleanArchitecture.Application/Queries/Tenants/GetAll/GetAllTenantsQuery.cs +++ b/CleanArchitecture.Application/Queries/Tenants/GetAll/GetAllTenantsQuery.cs @@ -4,4 +4,4 @@ using MediatR; namespace CleanArchitecture.Application.Queries.Tenants.GetAll; -public sealed record GetAllTenantsQuery() : IRequest>; \ No newline at end of file +public sealed record GetAllTenantsQuery : IRequest>; \ No newline at end of file diff --git a/CleanArchitecture.Application/Queries/Tenants/GetTenantById/GetTenantByIdQueryHandler.cs b/CleanArchitecture.Application/Queries/Tenants/GetTenantById/GetTenantByIdQueryHandler.cs index 9157fe4..2e22455 100644 --- a/CleanArchitecture.Application/Queries/Tenants/GetTenantById/GetTenantByIdQueryHandler.cs +++ b/CleanArchitecture.Application/Queries/Tenants/GetTenantById/GetTenantByIdQueryHandler.cs @@ -14,8 +14,8 @@ namespace CleanArchitecture.Application.Queries.Tenants.GetTenantById; public sealed class GetTenantByIdQueryHandler : IRequestHandler { - private readonly ITenantRepository _tenantRepository; private readonly IMediatorHandler _bus; + private readonly ITenantRepository _tenantRepository; public GetTenantByIdQueryHandler(ITenantRepository tenantRepository, IMediatorHandler bus) { diff --git a/CleanArchitecture.Application/Services/TenantService.cs b/CleanArchitecture.Application/Services/TenantService.cs index 62279c0..c10fe20 100644 --- a/CleanArchitecture.Application/Services/TenantService.cs +++ b/CleanArchitecture.Application/Services/TenantService.cs @@ -24,11 +24,11 @@ public sealed class TenantService : ITenantService public async Task CreateTenantAsync(CreateTenantViewModel tenant) { var tenantId = Guid.NewGuid(); - + await _bus.SendCommandAsync(new CreateTenantCommand( tenantId, tenant.Name)); - + return tenantId; } diff --git a/CleanArchitecture.Application/ViewModels/Tenants/TenantViewModel.cs b/CleanArchitecture.Application/ViewModels/Tenants/TenantViewModel.cs index 586768f..af6bb43 100644 --- a/CleanArchitecture.Application/ViewModels/Tenants/TenantViewModel.cs +++ b/CleanArchitecture.Application/ViewModels/Tenants/TenantViewModel.cs @@ -11,7 +11,7 @@ public sealed class TenantViewModel public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public IEnumerable Users { get; set; } = new List(); - + public static TenantViewModel FromTenant(Tenant tenant) { return new TenantViewModel diff --git a/CleanArchitecture.Application/gRPC/TenantsApiImplementation.cs b/CleanArchitecture.Application/gRPC/TenantsApiImplementation.cs index d356c9e..414206c 100644 --- a/CleanArchitecture.Application/gRPC/TenantsApiImplementation.cs +++ b/CleanArchitecture.Application/gRPC/TenantsApiImplementation.cs @@ -23,7 +23,7 @@ public sealed class TenantsApiImplementation : TenantsApi.TenantsApiBase ServerCallContext context) { var idsAsGuids = new List(request.Ids.Count); - + foreach (var id in request.Ids) { if (Guid.TryParse(id, out var parsed)) @@ -44,7 +44,7 @@ public sealed class TenantsApiImplementation : TenantsApi.TenantsApiBase .ToListAsync(); var result = new GetTenantsByIdsResult(); - + result.Tenants.AddRange(tenants); return result; diff --git a/CleanArchitecture.Domain.Tests/CleanArchitecture.Domain.Tests.csproj b/CleanArchitecture.Domain.Tests/CleanArchitecture.Domain.Tests.csproj index 9a66f90..ce47c49 100644 --- a/CleanArchitecture.Domain.Tests/CleanArchitecture.Domain.Tests.csproj +++ b/CleanArchitecture.Domain.Tests/CleanArchitecture.Domain.Tests.csproj @@ -8,11 +8,11 @@ - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,7 +24,7 @@ - + diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandHandlerTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandHandlerTests.cs index 77e2038..eb8d848 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandHandlerTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandHandlerTests.cs @@ -26,12 +26,12 @@ public sealed class CreateTenantCommandHandlerTests x.AggregateId == command.AggregateId && x.Name == command.Name); } - + [Fact] public void Should_Not_Create_Tenant_Insufficient_Permissions() { _fixture.SetupUser(); - + var command = new CreateTenantCommand( Guid.NewGuid(), "Test Tenant"); @@ -46,14 +46,14 @@ public sealed class CreateTenantCommandHandlerTests ErrorCodes.InsufficientPermissions, $"No permission to create tenant {command.AggregateId}"); } - + [Fact] public void Should_Not_Create_Tenant_Already_Exists() { var command = new CreateTenantCommand( Guid.NewGuid(), "Test Tenant"); - + _fixture.SetupExistingTenant(command.AggregateId); _fixture.CommandHandler.Handle(command, default!).Wait(); diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandTestFixture.cs b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandTestFixture.cs index 9c9a48c..d2ca1f2 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandTestFixture.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandTestFixture.cs @@ -8,15 +8,11 @@ namespace CleanArchitecture.Domain.Tests.CommandHandler.Tenant.CreateTenant; public sealed class CreateTenantCommandTestFixture : CommandHandlerFixtureBase { - public CreateTenantCommandHandler CommandHandler { get;} - - private ITenantRepository TenantRepository { get; } - public CreateTenantCommandTestFixture() { TenantRepository = Substitute.For(); - - CommandHandler = new( + + CommandHandler = new CreateTenantCommandHandler( Bus, UnitOfWork, NotificationHandler, @@ -24,6 +20,10 @@ public sealed class CreateTenantCommandTestFixture : CommandHandlerFixtureBase User); } + public CreateTenantCommandHandler CommandHandler { get; } + + private ITenantRepository TenantRepository { get; } + public void SetupUser() { User.GetUserRole().Returns(UserRole.User); diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandValidationTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandValidationTests.cs index 25aec37..2156932 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandValidationTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/CreateTenant/CreateTenantCommandValidationTests.cs @@ -11,7 +11,7 @@ public sealed class CreateTenantCommandValidationTests : public CreateTenantCommandValidationTests() : base(new CreateTenantCommandValidation()) { } - + [Fact] public void Should_Be_Valid() { @@ -19,7 +19,7 @@ public sealed class CreateTenantCommandValidationTests : ShouldBeValid(command); } - + [Fact] public void Should_Be_Invalid_For_Empty_Tenant_Id() { @@ -30,7 +30,7 @@ public sealed class CreateTenantCommandValidationTests : DomainErrorCodes.Tenant.TenantEmptyId, "Tenant id may not be empty"); } - + [Fact] public void Should_Be_Invalid_For_Empty_Tenant_Name() { @@ -46,7 +46,7 @@ public sealed class CreateTenantCommandValidationTests : Guid? id = null, string? name = null) { - return new( + return new CreateTenantCommand( id ?? Guid.NewGuid(), name ?? "Test Tenant"); } diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandHandlerTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandHandlerTests.cs index 27b5a2d..cfd6851 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandHandlerTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandHandlerTests.cs @@ -16,7 +16,7 @@ public sealed class DeleteTenantCommandHandlerTests var tenant = _fixture.SetupTenant(); var command = new DeleteTenantCommand(tenant.Id); - + _fixture.CommandHandler.Handle(command, default).Wait(); _fixture @@ -24,14 +24,14 @@ public sealed class DeleteTenantCommandHandlerTests .VerifyCommit() .VerifyRaisedEvent(x => x.AggregateId == tenant.Id); } - + [Fact] public void Should_Not_Delete_Non_Existing_Tenant() { _fixture.SetupTenant(); var command = new DeleteTenantCommand(Guid.NewGuid()); - + _fixture.CommandHandler.Handle(command, default).Wait(); _fixture diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandTestFixture.cs b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandTestFixture.cs index 9ed5c2c..1b8367a 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandTestFixture.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandTestFixture.cs @@ -7,17 +7,12 @@ namespace CleanArchitecture.Domain.Tests.CommandHandler.Tenant.DeleteTenant; public sealed class DeleteTenantCommandTestFixture : CommandHandlerFixtureBase { - public DeleteTenantCommandHandler CommandHandler { get;} - - private ITenantRepository TenantRepository { get; } - private IUserRepository UserRepository { get; } - public DeleteTenantCommandTestFixture() { TenantRepository = Substitute.For(); UserRepository = Substitute.For(); - - CommandHandler = new( + + CommandHandler = new DeleteTenantCommandHandler( Bus, UnitOfWork, NotificationHandler, @@ -26,14 +21,19 @@ public sealed class DeleteTenantCommandTestFixture : CommandHandlerFixtureBase User); } + public DeleteTenantCommandHandler CommandHandler { get; } + + private ITenantRepository TenantRepository { get; } + private IUserRepository UserRepository { get; } + public Entities.Tenant SetupTenant() { var tenant = new Entities.Tenant(Guid.NewGuid(), "TestTenant"); - + TenantRepository .GetByIdAsync(Arg.Is(y => y == tenant.Id)) .Returns(tenant); - + return tenant; - } + } } \ No newline at end of file diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandValidationTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandValidationTests.cs index 48d3877..b36e294 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandValidationTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/DeleteTenant/DeleteTenantCommandValidationTests.cs @@ -11,7 +11,7 @@ public sealed class DeleteTenantCommandValidationTests : public DeleteTenantCommandValidationTests() : base(new DeleteTenantCommandValidation()) { } - + [Fact] public void Should_Be_Valid() { @@ -19,7 +19,7 @@ public sealed class DeleteTenantCommandValidationTests : ShouldBeValid(command); } - + [Fact] public void Should_Be_Invalid_For_Empty_Tenant_Id() { @@ -30,9 +30,9 @@ public sealed class DeleteTenantCommandValidationTests : DomainErrorCodes.Tenant.TenantEmptyId, "Tenant id may not be empty"); } - + private static DeleteTenantCommand CreateTestCommand(Guid? tenantId = null) { - return new(tenantId ?? Guid.NewGuid()); + return new DeleteTenantCommand(tenantId ?? Guid.NewGuid()); } } \ No newline at end of file diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandHandlerTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandHandlerTests.cs index 8fa4424..e391a89 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandHandlerTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandHandlerTests.cs @@ -16,7 +16,7 @@ public sealed class UpdateTenantCommandHandlerTests var command = new UpdateTenantCommand( Guid.NewGuid(), "Tenant Name"); - + _fixture.SetupExistingTenant(command.AggregateId); _fixture.CommandHandler.Handle(command, default!).Wait(); @@ -28,14 +28,14 @@ public sealed class UpdateTenantCommandHandlerTests x.AggregateId == command.AggregateId && x.Name == command.Name); } - + [Fact] public void Should_Not_Update_Tenant_Insufficient_Permissions() { var command = new UpdateTenantCommand( Guid.NewGuid(), "Tenant Name"); - + _fixture.SetupUser(); _fixture.CommandHandler.Handle(command, default!).Wait(); @@ -48,14 +48,14 @@ public sealed class UpdateTenantCommandHandlerTests ErrorCodes.InsufficientPermissions, $"No permission to update tenant {command.AggregateId}"); } - + [Fact] public void Should_Not_Update_Tenant_Not_Existing() { var command = new UpdateTenantCommand( Guid.NewGuid(), "Tenant Name"); - + _fixture.CommandHandler.Handle(command, default!).Wait(); _fixture diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandTestFixture.cs b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandTestFixture.cs index 82879d6..dbd1695 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandTestFixture.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandTestFixture.cs @@ -1,7 +1,6 @@ using System; using CleanArchitecture.Domain.Commands.Tenants.UpdateTenant; using CleanArchitecture.Domain.Enums; -using CleanArchitecture.Domain.Interfaces; using CleanArchitecture.Domain.Interfaces.Repositories; using NSubstitute; @@ -9,22 +8,22 @@ namespace CleanArchitecture.Domain.Tests.CommandHandler.Tenant.UpdateTenant; public sealed class UpdateTenantCommandTestFixture : CommandHandlerFixtureBase { - public UpdateTenantCommandHandler CommandHandler { get;} - - private ITenantRepository TenantRepository { get; } - public UpdateTenantCommandTestFixture() { TenantRepository = Substitute.For(); - - CommandHandler = new( + + CommandHandler = new UpdateTenantCommandHandler( Bus, UnitOfWork, NotificationHandler, TenantRepository, User); } - + + public UpdateTenantCommandHandler CommandHandler { get; } + + private ITenantRepository TenantRepository { get; } + public void SetupUser() { User.GetUserRole().Returns(UserRole.User); diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandValidationTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandValidationTests.cs index 4aac523..c7c4f11 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandValidationTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/Tenant/UpdateTenant/UpdateTenantCommandValidationTests.cs @@ -11,7 +11,7 @@ public sealed class UpdateTenantCommandValidationTests : public UpdateTenantCommandValidationTests() : base(new UpdateTenantCommandValidation()) { } - + [Fact] public void Should_Be_Valid() { @@ -19,7 +19,7 @@ public sealed class UpdateTenantCommandValidationTests : ShouldBeValid(command); } - + [Fact] public void Should_Be_Invalid_For_Empty_Tenant_Id() { @@ -30,7 +30,7 @@ public sealed class UpdateTenantCommandValidationTests : DomainErrorCodes.Tenant.TenantEmptyId, "Tenant id may not be empty"); } - + [Fact] public void Should_Be_Invalid_For_Empty_Tenant_Name() { @@ -46,7 +46,7 @@ public sealed class UpdateTenantCommandValidationTests : Guid? id = null, string? name = null) { - return new( + return new UpdateTenantCommand( id ?? Guid.NewGuid(), name ?? "Test Tenant"); } diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/ChangePassword/ChangePasswordCommandValidationTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/ChangePassword/ChangePasswordCommandValidationTests.cs index 4a1a41a..b75d5f4 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/ChangePassword/ChangePasswordCommandValidationTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/ChangePassword/ChangePasswordCommandValidationTests.cs @@ -90,7 +90,7 @@ public sealed class ChangePasswordCommandValidationTests : private static ChangePasswordCommand CreateTestCommand( string? password = null, string? newPassword = null) { - return new( + return new ChangePasswordCommand( password ?? "z8]tnayvd5FNLU9:]AQm", newPassword ?? "z8]tnayvd5FNLU9:]AQw"); } diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandHandlerTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandHandlerTests.cs index 5382f23..0151fd4 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandHandlerTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandHandlerTests.cs @@ -15,7 +15,7 @@ public sealed class CreateUserCommandHandlerTests { // Todo: Fix tests _fixture.SetupCurrentUser(); - + var user = _fixture.SetupUser(); _fixture.SetupTenant(user.TenantId); @@ -39,7 +39,7 @@ public sealed class CreateUserCommandHandlerTests public void Should_Not_Create_Already_Existing_User() { _fixture.SetupCurrentUser(); - + var user = _fixture.SetupUser(); var command = new CreateUserCommand( @@ -60,12 +60,12 @@ public sealed class CreateUserCommandHandlerTests DomainErrorCodes.User.UserAlreadyExists, $"There is already a user with Id {command.UserId}"); } - + [Fact] public void Should_Not_Create_User_Tenant_Does_Not_Exist() { _fixture.SetupCurrentUser(); - + _fixture.SetupUser(); var command = new CreateUserCommand( @@ -86,7 +86,7 @@ public sealed class CreateUserCommandHandlerTests ErrorCodes.ObjectNotFound, $"There is no tenant with Id {command.TenantId}"); } - + [Fact] public void Should_Not_Create_User_Insufficient_Permissions() { diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandValidationTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandValidationTests.cs index 015b40d..05e3d7c 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandValidationTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/CreateUser/CreateUserCommandValidationTests.cs @@ -176,7 +176,7 @@ public sealed class CreateUserCommandValidationTests : ShouldHaveSingleError(command, DomainErrorCodes.User.UserLongPassword); } - + [Fact] public void Should_Be_Invalid_For_Empty_Tenant_Id() { @@ -193,7 +193,7 @@ public sealed class CreateUserCommandValidationTests : string? lastName = null, string? password = null) { - return new( + return new CreateUserCommand( userId ?? Guid.NewGuid(), tenantId ?? Guid.NewGuid(), email ?? "test@email.com", diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandValidationTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandValidationTests.cs index 9464154..8ea63cf 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandValidationTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/DeleteUser/DeleteUserCommandValidationTests.cs @@ -33,6 +33,6 @@ public sealed class DeleteUserCommandValidationTests : private static DeleteUserCommand CreateTestCommand(Guid? userId = null) { - return new(userId ?? Guid.NewGuid()); + return new DeleteUserCommand(userId ?? Guid.NewGuid()); } } \ No newline at end of file diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/LoginUser/LoginUserCommandValidationTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/LoginUser/LoginUserCommandValidationTests.cs index e6b4675..7b1ca35 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/LoginUser/LoginUserCommandValidationTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/LoginUser/LoginUserCommandValidationTests.cs @@ -125,7 +125,7 @@ public sealed class LoginUserCommandValidationTests : string? email = null, string? password = null) { - return new( + return new LoginUserCommand( email ?? "test@email.com", password ?? "Po=PF]PC6t.?8?ks)A6W"); } diff --git a/CleanArchitecture.Domain.Tests/CommandHandler/User/UpdateUser/UpdateUserCommandValidationTests.cs b/CleanArchitecture.Domain.Tests/CommandHandler/User/UpdateUser/UpdateUserCommandValidationTests.cs index 161aabc..42de98f 100644 --- a/CleanArchitecture.Domain.Tests/CommandHandler/User/UpdateUser/UpdateUserCommandValidationTests.cs +++ b/CleanArchitecture.Domain.Tests/CommandHandler/User/UpdateUser/UpdateUserCommandValidationTests.cs @@ -109,7 +109,7 @@ public sealed class UpdateUserCommandValidationTests : DomainErrorCodes.User.UserLastNameExceedsMaxLength, $"LastName may not be longer than {MaxLengths.User.LastName} characters"); } - + [Fact] public void Should_Be_Invalid_For_Empty_Tenant_Id() { @@ -129,7 +129,7 @@ public sealed class UpdateUserCommandValidationTests : string? lastName = null, UserRole? role = null) { - return new( + return new UpdateUserCommand( userId ?? Guid.NewGuid(), email ?? "test@email.com", firstName ?? "test", diff --git a/CleanArchitecture.Domain/ApiUser.cs b/CleanArchitecture.Domain/ApiUser.cs index df1db8a..3e0ea81 100644 --- a/CleanArchitecture.Domain/ApiUser.cs +++ b/CleanArchitecture.Domain/ApiUser.cs @@ -59,17 +59,20 @@ public sealed class ApiUser : IUser { return _name; } + var identity = _httpContextAccessor.HttpContext?.User.Identity; if (identity is null) { _name = string.Empty; return string.Empty; } + if (!string.IsNullOrWhiteSpace(identity.Name)) { _name = identity.Name; return identity.Name; } + var claim = _httpContextAccessor.HttpContext!.User.Claims .FirstOrDefault(c => string.Equals(c.Type, ClaimTypes.Name, StringComparison.OrdinalIgnoreCase))? .Value; diff --git a/CleanArchitecture.Domain/CleanArchitecture.Domain.csproj b/CleanArchitecture.Domain/CleanArchitecture.Domain.csproj index 0d9cbb5..756c41c 100644 --- a/CleanArchitecture.Domain/CleanArchitecture.Domain.csproj +++ b/CleanArchitecture.Domain/CleanArchitecture.Domain.csproj @@ -6,14 +6,14 @@ - - - - - + + + + + - - - + + + diff --git a/CleanArchitecture.Domain/Commands/CommandHandlerBase.cs b/CleanArchitecture.Domain/Commands/CommandHandlerBase.cs index 6ab6b8f..e1f7ba0 100644 --- a/CleanArchitecture.Domain/Commands/CommandHandlerBase.cs +++ b/CleanArchitecture.Domain/Commands/CommandHandlerBase.cs @@ -9,9 +9,9 @@ namespace CleanArchitecture.Domain.Commands; public abstract class CommandHandlerBase { - protected readonly IMediatorHandler Bus; private readonly DomainNotificationHandler _notifications; private readonly IUnitOfWork _unitOfWork; + protected readonly IMediatorHandler Bus; protected CommandHandlerBase( IMediatorHandler bus, diff --git a/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommand.cs b/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommand.cs index 3a97121..febc727 100644 --- a/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommand.cs +++ b/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommand.cs @@ -5,14 +5,14 @@ namespace CleanArchitecture.Domain.Commands.Tenants.CreateTenant; public sealed class CreateTenantCommand : CommandBase { private static readonly CreateTenantCommandValidation s_validation = new(); - - public string Name { get; } - + public CreateTenantCommand(Guid tenantId, string name) : base(tenantId) { Name = name; } + public string Name { get; } + public override bool IsValid() { ValidationResult = s_validation.Validate(this); diff --git a/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommandHandler.cs b/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommandHandler.cs index c96c8f0..16d0821 100644 --- a/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommandHandler.cs +++ b/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommandHandler.cs @@ -34,7 +34,7 @@ public sealed class CreateTenantCommandHandler : CommandHandlerBase, { return; } - + if (_user.GetUserRole() != UserRole.Admin) { await NotifyAsync( @@ -60,7 +60,7 @@ public sealed class CreateTenantCommandHandler : CommandHandlerBase, var tenant = new Tenant( request.AggregateId, request.Name); - + _tenantRepository.Add(tenant); if (await CommitAsync()) diff --git a/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommandValidation.cs b/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommandValidation.cs index 4838663..9ac7602 100644 --- a/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommandValidation.cs +++ b/CleanArchitecture.Domain/Commands/Tenants/CreateTenant/CreateTenantCommandValidation.cs @@ -11,7 +11,7 @@ public sealed class CreateTenantCommandValidation : AbstractValidator cmd.AggregateId) @@ -19,7 +19,7 @@ public sealed class CreateTenantCommandValidation : AbstractValidator cmd.Name) diff --git a/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommand.cs b/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommand.cs index 9e112ca..e83ddc8 100644 --- a/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommand.cs +++ b/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommand.cs @@ -5,7 +5,7 @@ namespace CleanArchitecture.Domain.Commands.Tenants.DeleteTenant; public sealed class DeleteTenantCommand : CommandBase { private static readonly DeleteTenantCommandValidation s_validation = new(); - + public DeleteTenantCommand(Guid tenantId) : base(tenantId) { } diff --git a/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommandHandler.cs b/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommandHandler.cs index 6c6b91a..3a57bed 100644 --- a/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommandHandler.cs +++ b/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommandHandler.cs @@ -15,8 +15,8 @@ public sealed class DeleteTenantCommandHandler : CommandHandlerBase, IRequestHandler { private readonly ITenantRepository _tenantRepository; - private readonly IUserRepository _userRepository; private readonly IUser _user; + private readonly IUserRepository _userRepository; public DeleteTenantCommandHandler( IMediatorHandler bus, @@ -37,7 +37,7 @@ public sealed class DeleteTenantCommandHandler : CommandHandlerBase, { return; } - + // Todo: Test following if (_user.GetUserRole() != UserRole.Admin) @@ -67,9 +67,9 @@ public sealed class DeleteTenantCommandHandler : CommandHandlerBase, var tenantUsers = _userRepository .GetAll() .Where(x => x.TenantId == request.AggregateId); - + _userRepository.RemoveRange(tenantUsers); - + _tenantRepository.Remove(tenant); if (await CommitAsync()) diff --git a/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommandValidation.cs b/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommandValidation.cs index dadddd8..7b80034 100644 --- a/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommandValidation.cs +++ b/CleanArchitecture.Domain/Commands/Tenants/DeleteTenant/DeleteTenantCommandValidation.cs @@ -9,7 +9,7 @@ public sealed class DeleteTenantCommandValidation : AbstractValidator cmd.AggregateId) diff --git a/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommand.cs b/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommand.cs index 3962e9b..cafbfef 100644 --- a/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommand.cs +++ b/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommand.cs @@ -5,14 +5,14 @@ namespace CleanArchitecture.Domain.Commands.Tenants.UpdateTenant; public sealed class UpdateTenantCommand : CommandBase { private static readonly UpdateTenantCommandValidation s_validation = new(); - - public string Name { get; } - + public UpdateTenantCommand(Guid tenantId, string name) : base(tenantId) { Name = name; } + public string Name { get; } + public override bool IsValid() { ValidationResult = s_validation.Validate(this); diff --git a/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommandHandler.cs b/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommandHandler.cs index 4ef9929..dc1e076 100644 --- a/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommandHandler.cs +++ b/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommandHandler.cs @@ -33,7 +33,7 @@ public sealed class UpdateTenantCommandHandler : CommandHandlerBase, { return; } - + if (_user.GetUserRole() != UserRole.Admin) { await NotifyAsync( @@ -57,9 +57,9 @@ public sealed class UpdateTenantCommandHandler : CommandHandlerBase, return; } - + tenant.SetName(request.Name); - + if (await CommitAsync()) { await Bus.RaiseEventAsync(new TenantUpdatedEvent( diff --git a/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommandValidation.cs b/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommandValidation.cs index 905e638..c9abd29 100644 --- a/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommandValidation.cs +++ b/CleanArchitecture.Domain/Commands/Tenants/UpdateTenant/UpdateTenantCommandValidation.cs @@ -11,7 +11,7 @@ public sealed class UpdateTenantCommandValidation : AbstractValidator cmd.AggregateId) @@ -19,7 +19,7 @@ public sealed class UpdateTenantCommandValidation : AbstractValidator cmd.Name) diff --git a/CleanArchitecture.Domain/Commands/Users/CreateUser/CreateUserCommandHandler.cs b/CleanArchitecture.Domain/Commands/Users/CreateUser/CreateUserCommandHandler.cs index 4407656..8eb5388 100644 --- a/CleanArchitecture.Domain/Commands/Users/CreateUser/CreateUserCommandHandler.cs +++ b/CleanArchitecture.Domain/Commands/Users/CreateUser/CreateUserCommandHandler.cs @@ -15,9 +15,9 @@ namespace CleanArchitecture.Domain.Commands.Users.CreateUser; public sealed class CreateUserCommandHandler : CommandHandlerBase, IRequestHandler { - private readonly IUserRepository _userRepository; private readonly ITenantRepository _tenantRepository; private readonly IUser _user; + private readonly IUserRepository _userRepository; public CreateUserCommandHandler( IMediatorHandler bus, @@ -38,9 +38,9 @@ public sealed class CreateUserCommandHandler : CommandHandlerBase, { return; } - + var currentUser = await _userRepository.GetByIdAsync(_user.GetUserId()); - + if (currentUser is null || currentUser.Role != UserRole.Admin) { await NotifyAsync( diff --git a/CleanArchitecture.Domain/Commands/Users/UpdateUser/UpdateUserCommandHandler.cs b/CleanArchitecture.Domain/Commands/Users/UpdateUser/UpdateUserCommandHandler.cs index eeda6e8..74b86fc 100644 --- a/CleanArchitecture.Domain/Commands/Users/UpdateUser/UpdateUserCommandHandler.cs +++ b/CleanArchitecture.Domain/Commands/Users/UpdateUser/UpdateUserCommandHandler.cs @@ -75,7 +75,7 @@ public sealed class UpdateUserCommandHandler : CommandHandlerBase, if (_user.GetUserRole() == UserRole.Admin) { user.SetRole(request.Role); - + // Todo: Test // Todo: Check if tenant exists first user.SetTenant(request.TenantId); diff --git a/CleanArchitecture.Domain/Commands/Users/UpdateUser/UpdateUserCommandValidation.cs b/CleanArchitecture.Domain/Commands/Users/UpdateUser/UpdateUserCommandValidation.cs index d5f9301..9380fb2 100644 --- a/CleanArchitecture.Domain/Commands/Users/UpdateUser/UpdateUserCommandValidation.cs +++ b/CleanArchitecture.Domain/Commands/Users/UpdateUser/UpdateUserCommandValidation.cs @@ -23,7 +23,7 @@ public sealed class UpdateUserCommandValidation : AbstractValidator cmd.TenantId) diff --git a/CleanArchitecture.Domain/DomainEvents/Message.cs b/CleanArchitecture.Domain/DomainEvents/Message.cs index 606c259..58622a3 100644 --- a/CleanArchitecture.Domain/DomainEvents/Message.cs +++ b/CleanArchitecture.Domain/DomainEvents/Message.cs @@ -19,4 +19,4 @@ public abstract class Message : IRequest public Guid AggregateId { get; private set; } public string MessageType { get; protected set; } -} +} \ No newline at end of file diff --git a/CleanArchitecture.Domain/DomainEvents/StoredDomainEvent.cs b/CleanArchitecture.Domain/DomainEvents/StoredDomainEvent.cs index 1074410..895bc9c 100644 --- a/CleanArchitecture.Domain/DomainEvents/StoredDomainEvent.cs +++ b/CleanArchitecture.Domain/DomainEvents/StoredDomainEvent.cs @@ -4,11 +4,6 @@ namespace CleanArchitecture.Domain.DomainEvents; public class StoredDomainEvent : DomainEvent { - public Guid Id { get; private set; } - public string Data { get; private set; } = string.Empty; - public string User { get; private set; } = string.Empty; - public string CorrelationId { get; private set; } = string.Empty; - public StoredDomainEvent( DomainEvent domainEvent, string data, @@ -24,5 +19,11 @@ public class StoredDomainEvent : DomainEvent // EF Constructor protected StoredDomainEvent() : base(Guid.NewGuid()) - { } -} + { + } + + public Guid Id { get; private set; } + public string Data { get; private set; } = string.Empty; + public string User { get; private set; } = string.Empty; + public string CorrelationId { get; private set; } = string.Empty; +} \ No newline at end of file diff --git a/CleanArchitecture.Domain/DomainNotifications/StoredDomainNotification.cs b/CleanArchitecture.Domain/DomainNotifications/StoredDomainNotification.cs index 3a6199c..b3fc594 100644 --- a/CleanArchitecture.Domain/DomainNotifications/StoredDomainNotification.cs +++ b/CleanArchitecture.Domain/DomainNotifications/StoredDomainNotification.cs @@ -5,21 +5,16 @@ namespace CleanArchitecture.Domain.DomainNotifications; public class StoredDomainNotification : DomainNotification { - public Guid Id { get; private set; } - public string SerializedData { get; private set; } = string.Empty; - public string User { get; private set; } = string.Empty; - public string CorrelationId { get; private set; } = string.Empty; - public StoredDomainNotification( DomainNotification domainNotification, string data, string user, string correlationId) : base( - domainNotification.Key, - domainNotification.Value, - domainNotification.Code, - null, - domainNotification.AggregateId) + domainNotification.Key, + domainNotification.Value, + domainNotification.Code, + null, + domainNotification.AggregateId) { Id = Guid.NewGuid(); User = user; @@ -31,5 +26,11 @@ public class StoredDomainNotification : DomainNotification // EF Constructor protected StoredDomainNotification() : base(string.Empty, string.Empty, string.Empty) - { } -} + { + } + + public Guid Id { get; private set; } + public string SerializedData { get; private set; } = string.Empty; + public string User { get; private set; } = string.Empty; + public string CorrelationId { get; private set; } = string.Empty; +} \ No newline at end of file diff --git a/CleanArchitecture.Domain/Entities/Tenant.cs b/CleanArchitecture.Domain/Entities/Tenant.cs index 39cefb6..74b97fd 100644 --- a/CleanArchitecture.Domain/Entities/Tenant.cs +++ b/CleanArchitecture.Domain/Entities/Tenant.cs @@ -5,17 +5,17 @@ namespace CleanArchitecture.Domain.Entities; public class Tenant : Entity { - public string Name { get; private set; } - - public virtual ICollection Users { get; private set; } = new HashSet(); - public Tenant( Guid id, string name) : base(id) { Name = name; } - + + public string Name { get; private set; } + + public virtual ICollection Users { get; private set; } = new HashSet(); + public void SetName(string name) { Name = name; diff --git a/CleanArchitecture.Domain/Entities/User.cs b/CleanArchitecture.Domain/Entities/User.cs index 56131d8..c897574 100644 --- a/CleanArchitecture.Domain/Entities/User.cs +++ b/CleanArchitecture.Domain/Entities/User.cs @@ -1,22 +1,10 @@ using System; -using System.Diagnostics.CodeAnalysis; using CleanArchitecture.Domain.Enums; namespace CleanArchitecture.Domain.Entities; public class User : Entity { - public string Email { get; private set; } - public string FirstName { get; private set; } - public string LastName { get; private set; } - public string Password { get; private set; } - public UserRole Role { get; private set; } - - public string FullName => $"{FirstName}, {LastName}"; - - public Guid TenantId { get; private set; } - public virtual Tenant Tenant { get; private set; } = null!; - public User( Guid id, Guid tenantId, @@ -34,6 +22,17 @@ public class User : Entity Role = role; } + public string Email { get; private set; } + public string FirstName { get; private set; } + public string LastName { get; private set; } + public string Password { get; private set; } + public UserRole Role { get; private set; } + + public string FullName => $"{FirstName}, {LastName}"; + + public Guid TenantId { get; private set; } + public virtual Tenant Tenant { get; private set; } = null!; + public void SetEmail(string email) { Email = email; @@ -58,7 +57,7 @@ public class User : Entity { Role = role; } - + public void SetTenant(Guid tenantId) { TenantId = tenantId; diff --git a/CleanArchitecture.Domain/Events/Tenant/TenantCreatedEvent.cs b/CleanArchitecture.Domain/Events/Tenant/TenantCreatedEvent.cs index b79f34e..fcdca66 100644 --- a/CleanArchitecture.Domain/Events/Tenant/TenantCreatedEvent.cs +++ b/CleanArchitecture.Domain/Events/Tenant/TenantCreatedEvent.cs @@ -5,10 +5,10 @@ namespace CleanArchitecture.Domain.Events.Tenant; public sealed class TenantCreatedEvent : DomainEvent { - public string Name { get; set; } - public TenantCreatedEvent(Guid tenantId, string name) : base(tenantId) { Name = name; } + + public string Name { get; set; } } \ No newline at end of file diff --git a/CleanArchitecture.Domain/Events/Tenant/TenantUpdatedEvent.cs b/CleanArchitecture.Domain/Events/Tenant/TenantUpdatedEvent.cs index 00b66b3..0c099d2 100644 --- a/CleanArchitecture.Domain/Events/Tenant/TenantUpdatedEvent.cs +++ b/CleanArchitecture.Domain/Events/Tenant/TenantUpdatedEvent.cs @@ -5,10 +5,10 @@ namespace CleanArchitecture.Domain.Events.Tenant; public sealed class TenantUpdatedEvent : DomainEvent { - public string Name { get; set; } - public TenantUpdatedEvent(Guid tenantId, string name) : base(tenantId) { Name = name; } + + public string Name { get; set; } } \ No newline at end of file diff --git a/CleanArchitecture.Domain/Extensions/ServiceCollectionExtension.cs b/CleanArchitecture.Domain/Extensions/ServiceCollectionExtension.cs index a82ac0a..eddd6e7 100644 --- a/CleanArchitecture.Domain/Extensions/ServiceCollectionExtension.cs +++ b/CleanArchitecture.Domain/Extensions/ServiceCollectionExtension.cs @@ -41,7 +41,7 @@ public static class ServiceCollectionExtension services.AddScoped, UserEventHandler>(); services.AddScoped, UserEventHandler>(); services.AddScoped, UserEventHandler>(); - + // Tenant services.AddScoped, TenantEventHandler>(); services.AddScoped, TenantEventHandler>(); diff --git a/CleanArchitecture.Infrastructure.Tests/CleanArchitecture.Infrastructure.Tests.csproj b/CleanArchitecture.Infrastructure.Tests/CleanArchitecture.Infrastructure.Tests.csproj index 41e3ba7..940558b 100644 --- a/CleanArchitecture.Infrastructure.Tests/CleanArchitecture.Infrastructure.Tests.csproj +++ b/CleanArchitecture.Infrastructure.Tests/CleanArchitecture.Infrastructure.Tests.csproj @@ -8,10 +8,10 @@ - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -23,7 +23,7 @@ - + diff --git a/CleanArchitecture.Infrastructure/CleanArchitecture.Infrastructure.csproj b/CleanArchitecture.Infrastructure/CleanArchitecture.Infrastructure.csproj index 1df52f3..4aab3e5 100644 --- a/CleanArchitecture.Infrastructure/CleanArchitecture.Infrastructure.csproj +++ b/CleanArchitecture.Infrastructure/CleanArchitecture.Infrastructure.csproj @@ -6,19 +6,19 @@ - + - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/CleanArchitecture.Infrastructure/Configurations/EventSourcing/StoredDomainEventConfiguration.cs b/CleanArchitecture.Infrastructure/Configurations/EventSourcing/StoredDomainEventConfiguration.cs index 05091d5..4347992 100644 --- a/CleanArchitecture.Infrastructure/Configurations/EventSourcing/StoredDomainEventConfiguration.cs +++ b/CleanArchitecture.Infrastructure/Configurations/EventSourcing/StoredDomainEventConfiguration.cs @@ -22,4 +22,4 @@ public sealed class StoredDomainEventConfiguration : IEntityTypeConfiguration c.SerializedData) .HasColumnName("Data"); } -} +} \ No newline at end of file diff --git a/CleanArchitecture.Infrastructure/Configurations/UserConfiguration.cs b/CleanArchitecture.Infrastructure/Configurations/UserConfiguration.cs index abe3cef..08642b0 100644 --- a/CleanArchitecture.Infrastructure/Configurations/UserConfiguration.cs +++ b/CleanArchitecture.Infrastructure/Configurations/UserConfiguration.cs @@ -1,4 +1,3 @@ -using System; using CleanArchitecture.Domain.Constants; using CleanArchitecture.Domain.Entities; using CleanArchitecture.Domain.Enums; diff --git a/CleanArchitecture.Infrastructure/Database/EventStoreDbContext.cs b/CleanArchitecture.Infrastructure/Database/EventStoreDbContext.cs index fb6a4b3..e7e7c65 100644 --- a/CleanArchitecture.Infrastructure/Database/EventStoreDbContext.cs +++ b/CleanArchitecture.Infrastructure/Database/EventStoreDbContext.cs @@ -18,4 +18,4 @@ public class EventStoreDbContext : DbContext base.OnModelCreating(modelBuilder); } -} +} \ No newline at end of file diff --git a/CleanArchitecture.Infrastructure/EventSourcing/EventStore.cs b/CleanArchitecture.Infrastructure/EventSourcing/EventStore.cs index 9231524..361156d 100644 --- a/CleanArchitecture.Infrastructure/EventSourcing/EventStore.cs +++ b/CleanArchitecture.Infrastructure/EventSourcing/EventStore.cs @@ -9,9 +9,9 @@ namespace CleanArchitecture.Infrastructure.EventSourcing; public sealed class DomainEventStore : IDomainEventStore { - private readonly EventStoreDbContext _eventStoreDbContext; - private readonly DomainNotificationStoreDbContext _domainNotificationStoreDbContext; private readonly IEventStoreContext _context; + private readonly DomainNotificationStoreDbContext _domainNotificationStoreDbContext; + private readonly EventStoreDbContext _eventStoreDbContext; public DomainEventStore( EventStoreDbContext eventStoreDbContext, @@ -53,4 +53,4 @@ public sealed class DomainEventStore : IDomainEventStore break; } } -} +} \ No newline at end of file diff --git a/CleanArchitecture.Infrastructure/EventSourcing/EventStoreContext.cs b/CleanArchitecture.Infrastructure/EventSourcing/EventStoreContext.cs index b28104b..f4610b4 100644 --- a/CleanArchitecture.Infrastructure/EventSourcing/EventStoreContext.cs +++ b/CleanArchitecture.Infrastructure/EventSourcing/EventStoreContext.cs @@ -14,7 +14,8 @@ public sealed class EventStoreContext : IEventStoreContext _user = user; if (httpContextAccessor?.HttpContext is null || - !httpContextAccessor.HttpContext.Request.Headers.TryGetValue("X-CLEAN-ARCHITECTURE-CORRELATION-ID", out var id)) + !httpContextAccessor.HttpContext.Request.Headers.TryGetValue("X-CLEAN-ARCHITECTURE-CORRELATION-ID", + out var id)) { _correlationId = $"internal - {Guid.NewGuid()}"; } @@ -24,7 +25,13 @@ public sealed class EventStoreContext : IEventStoreContext } } - public string GetCorrelationId() => _correlationId; + public string GetCorrelationId() + { + return _correlationId; + } - public string GetUserEmail() => _user?.GetUserEmail() ?? string.Empty; -} + public string GetUserEmail() + { + return _user?.GetUserEmail() ?? string.Empty; + } +} \ No newline at end of file diff --git a/CleanArchitecture.Infrastructure/EventSourcing/IEventStoreContext.cs b/CleanArchitecture.Infrastructure/EventSourcing/IEventStoreContext.cs index ab493f9..9bd64ca 100644 --- a/CleanArchitecture.Infrastructure/EventSourcing/IEventStoreContext.cs +++ b/CleanArchitecture.Infrastructure/EventSourcing/IEventStoreContext.cs @@ -4,4 +4,4 @@ public interface IEventStoreContext { public string GetUserEmail(); public string GetCorrelationId(); -} +} \ No newline at end of file diff --git a/CleanArchitecture.Infrastructure/Extensions/ServiceCollectionExtensions.cs b/CleanArchitecture.Infrastructure/Extensions/ServiceCollectionExtensions.cs index aec00dd..ad8ebac 100644 --- a/CleanArchitecture.Infrastructure/Extensions/ServiceCollectionExtensions.cs +++ b/CleanArchitecture.Infrastructure/Extensions/ServiceCollectionExtensions.cs @@ -16,18 +16,18 @@ public static class ServiceCollectionExtensions { public static IServiceCollection AddInfrastructure( this IServiceCollection services, - IConfiguration configuration, - string migrationsAssemblyName, - string connectionStringName = "DefaultConnection") + IConfiguration configuration, + string migrationsAssemblyName, + string connectionStringName = "DefaultConnection") { // Add event store db context services.AddDbContext( - options => - { - options.UseSqlServer( - configuration.GetConnectionString(connectionStringName), - b => b.MigrationsAssembly(migrationsAssemblyName)); - }); + options => + { + options.UseSqlServer( + configuration.GetConnectionString(connectionStringName), + b => b.MigrationsAssembly(migrationsAssemblyName)); + }); services.AddDbContext( options => diff --git a/CleanArchitecture.Infrastructure/GlobalSuppressions.cs b/CleanArchitecture.Infrastructure/GlobalSuppressions.cs index e510236..d7915ca 100644 --- a/CleanArchitecture.Infrastructure/GlobalSuppressions.cs +++ b/CleanArchitecture.Infrastructure/GlobalSuppressions.cs @@ -5,6 +5,12 @@ using System.Diagnostics.CodeAnalysis; -[assembly: SuppressMessage("Style", "IDE0161:Convert to file-scoped namespace", Justification = "", Scope = "namespace", Target = "~N:CleanArchitecture.Infrastructure.Migrations")] -[assembly: SuppressMessage("Style", "IDE0161:Convert to file-scoped namespace", Justification = "", Scope = "namespace", Target = "~N:CleanArchitecture.Infrastructure.Migrations.EventStoreDb")] -[assembly: SuppressMessage("Style", "IDE0161:Convert to file-scoped namespace", Justification = "", Scope = "namespace", Target = "~N:CleanArchitecture.Infrastructure.Migrations.DomainNotificationStoreDb")] +[assembly: + SuppressMessage("Style", "IDE0161:Convert to file-scoped namespace", Justification = "", + Scope = "namespace", Target = "~N:CleanArchitecture.Infrastructure.Migrations")] +[assembly: + SuppressMessage("Style", "IDE0161:Convert to file-scoped namespace", Justification = "", + Scope = "namespace", Target = "~N:CleanArchitecture.Infrastructure.Migrations.EventStoreDb")] +[assembly: + SuppressMessage("Style", "IDE0161:Convert to file-scoped namespace", Justification = "", + Scope = "namespace", Target = "~N:CleanArchitecture.Infrastructure.Migrations.DomainNotificationStoreDb")] \ No newline at end of file diff --git a/CleanArchitecture.Infrastructure/InMemoryBus.cs b/CleanArchitecture.Infrastructure/InMemoryBus.cs index 0da1dae..703cbb2 100644 --- a/CleanArchitecture.Infrastructure/InMemoryBus.cs +++ b/CleanArchitecture.Infrastructure/InMemoryBus.cs @@ -8,8 +8,8 @@ namespace CleanArchitecture.Infrastructure; public sealed class InMemoryBus : IMediatorHandler { - private readonly IMediator _mediator; private readonly IDomainEventStore _domainEventStore; + private readonly IMediator _mediator; public InMemoryBus( IMediator mediator, diff --git a/CleanArchitecture.Infrastructure/Migrations/DomainNotificationStoreDb/20230701135523_AddDomainNotificationStore.cs b/CleanArchitecture.Infrastructure/Migrations/DomainNotificationStoreDb/20230701135523_AddDomainNotificationStore.cs index bb09c31..f582c38 100644 --- a/CleanArchitecture.Infrastructure/Migrations/DomainNotificationStoreDb/20230701135523_AddDomainNotificationStore.cs +++ b/CleanArchitecture.Infrastructure/Migrations/DomainNotificationStoreDb/20230701135523_AddDomainNotificationStore.cs @@ -1,43 +1,39 @@ -using System; +#nullable disable + +using System; using Microsoft.EntityFrameworkCore.Migrations; -#nullable disable +namespace CleanArchitecture.Infrastructure.Migrations.DomainNotificationStoreDb; -namespace CleanArchitecture.Infrastructure.Migrations.DomainNotificationStoreDb +/// +public partial class AddDomainNotificationStore : Migration { /// - public partial class AddDomainNotificationStore : Migration + protected override void Up(MigrationBuilder migrationBuilder) { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "StoredDomainNotifications", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Data = table.Column(type: "nvarchar(max)", nullable: false), - User = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), - CorrelationId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), - AggregateId = table.Column(type: "uniqueidentifier", nullable: false), - MessageType = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), - Timestamp = table.Column(type: "datetime2", nullable: false), - Key = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), - Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false), - Code = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), - Version = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_StoredDomainNotifications", x => x.Id); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "StoredDomainNotifications"); - } + migrationBuilder.CreateTable( + "StoredDomainNotifications", + table => new + { + Id = table.Column("uniqueidentifier", nullable: false), + Data = table.Column("nvarchar(max)", nullable: false), + User = table.Column("nvarchar(100)", maxLength: 100, nullable: false), + CorrelationId = table.Column("nvarchar(100)", maxLength: 100, nullable: false), + AggregateId = table.Column("uniqueidentifier", nullable: false), + MessageType = table.Column("nvarchar(100)", maxLength: 100, nullable: false), + Timestamp = table.Column("datetime2", nullable: false), + Key = table.Column("nvarchar(100)", maxLength: 100, nullable: false), + Value = table.Column("nvarchar(1024)", maxLength: 1024, nullable: false), + Code = table.Column("nvarchar(100)", maxLength: 100, nullable: false), + Version = table.Column("int", nullable: false) + }, + constraints: table => { table.PrimaryKey("PK_StoredDomainNotifications", x => x.Id); }); } -} + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + "StoredDomainNotifications"); + } +} \ No newline at end of file diff --git a/CleanArchitecture.Infrastructure/Migrations/EventStoreDb/20230701135441_AddEventStore.cs b/CleanArchitecture.Infrastructure/Migrations/EventStoreDb/20230701135441_AddEventStore.cs index b30585f..8a4c9c8 100644 --- a/CleanArchitecture.Infrastructure/Migrations/EventStoreDb/20230701135441_AddEventStore.cs +++ b/CleanArchitecture.Infrastructure/Migrations/EventStoreDb/20230701135441_AddEventStore.cs @@ -1,39 +1,35 @@ -using System; +#nullable disable + +using System; using Microsoft.EntityFrameworkCore.Migrations; -#nullable disable +namespace CleanArchitecture.Infrastructure.Migrations.EventStoreDb; -namespace CleanArchitecture.Infrastructure.Migrations.EventStoreDb +/// +public partial class AddEventStore : Migration { /// - public partial class AddEventStore : Migration + protected override void Up(MigrationBuilder migrationBuilder) { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "StoredDomainEvents", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Data = table.Column(type: "nvarchar(max)", nullable: false), - User = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), - CorrelationId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), - AggregateId = table.Column(type: "uniqueidentifier", nullable: false), - Action = table.Column(type: "varchar(100)", nullable: false), - CreationDate = table.Column(type: "datetime2", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_StoredDomainEvents", x => x.Id); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "StoredDomainEvents"); - } + migrationBuilder.CreateTable( + "StoredDomainEvents", + table => new + { + Id = table.Column("uniqueidentifier", nullable: false), + Data = table.Column("nvarchar(max)", nullable: false), + User = table.Column("nvarchar(100)", maxLength: 100, nullable: false), + CorrelationId = table.Column("nvarchar(100)", maxLength: 100, nullable: false), + AggregateId = table.Column("uniqueidentifier", nullable: false), + Action = table.Column("varchar(100)", nullable: false), + CreationDate = table.Column("datetime2", nullable: false) + }, + constraints: table => { table.PrimaryKey("PK_StoredDomainEvents", x => x.Id); }); } -} + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + "StoredDomainEvents"); + } +} \ No newline at end of file diff --git a/CleanArchitecture.Infrastructure/Repositories/BaseRepository.cs b/CleanArchitecture.Infrastructure/Repositories/BaseRepository.cs index 4be4db9..88b7349 100644 --- a/CleanArchitecture.Infrastructure/Repositories/BaseRepository.cs +++ b/CleanArchitecture.Infrastructure/Repositories/BaseRepository.cs @@ -72,7 +72,7 @@ public class BaseRepository : IRepository where TEntity : Enti DbSet.Update(entity); } } - + public void RemoveRange(IEnumerable entities, bool hardDelete = false) { if (hardDelete) diff --git a/CleanArchitecture.IntegrationTests/CleanArchitecture.IntegrationTests.csproj b/CleanArchitecture.IntegrationTests/CleanArchitecture.IntegrationTests.csproj index d008535..3aa4f40 100644 --- a/CleanArchitecture.IntegrationTests/CleanArchitecture.IntegrationTests.csproj +++ b/CleanArchitecture.IntegrationTests/CleanArchitecture.IntegrationTests.csproj @@ -8,14 +8,14 @@ - - - - - - - - + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -27,8 +27,8 @@ - - + + diff --git a/CleanArchitecture.IntegrationTests/Controller/TenantControllerTests.cs b/CleanArchitecture.IntegrationTests/Controller/TenantControllerTests.cs index a3d60e5..2f9dd8a 100644 --- a/CleanArchitecture.IntegrationTests/Controller/TenantControllerTests.cs +++ b/CleanArchitecture.IntegrationTests/Controller/TenantControllerTests.cs @@ -30,17 +30,17 @@ public sealed class TenantControllerTests : IClassFixture await _fixture.AuthenticateUserAsync(); var response = await _fixture.ServerClient.GetAsync($"/api/v1/Tenant/{_fixture.CreatedTenantId}"); - + response.StatusCode.Should().Be(HttpStatusCode.OK); - + var message = await response.Content.ReadAsJsonAsync(); - + message?.Data.Should().NotBeNull(); - + message!.Data!.Id.Should().Be(_fixture.CreatedTenantId); message.Data.Name.Should().Be("Test Tenant"); } - + [Fact] [Priority(5)] public async Task Should_Get_All_Tenants() @@ -48,89 +48,89 @@ public sealed class TenantControllerTests : IClassFixture await _fixture.AuthenticateUserAsync(); var response = await _fixture.ServerClient.GetAsync("api/v1/Tenant"); - + response.StatusCode.Should().Be(HttpStatusCode.OK); - + var message = await response.Content.ReadAsJsonAsync>(); - + message?.Data.Should().NotBeEmpty(); message!.Data.Should().HaveCountGreaterOrEqualTo(2); message.Data! .FirstOrDefault(x => x.Id == _fixture.CreatedTenantId) .Should().NotBeNull(); } - + [Fact] [Priority(10)] public async Task Should_Create_Tenant() { await _fixture.AuthenticateUserAsync(); - + var request = new CreateTenantViewModel("Test Tenant 2"); - + var response = await _fixture.ServerClient.PostAsJsonAsync("/api/v1/Tenant", request); - + response.StatusCode.Should().Be(HttpStatusCode.OK); - + var message = await response.Content.ReadAsJsonAsync(); var tenantId = message?.Data; - + // Check if tenant exists var tenantResponse = await _fixture.ServerClient.GetAsync($"/api/v1/Tenant/{tenantId}"); - + tenantResponse.StatusCode.Should().Be(HttpStatusCode.OK); var tenantMessage = await tenantResponse.Content.ReadAsJsonAsync(); - + tenantMessage?.Data.Should().NotBeNull(); - + tenantMessage!.Data!.Id.Should().Be(tenantId!.Value); tenantMessage.Data.Name.Should().Be(request.Name); } - + [Fact] [Priority(15)] public async Task Should_Update_Tenant() { await _fixture.AuthenticateUserAsync(); - + var request = new UpdateTenantViewModel(_fixture.CreatedTenantId, "Test Tenant 3"); - + var response = await _fixture.ServerClient.PutAsJsonAsync("/api/v1/Tenant", request); - + response.StatusCode.Should().Be(HttpStatusCode.OK); - + var message = await response.Content.ReadAsJsonAsync(); - + message?.Data.Should().NotBeNull(); message!.Data.Should().BeEquivalentTo(request); - + // Check if tenant is updated var tenantResponse = await _fixture.ServerClient.GetAsync($"/api/v1/Tenant/{_fixture.CreatedTenantId}"); - + tenantResponse.StatusCode.Should().Be(HttpStatusCode.OK); - + var tenantMessage = await response.Content.ReadAsJsonAsync(); - + tenantMessage?.Data.Should().NotBeNull(); - + tenantMessage!.Data!.Id.Should().Be(_fixture.CreatedTenantId); tenantMessage.Data.Name.Should().Be(request.Name); } - + [Fact] [Priority(20)] public async Task Should_Delete_Tenant() { await _fixture.AuthenticateUserAsync(); - + var response = await _fixture.ServerClient.DeleteAsync($"/api/v1/Tenant/{_fixture.CreatedTenantId}"); - + response.StatusCode.Should().Be(HttpStatusCode.OK); - + // Check if tenant is deleted var tenantResponse = await _fixture.ServerClient.GetAsync($"/api/v1/Tenant/{_fixture.CreatedTenantId}"); - + tenantResponse.StatusCode.Should().Be(HttpStatusCode.NotFound); } } \ No newline at end of file diff --git a/CleanArchitecture.IntegrationTests/Controller/UserControllerTests.cs b/CleanArchitecture.IntegrationTests/Controller/UserControllerTests.cs index 4fd17ef..b3dd980 100644 --- a/CleanArchitecture.IntegrationTests/Controller/UserControllerTests.cs +++ b/CleanArchitecture.IntegrationTests/Controller/UserControllerTests.cs @@ -26,13 +26,13 @@ public sealed class UserControllerTests : IClassFixture } // Todo: Refactor tests to work alone - + [Fact] [Priority(0)] public async Task Should_Create_User() { await _fixture.AuthenticateUserAsync(); - + var user = new CreateUserViewModel( _fixture.CreatedUserEmail, "Test", @@ -237,7 +237,7 @@ public sealed class UserControllerTests : IClassFixture var content = message!.Data; content.Should().Be(_fixture.CreatedUserId); - + // Todo: Check if stuff is done } } \ No newline at end of file diff --git a/CleanArchitecture.IntegrationTests/Fixtures/TenantTestFixture.cs b/CleanArchitecture.IntegrationTests/Fixtures/TenantTestFixture.cs index 0ab2498..dffe6cc 100644 --- a/CleanArchitecture.IntegrationTests/Fixtures/TenantTestFixture.cs +++ b/CleanArchitecture.IntegrationTests/Fixtures/TenantTestFixture.cs @@ -7,7 +7,7 @@ namespace CleanArchitecture.IntegrationTests.Fixtures; public sealed class TenantTestFixture : TestFixtureBase { public Guid CreatedTenantId { get; } = Guid.NewGuid(); - + protected override void SeedTestData(ApplicationDbContext context) { context.Tenants.Add(new Tenant( diff --git a/CleanArchitecture.IntegrationTests/Fixtures/TestFixtureBase.cs b/CleanArchitecture.IntegrationTests/Fixtures/TestFixtureBase.cs index 80c2273..0be073f 100644 --- a/CleanArchitecture.IntegrationTests/Fixtures/TestFixtureBase.cs +++ b/CleanArchitecture.IntegrationTests/Fixtures/TestFixtureBase.cs @@ -1,5 +1,4 @@ using System; -using System.Net; using System.Net.Http; using System.Threading.Tasks; using CleanArchitecture.Application.ViewModels.Users; @@ -36,7 +35,7 @@ public class TestFixtureBase IServiceProvider scopedServices) { } - + // Todo: Fix auth public virtual async Task AuthenticateUserAsync() { diff --git a/CleanArchitecture.IntegrationTests/Fixtures/gRPC/GetTenantsByIdsTestFixture.cs b/CleanArchitecture.IntegrationTests/Fixtures/gRPC/GetTenantsByIdsTestFixture.cs index 5c9c3bd..b6f2672 100644 --- a/CleanArchitecture.IntegrationTests/Fixtures/gRPC/GetTenantsByIdsTestFixture.cs +++ b/CleanArchitecture.IntegrationTests/Fixtures/gRPC/GetTenantsByIdsTestFixture.cs @@ -7,9 +7,6 @@ namespace CleanArchitecture.IntegrationTests.Fixtures.gRPC; public sealed class GetTenantsByIdsTestFixture : TestFixtureBase { - public GrpcChannel GrpcChannel { get; } - public Guid CreatedTenantId { get; } = Guid.NewGuid(); - public GetTenantsByIdsTestFixture() { GrpcChannel = GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions @@ -18,6 +15,9 @@ public sealed class GetTenantsByIdsTestFixture : TestFixtureBase }); } + public GrpcChannel GrpcChannel { get; } + public Guid CreatedTenantId { get; } = Guid.NewGuid(); + protected override void SeedTestData(ApplicationDbContext context) { base.SeedTestData(context); @@ -30,7 +30,7 @@ public sealed class GetTenantsByIdsTestFixture : TestFixtureBase public Tenant CreateTenant() { - return new( + return new Tenant( CreatedTenantId, "Test Tenant"); } diff --git a/CleanArchitecture.IntegrationTests/Fixtures/gRPC/GetUsersByIdsTestFixture.cs b/CleanArchitecture.IntegrationTests/Fixtures/gRPC/GetUsersByIdsTestFixture.cs index 22ce59b..c39c29b 100644 --- a/CleanArchitecture.IntegrationTests/Fixtures/gRPC/GetUsersByIdsTestFixture.cs +++ b/CleanArchitecture.IntegrationTests/Fixtures/gRPC/GetUsersByIdsTestFixture.cs @@ -9,9 +9,6 @@ namespace CleanArchitecture.IntegrationTests.Fixtures.gRPC; public sealed class GetUsersByIdsTestFixture : TestFixtureBase { - public GrpcChannel GrpcChannel { get; } - public Guid CreatedUserId { get; } = Guid.NewGuid(); - public GetUsersByIdsTestFixture() { GrpcChannel = GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions @@ -20,6 +17,9 @@ public sealed class GetUsersByIdsTestFixture : TestFixtureBase }); } + public GrpcChannel GrpcChannel { get; } + public Guid CreatedUserId { get; } = Guid.NewGuid(); + protected override void SeedTestData(ApplicationDbContext context) { base.SeedTestData(context); diff --git a/CleanArchitecture.IntegrationTests/Infrastructure/CleanArchitectureWebApplicationFactory.cs b/CleanArchitecture.IntegrationTests/Infrastructure/CleanArchitectureWebApplicationFactory.cs index 63578e2..9a52c4d 100644 --- a/CleanArchitecture.IntegrationTests/Infrastructure/CleanArchitectureWebApplicationFactory.cs +++ b/CleanArchitecture.IntegrationTests/Infrastructure/CleanArchitectureWebApplicationFactory.cs @@ -47,19 +47,19 @@ public sealed class CleanArchitectureWebApplicationFactory : WebApplicationFacto services.SetupTestDatabase(_connection); services.SetupTestDatabase(_connection); - ServiceProvider sp = services.BuildServiceProvider(); + var sp = services.BuildServiceProvider(); - using IServiceScope scope = sp.CreateScope(); - IServiceProvider scopedServices = scope.ServiceProvider; + using var scope = sp.CreateScope(); + var scopedServices = scope.ServiceProvider; - ApplicationDbContext applicationDbContext = scopedServices.GetRequiredService(); - EventStoreDbContext storeDbContext = scopedServices.GetRequiredService(); - DomainNotificationStoreDbContext domainStoreDbContext = scopedServices.GetRequiredService(); + var applicationDbContext = scopedServices.GetRequiredService(); + var storeDbContext = scopedServices.GetRequiredService(); + var domainStoreDbContext = scopedServices.GetRequiredService(); applicationDbContext.EnsureMigrationsApplied(); var creator2 = (RelationalDatabaseCreator)storeDbContext.Database - .GetService(); + .GetService(); creator2.CreateTables(); var creator3 = (RelationalDatabaseCreator)domainStoreDbContext diff --git a/CleanArchitecture.IntegrationTests/gRPC/GetTenantsByIdsTests.cs b/CleanArchitecture.IntegrationTests/gRPC/GetTenantsByIdsTests.cs index 5c939a3..d6c2e8b 100644 --- a/CleanArchitecture.IntegrationTests/gRPC/GetTenantsByIdsTests.cs +++ b/CleanArchitecture.IntegrationTests/gRPC/GetTenantsByIdsTests.cs @@ -26,9 +26,9 @@ public sealed class GetTenantsByIdsTests : IClassFixture - - - - + + + + - - - + + + diff --git a/CleanArchitecture.Shared/CleanArchitecture.Shared.csproj b/CleanArchitecture.Shared/CleanArchitecture.Shared.csproj index 882f5b9..7547394 100644 --- a/CleanArchitecture.Shared/CleanArchitecture.Shared.csproj +++ b/CleanArchitecture.Shared/CleanArchitecture.Shared.csproj @@ -1,9 +1,9 @@ - - net7.0 - enable - + + net7.0 + enable + diff --git a/CleanArchitecture.Shared/Users/UserViewModel.cs b/CleanArchitecture.Shared/Users/UserViewModel.cs index c183ded..d08d316 100644 --- a/CleanArchitecture.Shared/Users/UserViewModel.cs +++ b/CleanArchitecture.Shared/Users/UserViewModel.cs @@ -7,4 +7,4 @@ public sealed record UserViewModel( string Email, string FirstName, string LastName, - bool IsDeleted); + bool IsDeleted); \ No newline at end of file diff --git a/CleanArchitecture.gRPC.Tests/CleanArchitecture.gRPC.Tests.csproj b/CleanArchitecture.gRPC.Tests/CleanArchitecture.gRPC.Tests.csproj index e4730d8..dfc5b4f 100644 --- a/CleanArchitecture.gRPC.Tests/CleanArchitecture.gRPC.Tests.csproj +++ b/CleanArchitecture.gRPC.Tests/CleanArchitecture.gRPC.Tests.csproj @@ -8,11 +8,11 @@ - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,9 +24,9 @@ - - - + + + diff --git a/CleanArchitecture.gRPC.Tests/Fixtures/TenantTestFixture.cs b/CleanArchitecture.gRPC.Tests/Fixtures/TenantTestFixture.cs index 4fb0177..3910cc2 100644 --- a/CleanArchitecture.gRPC.Tests/Fixtures/TenantTestFixture.cs +++ b/CleanArchitecture.gRPC.Tests/Fixtures/TenantTestFixture.cs @@ -10,24 +10,24 @@ namespace CleanArchitecture.gRPC.Tests.Fixtures; public sealed class TenantTestFixture { - public TenantsApiImplementation TenantsApiImplementation { get; } - private ITenantRepository TenantRepository { get; } - - public IEnumerable ExistingTenants { get; } - public TenantTestFixture() { TenantRepository = Substitute.For(); ExistingTenants = new List { - new Tenant(Guid.NewGuid(), "Tenant 1"), - new Tenant(Guid.NewGuid(), "Tenant 2"), - new Tenant(Guid.NewGuid(), "Tenant 3"), + new(Guid.NewGuid(), "Tenant 1"), + new(Guid.NewGuid(), "Tenant 2"), + new(Guid.NewGuid(), "Tenant 3") }; - + TenantRepository.GetAllNoTracking().Returns(ExistingTenants.BuildMock()); - - TenantsApiImplementation = new(TenantRepository); + + TenantsApiImplementation = new TenantsApiImplementation(TenantRepository); } + + public TenantsApiImplementation TenantsApiImplementation { get; } + private ITenantRepository TenantRepository { get; } + + public IEnumerable ExistingTenants { get; } } \ No newline at end of file diff --git a/CleanArchitecture.gRPC.Tests/Tenants/GetTenantsByIdsTests.cs b/CleanArchitecture.gRPC.Tests/Tenants/GetTenantsByIdsTests.cs index 5a60273..61e51f5 100644 --- a/CleanArchitecture.gRPC.Tests/Tenants/GetTenantsByIdsTests.cs +++ b/CleanArchitecture.gRPC.Tests/Tenants/GetTenantsByIdsTests.cs @@ -24,7 +24,7 @@ public sealed class GetTenantsByIdsTests : IClassFixture var result = await _fixture.TenantsApiImplementation.GetByIds( SetupRequest(Enumerable.Empty()), default!); - + result.Tenants.Should().HaveCount(0); } @@ -37,36 +37,36 @@ public sealed class GetTenantsByIdsTests : IClassFixture .Take(2) .Select(tenant => tenant.Id) .ToList(); - + ids.Add(nonExistingId); - + var result = await _fixture.TenantsApiImplementation.GetByIds( SetupRequest(ids), default!); - + result.Tenants.Should().HaveCount(2); foreach (var tenant in result.Tenants) { var tenantId = Guid.Parse(tenant.Id); - + tenantId.Should().NotBe(nonExistingId); - + var mockTenant = _fixture.ExistingTenants.First(t => t.Id == tenantId); - + mockTenant.Should().NotBeNull(); - + tenant.Name.Should().Be(mockTenant.Name); } } - + private static GetTenantsByIdsRequest SetupRequest(IEnumerable ids) { var request = new GetTenantsByIdsRequest(); - + request.Ids.AddRange(ids.Select(id => id.ToString())); request.Ids.Add("Not a guid"); - + return request; } } \ No newline at end of file diff --git a/CleanArchitecture.gRPC/CleanArchitecture.cs b/CleanArchitecture.gRPC/CleanArchitecture.cs index 8aa7853..3a54670 100644 --- a/CleanArchitecture.gRPC/CleanArchitecture.cs +++ b/CleanArchitecture.gRPC/CleanArchitecture.cs @@ -4,18 +4,15 @@ namespace CleanArchitecture.gRPC; public sealed class CleanArchitecture : ICleanArchitecture { - private readonly IUsersContext _users; - private readonly ITenantsContext _tenants; - - public IUsersContext Users => _users; - public ITenantsContext Tenants => _tenants; - public CleanArchitecture( IUsersContext users, ITenantsContext tenants) { - _users = users; - _tenants = tenants; - + Users = users; + Tenants = tenants; } -} + + public IUsersContext Users { get; } + + public ITenantsContext Tenants { get; } +} \ No newline at end of file diff --git a/CleanArchitecture.gRPC/CleanArchitecture.gRPC.csproj b/CleanArchitecture.gRPC/CleanArchitecture.gRPC.csproj index 1bec38c..068e549 100644 --- a/CleanArchitecture.gRPC/CleanArchitecture.gRPC.csproj +++ b/CleanArchitecture.gRPC/CleanArchitecture.gRPC.csproj @@ -6,9 +6,9 @@ - - - + + + diff --git a/CleanArchitecture.gRPC/Contexts/TenantsContext.cs b/CleanArchitecture.gRPC/Contexts/TenantsContext.cs index a8235ad..f6038e4 100644 --- a/CleanArchitecture.gRPC/Contexts/TenantsContext.cs +++ b/CleanArchitecture.gRPC/Contexts/TenantsContext.cs @@ -20,11 +20,11 @@ public sealed class TenantsContext : ITenantsContext public async Task> GetTenantsByIds(IEnumerable ids) { var request = new GetTenantsByIdsRequest(); - + request.Ids.AddRange(ids.Select(id => id.ToString())); - + var result = await _client.GetByIdsAsync(request); - + return result.Tenants.Select(tenant => new TenantViewModel( Guid.Parse(tenant.Id), tenant.Name)); diff --git a/CleanArchitecture.gRPC/Contexts/UsersContext.cs b/CleanArchitecture.gRPC/Contexts/UsersContext.cs index a00cbb7..a6b02d2 100644 --- a/CleanArchitecture.gRPC/Contexts/UsersContext.cs +++ b/CleanArchitecture.gRPC/Contexts/UsersContext.cs @@ -32,4 +32,4 @@ public sealed class UsersContext : IUsersContext user.LastName, user.IsDeleted)); } -} +} \ No newline at end of file diff --git a/CleanArchitecture.gRPC/Extensions/ServiceCollectionExtensions.cs b/CleanArchitecture.gRPC/Extensions/ServiceCollectionExtensions.cs index 89a9084..114c410 100644 --- a/CleanArchitecture.gRPC/Extensions/ServiceCollectionExtensions.cs +++ b/CleanArchitecture.gRPC/Extensions/ServiceCollectionExtensions.cs @@ -53,7 +53,7 @@ public static class ServiceCollectionExtensions services.AddSingleton(); services.AddSingleton(); - + return services; } -} +} \ No newline at end of file diff --git a/CleanArchitecture.gRPC/ICleanArchitecture.cs b/CleanArchitecture.gRPC/ICleanArchitecture.cs index 9e04af9..9c92a1c 100644 --- a/CleanArchitecture.gRPC/ICleanArchitecture.cs +++ b/CleanArchitecture.gRPC/ICleanArchitecture.cs @@ -6,4 +6,4 @@ public interface ICleanArchitecture { IUsersContext Users { get; } ITenantsContext Tenants { get; } -} +} \ No newline at end of file diff --git a/CleanArchitecture.gRPC/Interfaces/IUsersContext.cs b/CleanArchitecture.gRPC/Interfaces/IUsersContext.cs index f1f2f04..c8b01f3 100644 --- a/CleanArchitecture.gRPC/Interfaces/IUsersContext.cs +++ b/CleanArchitecture.gRPC/Interfaces/IUsersContext.cs @@ -8,4 +8,4 @@ namespace CleanArchitecture.gRPC.Interfaces; public interface IUsersContext { Task> GetUsersByIds(IEnumerable ids); -} +} \ No newline at end of file diff --git a/CleanArchitecture.gRPC/Models/GRPCSettings.cs b/CleanArchitecture.gRPC/Models/GRPCSettings.cs index fd7a02c..e784168 100644 --- a/CleanArchitecture.gRPC/Models/GRPCSettings.cs +++ b/CleanArchitecture.gRPC/Models/GRPCSettings.cs @@ -3,4 +3,4 @@ public sealed class GRPCSettings { public string CleanArchitectureUrl { get; set; } = string.Empty; -} +} \ No newline at end of file