Clear        


                
                    using CORE.APP.Models;
using CORE.APP.Services;
using Locations.APP.Domain;
using MediatR;
using Microsoft.EntityFrameworkCore;

namespace Locations.APP.Features.Countries
{
    public class CountryDeleteRequest : Request, IRequest<CommandResponse>
    {
    }

    public class CityDeleteHandler : Service<Country>, IRequestHandler<CountryDeleteRequest, CommandResponse>
    {
        protected override IQueryable<Country> Query(bool isNoTracking = true)
        {
            return base.Query(isNoTracking).Include(country => country.Cities);
        }

        public CityDeleteHandler(DbContext db) : base(db)
        {
        }

        public async Task<CommandResponse> Handle(CountryDeleteRequest request, CancellationToken cancellationToken)
        {
            // isNoTracking is false for being tracked by EF Core to delete the entity
            var entity = await Query(false).SingleOrDefaultAsync(country => country.Id == request.Id, cancellationToken);
            if (entity is null)
                return Error("Country not found!");

            // Way 1: check relational cities
            //if (entity.Cities.Any())
            //    return Error("Country can't be deleted because it has relational cities!");
            // Way 2: delete relational cities (not recommended)
            Delete(entity.Cities);

            Delete(entity);

            return Success("Country deleted successfully.", entity.Id);
        }
    }
}