- Updated the `PaymentRequest` model to include a new `Kind` property, distinguishing between `Subscription` and `RoleChangeTopUp` requests. - Modified the `TelegramNotifier` to accommodate the new request type, ensuring accurate notifications for role change top-ups. - Enhanced the `ConfirmPaymentRequestCommandHandler` to handle role change top-ups without extending the billing period, reflecting the new payment logic. - Updated various application components and tests to support the new payment request structure and ensure proper functionality. - Revised API documentation to clarify the behavior of role change top-ups and their impact on billing.
47 lines
1.6 KiB
C#
47 lines
1.6 KiB
C#
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<MarkPaymentSentCommand, Result>
|
|
{
|
|
public async Task<Result> 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();
|
|
}
|
|
}
|