sozsoft-platform/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Domain/Services/McpServerConfigProvider.cs
2026-09-10 17:40:43 +03:00

68 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sozsoft.Mcp.Entities;
using Sozsoft.Platform;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Services;
using Volo.Abp.MultiTenancy;
namespace Sozsoft.Mcp.Services;
/// <summary>
/// Istegin kiracisina dusen etkin sunucu kaydini cozer.
/// </summary>
public interface IMcpServerConfigProvider
{
/// <summary>Etkin kayit; kiraciya acik aktif bir kayit yoksa null.</summary>
Task<McpServer?> GetEffectiveServerAsync();
/// <summary>Coklu deger tasiyan kolonu (kiraci/arac listesi) ogelerine ayirir.</summary>
IReadOnlyList<string> SplitMultiValue(string? value);
}
public class McpServerConfigProvider(
IRepository<McpServer, Guid> serverRepository,
ICurrentTenant currentTenant)
: DomainService, IMcpServerConfigProvider
{
public async Task<McpServer?> GetEffectiveServerAsync()
{
var tenantName = currentTenant.Name;
// Sunucu tanimlari host kapsaminda yasar; kiraci baglamindaki istek de ayni tabloyu
// okur, hangi kiracilara acik oldugu Tenants kolonunda durur.
List<McpServer> servers;
using (currentTenant.Change(null))
{
var query = await serverRepository.GetQueryableAsync();
servers = [.. query.Where(server => server.IsActive).OrderBy(server => server.Name)];
}
return servers.Find(server => IsAvailableForTenant(server.Tenants, tenantName));
}
public IReadOnlyList<string> SplitMultiValue(string? value)
=> string.IsNullOrWhiteSpace(value)
? []
: [.. value.Split(
PlatformConsts.MultiValueDelimiter,
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)];
/// <summary>
/// Kaydin kiraci listesi bos ise tum kiracilara aciktir; doluysa kiraci adi listede
/// gecmelidir (AiBot ekraniyla ayni sozlesme).
/// </summary>
private bool IsAvailableForTenant(string? tenants, string? tenantName)
{
var allowed = SplitMultiValue(tenants);
if (allowed.Count == 0)
{
return true;
}
return tenantName is not null
&& allowed.Any(name => string.Equals(name, tenantName, StringComparison.OrdinalIgnoreCase));
}
}