< Summary

Information
Class: Services.ApiSupplierSettingsServices.ApiSupplierWarehouseService
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiSupplierSettings/ApiSupplierWarehouseService.cs
Line coverage
64%
Covered lines: 27
Uncovered lines: 15
Coverable lines: 42
Total lines: 82
Line coverage: 64.2%
Branch coverage
100%
Covered branches: 16
Total branches: 16
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%
GetWarehouseIdsAsync(...)100%11100%
GetAllAllowedWarehouseIdsByProviderAsync()100%210%
GetAsync()100%210%
IsWarehouseAllowedAsync()100%44100%
GetWarehouseNameAsync(...)100%210%
ReplaceAsync()100%1212100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiSupplierSettings/ApiSupplierWarehouseService.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using OzonDomains.Models;
 3using OzonRepositories.Context;
 4
 5namespace Services.ApiSupplierSettingsServices;
 6
 7/// <summary>Склады Studio2, с которыми работает API-поставщик. Пустой список — ограничения нет:
 8/// поставщик доступен для заказов с любого склада.</summary>
 9public sealed class ApiSupplierWarehouseService
 10{
 11    private readonly ApplicationDbContext _context;
 12
 2613    public ApiSupplierWarehouseService(ApplicationDbContext context) => _context = context;
 14
 15    public Task<List<int>> GetWarehouseIdsAsync(string providerKey, CancellationToken cancellationToken = default) =>
 1816        _context.ApiSupplierWarehouses.AsNoTracking()
 1817            .Where(x => x.ProviderKey == providerKey)
 1818            .Select(x => x.WarehouseId)
 1819            .ToListAsync(cancellationToken);
 20
 21    /// <summary>Словарь всех настроенных ограничений складов по ProviderKey (только для провайдеров с ненулевым набором
 22    public async Task<Dictionary<string, List<int>>> GetAllAllowedWarehouseIdsByProviderAsync(CancellationToken cancella
 23    {
 024        var items = await _context.ApiSupplierWarehouses.AsNoTracking()
 025            .Select(x => new { x.ProviderKey, x.WarehouseId })
 026            .ToListAsync(cancellationToken);
 27
 028        return items.GroupBy(x => x.ProviderKey)
 029            .ToDictionary(g => g.Key, g => g.Select(x => x.WarehouseId).Distinct().ToList());
 030    }
 31
 32    public async Task<List<ApiSupplierWarehouse>> GetAsync(string providerKey, CancellationToken cancellationToken = def
 033        await _context.ApiSupplierWarehouses.AsNoTracking()
 034            .Where(x => x.ProviderKey == providerKey)
 035            .Include(x => x.Warehouse)
 036            .OrderBy(x => x.Warehouse.Name)
 037            .ToListAsync(cancellationToken);
 38
 39    /// <summary>Разрешён ли поставщик для склада заказа. Без ограничений — разрешён всегда;
 40    /// неизвестный склад заказа тоже не блокируем: проверять нечего.</summary>
 41    public async Task<bool> IsWarehouseAllowedAsync(string providerKey, int? warehouseId,
 42        CancellationToken cancellationToken = default)
 43    {
 444        var allowed = await GetWarehouseIdsAsync(providerKey, cancellationToken);
 445        return allowed.Count == 0 || !warehouseId.HasValue || allowed.Contains(warehouseId.Value);
 446    }
 47
 48    /// <summary>Название склада для сообщений: резолвер отдаёт имя только для засыла,
 49    /// для склада отгрузки заказа его приходится дочитывать.</summary>
 50    public Task<string?> GetWarehouseNameAsync(int warehouseId, CancellationToken cancellationToken = default) =>
 051        _context.Warehouses.AsNoTracking()
 052            .Where(x => x.Id == warehouseId)
 053            .Select(x => x.Name)
 054            .FirstOrDefaultAsync(cancellationToken);
 55
 56    public async Task ReplaceAsync(string providerKey, IReadOnlyCollection<int> warehouseIds,
 57        CancellationToken cancellationToken = default)
 58    {
 2959        var requested = warehouseIds.Where(x => x > 0).Distinct().ToList();
 1160        var valid = requested.Count == 0
 1161            ? new List<int>()
 1162            : await _context.Warehouses.Where(x => requested.Contains(x.Id)).Select(x => x.Id).ToListAsync(cancellationT
 1163        if (valid.Count != requested.Count)
 164            throw new InvalidOperationException("Среди выбранных складов есть несуществующий.");
 65
 1066        var existing = await _context.ApiSupplierWarehouses
 1067            .Where(x => x.ProviderKey == providerKey)
 1068            .ToListAsync(cancellationToken);
 69
 1370        var removed = existing.Where(x => !valid.Contains(x.WarehouseId)).ToList();
 1271        if (removed.Count > 0) _context.ApiSupplierWarehouses.RemoveRange(removed);
 72
 1373        var existingIds = existing.Select(x => x.WarehouseId).ToHashSet();
 2474        var added = valid.Where(x => !existingIds.Contains(x))
 1375            .Select(x => new ApiSupplierWarehouse { ProviderKey = providerKey, WarehouseId = x })
 1076            .ToList();
 1977        if (added.Count > 0) await _context.ApiSupplierWarehouses.AddRangeAsync(added, cancellationToken);
 78
 1079        if (removed.Count > 0 || added.Count > 0)
 1080            await _context.SaveChangesAsync(cancellationToken);
 1081    }
 82}