0
0
mirror of https://github.com/alex289/CleanArchitecture.git synced 2025-07-02 03:22:57 +00:00

feat: Remove deleted flag at the get by id endpoints

This commit is contained in:
Alexander Konietzko 2023-09-01 23:43:08 +02:00
parent b4020cf80e
commit 6d4b000bd0
No known key found for this signature in database
GPG Key ID: BA6905F37AEC2B5B
12 changed files with 20 additions and 43 deletions

View File

@ -42,11 +42,9 @@ public sealed class TenantController : ApiController
[HttpGet("{id:guid}")] [HttpGet("{id:guid}")]
[SwaggerOperation("Get a tenant by id")] [SwaggerOperation("Get a tenant by id")]
[SwaggerResponse(200, "Request successful", typeof(ResponseMessage<TenantViewModel>))] [SwaggerResponse(200, "Request successful", typeof(ResponseMessage<TenantViewModel>))]
public async Task<IActionResult> GetTenantByIdAsync( public async Task<IActionResult> GetTenantByIdAsync([FromRoute] Guid id)
[FromRoute] Guid id,
[FromQuery] bool isDeleted = false)
{ {
var tenant = await _tenantService.GetTenantByIdAsync(id, isDeleted); var tenant = await _tenantService.GetTenantByIdAsync(id);
return Response(tenant); return Response(tenant);
} }

View File

@ -42,11 +42,9 @@ public sealed class UserController : ApiController
[HttpGet("{id:guid}")] [HttpGet("{id:guid}")]
[SwaggerOperation("Get a user by id")] [SwaggerOperation("Get a user by id")]
[SwaggerResponse(200, "Request successful", typeof(ResponseMessage<UserViewModel>))] [SwaggerResponse(200, "Request successful", typeof(ResponseMessage<UserViewModel>))]
public async Task<IActionResult> GetUserByIdAsync( public async Task<IActionResult> GetUserByIdAsync([FromRoute] Guid id)
[FromRoute] Guid id,
[FromQuery] bool isDeleted = false)
{ {
var user = await _userService.GetUserByUserIdAsync(id, isDeleted); var user = await _userService.GetUserByUserIdAsync(id);
return Response(user); return Response(user);
} }

View File

