using Application.Abstractions.Data; using SharedKernel.Helpers; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.EntityFrameworkCore; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Admin.Pages.Paper.Accounts; // 모의투자 계좌 모니터 (읽기 전용) — d4 §⑤ /Paper/Accounts public class IndexModel(IAppDbContext db) : PageModel { [BindProperty(SupportsGet = true)] public QueryParams Query { get; set; } = new(); public sealed class QueryParams { [Range(1, int.MaxValue)] public int PageNum { get; set; } = 1; [Range(1, 100)] public ushort PerPage { get; set; } = 20; // 1 = 회원 SID, 2 = 닉네임 [DisplayName("검색 조건")] [Range(1, 2, ErrorMessage = "{0}이(가) 올바르지 않습니다.")] public int? Search { get; set; } [DisplayName("검색어")] [MaxLength(100)] public string? Keyword { get; set; } } public int Total { get; set; } public List<( int Num, int ID, string SID, string? Nickname, decimal Token, decimal ReservedToken, decimal Units, decimal TotalDeposited, decimal TotalWithdrawn, string CreatedAt )> List { get; set; } = []; public Pagination? Pagination { get; set; } public async Task OnGetAsync(CancellationToken ct) { if (!ModelState.IsValid) { return; } var query = from a in db.PaperAccount.AsNoTracking() join m in db.Member.AsNoTracking() on a.MemberID equals m.ID select new { a.ID, m.SID, Nickname = m.Name, a.Token, a.ReservedToken, a.Units, a.TotalDeposited, a.TotalWithdrawn, a.CreatedAt }; if (!string.IsNullOrWhiteSpace(Query.Keyword)) { var keyword = Query.Keyword.Trim(); query = Query.Search switch { 1 => query.Where(c => c.SID == keyword), 2 => query.Where(c => c.Nickname != null && c.Nickname.Contains(keyword)), _ => query }; } Total = await query.CountAsync(ct); var skip = (Query.PageNum - 1) * Query.PerPage; var rows = await query.OrderByDescending(c => c.ID).Skip(skip).Take(Query.PerPage).ToListAsync(ct); var num = skip + 1; List = [.. rows.Select(c => ( Num: num++, c.ID, c.SID, c.Nickname, c.Token, c.ReservedToken, c.Units, c.TotalDeposited, c.TotalWithdrawn, CreatedAt: c.CreatedAt.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") ))]; Pagination = new Pagination(Total, Query.PageNum, Query.PerPage); } }