public class TenantService()

in src/Services/Azure/Tenant/TenantService.cs [10:79]


public class TenantService(ICacheService cacheService)
    : BaseAzureService, ITenantService
{
    private readonly ICacheService _cacheService = cacheService ?? throw new ArgumentNullException(nameof(cacheService));
    private const string CACHE_KEY = "tenants";
    private static readonly TimeSpan CACHE_DURATION = TimeSpan.FromHours(12);

    public async Task<List<ArgumentOption>> GetTenants()
    {
        // Try to get from cache first
        var cachedResults = await _cacheService.GetAsync<List<ArgumentOption>>(CACHE_KEY, CACHE_DURATION);
        if (cachedResults != null)
        {
            return cachedResults;
        }

        // If not in cache, fetch from Azure
        var results = new List<ArgumentOption>();

        var options = AddDefaultPolicies(new ArmClientOptions());
        var client = new ArmClient(await GetCredential(), default, options);

        await foreach (var tenant in client.GetTenants())
        {
            var tenantId = tenant.Data.TenantId?.ToString() ?? throw new InvalidOperationException("Tenant ID cannot be null");
            results.Add(new ArgumentOption
            {
                Name = tenant.Data.DisplayName ?? string.Empty,
                Id = tenantId
            });
        }

        // Cache the results
        await _cacheService.SetAsync(CACHE_KEY, results, CACHE_DURATION);
        return results;
    }

    public bool IsTenantId(string tenant)
    {
        return Guid.TryParse(tenant, out _);
    }

    public async Task<string> GetTenantId(string tenant)
    {
        if (IsTenantId(tenant))
        {
            return tenant;
        }

        return await GetTenantIdByName(tenant);
    }

    public async Task<string> GetTenantIdByName(string tenantName)
    {
        var tenants = await GetTenants();
        var tenant = tenants.FirstOrDefault(t => t.Name.Equals(tenantName, StringComparison.OrdinalIgnoreCase)) ??
            throw new Exception($"Could not find tenant with name {tenantName}");

        return tenant.Id;
    }

    public async Task<string> GetTenantNameById(string tenantId)
    {
        var tenants = await GetTenants();
        var tenant = tenants.FirstOrDefault(t => t.Id.Equals(tenantId, StringComparison.OrdinalIgnoreCase)) ??
            throw new Exception($"Could not find tenant with ID {tenantId}");

        return tenant.Name;
    }
}