< Summary

Information
Class: OzonOrdersWeb.Controllers.SidebarSaveSettingRequest
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Controllers/SidebarSettingsController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 3
Coverable lines: 3
Total lines: 81
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Key()100%210%
get_Value()100%210%
get_Version()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
 21    public SidebarSettingsController(IUserSidebarSettingsService settings)
 22    {
 23        _settings = settings;
 24    }
 25
 26    [HttpPost("SaveSetting")]
 27    [ValidateAntiForgeryToken]
 28    public async Task<IActionResult> SaveSetting([FromBody] SidebarSaveSettingRequest? request, CancellationToken cancel
 29    {
 30        var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
 31        if (string.IsNullOrEmpty(userId))
 32        {
 33            return Unauthorized();
 34        }
 35
 36        if (request is null || string.IsNullOrWhiteSpace(request.Key))
 37        {
 38            return BadRequest(new { message = "Не указан ключ настройки." });
 39        }
 40
 41        if (!string.IsNullOrWhiteSpace(request.Value) && !IsValidJson(request.Value))
 42        {
 43            return BadRequest(new { message = "Значение настройки — не JSON." });
 44        }
 45
 46        try
 47        {
 48            var saved = await _settings.SaveAsync(userId, request.Key, request.Value, request.Version, cancellationToken
 49            // stale — в базе уже более новая версия ключа: клиент просто пропускает устаревший ответ.
 50            return Ok(new { ok = true, stale = !saved });
 51        }
 52        catch (ArgumentException ex)
 53        {
 54            return BadRequest(new { message = ex.Message });
 55        }
 56    }
 57
 58    private static bool IsValidJson(string value)
 59    {
 60        try
 61        {
 62            using var _ = JsonDocument.Parse(value);
 63            return true;
 64        }
 65        catch (JsonException)
 66        {
 67            return false;
 68        }
 69    }
 70}
 71
 72public sealed class SidebarSaveSettingRequest
 73{
 074    public string Key { get; set; } = string.Empty;
 75
 76    /// <summary>JSON-строка; null/пусто — удалить настройку.</summary>
 077    public string? Value { get; set; }
 78
 79    /// <summary>Версия клиента (монотонная на ключ, например Date.now()); 0 — без проверки.</summary>
 080    public long Version { get; set; }
 81}

Methods/Properties

get_Key()
get_Value()
get_Version()