< Summary

Class:SVETA.Api.Controllers.BrandsController
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Controllers/BrandsController.cs
Covered lines:0
Uncovered lines:71
Coverable lines:71
Total lines:208
Line coverage:0% (0 of 71)
Covered branches:0
Total branches:32
Branch coverage:0% (0 of 32)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
GetBrandsCount()0%0%
GetBrand()0%0%
CreateBrand()0%0%
UpdateBrand()0%0%
DeleteBrand()0%0%

File(s)

/opt/dev/sveta_api_build/SVETA.Api/Controllers/BrandsController.cs

#LineLine coverage
 1using System;
 2using WinSolutions.Sveta.Common.Extensions;
 3using System.Collections.Generic;
 4using System.Linq;
 5using System.Threading.Tasks;
 6using Microsoft.AspNetCore.Mvc;
 7using Microsoft.Extensions.Logging;
 8using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 9using WinSolutions.Sveta.Server.Services.Interfaces;
 10using Swashbuckle.AspNetCore.Annotations;
 11using SVETA.Api.Data.DTO;
 12using Microsoft.AspNetCore.Authorization;
 13
 14namespace SVETA.Api.Controllers
 15{
 16    [Route("api/v1/Brands")]
 17    [ApiController]
 18    [Authorize]
 19    public class BrandsController : SvetaController
 20    {
 21        private readonly IBrandService _brandService;
 22        private readonly ILogger<BrandsController> _logger;
 23
 024        public BrandsController(IBrandService brandService, ILogger<BrandsController> logger): base(logger)
 025        {
 026            _brandService = brandService;
 027            _logger = logger;
 028        }
 29
 30        /// <summary>
 31        /// Возвращает количество брендов с учётом фильтрации
 32        /// </summary>
 33        /// <remarks>author: nko/obo</remarks>
 34        /// <param name="filter">Фильтр по значимым полям (Name)</param>
 35        /// <param name="parentId">код родительского бренда, -1 если считать по всем брендам базы</param>
 36        /// <returns>Количество брендов </returns>
 37        [HttpGet("Count")]
 38        [SwaggerResponse(200, "Успешно", typeof(CountDTO))]
 39        [SwaggerResponse(400, "Переданы некорректные параметры", typeof(ErrorDTO))]
 40        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 41        [Authorize(Roles = Role.SystemAdmin +"," + Role.SystemOperator)]
 42        public async Task<IActionResult> GetBrandsCount(string filter = "", long parentId = -1)
 043        {
 044            filter = filter.NormalizeName();
 045            return Ok(new CountDTO ((int)await _brandService.GetBrandsCount(filter, parentId != -1 ? parentId : (long?)n
 046        }
 47
 48        /// <summary>
 49        /// Возвращает список брендов с учётом фильтрации, сортировки и пагинации
 50        /// </summary>
 51        /// <remarks>author: nko</remarks>
 52        /// <param name="sort">Сортировка в виде field_name|order. order может принимать значения asc либо desc, field_n
 53        /// <param name="filter">Фильтр по значимым полям (name)</param>
 54        /// <param name="page">Любое значение ниже нуля изменится на 1, Номер страницы</param>
 55        /// <param name="limit">Любое значение ниже нуля изменится на 10, Записей на странице</param>
 56        /// <param name="parentId">Идентифиатор родительской категории: null - все категории, 0 - корневые категории, 1.
 57        /// <returns>Список брендов</returns>
 58        [HttpGet("")]
 59        [SwaggerResponse(200, "Успешно", typeof(List<BrandOutputDTO>))]
 60        [SwaggerResponse(400, "Переданы некорректные параметры", typeof(ErrorDTO))]
 61        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 62        [Authorize(Roles = Role.SystemAdmin+"," + Role.SystemOperator)]
 63        public async Task<IActionResult> GetBrands(string sort = "", string filter = "", int page = 1, int limit = 10, l
 64        {
 65            filter = filter.NormalizeName();
 66            page = page < 1 ? 1 : page;
 67            limit = limit < 1 ? 10 : limit;
 68            var items = await _brandService.GetBrands(sort, filter, page, limit, parentId != -1 ? parentId : (long?)null
 69
 070            var itemIds = items.Select(x => x.Id).ToArray();
 71
 72            var parentsId = await _brandService.CheckParentIds(itemIds);
 073            var result = items.Select(x => new BrandOutputDTO(x)
 074            {
 075                Expandable = parentsId.Count != 0 && parentsId.Contains(x.Id)
 076            });
 77            return Ok(result);
 78        }
 79
 80        /// <summary>
 81        /// Возвращает бренд по его ID
 82        /// </summary>
 83        /// <remarks>author: nko</remarks>
 84        /// <param name="id">ID записи</param>
 85        /// <returns></returns>
 86        [HttpGet("{id}")]
 87        [SwaggerResponse(200, "Успешно", typeof(BrandOutputDTO))]
 88        [SwaggerResponse(400, "Переданы некорректные параметры", typeof(ErrorDTO))]
 89        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 90        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 91        [Authorize(Roles = Role.SystemAdmin+"," + Role.SystemOperator)]
 92        public async Task<IActionResult> GetBrand([SwaggerParameter(Required = true)]long id)
 093        {
 094            var brand = await _brandService.GetBrand(id);
 095            if(brand == null)
 096            {
 097                return NotFoundResult("Бренд не найден");
 98            }
 99            else
 0100            {
 0101                long[] itemIds = { brand.Id};
 102
 0103                var parentsId = await _brandService.CheckParentIds(itemIds);
 0104                var result = new BrandOutputDTO(brand)
 0105                {
 0106                    Expandable = parentsId.Count != 0 && parentsId.Contains(brand.Id)
 0107                };
 0108                return Ok(result);
 109            }
 0110        }
 111
 112        /// <summary>
 113        /// Создает новый бренд
 114        /// </summary>
 115        /// <remarks>author: nko</remarks>
 116        /// <param name="brand">Объект с полями брэнда</param>
 117        /// <returns></returns>
 118        [HttpPost("")]
 119        [SwaggerResponse(200, "Успешно", typeof(BrandOutputDTO))]
 120        [SwaggerResponse(400, "Переданы некорректные параметры", typeof(ErrorDTO))]
 121        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 122        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 123        [Authorize(Roles = Role.SystemAdmin)]
 124        public async Task<IActionResult> CreateBrand([FromBody] [SwaggerParameter(Required = true)]BrandInputDTO brand)
 0125        {
 0126            Brand newBrand = new Brand();
 0127            newBrand.GUID = newBrand.GUID == Guid.Empty ? Guid.NewGuid() : newBrand.GUID;
 0128            newBrand.Name = brand.Name;
 0129            if (brand.ParentId > 0)
 0130            {
 0131                newBrand.Parent = await _brandService.GetBrand(brand.ParentId);
 0132                if(newBrand.Parent == null)
 0133                {
 0134                    return NotFoundResult($"Родительский брэнд #{brand.ParentId} не найден");
 135                }
 0136            }
 0137            await _brandService.CreateBrand(newBrand);
 138
 0139            return CreatedAtAction("GetBrand", new { id = newBrand.Id }, newBrand);
 0140        }
 141
 142        /// <summary>
 143        /// Обновляет существующий бренд
 144        /// </summary>
 145        /// <remarks>author: nko</remarks>
 146        /// <param name="brand">Объект с полями брэнда</param>
 147        /// <param name="id">Id объекта для обновления</param>
 148        /// <returns></returns>
 149        [HttpPut("{id}")]
 150        [SwaggerResponse(200, "Успешно", typeof(BrandOutputDTO))]
 151        [SwaggerResponse(400, "Переданы некорректные параметры", typeof(ErrorDTO))]
 152        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 153        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 154        [Authorize(Roles = Role.SystemAdmin)]
 155        public async Task<IActionResult> UpdateBrand([SwaggerParameter(Required = true)] long id, [FromBody] [SwaggerPar
 0156        {
 0157            Brand editedBrand = await _brandService.GetBrand(id);
 0158            if(editedBrand == null)
 0159            {
 0160                return NotFoundResult("Бренд не найден");
 161            }
 0162            editedBrand.Name = brand.Name;
 0163            if (brand.ParentId > 0)
 0164            {
 0165                var isCollisium = await _brandService.CheckCollision(editedBrand.Id, brand.ParentId);
 0166                if (editedBrand.Id == brand.ParentId || isCollisium) //TODO переделать проверку
 0167                    return BadRequestResult("Дочерний и родительский брэнд не могут ссылаться друг на друга");
 168
 0169                editedBrand.Parent = await _brandService.GetBrand(brand.ParentId);
 0170                if (editedBrand.Parent == null)
 0171                {
 0172                    return NotFoundResult($"Родительский брэнд не найден");
 173                }
 0174            }
 0175            await _brandService.UpdateBrand(editedBrand);
 176
 0177            return CreatedAtAction("GetBrand", new { id = editedBrand.Id }, new BrandOutputDTO(editedBrand));
 0178        }
 179
 180        /// <summary>
 181        /// Удаляет запись Бренд
 182        /// </summary>
 183        /// <remarks>author: nko</remarks>
 184        /// <param name="id">ID записи</param>
 185        /// <returns></returns>
 186        [HttpDelete("{id}")]
 187        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 188        [SwaggerResponse(400, "Переданы некорректные параметры", typeof(ErrorDTO))]
 189        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 190        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 191        [Authorize(Roles = Role.SystemAdmin)]
 192        public async Task<IActionResult> DeleteBrand([SwaggerParameter(Required = true)]long id)
 0193        {
 0194            if (await _brandService.BrandExists(id) == false)
 0195            {
 0196                return NotFoundResult("Бренд не найден");
 197            }
 198
 0199            if(await _brandService.GetBrandsCount(null, id) > 0)
 0200            {
 0201                return BadRequestResult($"Брэнд #{id} имеет дочерние брэнды и не может быть удалён");
 202            }
 203
 0204            await _brandService.DeleteBrand(id);
 0205            return Ok();
 0206        }
 207    }
 208}