using Microsoft.EntityFrameworkCore; using PnvPanel.Application.Auth; using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Common.Messaging; using PnvPanel.Application.Common.Models; using PnvPanel.Domain.Billing; namespace PnvPanel.Application.Billing.MarkPaymentSent; public sealed class MarkPaymentSentCommandHandler( IAppDbContext dbContext, IIdentityService identityService, ITelegramNotifier telegramNotifier, ICurrentUser currentUser ) : ICommandHandler { public async Task Handle(MarkPaymentSentCommand command, CancellationToken cancellationToken) { if (currentUser.UserId is not { } userId) return Result.Failure(AuthErrors.Unauthorized); var request = await dbContext.PaymentRequests.FirstOrDefaultAsync( r => r.Id == command.RequestId && r.UserId == userId, cancellationToken ); if (request is null) return Result.Failure(BillingErrors.RequestNotFound); if (request.Status != PaymentRequestStatus.AwaitingPayment) return Result.Failure(BillingErrors.RequestNotAwaitingPayment); request.MarkPaymentSent(); var profile = await identityService.GetProfileAsync(userId, cancellationToken); await telegramNotifier.NotifyAdminsPaymentRequestedAsync( request.Id, profile?.UserName ?? userId.ToString(), request.Kind, request.Period, request.AmountSnapshot, cancellationToken ); return Result.Success(); } }