namespace GrossesMitainesAPI.Controllers; #region Dependencies using Microsoft.AspNetCore.Mvc; using GrossesMitainesAPI.Models; using System.Linq; using GrossesMitainesAPI.Data; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Cors; using GrossesMitainesAPI.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Hosting; #endregion [EnableCors("_myAllowSpecificOrigins"), ApiController, Route("api/[controller]"), Authorize(AuthenticationSchemes = "Identity.Application")] public class InventoryController : Controller { #region Constants private const int AMOUNT_SCROLL = 6; #endregion #region DI Fields private readonly ILogger _logger; private readonly InventoryContext _context; private readonly DatabaseCacheService _cache; private readonly IWebHostEnvironment _hostEnvironment; #endregion #region Ctor public InventoryController(ILogger logger, InventoryContext context, DatabaseCacheService cache, IWebHostEnvironment hostEnvironment) { _context = context; _logger = logger; _cache = cache; _hostEnvironment = hostEnvironment; } #endregion #region API Methods [EnableCors("_myAllowSpecificOrigins"), HttpGet(Name = "Inventory"), AllowAnonymous] // Pour faire des calls async par paquet de AMOUNT (5) (pour du loading en scrollant) public IEnumerable Get(int? lastId, string? order, string? filterPrice, string? filterState, bool? all) { bool iscache = false; IQueryable ret; if (_cache.isOk()) { ret = _cache.queryCache().Select(x => new ProductViewModel(x)); iscache = true; } else ret = _context.Products.AsQueryable().Select(x => new ProductViewModel(x)); switch (filterPrice) { case "PriceUnder20": ret = ret.Where(x => x.Price < 20); break; case "Price20to49": ret = ret.Where(x => x.Price >= 20 && x.Price < 50); break; case "Price50to99": ret = ret.Where(x => x.Price >= 50 && x.Price < 100); break; case "PriceOver100": ret = ret.Where(x => x.Price >= 100); break; default: break; } switch (filterState) { case "isAvailable": ret = ret.Where(x => x.Status == ProductModel.States.Available); break; case "isUnavailable": ret = ret.Where(x => x.Status == ProductModel.States.Unavailable); break; case "isBackOrder": ret = ret.Where(x => x.Status == ProductModel.States.BackOrder); break; ; case "isClearance": ret = ret.Where(x => x.Status == ProductModel.States.Clearance); break; case "isDiscontinued": ret = ret.Where(x => x.Status == ProductModel.States.Discontinued); break; case "isPromoted": ret = ret.Where(x => x.Status == ProductModel.States.Clearance || x.Status == ProductModel.States.Promotion); break; default: break; } switch (order) { case "Price": ret = ret.OrderBy(x => x.Status == ProductModel.States.Promotion || x.Status == ProductModel.States.Clearance ? x.PromoPrice : x.Price); break; case "PriceDesc": ret = ret.OrderByDescending(x => x.Status == ProductModel.States.Promotion || x.Status == ProductModel.States.Clearance ? x.PromoPrice : x.Price); break; case "Title": ret = ret.OrderBy(x => x.Title); break; case "TitleDesc": ret = ret.OrderByDescending(x => x.Title); break; case "Category": ret = ret.OrderBy(x => x.Category); break; case "CategoryDesc": ret = ret.OrderByDescending(x => x.Category); break; default: break; } List lst = new(); bool yup = false; int add = 0; try { if (!lastId.HasValue || lastId == 0) yup = true; foreach (ProductViewModel prod in ret.ToList()) { if (yup && add < AMOUNT_SCROLL || (all.HasValue && all == true)) { lst.Add(prod); add++; } if (!yup && prod.Id == lastId) yup = true; } return lst; } catch (Exception e) { if (iscache) _logger.LogError(e, "Erreur d'appel de cache."); else _logger.LogError(e, "Erreur d'appel d'API."); return new List(); } } // Inventory/Delete => Décrémenter un produit. Va aller chercher directement dans la BD. //[EnableCors("_myAllowSpecificOrigins"), HttpDelete(Name = "Inventory"), AllowAnonymous] //public ActionResult Delete(int? id) { // int rid = 0; // if (!id.HasValue) { // _logger.LogError(8, "Tentative de vente sans Id."); // return BadRequest(); // } // try { // ProductModel prod = _context.Products.First(x => x.Id == id); // rid = prod.Id; // if (prod.Quantity > 0) { // prod.Quantity = prod.Quantity - 1; // prod.Sales = prod.Sales + 1; // prod.LastSale = DateTime.Now; // if (prod.Quantity == 0) // prod.Status = prod.Status == ProductModel.States.Clearance ? // ProductModel.States.Discontinued : // ProductModel.States.BackOrder; // } else { // _logger.LogError(8, $"Vente de produit pas en stock. Id Produit: {prod.Id}"); // return BadRequest(); // } // _context.Products.Update(prod); // _context.SaveChanges(); // } catch (Exception e) { // _logger.LogError(8, e.Message); // return BadRequest(); // } // _cache.askForRefresh(); // return rid; //} #endregion }