GetChargingPilesQueryHandler.cs 2.95 KB
using AutoMapper;
using MassTransit;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Rcs.Application.Common;
using Rcs.Application.DTOs;
using Rcs.Application.MessageBus.Commands.ChargingPile;
using Rcs.Domain.Repositories;

namespace Rcs.Infrastructure.MessageBus.Handlers.Commands.ChargingPile
{
    /// <summary>
    /// Get charging pile list query handler.
    /// </summary>
    public class GetChargingPilesQueryHandler : IConsumer<GetChargingPilesQuery>
    {
        private readonly ILogger<GetChargingPilesQueryHandler> _logger;
        private readonly IChargingPileRepository _repository;
        private readonly IMapper _mapper;

        public GetChargingPilesQueryHandler(
            ILogger<GetChargingPilesQueryHandler> logger,
            IChargingPileRepository repository,
            IMapper mapper)
        {
            _logger = logger;
            _repository = repository;
            _mapper = mapper;
        }

        public async Task Consume(ConsumeContext<GetChargingPilesQuery> context)
        {
            var query = context.Message;

            try
            {
                var queryable = _repository.GetQueryable();

                if (!string.IsNullOrWhiteSpace(query.FilterModel))
                {
                    queryable = FilterHelper.ApplyFilters(queryable, query.FilterModel);
                }

                if (!string.IsNullOrWhiteSpace(query.PileCode))
                {
                    queryable = queryable.Where(x => x.PileCode.Contains(query.PileCode));
                }

                if (!string.IsNullOrWhiteSpace(query.PileName))
                {
                    queryable = queryable.Where(x => x.PileName.Contains(query.PileName));
                }

                if (!string.IsNullOrWhiteSpace(query.IpAddress))
                {
                    queryable = queryable.Where(x => x.IpAddress.Contains(query.IpAddress));
                }

                if (query.IsActive.HasValue)
                {
                    queryable = queryable.Where(x => x.IsActive == query.IsActive.Value);
                }

                var totalCount = await queryable.CountAsync(context.CancellationToken);

                var items = await queryable
                    .OrderByDescending(x => x.CreatedAt)
                    .Skip((query.PageNumber - 1) * query.PageSize)
                    .Take(query.PageSize)
                    .ToListAsync(context.CancellationToken);

                var dtos = _mapper.Map<List<ChargingPileListItemDto>>(items);

                await context.RespondAsync(
                    PagedResponse<ChargingPileListItemDto>.Successful(dtos, query.PageNumber, query.PageSize, totalCount));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Get charging pile list failed");
                await context.RespondAsync(PagedResponse<ChargingPileListItemDto>.Failed(ex.Message));
            }
        }
    }
}