From 2d19c33ad3ca0a35a2f4e0fc2b6203591890bb5a Mon Sep 17 00:00:00 2001 From: bocchanskyy Date: Fri, 3 May 2024 21:45:35 +0400 Subject: [PATCH] Database (recovery...) --- BeautyStudio/BeautyStudio.sln | 6 + .../BeautyStudioDatabase.cs | 29 ++++ .../BeautyStudioDatabaseImplement.csproj | 24 +++ .../Implements/ClientStorage.cs | 97 ++++++++++++ .../Implements/CosmeticStorage.cs | 111 ++++++++++++++ .../Implements/LaborCostStorage.cs | 96 ++++++++++++ .../Implements/OrderStorage.cs | 140 ++++++++++++++++++ .../Implements/ProcedureStorage.cs | 128 ++++++++++++++++ .../Implements/ServiceStorage.cs | 134 +++++++++++++++++ .../Implements/StaffStorage.cs | 97 ++++++++++++ .../Models/Client.cs | 68 +++++++++ .../Models/Cosmetic.cs | 69 +++++++++ .../Models/LaborCost.cs | 57 +++++++ .../Models/Order.cs | 69 +++++++++ .../Models/OrderService.cs | 24 +++ .../Models/Procedure.cs | 108 ++++++++++++++ .../Models/ProcedureCosmetics.cs | 24 +++ .../Models/Service.cs | 53 +++++++ .../Models/ServiceProcedure.cs | 25 ++++ .../Models/Staff.cs | 75 ++++++++++ 20 files changed, 1434 insertions(+) create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/BeautyStudioDatabase.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/BeautyStudioDatabaseImplement.csproj create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Implements/ClientStorage.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Implements/CosmeticStorage.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Implements/LaborCostStorage.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Implements/OrderStorage.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Implements/ProcedureStorage.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Implements/ServiceStorage.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Implements/StaffStorage.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/Client.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/Cosmetic.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/LaborCost.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/Order.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/OrderService.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/Procedure.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/ProcedureCosmetics.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/Service.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/ServiceProcedure.cs create mode 100644 BeautyStudio/BeautyStudioDatabaseImplement/Models/Staff.cs diff --git a/BeautyStudio/BeautyStudio.sln b/BeautyStudio/BeautyStudio.sln index 13d9e8e..f1abd52 100644 --- a/BeautyStudio/BeautyStudio.sln +++ b/BeautyStudio/BeautyStudio.sln @@ -11,6 +11,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BeautyStudioContracts", "Be EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BeautyStudioBusinessLogic", "BeautyStudioBusinessLogic\BeautyStudioBusinessLogic.csproj", "{25B40F20-807F-4A09-80E5-4A94EE480FB6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BeautyStudioDatabaseImplement", "BeautyStudioDatabaseImplement\BeautyStudioDatabaseImplement.csproj", "{8BEBC76F-F7B5-46CB-A42B-28E133452D52}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -33,6 +35,10 @@ Global {25B40F20-807F-4A09-80E5-4A94EE480FB6}.Debug|Any CPU.Build.0 = Debug|Any CPU {25B40F20-807F-4A09-80E5-4A94EE480FB6}.Release|Any CPU.ActiveCfg = Release|Any CPU {25B40F20-807F-4A09-80E5-4A94EE480FB6}.Release|Any CPU.Build.0 = Release|Any CPU + {8BEBC76F-F7B5-46CB-A42B-28E133452D52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BEBC76F-F7B5-46CB-A42B-28E133452D52}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BEBC76F-F7B5-46CB-A42B-28E133452D52}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BEBC76F-F7B5-46CB-A42B-28E133452D52}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/BeautyStudioDatabase.cs b/BeautyStudio/BeautyStudioDatabaseImplement/BeautyStudioDatabase.cs new file mode 100644 index 0000000..cf784e8 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/BeautyStudioDatabase.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore; +using BeautyStudioDatabaseImplement.Models; +using System.Collections.Generic; + +namespace BeautyStudioDatabaseImplement +{ + public class BeautyStudioDatabase : DbContext + { + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + if (optionsBuilder.IsConfigured == false) + { + optionsBuilder.UseNpgsql(@"Host=localhost;Port=5432;Database=BeautyStudioDatabase;Username=postgres;Password=postgres"); + } + base.OnConfiguring(optionsBuilder); + } + + public virtual DbSet Orders { set; get; } + public virtual DbSet OrderService { set; get; } + public virtual DbSet LaborCost { set; get; } + public virtual DbSet Cosmetics { set; get; } + public virtual DbSet Services { set; get; } + public virtual DbSet ServiceProcedures { set; get; } + public virtual DbSet Procedures { set; get; } + public virtual DbSet ProcedureCosmetics { set; get; } + public virtual DbSet Staffs { set; get; } + public virtual DbSet Clients { set; get; } + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/BeautyStudioDatabaseImplement.csproj b/BeautyStudio/BeautyStudioDatabaseImplement/BeautyStudioDatabaseImplement.csproj new file mode 100644 index 0000000..5d83c44 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/BeautyStudioDatabaseImplement.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + enable + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Implements/ClientStorage.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/ClientStorage.cs new file mode 100644 index 0000000..b87ba44 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/ClientStorage.cs @@ -0,0 +1,97 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.SearchModels; +using BeautyStudioContracts.StoragesContracts; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.Linq; + +namespace BeautyStudioDatabaseImplement.Implements +{ + public class ClientStorage : IClientStorage + { + public ClientViewModel? Delete(ClientBindingModel model) + { + using var context = new BeautyStudioDatabase(); + + var element = context.Clients.FirstOrDefault(rec => rec.Id == model.Id); + + if (element != null) + { + context.Clients.Remove(element); + context.SaveChanges(); + + return element.GetViewModel; + } + + return null; + } + + + public ClientViewModel? GetElement(ClientSearchModel model) + { + using var context = new BeautyStudioDatabase(); + if (model.Id.HasValue) + return context.Clients + .FirstOrDefault(x => x.Id == model.Id)? + .GetViewModel; + + if (!string.IsNullOrEmpty(model.ClientLogin) && + !string.IsNullOrEmpty(model.ClientPassword)) + return context.Clients + .FirstOrDefault(x => + x.ClientLogin.Equals(model.ClientLogin) && + x.ClientPassword.Equals(model.ClientPassword))? + .GetViewModel; + + return null; + } + + public List GetFilteredList(ClientSearchModel model) + { + throw new NotImplementedException(); + } + + public List GetFullList() + { + using var context = new BeautyStudioDatabase(); + return context.Clients + .Select(x => x.GetViewModel) + .ToList(); + } + + public ClientViewModel? Insert(ClientBindingModel model) + { + using var context = new BeautyStudioDatabase(); + + var newClient = Client.Create(model); + + if (newClient == null) + { + return null; + } + context.Clients.Add(newClient); + context.SaveChanges(); + + return newClient.GetViewModel; + } + + public ClientViewModel? Update(ClientBindingModel model) + { + using var context = new BeautyStudioDatabase(); + + var client = context.Clients.FirstOrDefault(x => x.Id == model.Id); + + if (client == null) + { + return null; + } + + client.Update(model); + context.SaveChanges(); + + return client.GetViewModel; + } + } +} \ No newline at end of file diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Implements/CosmeticStorage.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/CosmeticStorage.cs new file mode 100644 index 0000000..64504aa --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/CosmeticStorage.cs @@ -0,0 +1,111 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.SearchModels; +using BeautyStudioContracts.StoragesContracts; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; + +namespace BeautyStudioDatabaseImplement.Implements +{ + public class CosmeticStorage : ICosmeticStorage + { + public List GetFullList() + { + using var context = new BeautyStudioDatabase(); + return context.Cosmetics + //.Include(x => x.Procedures) + //.ThenInclude(x => x.Procedure) + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(CosmeticSearchModel model) + { + using var context = new BeautyStudioDatabase(); + if (model.Id.HasValue) + { + return context.Cosmetics + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + if (model.LaborCostId.HasValue) + { + return context.Cosmetics + .Where(x => x.LaborCostId == model.LaborCostId) + .Select(x => x.GetViewModel) + .ToList(); + } + + return new(); + } + + public CosmeticViewModel? GetElement(CosmeticSearchModel model) + { + if (string.IsNullOrEmpty(model.CosmeticName) && !model.Id.HasValue) + { + return null; + } + using var context = new BeautyStudioDatabase(); + return context.Cosmetics + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.CosmeticName) && x.CosmeticName == model.CosmeticName) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public CosmeticViewModel? Insert(CosmeticBindingModel model) + { + var newCosmetic = Cosmetic.Create(model); + if (newCosmetic == null) + { + return null; + } + using var context = new BeautyStudioDatabase(); + context.Cosmetics.Add(newCosmetic); + context.SaveChanges(); + return newCosmetic.GetViewModel; + } + + public CosmeticViewModel? Update(CosmeticBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var сosmetic = context.Cosmetics.FirstOrDefault(x => x.Id == model.Id); + if (сosmetic == null) + { + return null; + } + сosmetic.Update(model); + context.SaveChanges(); + return сosmetic.GetViewModel; + } + + public CosmeticViewModel? Delete(CosmeticBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var element = context.Cosmetics.FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Cosmetics.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + + public List GetCosmeticProcedures(CosmeticSearchModel model) + { + if (model == null) + { + return new(); + } + using var context = new BeautyStudioDatabase(); + var procedures = context.CosmeticProcedures + .Where(x => x.CosmeticId == model.Id) + .Select(x => x.Procedure.GetViewModel) + .ToList(); + return procedures; + } + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Implements/LaborCostStorage.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/LaborCostStorage.cs new file mode 100644 index 0000000..e7dfaf0 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/LaborCostStorage.cs @@ -0,0 +1,96 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.SearchModels; +using BeautyStudioContracts.StoragesContracts; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDatabaseImplement.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Implements +{ + public class LaborCostStorage : ILaborCostStorage + { + public LaborCostViewModel? Delete(LaborCostBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var element = context.LaborCost.FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.LaborCost.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + + public LaborCostViewModel? GetElement(LaborCostSearchModel model) + { + if (!model.Id.HasValue) + { + return null; + } + using var context = new BeautyStudioDatabase(); + return context.LaborCost + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + } + + public List GetFilteredList(LaborCostSearchModel model) + { + using var context = new BeautyStudioDatabase(); + if (model.Id.HasValue) + { + return context.LaborCost + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + if (model.StaffId.HasValue) + { + return context.LaborCost + .Where(x => x.StaffId == model.StaffId) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + + public List GetFullList() + { + using var context = new BeautyStudioDatabase(); + return context.LaborCost + .Select(x => x.GetViewModel) + .ToList(); + } + + public LaborCostViewModel? Insert(LaborCostBindingModel model) + { + var newLaborCost = LaborCost.Create(model); + if (newLaborCost == null) + { + return null; + } + using var context = new BeautyStudioDatabase(); + context.LaborCost.Add(newLaborCost); + context.SaveChanges(); + return newLaborCost.GetViewModel; + } + + public LaborCostViewModel? Update(LaborCostBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var laborCosts = context.LaborCost.FirstOrDefault(x => x.Id == model.Id); + if (laborCosts == null) + { + return null; + } + laborCosts.Update(model); + context.SaveChanges(); + return laborCosts.GetViewModel; + } + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Implements/OrderStorage.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/OrderStorage.cs new file mode 100644 index 0000000..feacd97 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/OrderStorage.cs @@ -0,0 +1,140 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.SearchModels; +using BeautyStudioContracts.StoragesContracts; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Implements +{ + public class OrderStorage : IOrderStorage + { + public OrderViewModel? Delete(OrderBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var element = context.Orders + .Include(x => x.Services) + .Include(x => x.Procedures) + .Include(x => x.Cosmetics) + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Orders.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + + public OrderViewModel? GetElement(OrderSearchModel model) + { + if (!model.Id.HasValue) + { + return null; + } + using var context = new BeautyStudioDatabase(); + return context.Orders + .Include(x => x.Services) + .ThenInclude(x => x.Service) + .Include(x => x.Procedures) + .ThenInclude(x => x.Procedure) + .Include(x => x.Cosmetics) + .ThenInclude(x => x.Cosmetic) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + } + + public List GetFilteredList(OrderSearchModel model) + { + if (model == null) + { + return new(); + } + using var context = new BeautyStudioDatabase(); + if (model.ClientId.HasValue && model.OrderDate.HasValue) + { + return context.Orders + .Include(x => x.Services) + .ThenInclude(x => x.Service) + .Include(x => x.Procedures) + .ThenInclude(x => x.Procedure) + .Include(x => x.Cosmetics) + .ThenInclude(x => x.Cosmetic) + .Where(x => x.ClientId == model.ClientId && + x.OrderDate == model.OrderDate).ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + if (model.ClientId.HasValue) + { + return context.Orders + .Include(x => x.Services) + .ThenInclude(x => x.Service) + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + + public List GetFullList() + { + using var context = new BeautyStudioDatabase(); + return context.Orders + .Include(x => x.Services) + .ThenInclude(x => x.Service) + .Include(x => x.Procedures) + .ThenInclude(x => x.Procedure) + .Include(x => x.Cosmetics) + .ThenInclude(x => x.Cosmetic) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + + public OrderViewModel? Insert(OrderBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var newOrder = Order_.Create(context, model); + if (newOrder == null) + { + return null; + } + context.Orders.Add(newOrder); + context.SaveChanges(); + return newOrder.GetViewModel; + } + + public OrderViewModel? Update(OrderBindingModel model) + { + using var context = new BeautyStudioDatabase(); + using var transaction = context.Database.BeginTransaction(); + try + { + var order = context.Orders.FirstOrDefault(rec => rec.Id == model.Id); + if (order == null) + { + return null; + } + order.Update(model); + context.SaveChanges(); + order.UpdateServices(context, model); + order.UpdateProcedures(context, model); + order.UpdateCosmetics(context, model); + transaction.Commit(); + return order.GetViewModel; + } + catch + { + transaction.Rollback(); + throw; + } + } + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Implements/ProcedureStorage.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/ProcedureStorage.cs new file mode 100644 index 0000000..83062a3 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/ProcedureStorage.cs @@ -0,0 +1,128 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.SearchModels; +using BeautyStudioContracts.StoragesContracts; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Implements +{ + public class ProcedureStorage : IProcedureStorage + { + public ProcedureViewModel? Delete(ProcedureBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var element = context.Procedures + .Include(x => x.Cosmetics) + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Procedures.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + + public ProcedureViewModel? GetElement(ProcedureSearchModel model) + { + if (string.IsNullOrEmpty(model.ProcedureName) && !model.Id.HasValue) + { + return null; + } + using var context = new BeautyStudioDatabase(); + return context.Procedures + .Include(x => x.Cosmetics) + .ThenInclude(x => x.Cosmetic) + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ProcedureName) && x.ProcedureName == model.ProcedureName) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public List GetFilteredList(ProcedureSearchModel model) + { + using var context = new BeautyStudioDatabase(); + if (model.Id.HasValue) + { + return context.Procedures + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + if (model.ClientId.HasValue) + { + return context.Procedures + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + + public List GetFullList() + { + using var context = new BeautyStudioDatabase(); + return context.Procedures + .Include(x => x.Cosmetics) + .ThenInclude(x => x.Cosmetic) + .Select(x => x.GetViewModel) + .ToList(); + } + + public ProcedureViewModel? Insert(ProcedureBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var newProcedure = Procedure.Create(context, model); + if (newProcedure == null) + { + return null; + } + context.Procedures.Add(newProcedure); + context.SaveChanges(); + return newProcedure.GetViewModel; + } + + public ProcedureViewModel? Update(ProcedureBindingModel model) + { + using var context = new BeautyStudioDatabase(); + using var transaction = context.Database.BeginTransaction(); + try + { + var procedure = context.Procedures.FirstOrDefault(rec => rec.Id == model.Id); + if (procedure == null) + { + return null; + } + procedure.Update(model); + context.SaveChanges(); + procedure.UpdateCosmetics(context, model); + transaction.Commit(); + return procedure.GetViewModel; + } + catch + { + transaction.Rollback(); + throw; + } + } + + public List GetProcedureCosmetics(ProcedureSearchModel model) + { + if (model == null) + { + return new(); + } + using var context = new BeautyStudioDatabase(); + var cosmetics = context.CosmeticProcedures + .Where(x => x.ProcedureId == model.Id) + .Select(x => x.Cosmetic.GetViewModel) + .ToList(); + return cosmetics; + } + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Implements/ServiceStorage.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/ServiceStorage.cs new file mode 100644 index 0000000..f8e2117 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/ServiceStorage.cs @@ -0,0 +1,134 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.SearchModels; +using BeautyStudioContracts.StoragesContracts; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Implements +{ + public class ServiceStorage : IServiceStorage + { + public ServiceViewModel? Delete(ServiceBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var element = context.Services + .Include(x => x.Procedures) + .Include(x => x.Cosmetics) + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Services.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + + public ServiceViewModel? GetElement(ServiceSearchModel model) + { + if (string.IsNullOrEmpty(model.ServiceName) && !model.Id.HasValue) + { + return null; + } + using var context = new BeautyStudioDatabase(); + return context.Services + .Include(x => x.Procedures) + .ThenInclude(x => x.Procedure) + .Include(x => x.Cosmetics) + .ThenInclude(x => x.Cosmetic) + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ServiceName) && x.ServiceName == model.ServiceName) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public List GetFilteredList(ServiceSearchModel model) + { + if (model == null) + { + return new(); + } + using var context = new BeautyStudioDatabase(); + if (model.Id.HasValue) + { + return context.Services + .Include(x => x.Procedures) + .ThenInclude(x => x.Procedure) + .Include(x => x.Cosmetics) + .ThenInclude(x => x.Cosmetic) + .Where(x => x.Id == model.Id) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + if (model.StaffId.HasValue) + { + return context.Services + .Include(x => x.Procedures) + .ThenInclude(x => x.Procedure) + .Include(x => x.Cosmetics) + .ThenInclude(x => x.Cosmetic) + .Where(x => x.StaffId == model.StaffId) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + + public List GetFullList() + { + using var context = new BeautyStudioDatabase(); + return context.Services + .Include(x => x.Procedures) + .ThenInclude(x => x.Procedure) + .Include(x => x.Cosmetics) + .ThenInclude(x => x.Cosmetic) + .Select(x => x.GetViewModel) + .ToList(); + } + + public ServiceViewModel? Insert(ServiceBindingModel model) + { + using var context = new BeautyStudioDatabase(); + var newService = Service.Create(context, model); + if (newService == null) + { + return null; + } + context.Services.Add(newService); + context.SaveChanges(); + return newService.GetViewModel; + } + + public ServiceViewModel? Update(ServiceBindingModel model) + { + using var context = new BeautyStudioDatabase(); + using var transaction = context.Database.BeginTransaction(); + try + { + var service = context.Services.FirstOrDefault(rec => rec.Id == model.Id); + if (service == null) + { + return null; + } + service.Update(model); + context.SaveChanges(); + service.UpdateCosmetics(context, model); + service.UpdateProcedures(context, model); + transaction.Commit(); + return service.GetViewModel; + } + catch + { + transaction.Rollback(); + throw; + } + } + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Implements/StaffStorage.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/StaffStorage.cs new file mode 100644 index 0000000..f18ee5a --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Implements/StaffStorage.cs @@ -0,0 +1,97 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.SearchModels; +using BeautyStudioContracts.StoragesContracts; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.Linq; + +namespace BeautyStudioDatabaseImplement.Implements +{ + public class StaffStorage : IStaffStorage + { + public StaffViewModel? Delete(StaffBindingModel model) + { + using var context = new BeautyStudioDatabase(); + + var element = context.Staffs.FirstOrDefault(rec => rec.Id == model.Id); + + if (element != null) + { + context.Staffs.Remove(element); + context.SaveChanges(); + + return element.GetViewModel; + } + + return null; + } + + public StaffViewModel? GetElement(StaffSearchModel model) + { + using var context = new BeautyStudioDatabase(); + if (model.Id.HasValue) + return context.Staffs + .FirstOrDefault(x => x.Id == model.Id)? + .GetViewModel; + + if (!string.IsNullOrEmpty(model.StaffPassword) && + !string.IsNullOrEmpty(model.StaffLogin)) + return context.Staffs + .FirstOrDefault(x => + x.StaffPassword.Equals(model.StaffPassword) && + x.StaffLogin.Equals(model.StaffLogin))? + .GetViewModel; + + return null; + } + + public List GetFilteredList(StaffSearchModel model) + { + throw new NotImplementedException(); + } + + public List GetFullList() + { + using var context = new BeautyStudioDatabase(); + return context.Staffs + .Select(x => x.GetViewModel) + .ToList(); + } + + public StaffViewModel? Insert(StaffBindingModel model) + { + using var context = new BeautyStudioDatabase(); + + var newStaffs = Staff.Create(model); + + if (newStaffs == null) + { + return null; + } + + context.Staffs.Add(newStaffs); + context.SaveChanges(); + + return newStaffs.GetViewModel; + } + + public StaffViewModel? Update(StaffBindingModel model) + { + using var context = new BeautyStudioDatabase(); + + var Staffs = context.Staffs.FirstOrDefault(x => x.Id == model.Id); + + if (Staffs == null) + { + return null; + } + + Staffs.Update(model); + context.SaveChanges(); + + return Staffs.GetViewModel; + } + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/Client.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Client.cs new file mode 100644 index 0000000..925583d --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Client.cs @@ -0,0 +1,68 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class Client : IClientModel + { + public int Id { get; set; } + + [Required] + public string ClientLogin { get; set; } = string.Empty; + + [Required] + public string ClientFIO { get; set; } = string.Empty; + [Required] + public string ClientEmail { get; set; } = string.Empty; + [Required] + public string ClientPhone { get; set; } = string.Empty; + [Required] + + public string ClientPassword { get; set; } = string.Empty; + + [ForeignKey("ClientId")] + public virtual List Orders { get; set; } = new(); + + public static Client? Create(ClientBindingModel model) + { + + if (model == null) + { + return null; + } + return new Client() + { + Id = model.Id, + ClientLogin = model.ClientLogin, + ClientFIO = model.ClientFIO, + ClientEmail = model.ClientEmail, + ClientPassword = model.ClientPassword, + }; + } + + public void Update(ClientBindingModel model) + { + if (model == null) + { + return; + } + ClientLogin = model.ClientLogin; + ClientFIO = model.ClientFIO; + ClientEmail = model.ClientEmail; + ClientPassword = model.ClientPassword; + } + + public ClientViewModel GetViewModel => new() + { + Id = Id, + ClientLogin = ClientLogin, + ClientFIO = ClientFIO, + ClientEmail = ClientEmail, + ClientPassword = ClientPassword + }; + + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/Cosmetic.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Cosmetic.cs new file mode 100644 index 0000000..f789417 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Cosmetic.cs @@ -0,0 +1,69 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class Cosmetic : ICosmeticModel + { + public int Id { get; set; } + + [Required] + public string CosmeticName { get; set; } = string.Empty; + + [Required] + public double CosmeticPrice { get; set; } + + [Required] + public int StoreKeeperId { get; set; } + + [Required] + public int LaborCostId { get; set; } + public virtual LaborCost LaborCost { get; set; } = new(); + + public static Cosmetic Create(CosmeticBindingModel model) + { + + if (model == null) + { + return null; + } + return new Cosmetic() + { + Id = model.Id, + CosmeticName = model.CosmeticName, + CosmeticPrice = model.CosmeticPrice, + StoreKeeperId = model.StoreKeeperId, + LaborCostId = model.LaborCostId + }; + } + + public void Update(CosmeticBindingModel model) + { + if (model == null) + { + return; + } + CosmeticName = model.CosmeticName; + CosmeticPrice = model.CosmeticPrice; + StoreKeeperId = model.StoreKeeperId; + LaborCostId = model.LaborCostId; + } + + public CosmeticViewModel GetViewModel => new() + { + Id = Id, + CosmeticName = CosmeticName, + CosmeticPrice = CosmeticPrice, + StoreKeeperId = StoreKeeperId, + LaborCostId = LaborCostId + }; + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/LaborCost.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/LaborCost.cs new file mode 100644 index 0000000..4851f7c --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/LaborCost.cs @@ -0,0 +1,57 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDataModels.Models; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class LaborCost : ILaborCostModel + { + public int Id { get; set; } + + [Required] + public int TimeSpent { get; set; } + + [Required] + public string Difficulty { get; set; } = string.Empty; + + public int StaffId { get; set; } + + public virtual Staff Staff { get; set; } + + public virtual List Cosmetics { get; set; } = new(); + + public static LaborCost? Create(LaborCostBindingModel? model) + { + if (model == null) + { + return null; + } + return new LaborCost() + { + Id = model.Id, + StaffId = model.StaffId, + TimeSpent = model.TimeSpent + }; + } + + public void Update(LaborCostBindingModel? model) + { + if (model == null) + { + return; + } + TimeSpent = model.TimeSpent; + + } + + public LaborCostViewModel GetViewModel => new() + { + Id = Id, + TimeSpent = TimeSpent + }; + } + +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/Order.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Order.cs new file mode 100644 index 0000000..826c633 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Order.cs @@ -0,0 +1,69 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDataModels.Enums; +using BeautyStudioDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class Order : IOrderModel + { + public int Id { get; set; } + + [Required] + public DateTime DateCreate { get; set; } + + public DateTime? DateComplete { get; set; } + + [Required] + public OrderStatus Status { get; set; } + + [Required] + public double Sum { get; set; } + + [Required] + public int ClientId { get; set; } + + [Required] + public int? StaffId { get; set; } + + [Required] + public int ServiceId { get; set; } + + [ForeignKey("ClientId")] + public virtual Client? Client { get; set; } + public virtual Staff? Staff { get; set; } + + public static Order Create(BeautyStudioDatabase context, OrderBindingModel model) + { + return new Order() + { + Id = model.Id, + DateCreate = model.DateCreate, + DateComplete = model.DateComplete, + ClientId = model.ClientId, + }; + } + + public void Update(OrderBindingModel model) + { + Status = model.Status; + DateCreate = model.DateCreate; + StaffId = model.StaffId; + } + + public OrderViewModel GetViewModel => new() + { + Id = Id, + DateCreate = DateCreate, + ClientId = ClientId + }; + + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/OrderService.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/OrderService.cs new file mode 100644 index 0000000..2dea377 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/OrderService.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class OrderService + { + public int Id { get; set; } + + [Required] + public int OrderId { get; set; } + + [Required] + public int ServiceId { get; set; } + + public virtual Order Order { get; set; } = new(); + public virtual Service Service { get; set; } = new(); + + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/Procedure.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Procedure.cs new file mode 100644 index 0000000..ad5a9a6 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Procedure.cs @@ -0,0 +1,108 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class Procedure : IProcedureModel + { + public int Id { get; set; } + + [Required] + public string ProcedureName { get; set; } = string.Empty; + + [Required] + public double ProcedurePrice { get; set; } + + [Required] + public double ProcedureDuration { get; set; } + + public int ClientId { get; set; } + public virtual Client Client { get; set; } = null!; + + // связь процедуры и оценок один - ко - многим + [ForeignKey("ProcedureId")] + public virtual List Evaluations { get; set; } = new(); + private List? _procedureEvaluations = null; + [NotMapped] + public List ProcedureEvaluations + { + get + { + _procedureEvaluations ??= Evaluations + .Select(x => x.GetViewModel) + .ToList(); + return _procedureEvaluations; + } + } + + // связь процедур и косметки многие - ко - многим + [ForeignKey("ProcedureId")] + public virtual List Cosmetics { get; set; } = new(); + + private List? _cosmeticProcedures = null; + + [NotMapped] + public List CosmeticProcedures + { + get + { + _cosmeticProcedures ??= Cosmetics + .Select(pc => new CosmeticProcedureViewModel(pc.Cosmetic.GetViewModel, pc.Procedure.GetViewModel, pc.ProcedureCosmeticCount)) + .ToList(); + return _cosmeticProcedures; + } + } + + // связь процедур и заказов многие - ко - многим + [ForeignKey("ProcedureId")] + public virtual List Orders { get; set; } = new(); + + // связь процедур и заказов многие - ко - многим + [ForeignKey("ProcedureId")] + public virtual List Services { get; set; } = new(); + + + public static Procedure Create(BeautyStudioDatabase context, ProcedureBindingModel model) + { + return new Procedure() + { + Id = model.Id, + ProcedureName = model.ProcedureName, + ProcedurePrice = model.ProcedurePrice, + ProcedureDuration = model.ProcedureDuration, + Cosmetics = model.ProcedureCosmetics.Select(x => new CosmeticProcedure() + { + Cosmetic = context.Cosmetics.First(y => y.Id == x.Cosmetic.Id), + ProcedureCosmeticCount = x.Count + }).ToList(), + ClientId = model.ClientId, + }; + } + + public void Update(ProcedureBindingModel model) + { + ProcedureName = model.ProcedureName; + ProcedurePrice = model.ProcedurePrice; + ProcedureDuration = model.ProcedureDuration; + } + + public ProcedureViewModel GetViewModel => new() + { + Id = Id, + ProcedureName = ProcedureName, + ProcedurePrice = ProcedurePrice, + ProcedureDuration = ProcedureDuration, + CosmeticProcedures = CosmeticProcedures, + ClientId = ClientId + }; + + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/ProcedureCosmetics.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/ProcedureCosmetics.cs new file mode 100644 index 0000000..f7388e1 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/ProcedureCosmetics.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class ProcedureCosmetics + { + public int Id { get; set; } + + [Required] + public int ProcedureId { get; set; } + + [Required] + public int CosmeticId { get; set; } + + public virtual Procedure Procedure { get; set; } = new(); + + public virtual Cosmetic Cosmetic { get; set; } = new(); + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/Service.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Service.cs new file mode 100644 index 0000000..607ab26 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Service.cs @@ -0,0 +1,53 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class Service : IServiceModel + { + public int Id {get; set; } + + [Required] + public string ServiceName { get; set; } = string.Empty; + + [Required] + public double Sum { get; set; } + + public int StaffId { get; set; } + public virtual Staff Staff { get; set; } + + public static Service Create(BeautyStudioDatabase context, ServiceBindingModel model) + { + return new Service() + { + Id = model.Id, + ServiceName = model.ServiceName, + StaffId = model.StaffId + }; + } + + public void Update(ServiceBindingModel model) + { + ServiceName = model.ServiceName; + StaffId = model.StaffId; + } + + public ServiceViewModel GetViewModel => new() + { + Id = Id, + ServiceName = ServiceName, + StaffId = StaffId + }; + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/ServiceProcedure.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/ServiceProcedure.cs new file mode 100644 index 0000000..29f1022 --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/ServiceProcedure.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class ServiceProcedure + { + public int Id { get; set; } + + [Required] + public int ServiceId { get; set; } + + [Required] + public int ProcedureId { get; set; } + + public virtual Service Service { get; set; } = new(); + + public virtual Procedure Procedure { get; set; } = new(); + } +} diff --git a/BeautyStudio/BeautyStudioDatabaseImplement/Models/Staff.cs b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Staff.cs new file mode 100644 index 0000000..ca030bb --- /dev/null +++ b/BeautyStudio/BeautyStudioDatabaseImplement/Models/Staff.cs @@ -0,0 +1,75 @@ +using BeautyStudioContracts.BindingModels; +using BeautyStudioContracts.ViewModels; +using BeautyStudioDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace BeautyStudioDatabaseImplement.Models +{ + public class Staff : IStaffModel + { + public int Id { get; set; } + + [Required] + public string StaffFIO { get; set; } = string.Empty; + + [Required] + public string StaffEmail { get; set; } = string.Empty; + + [Required] + public string StaffLogin { get; set; } = string.Empty; + + [Required] + public string StaffPassword { get; set; } = string.Empty; + + [Required] + public string StaffPhone { get; set; } = string.Empty; + + [ForeignKey("StaffId")] + public virtual List LaborCost { get; set; } = new(); + + [ForeignKey("StaffId")] + public virtual List Services { get; set; } = new(); + + public static Staff? Create(StaffBindingModel model) + { + + if (model == null) + { + return null; + } + return new Staff() + { + Id = model.Id, + StaffFIO = model.StaffFIO, + StaffLogin = model.StaffLogin, + StaffEmail = model.StaffEmail, + StaffPassword = model.StaffPassword, + StaffPhone = model.StaffPhone, + }; + } + + public void Update(StaffBindingModel model) + { + if (model == null) + { + return; + } + StaffFIO = model.StaffFIO; + StaffLogin = model.StaffLogin; + StaffEmail = model.StaffEmail; + StaffPassword = model.StaffPassword; + StaffPhone = model.StaffPhone; + } + + public StaffViewModel GetViewModel => new() + { + Id = Id, + StaffFIO = StaffFIO, + StaffLogin = StaffLogin, + StaffEmail = StaffEmail, + StaffPassword = StaffPassword, + StaffPhone = StaffPhone, + }; + } +}