< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Controllers.Directories.TransactionTypeSettingsController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Directories/TransactionTypeSettingsController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 73
Coverable lines: 73
Total lines: 147
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 30
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%
Index()100%210%
Edit()0%7280%
Edit()0%272160%
ToggleGrid()0%4260%
Reset()100%210%
InvalidateCaches()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Directories/TransactionTypeSettingsController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using OzonDomains;
 4using OzonDomains.Models;
 5using OzonOrdersWeb.WebServices;
 6using OzonOrdersWeb.WebServices.Transactions.Grid.Definitions;
 7using Services.DataServices;
 8
 9namespace OzonOrdersWeb.Areas.Studio2.Controllers.Directories;
 10
 11/// <summary>
 12/// Админка типов транзакций: имена/иконки/цвета в меню проведения и флаг «использовать новый грид».
 13/// Хранится в <see cref="TransactionTypeSetting"/>; строка без переопределений = дефолты каталога.
 14/// </summary>
 15[Authorize(Roles = "Admin")]
 16[Area("Studio2")]
 17public sealed class TransactionTypeSettingsController : Controller
 18{
 19    private readonly ITransactionTypeSettingDataServices _settings;
 20    private readonly ITransactionDefinitionProvider _definitions;
 21    private readonly TransactionTransitionRuleService _ruleService;
 22    private readonly TransactionTooltipService _tooltipService;
 23
 024    public TransactionTypeSettingsController(
 025        ITransactionTypeSettingDataServices settings,
 026        ITransactionDefinitionProvider definitions,
 027        TransactionTransitionRuleService ruleService,
 028        TransactionTooltipService tooltipService)
 29    {
 030        _settings = settings;
 031        _definitions = definitions;
 032        _ruleService = ruleService;
 033        _tooltipService = tooltipService;
 034    }
 35
 36    public async Task<IActionResult> Index(CancellationToken cancellationToken)
 37    {
 038        var definitions = await _definitions.GetAllAsync(cancellationToken);
 039        var stored = (await _settings.GetAllAsync(cancellationToken)).ToDictionary(s => s.TransactionType);
 040        var rows = definitions
 041            .Select(d => new TransactionTypeSettingRow(d, TransactionDefinitionCatalog.ByType(d.Type)!, stored.GetValueO
 042            .ToList();
 043        return View(rows);
 044    }
 45
 46    public async Task<IActionResult> Edit(TransactionType id, CancellationToken cancellationToken)
 47    {
 048        var catalog = TransactionDefinitionCatalog.ByType(id);
 049        if (catalog == null)
 50        {
 051            return NotFound();
 52        }
 53
 054        var stored = await _settings.GetAsync(id, cancellationToken) ?? new TransactionTypeSetting { TransactionType = i
 055        ViewBag.Catalog = catalog;
 056        ViewBag.Groups = new[]
 057        {
 058            TransactionDefinitionCatalog.GroupPurchase, TransactionDefinitionCatalog.GroupShipping,
 059            TransactionDefinitionCatalog.GroupWarehouse, TransactionDefinitionCatalog.GroupReturns,
 060            TransactionDefinitionCatalog.GroupCancel, TransactionDefinitionCatalog.GroupPrices
 061        };
 062        return View(stored);
 063    }
 64
 65    [HttpPost]
 66    [ValidateAntiForgeryToken]
 67    public async Task<IActionResult> Edit(TransactionType id, TransactionTypeSetting model, CancellationToken cancellati
 68    {
 069        if (TransactionDefinitionCatalog.ByType(id) == null)
 70        {
 071            return NotFound();
 72        }
 73
 074        if (!string.IsNullOrWhiteSpace(model.Color) && !System.Text.RegularExpressions.Regex.IsMatch(model.Color.Trim(),
 75        {
 076            ModelState.AddModelError(nameof(model.Color), "Цвет в формате #rrggbb.");
 77        }
 78
 079        if (!string.IsNullOrWhiteSpace(model.DefaultsJson))
 80        {
 81            try
 82            {
 083                using var _ = System.Text.Json.JsonDocument.Parse(model.DefaultsJson);
 084            }
 085            catch (System.Text.Json.JsonException)
 86            {
 087                ModelState.AddModelError(nameof(model.DefaultsJson), "Некорректный JSON.");
 088            }
 89        }
 90
 091        if (!ModelState.IsValid)
 92        {
 093            ViewBag.Catalog = TransactionDefinitionCatalog.ByType(id);
 094            ViewBag.Groups = new[]
 095            {
 096                TransactionDefinitionCatalog.GroupPurchase, TransactionDefinitionCatalog.GroupShipping,
 097                TransactionDefinitionCatalog.GroupWarehouse, TransactionDefinitionCatalog.GroupReturns,
 098                TransactionDefinitionCatalog.GroupCancel, TransactionDefinitionCatalog.GroupPrices
 099            };
 0100            model.TransactionType = id;
 0101            return View(model);
 102        }
 103
 0104        model.TransactionType = id;
 0105        await _settings.UpsertAsync(model, User.Identity?.Name, cancellationToken);
 0106        InvalidateCaches();
 0107        TempData["StatusResult"] = $"Настройки «{TransactionDefinitionCatalog.ByType(id)!.Title}» сохранены.";
 0108        return RedirectToAction(nameof(Index));
 0109    }
 110
 111    /// <summary>Быстрое переключение «использовать грид» из таблицы.</summary>
 112    [HttpPost]
 113    [ValidateAntiForgeryToken]
 114    public async Task<IActionResult> ToggleGrid(TransactionType id, bool useGrid, CancellationToken cancellationToken)
 115    {
 0116        if (TransactionDefinitionCatalog.ByType(id) == null)
 117        {
 0118            return NotFound();
 119        }
 120
 0121        var stored = await _settings.GetAsync(id, cancellationToken) ?? new TransactionTypeSetting { TransactionType = i
 0122        stored.UseGrid = useGrid;
 0123        await _settings.UpsertAsync(stored, User.Identity?.Name, cancellationToken);
 0124        InvalidateCaches();
 0125        return Json(new { ok = true, useGrid });
 0126    }
 127
 128    [HttpPost]
 129    [ValidateAntiForgeryToken]
 130    public async Task<IActionResult> Reset(TransactionType id, CancellationToken cancellationToken)
 131    {
 0132        await _settings.ResetAsync(id, cancellationToken);
 0133        InvalidateCaches();
 0134        TempData["StatusResult"] = "Настройки сброшены к значениям каталога.";
 0135        return RedirectToAction(nameof(Index));
 0136    }
 137
 138    private void InvalidateCaches()
 139    {
 0140        _definitions.Invalidate();
 0141        _ruleService.InvalidateCache();
 0142        _tooltipService.InvalidateCache();
 0143    }
 144}
 145
 146/// <summary>Строка таблицы админки: эффективное определение, дефолт каталога и сохранённая настройка (если есть).</summ
 147public sealed record TransactionTypeSettingRow(TransactionDefinition Effective, TransactionDefinition Catalog, Transacti