Files
PnvPanel/backend/src/PnvPanel.Application/Configs/GetConfigLink/GetConfigLinkQueryHandler.cs
T

39 lines
1.8 KiB
C#

using Microsoft.EntityFrameworkCore;
using PnvPanel.Application.Auth;
using PnvPanel.Application.Common.Interfaces;
using PnvPanel.Application.Common.Messaging;
using PnvPanel.Application.Common.Models;
namespace PnvPanel.Application.Configs.GetConfigLink;
public sealed class GetConfigLinkQueryHandler(IAppDbContext dbContext, IXuiPanelGateway gateway, ICurrentUser currentUser)
: IQueryHandler<GetConfigLinkQuery, Result<ConfigLinkDto>>
{
public async Task<Result<ConfigLinkDto>> Handle(GetConfigLinkQuery query, CancellationToken cancellationToken)
{
if (currentUser.UserId is not { } userId)
return Result.Failure<ConfigLinkDto>(AuthErrors.Unauthorized);
var config = await dbContext.VpnConfigs.AsNoTracking()
.FirstOrDefaultAsync(c => c.Id == query.ConfigId && c.UserId == userId, cancellationToken);
if (config is null)
return Result.Failure<ConfigLinkDto>(ConfigErrors.NotFound);
var inbound = await dbContext.Inbounds.AsNoTracking().FirstOrDefaultAsync(i => i.Id == config.InboundId, cancellationToken);
if (inbound is null)
return Result.Failure<ConfigLinkDto>(ConfigErrors.InboundNotAvailable);
var node = await dbContext.Nodes.AsNoTracking().FirstOrDefaultAsync(n => n.Id == inbound.NodeId, cancellationToken);
if (node is null)
return Result.Failure<ConfigLinkDto>(ConfigErrors.NodeDisabled);
var linkResult = await gateway.BuildConnectionStringAsync(
node, inbound, config.ClientExternalId, config.Label ?? config.ClientEmail, node.BaseAddress.Host, cancellationToken);
if (!linkResult.IsSuccess)
return Result.Failure<ConfigLinkDto>(linkResult.Error);
return Result.Success(new ConfigLinkDto(linkResult.Value, config.SubscriptionToken));
}
}