< Summary

Information
Class: Services.BitrixStockServices.BitrixStockSyncPresetService
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/BitrixStockServices/BitrixStockSyncPresetService.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 109
Coverable lines: 109
Total lines: 175
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 68
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
GetAllAsync()0%210140%
GetByIdAsync()0%210140%
CreateAsync()0%272160%
UpdateAsync()0%110100%
DeleteAsync()100%210%
MapRow(...)0%210140%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/BitrixStockServices/BitrixStockSyncPresetService.cs

#LineLine coverage
 1using System.Text.Json;
 2using Microsoft.EntityFrameworkCore;
 3using OzonRepositories.Context;
 4
 5namespace Services.BitrixStockServices;
 6
 07public class BitrixStockSyncPresetService(ApplicationDbContext db) : IBitrixStockSyncPresetService
 8{
 9    private const string SelectCols = "Id, Name, OzonClientId, OzonClientName, ArticleFilter, SelectedStoresJson, Disabl
 10
 11    public async Task<List<BitrixStockSyncPreset>> GetAllAsync(CancellationToken ct = default)
 12    {
 013        var conn = db.Database.GetDbConnection();
 014        var wasOpen = conn.State == System.Data.ConnectionState.Open;
 015        if (!wasOpen) await conn.OpenAsync(ct);
 16        try
 17        {
 018            using var cmd = conn.CreateCommand();
 19            try
 20            {
 021                cmd.CommandText = $"SELECT {SelectCols} FROM BitrixStockSyncPresets ORDER BY UpdatedAt DESC;";
 022                var result = new List<BitrixStockSyncPreset>();
 023                await using var reader = await cmd.ExecuteReaderAsync(ct);
 024                while (await reader.ReadAsync(ct))
 025                    result.Add(MapRow(reader));
 026                return result;
 027            }
 28            catch
 29            {
 030                cmd.CommandText = "SELECT Id, Name, OzonClientId, OzonClientName, ArticleFilter, SelectedStoresJson, NUL
 031                var result = new List<BitrixStockSyncPreset>();
 032                await using var reader = await cmd.ExecuteReaderAsync(ct);
 033                while (await reader.ReadAsync(ct))
 034                    result.Add(MapRow(reader));
 035                return result;
 036            }
 037        }
 038        finally { if (!wasOpen) await conn.CloseAsync(); }
 039    }
 40
 41    public async Task<BitrixStockSyncPreset?> GetByIdAsync(int id, CancellationToken ct = default)
 42    {
 043        var conn = db.Database.GetDbConnection();
 044        var wasOpen = conn.State == System.Data.ConnectionState.Open;
 045        if (!wasOpen) await conn.OpenAsync(ct);
 46        try
 47        {
 048            using var cmd = conn.CreateCommand();
 49            try
 50            {
 051                cmd.CommandText = $"SELECT {SelectCols} FROM BitrixStockSyncPresets WHERE Id = @id LIMIT 1;";
 052                var p = cmd.CreateParameter(); p.ParameterName = "@id"; p.Value = id;
 053                cmd.Parameters.Add(p);
 054                await using var reader = await cmd.ExecuteReaderAsync(ct);
 055                return await reader.ReadAsync(ct) ? MapRow(reader) : null;
 056            }
 57            catch
 58            {
 059                cmd.CommandText = "SELECT Id, Name, OzonClientId, OzonClientName, ArticleFilter, SelectedStoresJson, NUL
 060                var p = cmd.CreateParameter(); p.ParameterName = "@id"; p.Value = id;
 061                cmd.Parameters.Clear();
 062                cmd.Parameters.Add(p);
 063                await using var reader = await cmd.ExecuteReaderAsync(ct);
 064                return await reader.ReadAsync(ct) ? MapRow(reader) : null;
 065            }
 066        }
 067        finally { if (!wasOpen) await conn.CloseAsync(); }
 068    }
 69
 70    public async Task<BitrixStockSyncPreset> CreateAsync(BitrixStockSyncPresetCreateRequest request, string? createdBy, 
 71    {
 072        var now = DateTime.UtcNow;
 073        var effectiveClients = request.GetEffectiveClients();
 074        var primaryClient = effectiveClients.FirstOrDefault() ?? new SyncClientEntry { Id = request.OzonClientId, Name =
 075        var storesJson = JsonSerializer.Serialize(request.SelectedStores ?? new List<string>());
 076        var disabledJson = JsonSerializer.Serialize(request.DisabledWarehouseMappingIds ?? new List<int>());
 077        var clientsJson = JsonSerializer.Serialize(effectiveClients);
 078        var stageJson = JsonSerializer.Serialize(request.StageSettings ?? new PresetStageSettings());
 79
 80        try
 81        {
 082            await db.Database.ExecuteSqlRawAsync(
 083                "INSERT INTO BitrixStockSyncPresets (Name, OzonClientId, OzonClientName, ArticleFilter, SelectedStoresJs
 084                EfSqlRawParameterGuard.Materialize(request.Name, primaryClient.Id, primaryClient.Name, request.ArticleFi
 085                ct);
 086        }
 87        catch
 88        {
 089            await db.Database.ExecuteSqlRawAsync(
 090                "INSERT INTO BitrixStockSyncPresets (Name, OzonClientId, OzonClientName, ArticleFilter, SelectedStoresJs
 091                EfSqlRawParameterGuard.Materialize(request.Name, primaryClient.Id, primaryClient.Name, request.ArticleFi
 092                ct);
 93        }
 94
 095        var conn = db.Database.GetDbConnection();
 096        var wasOpen = conn.State == System.Data.ConnectionState.Open;
 097        if (!wasOpen) await conn.OpenAsync(ct);
 98        try
 99        {
 0100            using var idCmd = conn.CreateCommand();
 0101            idCmd.CommandText = "SELECT LAST_INSERT_ID();";
 0102            var newId = Convert.ToInt32(await idCmd.ExecuteScalarAsync(ct));
 0103            return (await GetByIdAsync(newId, ct))!;
 104        }
 0105        finally { if (!wasOpen) await conn.CloseAsync(); }
 0106    }
 107
 108    public async Task<BitrixStockSyncPreset?> UpdateAsync(int id, BitrixStockSyncPresetUpdateRequest request, Cancellati
 109    {
 0110        var effectiveClients = request.GetEffectiveClients();
 0111        var primaryClient = effectiveClients.FirstOrDefault() ?? new SyncClientEntry { Id = request.OzonClientId, Name =
 0112        var storesJson = JsonSerializer.Serialize(request.SelectedStores ?? new List<string>());
 0113        var disabledJson = JsonSerializer.Serialize(request.DisabledWarehouseMappingIds ?? new List<int>());
 0114        var clientsJson = JsonSerializer.Serialize(effectiveClients);
 0115        var stageJson = JsonSerializer.Serialize(request.StageSettings ?? new PresetStageSettings());
 0116        var now = DateTime.UtcNow;
 117
 118        try
 119        {
 0120            await db.Database.ExecuteSqlRawAsync(
 0121                "UPDATE BitrixStockSyncPresets SET Name={0}, OzonClientId={1}, OzonClientName={2}, ArticleFilter={3}, Se
 0122                EfSqlRawParameterGuard.Materialize(request.Name, primaryClient.Id, primaryClient.Name, request.ArticleFi
 0123                ct);
 0124        }
 125        catch
 126        {
 0127            await db.Database.ExecuteSqlRawAsync(
 0128                "UPDATE BitrixStockSyncPresets SET Name={0}, OzonClientId={1}, OzonClientName={2}, ArticleFilter={3}, Se
 0129                EfSqlRawParameterGuard.Materialize(request.Name, primaryClient.Id, primaryClient.Name, request.ArticleFi
 0130                ct);
 131        }
 132
 0133        return await GetByIdAsync(id, ct);
 0134    }
 135
 136    public async Task<bool> DeleteAsync(int id, CancellationToken ct = default)
 137    {
 0138        await db.Database.ExecuteSqlRawAsync("DELETE FROM BitrixStockSyncPresets WHERE Id={0};", EfSqlRawParameterGuard.
 0139        return true;
 0140    }
 141
 142    private static BitrixStockSyncPreset MapRow(System.Data.Common.DbDataReader r)
 143    {
 144        // Порядок колонок: 0=Id,1=Name,2=OzonClientId,3=OzonClientName,4=ArticleFilter,
 145        // 5=SelectedStoresJson,6=DisabledWarehouseMappingIdsJson,7=OzonClientsJson,
 146        // 8=StageSettingsJson,9=CreatedAt,10=UpdatedAt,11=CreatedBy
 0147        var preset = new BitrixStockSyncPreset
 0148        {
 0149            Id             = r.GetInt32(0),
 0150            Name           = r.GetString(1),
 0151            OzonClientId   = r.GetInt32(2),
 0152            OzonClientName = r.GetString(3),
 0153            ArticleFilter  = r.IsDBNull(4) ? null : r.GetString(4),
 0154            SelectedStoresJson              = r.GetString(5),
 0155            DisabledWarehouseMappingIdsJson = r.IsDBNull(6) ? "[]" : r.GetString(6),
 0156            CreatedAt      = r.GetDateTime(9),
 0157            UpdatedAt      = r.GetDateTime(10),
 0158            CreatedBy      = r.IsDBNull(11) ? null : r.GetString(11)
 0159        };
 160
 161        // Список клиентов (колонка 7)
 0162        var clientsJson = r.IsDBNull(7) ? null : r.GetString(7);
 0163        if (!string.IsNullOrWhiteSpace(clientsJson))
 0164            preset.OzonClientsJson = clientsJson;
 165        else
 0166            preset.OzonClients = new List<SyncClientEntry> { new() { Id = preset.OzonClientId, Name = preset.OzonClientN
 167
 168        // Настройки этапов 2/3 (колонка 8)
 0169        var stageJson = r.IsDBNull(8) ? null : r.GetString(8);
 0170        if (!string.IsNullOrWhiteSpace(stageJson))
 0171            preset.StageSettingsJson = stageJson;
 172
 0173        return preset;
 174    }
 175}