using Contracts.BindingModels; using Contracts.SearchModels; using Contracts.StoragesContracts; using Contracts.ViewModels; using DatabaseImplement.Models; using Microsoft.EntityFrameworkCore; namespace DatabaseImplement.Implements { public class ProductStorage : IProductStorage { public ProductViewModel? Delete(ProductBindingModel model) { using var context = new FactoryGoWorkDatabase(); var newProduct = context.Products.FirstOrDefault(x => x.Id == model.Id); if (newProduct == null) return null; newProduct.UpdateDetails(context, model); context.Products.Remove(newProduct); context.SaveChanges(); return newProduct.GetViewModel; } public ProductViewModel? GetElement(ProductSearchModel model) { using var context = new FactoryGoWorkDatabase(); return context.Products.Include(p => p.Details).ThenInclude(p => p.Detail).Include(p => p.Machine).FirstOrDefault(x => (!string.IsNullOrEmpty(model.Name) && x.Name.Contains(model.Name)) || (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; } public List GetFilteredList(ProductSearchModel model) { if (!model.UserId.HasValue && !model.WorkerId.HasValue && !model.DetailId.HasValue) { return new(); } using var context = new FactoryGoWorkDatabase(); if (model.DetailId.HasValue) return context.Products.Include(p => p.Details).ThenInclude(p => p.Detail).Include(p => p.Machine).Where(x => x.UserId == model.UserId).Where(x => x.Details.FirstOrDefault(y => y.DetailId == model.DetailId) != null).Select(x => x.GetViewModel).ToList(); else if (model.WorkerId.HasValue) return context.Products.Where(p => p.MachineId.HasValue).Include(p => p.Machine).ThenInclude(p => p.Workers).Where(x => x.Machine.Workers.FirstOrDefault(y => y.WorkerId == model.WorkerId) != null).Select(x => x.GetViewModel).ToList(); else return context.Products.Include(p => p.Details).ThenInclude(p => p.Detail).Include(p => p.Machine).Where(x => x.UserId == model.UserId).Select(x => x.GetViewModel).ToList(); } public List GetFullList() { using var context = new FactoryGoWorkDatabase(); return context.Products.Include(p => p.Details).ThenInclude(p => p.Detail).Select(x => x.GetViewModel).ToList(); } public ProductViewModel? Insert(ProductBindingModel model) { using var context = new FactoryGoWorkDatabase(); var newProduct = Product.Create(context, model); if (newProduct == null) return null; context.Products.Add(newProduct); context.SaveChanges(); return newProduct.GetViewModel; } public ProductViewModel? Update(ProductBindingModel model) { using var context = new FactoryGoWorkDatabase(); var newProduct = context.Products.FirstOrDefault(x => x.Id == model.Id); if (newProduct == null) return null; newProduct.Update(model); newProduct.UpdateDetails(context, model); context.SaveChanges(); return newProduct.GetViewModel; } } }