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)); } }