< Summary

Information
Class: Chronicis.Api.Repositories.ResourceProviderRepository
Assembly: Chronicis.Api
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Api/Repositories/ResourceProviderRepository.cs
Line coverage
100%
Covered lines: 5
Uncovered lines: 0
Coverable lines: 5
Total lines: 114
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
NormalizeLookupKeyForStorage(...)100%22100%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Api/Repositories/ResourceProviderRepository.cs

#LineLine coverage
 1using Chronicis.Api.Data;
 2using Chronicis.Shared.Models;
 3using Microsoft.EntityFrameworkCore;
 4
 5namespace Chronicis.Api.Repositories;
 6
 7/// <summary>
 8/// Repository implementation for managing resource providers and their world associations.
 9/// </summary>
 10public class ResourceProviderRepository : IResourceProviderRepository
 11{
 12    private readonly ChronicisDbContext _context;
 13
 14    public ResourceProviderRepository(ChronicisDbContext context)
 15    {
 1916        _context = context;
 1917    }
 18
 19    /// <inheritdoc/>
 20    public async Task<List<ResourceProvider>> GetAllProvidersAsync()
 21    {
 22        return await _context.ResourceProviders
 23            .Where(rp => rp.IsActive)
 24            .OrderBy(rp => rp.Name)
 25            .AsNoTracking()
 26            .ToListAsync();
 27    }
 28
 29    /// <inheritdoc/>
 30    public async Task<List<(ResourceProvider Provider, bool IsEnabled, string LookupKey)>> GetWorldProvidersAsync(Guid w
 31    {
 32        // Get all active providers
 33        var providers = await _context.ResourceProviders
 34            .Where(rp => rp.IsActive)
 35            .OrderBy(rp => rp.Name)
 36            .AsNoTracking()
 37            .ToListAsync();
 38
 39        // Get world-level provider associations (enabled state + optional lookup key override)
 40        var worldAssociations = await _context.WorldResourceProviders
 41            .Where(wrp => wrp.WorldId == worldId)
 42            .AsNoTracking()
 43            .ToDictionaryAsync(
 44                wrp => wrp.ResourceProviderCode,
 45                wrp => wrp,
 46                StringComparer.OrdinalIgnoreCase);
 47
 48        // Combine into result
 49        return providers.Select(p => (
 50            Provider: p,
 51            IsEnabled: worldAssociations.TryGetValue(p.Code, out var association) && association.IsEnabled,
 52            LookupKey: worldAssociations.TryGetValue(p.Code, out var wrp) && !string.IsNullOrWhiteSpace(wrp.LookupKey)
 53                ? wrp.LookupKey!
 54                : p.Code
 55        )).ToList();
 56    }
 57
 58    /// <inheritdoc/>
 59    public async Task<bool> SetProviderEnabledAsync(Guid worldId, string providerCode, bool enabled, Guid userId, string
 60    {
 61        // Verify provider exists
 62        var providerExists = await _context.ResourceProviders
 63            .AnyAsync(rp => rp.Code == providerCode && rp.IsActive);
 64
 65        if (!providerExists)
 66        {
 67            return false;
 68        }
 69
 70        // Find or create the association
 71        var association = await _context.WorldResourceProviders
 72            .FirstOrDefaultAsync(wrp => wrp.WorldId == worldId && wrp.ResourceProviderCode == providerCode);
 73
 74        if (association == null)
 75        {
 76            // Create new association
 77            association = new WorldResourceProvider
 78            {
 79                WorldId = worldId,
 80                ResourceProviderCode = providerCode,
 81                IsEnabled = enabled,
 82                LookupKey = NormalizeLookupKeyForStorage(lookupKey),
 83                ModifiedAt = DateTimeOffset.UtcNow,
 84                ModifiedByUserId = userId
 85            };
 86            _context.WorldResourceProviders.Add(association);
 87        }
 88        else
 89        {
 90            // Update existing association
 91            association.IsEnabled = enabled;
 92            if (lookupKey != null)
 93            {
 94                association.LookupKey = NormalizeLookupKeyForStorage(lookupKey);
 95            }
 96
 97            association.ModifiedAt = DateTimeOffset.UtcNow;
 98            association.ModifiedByUserId = userId;
 99        }
 100
 101        await _context.SaveChangesAsync();
 102        return true;
 103    }
 104
 105    private static string? NormalizeLookupKeyForStorage(string? lookupKey)
 106    {
 6107        if (string.IsNullOrWhiteSpace(lookupKey))
 108        {
 3109            return null;
 110        }
 111
 3112        return lookupKey.Trim().ToLowerInvariant();
 113    }
 114}