69 lines
2.3 KiB
C#
69 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));
|
|||
|
|
}
|
|||
|
|
}
|