@ -17,21 +17,7 @@ public sealed class GetTenantByIdQueryHandlerTests
var tenant = _fixture.SetupTenant(); var tenant = _fixture.SetupTenant();
var result = await _fixture.QueryHandler.Handle( var result = await _fixture.QueryHandler.Handle(
new GetTenantByIdQuery(tenant.Id, false), new GetTenantByIdQuery(tenant.Id),
default);
_fixture.VerifyNoDomainNotification();
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); default);
_fixture.VerifyNoDomainNotification(); _fixture.VerifyNoDomainNotification();
@ -45,7 +31,7 @@ public sealed class GetTenantByIdQueryHandlerTests
var tenant = _fixture.SetupTenant(true); var tenant = _fixture.SetupTenant(true);
var result = await _fixture.QueryHandler.Handle( var result = await _fixture.QueryHandler.Handle(
new GetTenantByIdQuery(tenant.Id, false), new GetTenantByIdQuery(tenant.Id),
default); default);
_fixture.VerifyExistingNotification( _fixture.VerifyExistingNotification(

View File

@ -18,7 +18,7 @@ public sealed class GetUserByIdQueryHandlerTests
_fixture.SetupUserAsync(); _fixture.SetupUserAsync();
var result = await _fixture.Handler.Handle( var result = await _fixture.Handler.Handle(
new GetUserByIdQuery(_fixture.ExistingUserId, false), new GetUserByIdQuery(_fixture.ExistingUserId),
default); default);
_fixture.VerifyNoDomainNotification(); _fixture.VerifyNoDomainNotification();
@ -32,7 +32,7 @@ public sealed class GetUserByIdQueryHandlerTests
{ {
_fixture.SetupUserAsync(); _fixture.SetupUserAsync();
var request = new GetUserByIdQuery(Guid.NewGuid(), false); var request = new GetUserByIdQuery(Guid.NewGuid());
var result = await _fixture.Handler.Handle( var result = await _fixture.Handler.Handle(
request, request,
default); default);
@ -51,7 +51,7 @@ public sealed class GetUserByIdQueryHandlerTests
_fixture.SetupDeletedUserAsync(); _fixture.SetupDeletedUserAsync();
var result = await _fixture.Handler.Handle( var result = await _fixture.Handler.Handle(
new GetUserByIdQuery(_fixture.ExistingUserId, false), new GetUserByIdQuery(_fixture.ExistingUserId),
default); default);
_fixture.VerifyExistingNotification( _fixture.VerifyExistingNotification(

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using CleanArchitecture.Application.ViewModels; using CleanArchitecture.Application.ViewModels;
using CleanArchitecture.Application.ViewModels.Tenants; using CleanArchitecture.Application.ViewModels.Tenants;
@ -11,6 +10,6 @@ public interface ITenantService
public Task<Guid> CreateTenantAsync(CreateTenantViewModel tenant); public Task<Guid> CreateTenantAsync(CreateTenantViewModel tenant);
public Task UpdateTenantAsync(UpdateTenantViewModel tenant); public Task UpdateTenantAsync(UpdateTenantViewModel tenant);
public Task DeleteTenantAsync(Guid tenantId); public Task DeleteTenantAsync(Guid tenantId);
public Task<TenantViewModel?> GetTenantByIdAsync(Guid tenantId, bool deleted); public Task<TenantViewModel?> GetTenantByIdAsync(Guid tenantId);
public Task<PagedResult<TenantViewModel>> GetAllTenantsAsync(PageQuery query, string searchTerm = ""); public Task<PagedResult<TenantViewModel>> GetAllTenantsAsync(PageQuery query, string searchTerm = "");
} }

View File

@ -8,7 +8,7 @@ namespace CleanArchitecture.Application.Interfaces;
public interface IUserService public interface IUserService
{ {
public Task<UserViewModel?> GetUserByUserIdAsync(Guid userId, bool isDeleted); public Task<UserViewModel?> GetUserByUserIdAsync(Guid userId);
public Task<UserViewModel?> GetCurrentUserAsync(); public Task<UserViewModel?> GetCurrentUserAsync();
public Task<PagedResult<UserViewModel>> GetAllUsersAsync(PageQuery query, string searchTerm = ""); public Task<PagedResult<UserViewModel>> GetAllUsersAsync(PageQuery query, string searchTerm = "");
public Task<Guid> CreateUserAsync(CreateUserViewModel user); public Task<Guid> CreateUserAsync(CreateUserViewModel user);

View File

@ -4,4 +4,4 @@ using MediatR;
namespace CleanArchitecture.Application.Queries.Tenants.GetTenantById; namespace CleanArchitecture.Application.Queries.Tenants.GetTenantById;
public sealed record GetTenantByIdQuery(Guid TenantId, bool IsDeleted) : IRequest<TenantViewModel?>; public sealed record GetTenantByIdQuery(Guid TenantId) : IRequest<TenantViewModel?>;

View File

@ -28,9 +28,7 @@ public sealed class GetTenantByIdQueryHandler :
var tenant = _tenantRepository var tenant = _tenantRepository
.GetAllNoTracking() .GetAllNoTracking()
.Include(x => x.Users) .Include(x => x.Users)
.FirstOrDefault(x => .FirstOrDefault(x => x.Id == request.TenantId && !x.Deleted);
x.Id == request.TenantId &&
x.Deleted == request.IsDeleted);
if (tenant is null) if (tenant is null)
{ {

View File

@ -4,4 +4,4 @@ using MediatR;
namespace CleanArchitecture.Application.Queries.Users.GetUserById; namespace CleanArchitecture.Application.Queries.Users.GetUserById;
public sealed record GetUserByIdQuery(Guid UserId, bool IsDeleted) : IRequest<UserViewModel?>; public sealed record GetUserByIdQuery(Guid UserId) : IRequest<UserViewModel?>;

View File

@ -26,9 +26,7 @@ public sealed class GetUserByIdQueryHandler :
{ {
var user = _userRepository var user = _userRepository
.GetAllNoTracking() .GetAllNoTracking()
.FirstOrDefault(x => .FirstOrDefault(x => x.Id == request.UserId && !x.Deleted);
x.Id == request.UserId &&
x.Deleted == request.IsDeleted);
if (user is null) if (user is null)
{ {

View File

@ -51,11 +51,11 @@ public sealed class TenantService : ITenantService
await _bus.SendCommandAsync(new DeleteTenantCommand(tenantId)); await _bus.SendCommandAsync(new DeleteTenantCommand(tenantId));
} }
public async Task<TenantViewModel?> GetTenantByIdAsync(Guid tenantId, bool deleted) public async Task<TenantViewModel?> GetTenantByIdAsync(Guid tenantId)
{ {
var cachedTenant = await _distributedCache.GetOrCreateJsonAsync( var cachedTenant = await _distributedCache.GetOrCreateJsonAsync(
CacheKeyGenerator.GetEntityCacheKey<Tenant>(tenantId), CacheKeyGenerator.GetEntityCacheKey<Tenant>(tenantId),
async () => await _bus.QueryAsync(new GetTenantByIdQuery(tenantId, deleted)), async () => await _bus.QueryAsync(new GetTenantByIdQuery(tenantId)),
new DistributedCacheEntryOptions new DistributedCacheEntryOptions
{ {
SlidingExpiration = TimeSpan.FromDays(3), SlidingExpiration = TimeSpan.FromDays(3),

View File

@ -26,14 +26,14 @@ public sealed class UserService : IUserService
_user = user; _user = user;
} }
public async Task<UserViewModel?> GetUserByUserIdAsync(Guid userId, bool isDeleted) public async Task<UserViewModel?> GetUserByUserIdAsync(Guid userId)
{ {
return await _bus.QueryAsync(new GetUserByIdQuery(userId, isDeleted)); return await _bus.QueryAsync(new GetUserByIdQuery(userId));
} }
public async Task<UserViewModel?> GetCurrentUserAsync() public async Task<UserViewModel?> GetCurrentUserAsync()
{ {
return await _bus.QueryAsync(new GetUserByIdQuery(_user.GetUserId(), false)); return await _bus.QueryAsync(new GetUserByIdQuery(_user.GetUserId()));
} }
public async Task<PagedResult<UserViewModel>> GetAllUsersAsync(PageQuery query, string searchTerm = "") public async Task<PagedResult<UserViewModel>> GetAllUsersAsync(PageQuery query, string searchTerm = "")