Files
CMS/src/CMSMicroservice.Application/UserOrderCQ/Queries/GetCustomerOrderHistory/GetCustomerOrderHistoryQueryHandler.cs
T
masoodafar-web b2d676b555 feat: Implement customer profile and referral queries
- Add GetCustomerProfileResponseDto for retrieving customer profile information.
- Create GetCustomerReferralsQuery and GetCustomerReferralsQueryHandler to fetch customer referrals with pagination and filtering options.
- Introduce GetCustomerReferralsResponseDto to structure the response for customer referrals.
- Implement GetCustomerSettingsQuery and GetCustomerSettingsQueryHandler to retrieve user settings.
- Add GetCustomerOrder and GetCustomerOrderQueryHandler for fetching specific customer orders.
- Create GetCustomerOrderHistoryQuery and GetCustomerOrderHistoryQueryHandler to retrieve order history with filtering options.
- Implement GetCustomerOrdersQuery and GetCustomerOrdersQueryHandler for fetching multiple customer orders with filters.
- Add GetCustomerWalletChangeLogQuery and GetCustomerWalletChangeLogQueryHandler for retrieving wallet change logs.
- Implement GetCustomerWithdrawalSettingsQuery and GetCustomerWithdrawalSettingsQueryHandler for fetching withdrawal settings.
- Create GetCustomerWithdrawalsQuery and GetCustomerWithdrawalsQueryHandler to retrieve customer withdrawal requests.
2026-02-05 23:01:50 +03:30

156 lines
5.7 KiB
C#

using CMSMicroservice.Application.Common.Extensions;
using CMSMicroservice.Application.Common.Interfaces;
using CMSMicroservice.Application.Common.Models;
using CMSMicroservice.Domain.Enums;
namespace CMSMicroservice.Application.UserOrderCQ.Queries.GetCustomerOrderHistory;
public class GetCustomerOrderHistoryQueryHandler : IRequestHandler<GetCustomerOrderHistoryQuery, GetCustomerOrderHistoryResponseDto>
{
private readonly IApplicationDbContext _context;
private readonly ICurrentUserService _currentUser;
public GetCustomerOrderHistoryQueryHandler(
IApplicationDbContext context,
ICurrentUserService currentUser)
{
_context = context;
_currentUser = currentUser;
}
public async Task<GetCustomerOrderHistoryResponseDto> Handle(GetCustomerOrderHistoryQuery request, CancellationToken cancellationToken)
{
// Resolve UserId from JWT if not specified
var userId = request.UserId == 0
? (long.TryParse(_currentUser.UserId, out var currentUserId) ? currentUserId : 0)
: request.UserId;
if (userId == 0)
throw new UnauthorizedAccessException("User ID not found");
var query = _context.UserOrders
.AsNoTracking()
.Where(x => x.UserId == userId)
.Include(x => x.Package)
.Include(x => x.FactorDetails)
.AsQueryable();
// Apply status filter if specified
if (request.StatusFilter.HasValue)
{
// Status filter is based on OrderStatusEnum from Proto
// We need to map to DeliveryStatus enum values
var deliveryStatus = MapProtoStatusToDeliveryStatus(request.StatusFilter.Value);
if (deliveryStatus.HasValue)
query = query.Where(x => x.DeliveryStatus == deliveryStatus.Value);
}
// Apply date filters
if (request.FromDate.HasValue)
query = query.Where(x => x.Created >= request.FromDate.Value);
if (request.ToDate.HasValue)
query = query.Where(x => x.Created <= request.ToDate.Value);
// Order by most recent first
query = query.OrderByDescending(x => x.Created);
// Get metadata
var metaData = await query.GetMetaData(request.PaginationState, cancellationToken);
// Get paginated results
var orders = await query
.PaginatedListAsync(request.PaginationState)
.ToListAsync(cancellationToken);
var orderModels = orders.Select(order => new CustomerOrderHistoryModel
{
Id = order.Id,
Amount = order.Amount,
PackageId = order.PackageId,
PackageName = order.Package?.Title ?? "سفارش محصولات",
Status = MapDeliveryStatusToProtoStatus(order.DeliveryStatus),
StatusMessage = GetStatusMessage(order.DeliveryStatus),
OrderDate = order.Created,
DeliveryDate = order.PaymentDate?.AddDays(GetEstimatedDeliveryDays(order.DeliveryStatus)),
TrackingCode = order.TrackingCode ?? "",
ItemsCount = order.FactorDetails?.Count ?? 0,
CanCancel = CanCancelOrder(order.DeliveryStatus, order.Created),
CanReorder = true // همیشه می‌توان دوباره سفارش داد
}).ToList();
return new GetCustomerOrderHistoryResponseDto
{
MetaData = metaData,
Orders = orderModels
};
}
private DeliveryStatus? MapProtoStatusToDeliveryStatus(int protoStatus)
{
// OrderStatusEnum from Proto:
// 0=Pending, 1=Confirmed, 2=Processing, 3=Shipped, 4=Delivered, 5=Cancelled, 6=Refunded
return protoStatus switch
{
0 => DeliveryStatus.Pending,
1 => DeliveryStatus.Pending,
2 => DeliveryStatus.Pending,
3 => DeliveryStatus.InTransit,
4 => DeliveryStatus.Delivered,
5 => DeliveryStatus.Cancelled,
6 => DeliveryStatus.Cancelled,
_ => null
};
}
private int MapDeliveryStatusToProtoStatus(DeliveryStatus status)
{
return status switch
{
DeliveryStatus.None => 0,
DeliveryStatus.Pending => 1,
DeliveryStatus.InTransit => 3,
DeliveryStatus.Delivered => 4,
DeliveryStatus.Cancelled => 5,
DeliveryStatus.Returned => 6,
_ => 0
};
}
private string GetStatusMessage(DeliveryStatus status)
{
return status switch
{
DeliveryStatus.None => "ثبت نشده",
DeliveryStatus.Pending => "در انتظار پردازش",
DeliveryStatus.InTransit => "ارسال شده",
DeliveryStatus.Delivered => "تحویل داده شد",
DeliveryStatus.Cancelled => "لغو شده",
DeliveryStatus.Returned => "مرجوع شده",
_ => "نامشخص"
};
}
private int GetEstimatedDeliveryDays(DeliveryStatus status)
{
return status switch
{
DeliveryStatus.None => 7,
DeliveryStatus.Pending => 5,
DeliveryStatus.InTransit => 3,
DeliveryStatus.Delivered => 0,
_ => 0
};
}
private bool CanCancelOrder(DeliveryStatus status, DateTime orderDate)
{
// فقط سفارشات Pending یا None که کمتر از 24 ساعت از ثبت آنها گذشته قابل لغو هستند
if (status != DeliveryStatus.Pending && status != DeliveryStatus.None)
return false;
var hoursSinceOrder = (DateTime.UtcNow - orderDate).TotalHours;
return hoursSinceOrder < 24;
}
}