using Microsoft.AspNetCore.Mvc; using RhSolutions.Models; using RhSolutions.Api.Services; using Microsoft.AspNetCore.Authorization; namespace RhSolutions.Api.Controllers { [Route("api/[controller]")] public class ProductsController : ControllerBase { private RhSolutionsContext dbContext; private IPricelistParser parser; public ProductsController(RhSolutionsContext dbContext, IPricelistParser parser) { this.dbContext = dbContext; this.parser = parser; } /// /// Возвращает все продукты в базе данных /// /// [HttpGet] public IAsyncEnumerable GetProducts() { return dbContext.Products .AsAsyncEnumerable(); } /// /// Возвращает продукт по номеру артикула /// /// Номер артикула /// [HttpGet("{id}")] public IEnumerable GetProduct(string id) { return dbContext.Products .Where(p => p.Id.Equals(id)); } /// /// Загрузка прайс-листа в формате xlsx в базу данных /// /// [HttpPost] [Authorize(AuthenticationSchemes = "Identity.Application, Bearer")] public IActionResult PostProductsFromXls() { try { var file = Request.Form.Files.FirstOrDefault(); var products = parser.GetProducts(file) .GroupBy(p => p.ProductSku) .Select(g => new Product(g.Key) { Name = g.First().Name, DeprecatedSkus = g.SelectMany(p => p.DeprecatedSkus).Distinct().ToList(), ProductLines = g.SelectMany(p => p.ProductLines).Distinct().ToList(), IsOnWarehouse = g.Any(p => p.IsOnWarehouse == true), ProductMeasure = g.First().ProductMeasure, DeliveryMakeUp = g.First().DeliveryMakeUp, Price = g.First().Price }); dbContext.AddRange(products); dbContext.SaveChanges(); return Ok(); } catch (Exception ex) { return BadRequest(ex.Message); } } /// /// Удаление всех продуктов из базы данных /// /// [HttpDelete] [Authorize(AuthenticationSchemes = "Identity.Application, Bearer")] public IActionResult DeleteAllProducts() { List deleted = new(); if (dbContext.Products.Count() > 0) { foreach (Product p in dbContext.Products) { deleted.Add(p); dbContext.Remove(p); } dbContext.SaveChanges(); return Ok(deleted); } else return Ok("Empty db"); } } }