using MediatR;
using TakeoutSaaS.Application.App.Merchants.Dto;
using TakeoutSaaS.Application.App.Merchants.Queries;
using TakeoutSaaS.Domain.Merchants.Repositories;
using TakeoutSaaS.Shared.Abstractions.Results;
using TakeoutSaaS.Shared.Abstractions.Tenancy;
namespace TakeoutSaaS.Application.App.Merchants.Handlers;
///
/// 商户列表查询处理器。
///
public sealed class SearchMerchantsQueryHandler(
IMerchantRepository merchantRepository,
ITenantProvider tenantProvider)
: IRequestHandler>
{
///
public async Task> Handle(SearchMerchantsQuery request, CancellationToken cancellationToken)
{
// 1. 获取租户并查询商户
var tenantId = tenantProvider.GetCurrentTenantId();
var merchants = await merchantRepository.SearchAsync(tenantId, request.Status, cancellationToken);
// 2. 排序与分页
var sorted = ApplySorting(merchants, request.SortBy, request.SortDescending);
var paged = sorted
.Skip((request.Page - 1) * request.PageSize)
.Take(request.PageSize)
.ToList();
// 3. 映射 DTO
var items = paged.Select(merchant => new MerchantDto
{
Id = merchant.Id,
TenantId = merchant.TenantId,
BrandName = merchant.BrandName,
BrandAlias = merchant.BrandAlias,
LogoUrl = merchant.LogoUrl,
Category = merchant.Category,
ContactPhone = merchant.ContactPhone,
ContactEmail = merchant.ContactEmail,
Status = merchant.Status,
JoinedAt = merchant.JoinedAt,
CreatedAt = merchant.CreatedAt
}).ToList();
// 4. 返回分页结果
return new PagedResult(items, request.Page, request.PageSize, merchants.Count);
}
private static IOrderedEnumerable ApplySorting(
IReadOnlyCollection merchants,
string? sortBy,
bool sortDescending)
{
return sortBy?.ToLowerInvariant() switch
{
"brandname" => sortDescending
? merchants.OrderByDescending(x => x.BrandName)
: merchants.OrderBy(x => x.BrandName),
"status" => sortDescending
? merchants.OrderByDescending(x => x.Status)
: merchants.OrderBy(x => x.Status),
_ => sortDescending
? merchants.OrderByDescending(x => x.CreatedAt)
: merchants.OrderBy(x => x.CreatedAt)
};
}
}