using AdsManagerService.API.Controllers;
using AdsManagerService.Domain.AggregatesModel.AudienceAggregate;
using AdsManagerService.Infrastructure;
using MediatR;
using Microsoft.EntityFrameworkCore;
namespace AdsManagerService.API.Application.Queries;
///
/// EN: Handler for ListAudiencesQuery - returns audiences for an advertiser.
/// VI: Handler cho ListAudiencesQuery - trả về audiences cho nhà quảng cáo.
///
public class ListAudiencesQueryHandler : IRequestHandler>
{
private readonly AdsManagerServiceContext _context;
public ListAudiencesQueryHandler(AdsManagerServiceContext context)
{
_context = context ?? throw new ArgumentNullException(nameof(context));
}
public async Task> Handle(ListAudiencesQuery request, CancellationToken cancellationToken)
{
// EN: Get custom audiences for the advertiser / VI: Lấy custom audiences cho nhà quảng cáo
var customAudiences = await _context.CustomAudiences
.AsNoTracking()
.Where(a => a.AdvertiserId == request.AdvertiserId)
.OrderByDescending(a => a.CreatedAt)
.Select(a => new AudienceDto
{
Id = a.Id,
Name = a.Name,
Type = "custom",
Size = a.Size,
CreatedAt = a.CreatedAt
})
.ToListAsync(cancellationToken);
// EN: Get lookalike audiences for the advertiser / VI: Lấy lookalike audiences cho nhà quảng cáo
var lookalikeAudiences = await _context.LookalikeAudiences
.AsNoTracking()
.Where(a => a.AdvertiserId == request.AdvertiserId)
.OrderByDescending(a => a.CreatedAt)
.Select(a => new AudienceDto
{
Id = a.Id,
Name = a.Name,
Type = "lookalike",
Size = a.Size,
CreatedAt = a.CreatedAt
})
.ToListAsync(cancellationToken);
// EN: Merge and sort by creation date / VI: Gộp và sắp xếp theo ngày tạo
var allAudiences = customAudiences
.Concat(lookalikeAudiences)
.OrderByDescending(a => a.CreatedAt)
.ToList();
return allAudiences;
}
}
///
/// EN: Handler for GetAudienceByIdQuery - returns a single audience by ID.
/// VI: Handler cho GetAudienceByIdQuery - trả về một audience theo ID.
///
public class GetAudienceByIdQueryHandler : IRequestHandler
{
private readonly AdsManagerServiceContext _context;
public GetAudienceByIdQueryHandler(AdsManagerServiceContext context)
{
_context = context ?? throw new ArgumentNullException(nameof(context));
}
public async Task Handle(GetAudienceByIdQuery request, CancellationToken cancellationToken)
{
// EN: Try custom audience first / VI: Thử custom audience trước
var customAudience = await _context.CustomAudiences
.AsNoTracking()
.FirstOrDefaultAsync(a => a.Id == request.AudienceId, cancellationToken);
if (customAudience != null)
{
return new AudienceDto
{
Id = customAudience.Id,
Name = customAudience.Name,
Type = "custom",
Size = customAudience.Size,
CreatedAt = customAudience.CreatedAt
};
}
// EN: Try lookalike audience / VI: Thử lookalike audience
var lookalikeAudience = await _context.LookalikeAudiences
.AsNoTracking()
.FirstOrDefaultAsync(a => a.Id == request.AudienceId, cancellationToken);
if (lookalikeAudience != null)
{
return new AudienceDto
{
Id = lookalikeAudience.Id,
Name = lookalikeAudience.Name,
Type = "lookalike",
Size = lookalikeAudience.Size,
CreatedAt = lookalikeAudience.CreatedAt
};
}
return null;
}
}