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.Activation; namespace PnvPanel.Application.Activation; public sealed class RequestActivationCommandHandler( IAppDbContext dbContext, IRealtimeNotifier notifier, ITelegramNotifier telegramNotifier, ICurrentUser currentUser) : ICommandHandler> { public async Task> Handle(RequestActivationCommand command, CancellationToken cancellationToken) { if (currentUser.UserId is not { } userId) return Result.Failure(AuthErrors.Unauthorized); var hasPending = await dbContext.ActivationRequests .AnyAsync(r => r.UserId == userId && r.Status == ActivationStatus.Pending, cancellationToken); if (hasPending) return Result.Failure(ActivationErrors.AlreadyPending); var request = ActivationRequest.Create(userId, command.Comment); dbContext.ActivationRequests.Add(request); var userName = currentUser.UserName ?? userId.ToString(); await notifier.NotifyActivationRequestedAsync(request.Id, userId, userName, request.Comment, request.CreatedAt, cancellationToken); await telegramNotifier.NotifyAdminsActivationRequestedAsync(request.Id, userName, request.Comment, cancellationToken); return Result.Success(new ActivationRequestDto(request.Id, request.Comment, request.CreatedAt)); } }