using Application.Abstractions.Data;
using Application.Abstractions.Messaging;
using Microsoft.EntityFrameworkCore;
namespace Application.Features.Api.Stocks.GetStockDisclosures;
///
/// 특정 종목(6자리 StockCode)의 전자공시(DART) 목록 — 접수일(RceptDt) 내림차순, 동일자는 접수번호 내림차순 페이징 (익명).
/// 공시가 없는 종목은 빈 목록 반환 (NotFound 아님 — Disclosure 는 종목 마스터와 독립 피드).
///
internal sealed class Handler(IAppDbContext db) : IQueryHandler
{
private const ushort MaxPerPage = 100;
public async Task Handle(Query request, CancellationToken ct)
{
var page = request.Page < 1 ? 1 : request.Page;
var perPage = request.PerPage is 0 or > MaxPerPage ? (ushort)20 : request.PerPage;
var query = db.Disclosure.AsNoTracking().Where(c => c.StockCode == request.Code);
var total = await query.CountAsync(ct);
var list = await query
.OrderByDescending(c => c.RceptDt).ThenByDescending(c => c.RceptNo)
.Skip((page - 1) * perPage)
.Take(perPage)
.Select(c => new Response.Row
{
RceptNo = c.RceptNo,
CorpCode = c.CorpCode,
CorpName = c.CorpName,
CorpCls = c.CorpCls,
ReportNm = c.ReportNm,
FlrNm = c.FlrNm,
RceptDt = c.RceptDt,
Rm = c.Rm
})
.ToListAsync(ct);
return new Response
{
Total = total,
List = list
};
}
}