using FinancialApi.Application; using FinancialApi.Infrastructure; using Microsoft.EntityFrameworkCore; using Wolverine.Attributes; using Wolverine.Persistence; namespace FinancialApi; public static class ApplyFeeHandler { public static Task LoadAsync( ApplyFeeCommand cmd, AccountDbContext db) => db.Set().AsNoTracking().SingleOrDefaultAsync(x => x.Id == cmd.AccountId); [Transactional] public static (Update UpdatedAccount, FeeAppliedEvent Event) Handle( ApplyFeeCommand cmd, Account account) { var updatedAccount = account.ApplyFee(cmd.Amount); var @event = new FeeAppliedEvent(account.Id, cmd.Amount); return (Storage.Update(updatedAccount), @event); } } public record ApplyFeeCommand(int AccountId, decimal Amount); public record FeeAppliedEvent(int AccountId, decimal Amount);