| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Application.Common;
- using SharedKernel.Results;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.MyPage.GetLoginLogs;
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
- {
- public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
- {
- var page = request.Page < 1 ? 1 : request.Page;
- var perPage = request.PerPage is < 1 or > 50 ? 20 : request.PerPage;
- var now = DateTime.UtcNow;
- var startDate = request.Type switch
- {
- SearchDateType.Week => now.AddDays(-7),
- SearchDateType.Month => now.AddMonths(-1),
- SearchDateType.QuarterYear => now.AddMonths(-3),
- SearchDateType.HalfYear => now.AddMonths(-6),
- _ => now.Date // SearchDateType.Today
- };
- var query = db.MemberLoginLog.AsNoTracking().Where(l => l.MemberID == request.MemberID && l.CreatedAt >= startDate).OrderByDescending(l => l.CreatedAt);
- var total = await query.CountAsync(ct);
- var list = await query
- .Skip((page - 1) * perPage)
- .Take(perPage)
- .Select(l => new LoginLogItem(
- l.ID,
- l.Success,
- l.Account,
- l.Reason,
- l.IpAddress,
- l.UserAgent,
- l.CreatedAt
- ))
- .ToListAsync(ct);
- return Result.Success(new Response(list, total, page, perPage));
- }
- }
|