< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Controllers.Directories.InterpartsWarehouseLoginController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Directories/InterpartsWarehouseLoginController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 52
Coverable lines: 52
Total lines: 98
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 20
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%
Save()0%210140%

File(s)

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

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using Microsoft.EntityFrameworkCore;
 4using OzonDomains.Models;
 5using OzonOrdersWeb.Areas.Studio2.ViewModels.Warehouse;
 6using OzonRepositories.Context;
 7
 8namespace OzonOrdersWeb.Areas.Studio2.Controllers.Directories;
 9
 10[Area("Studio2")]
 11[Authorize(Roles = "User,Admin")]
 12public class InterpartsWarehouseLoginController : Controller
 13{
 14    private readonly ApplicationDbContext _context;
 15
 016    public InterpartsWarehouseLoginController(ApplicationDbContext context)
 17    {
 018        _context = context;
 019    }
 20
 21    [HttpGet]
 22    public async Task<IActionResult> Index()
 23    {
 024        var warehouses = await _context.Warehouses
 025            .AsNoTracking()
 026            .OrderBy(w => w.Name)
 027            .ToListAsync()
 028            .ConfigureAwait(false);
 29
 030        var map = await _context.InterpartsWarehouseLogins
 031            .AsNoTracking()
 032            .ToDictionaryAsync(x => x.WarehouseId, x => x.Login)
 033            .ConfigureAwait(false);
 34
 035        var model = new InterpartsWarehouseLoginPageViewModel
 036        {
 037            Rows = warehouses.Select(w => new InterpartsWarehouseLoginRowViewModel
 038            {
 039                WarehouseId = w.Id,
 040                WarehouseName = w.Name ?? $"Склад #{w.Id}",
 041                Login = map.TryGetValue(w.Id, out var login) && !string.IsNullOrWhiteSpace(login)
 042                    ? login
 043                    : "admin"
 044            }).ToList()
 045        };
 46
 047        return View(model);
 048    }
 49
 50    [HttpPost]
 51    [ValidateAntiForgeryToken]
 52    public async Task<IActionResult> Save(InterpartsWarehouseLoginPageViewModel model)
 53    {
 054        if (model?.Rows == null || model.Rows.Count == 0)
 55        {
 056            TempData["ErrorMessage"] = "Нет данных для сохранения.";
 057            return RedirectToAction(nameof(Index));
 58        }
 59
 060        var warehouseIds = model.Rows
 061            .Select(r => r.WarehouseId)
 062            .Where(id => id > 0)
 063            .Distinct()
 064            .ToList();
 65
 066        var existing = await _context.InterpartsWarehouseLogins
 067            .Where(x => warehouseIds.Contains(x.WarehouseId))
 068            .ToDictionaryAsync(x => x.WarehouseId)
 069            .ConfigureAwait(false);
 70
 071        foreach (var row in model.Rows)
 72        {
 073            if (row.WarehouseId <= 0)
 74                continue;
 75
 076            var normalizedLogin = string.IsNullOrWhiteSpace(row.Login) ? "admin" : row.Login.Trim();
 77
 078            if (existing.TryGetValue(row.WarehouseId, out var entity))
 79            {
 080                entity.Login = normalizedLogin;
 081                _context.InterpartsWarehouseLogins.Update(entity);
 82            }
 83            else
 84            {
 085                _context.InterpartsWarehouseLogins.Add(new InterpartsWarehouseLogin
 086                {
 087                    WarehouseId = row.WarehouseId,
 088                    Login = normalizedLogin
 089                });
 90            }
 91        }
 92
 093        await _context.SaveChangesAsync().ConfigureAwait(false);
 094        TempData["SuccessMessage"] = "Логины Interparts по складам сохранены.";
 095        return RedirectToAction(nameof(Index));
 096    }
 97}
 98