using CORE.APP.Models;
using CORE.APP.Services;
using Locations.APP.Domain;
using Locations.APP.Features.Countries;
using MediatR;
using Microsoft.EntityFrameworkCore;
namespace Locations.APP.Features.Cities
{
public class CityQueryRequest : Request, IRequest<IQueryable<CityQueryResponse>>
{
public int? CountryId { get; set; }
}
public class CityQueryResponse : Response
{
public string CityName { get; set; }
public CountryQueryResponse Country { get; set; }
}
public class CityQueryHandler : Service<City>, IRequestHandler<CityQueryRequest, IQueryable<CityQueryResponse>>
{
protected override IQueryable<City> Query(bool isNoTracking = true)
{
return base.Query(isNoTracking).Include(city => city.Country).OrderBy(city => city.CityName);
}
public CityQueryHandler(DbContext db) : base(db)
{
}
public Task<IQueryable<CityQueryResponse>> Handle(CityQueryRequest request, CancellationToken cancellationToken)
{
var entityQuery = Query();
if (request.CountryId.HasValue)
entityQuery = entityQuery.Where(city => city.CountryId == request.CountryId.Value);
var query = entityQuery.Select(city => new CityQueryResponse
{
Id = city.Id,
Guid = city.Guid,
CityName = city.CityName,
Country = new CountryQueryResponse
{
Id = city.Country.Id,
Guid = city.Country.Guid,
CountryName = city.Country.CountryName
}
});
return Task.FromResult(query);
}
}
}