< Summary

Information
Class: OzonOrdersWeb.Controllers.SidebarSettingsController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Controllers/SidebarSettingsController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 20
Coverable lines: 20
Total lines: 81
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 10
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%
SaveSetting()0%110100%
IsValidJson(...)100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Controllers/SidebarSettingsController.cs

#LineLine coverage
 1using System.Security.Claims;
 2using System.Text.Json;
 3using Microsoft.AspNetCore.Authorization;
 4using Microsoft.AspNetCore.Mvc;
 5using OzonOrdersWeb.Authorization;
 6using OzonOrdersWeb.WebServices.Sidebar;
 7
 8namespace OzonOrdersWeb.Controllers;
 9
 10/// <summary>
 11/// AJAX-эндпоинт настроек бокового меню (избранное, порядок, свёрнутые группы, pin панели).
 12/// Прав на страницу не требует: любой вошедший пользователь правит только собственное меню.
 13/// </summary>
 14[Authorize]
 15[ServiceEndpoint]
 16[Route("Sidebar")]
 17public sealed class SidebarSettingsController : Controller
 18{
 19    private readonly IUserSidebarSettingsService _settings;
 20
 021    public SidebarSettingsController(IUserSidebarSettingsService settings)
 22    {
 023        _settings = settings;
 024    }
 25
 26    [HttpPost("SaveSetting")]
 27    [ValidateAntiForgeryToken]
 28    public async Task<IActionResult> SaveSetting([FromBody] SidebarSaveSettingRequest? request, CancellationToken cancel
 29    {
 030        var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
 031        if (string.IsNullOrEmpty(userId))
 32        {
 033            return Unauthorized();
 34        }
 35
 036        if (request is null || string.IsNullOrWhiteSpace(request.Key))
 37        {
 038            return BadRequest(new { message = "Не указан ключ настройки." });
 39        }
 40
 041        if (!string.IsNullOrWhiteSpace(request.Value) && !IsValidJson(request.Value))
 42        {
 043            return BadRequest(new { message = "Значение настройки — не JSON." });
 44        }
 45
 46        try
 47        {
 048            var saved = await _settings.SaveAsync(userId, request.Key, request.Value, request.Version, cancellationToken
 49            // stale — в базе уже более новая версия ключа: клиент просто пропускает устаревший ответ.
 050            return Ok(new { ok = true, stale = !saved });
 51        }
 052        catch (ArgumentException ex)
 53        {
 054            return BadRequest(new { message = ex.Message });
 55        }
 056    }
 57
 58    private static bool IsValidJson(string value)
 59    {
 60        try
 61        {
 062            using var _ = JsonDocument.Parse(value);
 063            return true;
 64        }
 065        catch (JsonException)
 66        {
 067            return false;
 68        }
 069    }
 70}
 71
 72public sealed class SidebarSaveSettingRequest
 73{
 74    public string Key { get; set; } = string.Empty;
 75
 76    /// <summary>JSON-строка; null/пусто — удалить настройку.</summary>
 77    public string? Value { get; set; }
 78
 79    /// <summary>Версия клиента (монотонная на ключ, например Date.now()); 0 — без проверки.</summary>
 80    public long Version { get; set; }
 81}