using ComputerStoreBusinessLogic.BusinessLogic; using ComputerStoreContracts.BindingModels; using ComputerStoreContracts.BusinessLogicContracts; using ComputerStoreContracts.SearchModels; using ComputerStoreDataModels.Models; using Microsoft.AspNetCore.Mvc; using System.Text.RegularExpressions; namespace ComputerStoreSellerApp.Controllers { public class RequestController : Controller { private IRequestLogic _requestLogic; private IComponentLogic _componentLogic; private static List<(int componentId, int count)> selectedComponents = new(); public RequestController(IRequestLogic requestLogic, IComponentLogic componentLogic) { _requestLogic = requestLogic; _componentLogic = componentLogic; } [HttpPost("[controller]/[action]")] public IActionResult AddComponent(int component, int amount) { if (!HttpContext.Session.Keys.Contains("login")) { return RedirectToAction("Login", "Auth"); } if (amount <= 0) { return RedirectToAction("Create", "Request"); } var tmp = selectedComponents.FirstOrDefault(x => x.componentId == component && x.count > 0); if (tmp.componentId != 0) { selectedComponents.Remove((tmp.componentId, tmp.count)); selectedComponents.Add((component, tmp.count + amount)); } else { selectedComponents.Add((component, amount)); } return RedirectToAction("CreatePage", "Request"); } [HttpPost("[controller]/[action]")] public IActionResult UpdateComponent(int component, int amount, int id) { if (!HttpContext.Session.Keys.Contains("login")) { return RedirectToAction("Login", "Auth"); } if (amount <= 0) { return RedirectToAction("Create", "Request"); } var tmp = selectedComponents.FirstOrDefault(x => x.componentId == component && x.count > 0); if (tmp.componentId != 0) { selectedComponents.Remove((tmp.componentId, tmp.count)); selectedComponents.Add((component, tmp.count + amount)); } else { selectedComponents.Add((component, amount)); } ViewData["currentRequest"] = _requestLogic.ReadElement(new RequestSearchModel() { ID = id }); ViewData["components"] = _componentLogic.ReadList(null); ViewData["selectedComponents"] = selectedComponents; return View("Views/Request/Create.cshtml"); } [HttpGet("[controller]/[action]")] public IActionResult List() { if (!HttpContext.Session.Keys.Contains("login")) { return RedirectToAction("Login", "Auth"); } selectedComponents.Clear(); ViewData["requests"] = _requestLogic.ReadList(null); return View(); } [HttpGet("[controller]/[action]/{id}")] public IActionResult View(int id) { if (!HttpContext.Session.Keys.Contains("login")) { return RedirectToAction("Login", "Auth"); } var request = _requestLogic.ReadElement(new RequestSearchModel() { ID = id }); if (request is null) { TempData.Add("error", "Заявки с таким идентификатором не существует"); return RedirectToAction("List", "Request", null); } ViewData["currentRequest"] = request; ViewData["components"] = _componentLogic.ReadList(null); foreach (var selcomp in request.RequestComponents) { selectedComponents.Add((selcomp.Item1.ID, selcomp.Item2)); } ViewData["selectedComponents"] = selectedComponents; return View("Views/Request/Create.cshtml"); } [HttpGet("[controller]/[action]")] public IActionResult CreatePage() { if (!HttpContext.Session.Keys.Contains("login")) { return RedirectToAction("Login", "Auth"); } ViewData["selectedComponents"] = selectedComponents; ViewData["components"] = _componentLogic.ReadList(null); return View("Views/Request/Create.cshtml"); } [HttpPost("[controller]/[action]")] public IActionResult Create() { if (!HttpContext.Session.Keys.Contains("login")) { return RedirectToAction("Login", "Auth"); } if (selectedComponents.Count == 0) { TempData.Add("error", "Заявка должна содержать компоненты"); return RedirectToAction("CreatePage", "Request"); } try { double tmpPrice = 0; foreach (var (componentId, count) in selectedComponents) { tmpPrice += _componentLogic.ReadElement(new ComponentSearchModel() { ID = componentId })!.Price * count; } _requestLogic.Create(new RequestBindingModel() { OrderID = null, PCID = null, Price = tmpPrice, RequestComponents = selectedComponents.Select(x => ((IComponentModel)_componentLogic.ReadElement(new ComponentSearchModel() { ID = x.componentId })!, x.count)).ToList() }); selectedComponents.Clear(); return RedirectToAction("List", "Request", null); } catch (Exception e) { TempData.Add("error", Regex.Replace(e.Message, "[a-zA-Z\\(\\)']", "")); selectedComponents.Clear(); return RedirectToAction("List", "Request", null); } } [HttpPost("[controller]/[action]/{id}")] public IActionResult Edit(int id) { if (!HttpContext.Session.Keys.Contains("login")) { return RedirectToAction("Login", "Auth"); } if (selectedComponents.Count == 0) { TempData.Add("error", "Заявка должна содержать компоненты"); ViewData["currentRequest"] = _requestLogic.ReadElement(new RequestSearchModel() { ID = id }); ViewData["components"] = _componentLogic.ReadList(null); ViewData["selectedComponents"] = selectedComponents; return View("Views/Request/Create.cshtml"); } try { double tmpPrice = 0; foreach (var (componentId, count) in selectedComponents) { tmpPrice += _componentLogic.ReadElement(new ComponentSearchModel() { ID = componentId })!.Price * count; } _requestLogic.Update(new RequestBindingModel() { ID = id, OrderID = _requestLogic.ReadElement(new RequestSearchModel() { ID = id })?.OrderID, PCID = _requestLogic.ReadElement(new RequestSearchModel() { ID = id })?.PCID, Price = tmpPrice, RequestComponents = selectedComponents.Select(x => ((IComponentModel)_componentLogic.ReadElement(new ComponentSearchModel() { ID = x.componentId })!, x.count)).ToList(), }); selectedComponents.Clear(); return RedirectToAction("List", "Request", null); } catch (Exception e) { TempData.Add("error", Regex.Replace(e.Message, "[a-zA-Z\\(\\)']", "")); return RedirectToAction("View", "Request", new { id = id }); } } [HttpPost("[controller]/[action]/{id}")] public IActionResult Delete(int id) { if (!HttpContext.Session.Keys.Contains("login")) { return RedirectToAction("Login", "Auth"); } var deletedRequest = _requestLogic.ReadElement(new RequestSearchModel { ID = id }); if (deletedRequest != null && deletedRequest.PCID == null && deletedRequest.OrderID == null) { _requestLogic.Delete(new RequestBindingModel() { ID = id }); } return RedirectToAction("List", "Request", null); } [HttpPost("[controller]/[action]/{selectedcomponentid}/{currentrequestid}")] public IActionResult DeleteComponent(int selectedcomponentid, int currentrequestid) { if (!HttpContext.Session.Keys.Contains("login")) { return RedirectToAction("Login", "Auth"); } selectedComponents.Remove(selectedComponents.FirstOrDefault(x => x.componentId == selectedcomponentid && x.count > 0)); if (currentrequestid > 0) { ViewData["currentRequest"] = _requestLogic.ReadElement(new RequestSearchModel() { ID = currentrequestid }); ViewData["components"] = _componentLogic.ReadList(null); ViewData["selectedComponents"] = selectedComponents; return View("Views/Request/Create.cshtml"); } else { return RedirectToAction("CreatePage", "Request"); } } } }