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;
///
/// Istegin kiracisina dusen etkin sunucu kaydini cozer.
///
public interface IMcpServerConfigProvider
{
/// Etkin kayit; kiraciya acik aktif bir kayit yoksa null.
Task GetEffectiveServerAsync();
/// Coklu deger tasiyan kolonu (kiraci/arac listesi) ogelerine ayirir.
IReadOnlyList SplitMultiValue(string? value);
}
public class McpServerConfigProvider(
IRepository serverRepository,
ICurrentTenant currentTenant)
: DomainService, IMcpServerConfigProvider
{
public async Task 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 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 SplitMultiValue(string? value)
=> string.IsNullOrWhiteSpace(value)
? []
: [.. value.Split(
PlatformConsts.MultiValueDelimiter,
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)];
///
/// Kaydin kiraci listesi bos ise tum kiracilara aciktir; doluysa kiraci adi listede
/// gecmelidir (AiBot ekraniyla ayni sozlesme).
///
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));
}
}