Skip to content

Commit

Permalink
Added GetAll
Browse files Browse the repository at this point in the history
  • Loading branch information
goodtocode committed Jul 9, 2023
1 parent 4eb6b97 commit 34f5e8d
Show file tree
Hide file tree
Showing 14 changed files with 107 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,27 @@

namespace Goodtocode.Subjects.Application;

public class GetBusinessQuery : IRequest<BusinessEntity>, IBusinessEntity
public class GetBusinessByKeyQuery : IRequest<BusinessEntity>
{
public Guid BusinessKey { get; set; }
public string BusinessName { get; set; } = string.Empty;
public string TaxNumber { get; set; } = string.Empty;
}

public class GetBusinessQueryHandler : IRequestHandler<GetBusinessQuery, BusinessEntity?>
public class GetBusinessByKeyQueryHandler : IRequestHandler<GetBusinessByKeyQuery, BusinessEntity?>
{
private readonly IMapper _mapper;
private readonly IBusinessRepo _userBusinessRepo;

public GetBusinessQueryHandler(IBusinessRepo userBusinessRepo, IMapper mapper)
public GetBusinessByKeyQueryHandler(IBusinessRepo userBusinessRepo, IMapper mapper)
{
_userBusinessRepo = userBusinessRepo;
_mapper = mapper;
}

public async Task<BusinessEntity?> Handle(GetBusinessQuery request,
public async Task<BusinessEntity?> Handle(GetBusinessByKeyQuery request,
CancellationToken cancellationToken)
{
var business =
await _userBusinessRepo.GetBusinessAsync(request.BusinessKey,
await _userBusinessRepo.GetBusinessByKeyAsync(request.BusinessKey,
cancellationToken);

return business.Match(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

namespace Goodtocode.Subjects.Application;

public class GetBusinessQueryValidator : AbstractValidator<GetBusinessQuery>
public class GetBusinessbyKeyQueryValidator : AbstractValidator<GetBusinessByKeyQuery>
{
public GetBusinessQueryValidator()
public GetBusinessbyKeyQueryValidator()
{
RuleFor(x => x.BusinessKey).NotEmpty();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Goodtocode.Common.Extensions;
using Goodtocode.Subjects.Domain;
using MediatR;

namespace Goodtocode.Subjects.Application;

public class GetBusinessesAllQuery : IRequest<PagedResult<BusinessEntity>>
{
public string BusinessName { get; set; } = string.Empty;
public int Page { get; set; } = 1;
public int Results { get; set; } = 20;
}

public class GetBusinessesAllQueryHandler : IRequestHandler<GetBusinessesAllQuery, PagedResult<BusinessEntity>>
{
private readonly IBusinessRepo _userBusinessesRepo;

public GetBusinessesAllQueryHandler(IBusinessRepo userBusinessesRepo)
{
_userBusinessesRepo = userBusinessesRepo;
}

public async Task<PagedResult<BusinessEntity>> Handle(GetBusinessesAllQuery request,
CancellationToken cancellationToken)
{
var businesses =
await _userBusinessesRepo.GetBusinessesAllAsync(request.BusinessName, request.Page, request.Results,
cancellationToken);

return businesses.GetValueOrDefault();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using FluentValidation;

namespace Goodtocode.Subjects.Application;

public class GetBusinessesAllQueryValidator : AbstractValidator<GetBusinessesAllQuery>
{
public GetBusinessesAllQueryValidator()
{
RuleFor(x => x.BusinessName).NotEmpty();
RuleFor(x => x.Results).GreaterThan(0);
RuleFor(x => x.Page).GreaterThan(0);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public class GetBusinessesByNameQuery : IRequest<PagedResult<BusinessEntity>>
{
public string BusinessName { get; set; } = string.Empty;
public int Page { get; set; } = 1;
public int Results { get; set; } = 20;
}

public class GetBusinessesByNameQueryHandler : IRequestHandler<GetBusinessesByNameQuery, PagedResult<BusinessEntity>>
Expand All @@ -23,7 +24,7 @@ public GetBusinessesByNameQueryHandler(IBusinessRepo userBusinessesRepo)
CancellationToken cancellationToken)
{
var businesses =
await _userBusinessesRepo.GetBusinessesByNameAsync(request.BusinessName, request.Page,
await _userBusinessesRepo.GetBusinessesByNameAsync(request.BusinessName, request.Page, request.Results,
cancellationToken);

return businesses.GetValueOrDefault();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,7 @@ public class GetBusinessesByNameQueryValidator : AbstractValidator<GetBusinesses
public GetBusinessesByNameQueryValidator()
{
RuleFor(x => x.BusinessName).NotEmpty();
RuleFor(x => x.Results).GreaterThan(0);
RuleFor(x => x.Page).GreaterThan(0);
}
}
7 changes: 5 additions & 2 deletions src/Subjects/Core.Application/Interfaces/IBusinessRepo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@ namespace Goodtocode.Subjects.Application;

public interface IBusinessRepo
{
Task<Result<BusinessEntity?>> GetBusinessAsync(Guid businessKey,
Task<Result<BusinessEntity?>> GetBusinessByKeyAsync(Guid businessKey,
CancellationToken cancellationToken);

Task<Result<PagedResult<BusinessEntity>>> GetBusinessesByNameAsync(string businessName, int page,
Task<Result<PagedResult<BusinessEntity>>> GetBusinessesAllAsync(string businessName, int page, int results,
CancellationToken cancellationToken);

Task<Result<PagedResult<BusinessEntity>>> GetBusinessesByNameAsync(string businessName, int page, int results,
CancellationToken cancellationToken);

Task<Result<BusinessEntity>> AddBusinessAsync(IBusinessObject businessInfo,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,13 @@ namespace Goodtocode.Subjects.Persistence.Repositories;
public class BusinessRepo : IBusinessRepo
{
private readonly ISubjectsDbContext _context;
private readonly int _pageSize = 20;

public BusinessRepo(ISubjectsDbContext context, int pageSize = 20)
public BusinessRepo(ISubjectsDbContext context)
{
_context = context;
_pageSize = pageSize;
}

public async Task<Result<BusinessEntity?>> GetBusinessAsync(Guid businessKey, CancellationToken cancellationToken)
public async Task<Result<BusinessEntity?>> GetBusinessByKeyAsync(Guid businessKey, CancellationToken cancellationToken)
{
var businessResult = await _context.Business.FindAsync(new object?[] { businessKey, cancellationToken }, cancellationToken: cancellationToken);
if (businessResult != null)
Expand All @@ -28,12 +26,20 @@ public BusinessRepo(ISubjectsDbContext context, int pageSize = 20)
return Result.Failure<BusinessEntity?>("Business not found.");
}

public async Task<Result<PagedResult<BusinessEntity>>> GetBusinessesByNameAsync(string businessName, int page, CancellationToken cancellationToken)
public async Task<Result<PagedResult<BusinessEntity>>> GetBusinessesAllAsync(string businessName, int page, int results, CancellationToken cancellationToken)
{
var businessResult = await _context.Business
.OrderBy(b => b.BusinessKey)
.GetPagedAsync(page, results, cancellationToken);
return Result.Success(businessResult);
}

public async Task<Result<PagedResult<BusinessEntity>>> GetBusinessesByNameAsync(string businessName, int page, int results, CancellationToken cancellationToken)
{
var businessResult = await _context.Business
.Where(b => b.BusinessName.Contains(businessName))
.OrderBy(b => b.BusinessKey)
.GetPagedAsync(page, _pageSize, cancellationToken);
.GetPagedAsync(page, results, cancellationToken);
return Result.Success(businessResult);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class BusinessController : BaseController
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<BusinessEntity> Get(Guid key)
{
return await Mediator.Send(new GetBusinessQuery
return await Mediator.Send(new GetBusinessByKeyQuery
{
BusinessKey = key
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,21 @@ public class BusinessesController : BaseController
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<PagedResult<BusinessEntity>> Get(string name, int pageNumber = 1, int pageSize = 20) => await Mediator.Send(new GetBusinessesByNameQuery
{
BusinessName = name
BusinessName = name,
Page = pageNumber,
});

/// <summary> Get Businesses by Name</summary>
/// <remarks>
/// Sample request:
/// "businessName": "My Business"
/// "api-version": 1
/// </remarks>
/// <returns>Collection of BusinessEntity</returns>
[HttpGet(Name = "GetBusinessesAllQuery")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<PagedResult<BusinessEntity>> Get(int pageNumber = 1, int pageSize = 20) => await Mediator.Send(new GetBusinessesAllQuery
{
});
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,19 @@ public void GivenIHaveABusinessName(Guid businessKey)
[When(@"I query for matching Businesses")]
public async Task WhenIQueryForMatchingBusinesses()
{
var request = new GetBusinessQuery
var request = new GetBusinessByKeyQuery
{
BusinessKey = _businessKey
};

var requestValidator = new GetBusinessQueryValidator();
var requestValidator = new GetBusinessbyKeyQueryValidator();

_validationErrors = await requestValidator.ValidateAsync(request);

if (_validationErrors.IsValid)
try
{
var handler = new GetBusinessQueryHandler(BusinessRepo, Mapper);
var handler = new GetBusinessByKeyQueryHandler(BusinessRepo, Mapper);
_response = await handler.Handle(request, CancellationToken.None) ?? new BusinessEntity();
_responseType = CommandResponseType.Successful;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,27 +47,27 @@ public async Task WhenIQueryForMatchingBusinesses()
if (_businessExists)
{
userBusinessesRepoMock
.Setup(x => x.GetBusinessAsync(_businessKey, It.IsAny<CancellationToken>()))
.Setup(x => x.GetBusinessByKeyAsync(_businessKey, It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(Result.Success<BusinessEntity?>(new BusinessEntity()
{
BusinessKey = new Guid("2016a497-e56c-4be8-8ef6-3dc5ae1699ce"),
BusinessName = "BusinessInDb"
})));
}

var request = new GetBusinessQuery
var request = new GetBusinessByKeyQuery
{
BusinessKey = _businessKey
};

var requestValidator = new GetBusinessQueryValidator();
var requestValidator = new GetBusinessbyKeyQueryValidator();

_validationErrors = await requestValidator.ValidateAsync(request);

if (_validationErrors.IsValid)
try
{
var handler = new GetBusinessQueryHandler(userBusinessesRepoMock.Object, Mapper);
var handler = new GetBusinessByKeyQueryHandler(userBusinessesRepoMock.Object, Mapper);
_response = await handler.Handle(request, CancellationToken.None) ?? new BusinessEntity();
_responseType = CommandResponseType.Successful;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public async Task WhenIQueryForMatchingBusinesses()
if (_businessExists)
{
userBusinessesRepoMock
.Setup(x => x.GetBusinessesByNameAsync(_businessName, 1, It.IsAny<CancellationToken>()))
.Setup(x => x.GetBusinessesByNameAsync(_businessName, 1, 20, It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(Result.Success(new PagedResult<BusinessEntity>(
new()
{
Expand Down

0 comments on commit 34f5e8d

Please sign in to comment.