| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Application.Helpers;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.Paper.GetAccount;
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
- {
- public async Task<Response> Handle(Query request, CancellationToken ct)
- {
- var account = await db.PaperAccount.AsNoTracking().FirstOrDefaultAsync(c => c.MemberID == request.MemberID, ct);
- if (account is null)
- {
- return new Response(false, 0, 0, 0, 0, 0, 0);
- }
- var positions = await db.PaperPosition.AsNoTracking()
- .Where(c => c.AccountID == account.ID && c.Quantity > 0)
- .Select(c => new { c.StockCode, c.Quantity })
- .ToListAsync(ct);
- var codes = positions.Select(c => c.StockCode).Distinct().ToList();
- var latestCloses = await PaperValuation.GetLatestClosesAsync(db, codes, ct);
- var equity = PaperValuation.ComputeEquity(
- account.Token,
- account.ReservedToken,
- positions.Select(c => (c.StockCode, c.Quantity)),
- latestCloses);
- var nav = PaperValuation.ComputeNav(equity, account.Units);
- var cumReturnBp = (int)Math.Round((nav - 1m) * 10000m, MidpointRounding.AwayFromZero);
- return new Response(
- true,
- account.Token,
- account.ReservedToken,
- account.Units,
- equity,
- cumReturnBp,
- positions.Count);
- }
- }
|