From 031c9815d751b1f2ea04799b00e2f13c7383e2dc Mon Sep 17 00:00:00 2001 From: AnnZhimol Date: Tue, 16 May 2023 19:43:06 +0400 Subject: [PATCH] =?UTF-8?q?crud=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=B8=D1=82=D0=B0=D0=BD=D0=B8=D1=8F+?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7=D0=BA=D0=B0=20=D1=83=D1=87?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=BA=20?= =?UTF-8?q?=D0=BF=D0=BB=D0=B0=D0=BD=D0=B0=D0=BC=20=D0=BF=D0=B8=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/MealPlanLogic.cs | 35 ++++ .../BindingModels/MealPlanBindingModel.cs | 2 +- .../BusinessLogicsContracts/IMealPlanLogic.cs | 2 + .../ViewModels/MealPlanViewModel.cs | 11 +- .../Implemets/MealPlanStorage.cs | 30 +++- .../HotelDataBaseImplement/Models/MealPlan.cs | 28 ++- .../Models/MealPlanMember.cs | 4 +- Hotel/HotelDataBaseImplement/Models/Member.cs | 2 +- .../Controllers/HomeController.cs | 159 ++++++++++++++++++ .../Views/Home/AddMemberToMealPlan.cshtml | 27 +++ .../Views/Home/CreateMealPlan.cshtml | 31 ++++ .../Views/Home/DeleteMealPlan.cshtml | 18 ++ .../Views/Home/ListMealPlans.cshtml | 95 +++++++++++ .../Views/Home/UpdateMealPlan.cshtml | 89 ++++++++++ .../Controllers/MainController.cs | 60 +++++++ 15 files changed, 572 insertions(+), 21 deletions(-) create mode 100644 Hotel/HotelOrganiserApp/Views/Home/AddMemberToMealPlan.cshtml create mode 100644 Hotel/HotelOrganiserApp/Views/Home/CreateMealPlan.cshtml create mode 100644 Hotel/HotelOrganiserApp/Views/Home/DeleteMealPlan.cshtml create mode 100644 Hotel/HotelOrganiserApp/Views/Home/ListMealPlans.cshtml create mode 100644 Hotel/HotelOrganiserApp/Views/Home/UpdateMealPlan.cshtml diff --git a/Hotel/HotelBusinessLogic/BusinessLogics/MealPlanLogic.cs b/Hotel/HotelBusinessLogic/BusinessLogics/MealPlanLogic.cs index 7cff2b8..dd1dc98 100644 --- a/Hotel/HotelBusinessLogic/BusinessLogics/MealPlanLogic.cs +++ b/Hotel/HotelBusinessLogic/BusinessLogics/MealPlanLogic.cs @@ -3,6 +3,7 @@ using HotelContracts.BusinessLogicsContracts; using HotelContracts.SearchModels; using HotelContracts.StoragesContracts; using HotelContracts.ViewModels; +using HotelDataModels.Models; using Microsoft.Extensions.Logging; namespace HotelBusinessLogic.BusinessLogics @@ -17,9 +18,43 @@ namespace HotelBusinessLogic.BusinessLogics _logger = logger; _mealPlanStorage = mealPlanStorage; } + + public bool AddMemberToMealPlan(MealPlanSearchModel model, IMemberModel member) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + _logger.LogInformation("AddMemberToMealPlan. MealPlanName:{MealPlanName}.Id:{ Id}", model.MealPlanName, model.Id); + var element = _mealPlanStorage.GetElement(model); + + if (element == null) + { + _logger.LogWarning("AddMemberToMealPlan element not found"); + return false; + } + + _logger.LogInformation("AddMemberToMealPlan find. Id:{Id}", element.Id); + + element.MealPlanMembers[member.Id] = member; + + _mealPlanStorage.Update(new() + { + Id = element.Id, + MealPlanName = element.MealPlanName, + MealPlanPrice = element.MealPlanPrice, + OrganiserId = element.OrganiserId, + MealPlanMembers = element.MealPlanMembers + }); + + return true; + } + public bool Create(MealPlanBindingModel model) { CheckModel(model); + model.MealPlanMembers = new(); if (_mealPlanStorage.Insert(model) == null) { diff --git a/Hotel/HotelContracts/BindingModels/MealPlanBindingModel.cs b/Hotel/HotelContracts/BindingModels/MealPlanBindingModel.cs index c8147b6..91dd785 100644 --- a/Hotel/HotelContracts/BindingModels/MealPlanBindingModel.cs +++ b/Hotel/HotelContracts/BindingModels/MealPlanBindingModel.cs @@ -11,6 +11,6 @@ namespace HotelContracts.BindingModels public int OrganiserId { get; set; } public int Id { get; set; } - public Dictionary MealPlanMembers { get; set; } + public Dictionary MealPlanMembers { get; set; } = new(); } } diff --git a/Hotel/HotelContracts/BusinessLogicsContracts/IMealPlanLogic.cs b/Hotel/HotelContracts/BusinessLogicsContracts/IMealPlanLogic.cs index c51a2b8..ab36b8a 100644 --- a/Hotel/HotelContracts/BusinessLogicsContracts/IMealPlanLogic.cs +++ b/Hotel/HotelContracts/BusinessLogicsContracts/IMealPlanLogic.cs @@ -1,6 +1,7 @@ using HotelContracts.BindingModels; using HotelContracts.SearchModels; using HotelContracts.ViewModels; +using HotelDataModels.Models; namespace HotelContracts.BusinessLogicsContracts { @@ -8,6 +9,7 @@ namespace HotelContracts.BusinessLogicsContracts { List? ReadList(MealPlanSearchModel? model); MealPlanViewModel? ReadElement(MealPlanSearchModel model); + bool AddMemberToMealPlan(MealPlanSearchModel model, IMemberModel member); bool Create(MealPlanBindingModel model); bool Update(MealPlanBindingModel model); bool Delete(MealPlanBindingModel model); diff --git a/Hotel/HotelContracts/ViewModels/MealPlanViewModel.cs b/Hotel/HotelContracts/ViewModels/MealPlanViewModel.cs index c249c07..017cf6e 100644 --- a/Hotel/HotelContracts/ViewModels/MealPlanViewModel.cs +++ b/Hotel/HotelContracts/ViewModels/MealPlanViewModel.cs @@ -1,5 +1,6 @@ using HotelDataModels.Models; using System.ComponentModel; +using Newtonsoft.Json; namespace HotelContracts.ViewModels { @@ -15,7 +16,15 @@ namespace HotelContracts.ViewModels public int Id { get; set; } - public Dictionary MealPlanMembers { get; set; } + public Dictionary MealPlanMembers { get; set; } = new(); public Dictionary MealPlanRooms { get; set; } + + public MealPlanViewModel() { } + + [JsonConstructor] + public MealPlanViewModel(Dictionary MealPlanMembers) + { + this.MealPlanMembers = MealPlanMembers.ToDictionary(x => x.Key, x => x.Value as IMemberModel); + } } } diff --git a/Hotel/HotelDataBaseImplement/Implemets/MealPlanStorage.cs b/Hotel/HotelDataBaseImplement/Implemets/MealPlanStorage.cs index 8a10096..f951ff2 100644 --- a/Hotel/HotelDataBaseImplement/Implemets/MealPlanStorage.cs +++ b/Hotel/HotelDataBaseImplement/Implemets/MealPlanStorage.cs @@ -14,6 +14,7 @@ namespace HotelDataBaseImplement.Implemets using var context = new HotelDataBase(); var element = context.MealPlans + .Include(x => x.Members) .FirstOrDefault(rec => rec.Id == model.Id); if (element != null) @@ -29,7 +30,7 @@ namespace HotelDataBaseImplement.Implemets public MealPlanViewModel? GetElement(MealPlanSearchModel model) { - if (!model.Id.HasValue) + if (string.IsNullOrEmpty(model.MealPlanName) && !model.Id.HasValue) { return null; } @@ -43,7 +44,7 @@ namespace HotelDataBaseImplement.Implemets .ThenInclude(x => x.Conference) .Include(x => x.Rooms) .Include(x => x.Organiser) - .FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))? + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.MealPlanName) && x.MealPlanName == model.MealPlanName) || (model.Id.HasValue && x.Id == model.Id))? .GetViewModel; } @@ -79,6 +80,7 @@ namespace HotelDataBaseImplement.Implemets .Include(x => x.Rooms) .Include(x => x.Organiser) .Where(x => x.MealPlanName.Contains(model.MealPlanName)) + .ToList() .Select(x => x.GetViewModel) .ToList(); } @@ -115,14 +117,26 @@ namespace HotelDataBaseImplement.Implemets public MealPlanViewModel? Update(MealPlanBindingModel model) { using var context = new HotelDataBase(); - var mealPlan = context.MealPlans.FirstOrDefault(x => x.Id == model.Id); - if (mealPlan == null) + using var transaction = context.Database.BeginTransaction(); + try { - return null; + var elem = context.MealPlans.FirstOrDefault(rec => rec.Id == model.Id); + if (elem == null) + { + return null; + } + elem.Update(model); + context.SaveChanges(); + if (model.MealPlanMembers != null) + elem.UpdateMembers(context, model); + transaction.Commit(); + return elem.GetViewModel; + } + catch + { + transaction.Rollback(); + throw; } - mealPlan.Update(model); - context.SaveChanges(); - return mealPlan.GetViewModel; } } } diff --git a/Hotel/HotelDataBaseImplement/Models/MealPlan.cs b/Hotel/HotelDataBaseImplement/Models/MealPlan.cs index 8ca670d..89fd077 100644 --- a/Hotel/HotelDataBaseImplement/Models/MealPlan.cs +++ b/Hotel/HotelDataBaseImplement/Models/MealPlan.cs @@ -3,6 +3,7 @@ using HotelContracts.ViewModels; using HotelDataModels.Models; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Text.Json.Serialization; namespace HotelDataBaseImplement.Models { @@ -20,13 +21,8 @@ namespace HotelDataBaseImplement.Models public virtual Organiser Organiser { get; set; } - [ForeignKey("MealPlanId")] - public virtual List Rooms { get; set; } - - [ForeignKey("MealPlanId")] - public virtual List Members { get; set; } - private Dictionary _mealPlanMembers = null; + [NotMapped] public Dictionary MealPlanMembers { @@ -34,11 +30,21 @@ namespace HotelDataBaseImplement.Models { if (_mealPlanMembers == null) { - _mealPlanMembers = Members.ToDictionary(recPC => recPC.MemberId, recPC => (recPC.Member as IMemberModel)); + using var context = new HotelDataBase(); + _mealPlanMembers = Members + .ToDictionary(x => x.MemberId, x => (context.Members + .FirstOrDefault(y => y.Id == x.MemberId)! as IMemberModel)); } return _mealPlanMembers; } } + + [ForeignKey("MealPlanId")] + public virtual List Rooms { get; set; } + + [ForeignKey("MealPlanId")] + public virtual List Members { get; set; } = new(); + public static MealPlan Create(HotelDataBase context, MealPlanBindingModel model) { return new MealPlan() @@ -74,10 +80,16 @@ namespace HotelDataBaseImplement.Models { var mealPlanMembers = context.MealPlanMembers.Where(rec => rec.MealPlanId == model.Id).ToList(); - if (mealPlanMembers != null) + if (mealPlanMembers != null && mealPlanMembers.Count > 0) { context.MealPlanMembers.RemoveRange(mealPlanMembers.Where(rec => !model.MealPlanMembers.ContainsKey(rec.MemberId))); context.SaveChanges(); + + foreach (var updateMember in mealPlanMembers) + { + model.MealPlanMembers.Remove(updateMember.MemberId); + } + context.SaveChanges(); } var mealPlan = context.MealPlans.First(x => x.Id == Id); diff --git a/Hotel/HotelDataBaseImplement/Models/MealPlanMember.cs b/Hotel/HotelDataBaseImplement/Models/MealPlanMember.cs index 35939df..4865f6a 100644 --- a/Hotel/HotelDataBaseImplement/Models/MealPlanMember.cs +++ b/Hotel/HotelDataBaseImplement/Models/MealPlanMember.cs @@ -12,7 +12,7 @@ namespace HotelDataBaseImplement.Models [Required] public int MealPlanId { get; set; } - public virtual MealPlan MealPlan { get; set; } - public virtual Member Member { get; set; } + public virtual MealPlan MealPlan { get; set; } = new(); + public virtual Member Member { get; set; } = new(); } } diff --git a/Hotel/HotelDataBaseImplement/Models/Member.cs b/Hotel/HotelDataBaseImplement/Models/Member.cs index 8719f3c..38296b4 100644 --- a/Hotel/HotelDataBaseImplement/Models/Member.cs +++ b/Hotel/HotelDataBaseImplement/Models/Member.cs @@ -20,7 +20,7 @@ namespace HotelDataBaseImplement.Models public virtual Organiser Organiser { get; set; } [ForeignKey("MemberId")] - public virtual List MealPlanMember { get; set; } + public virtual List MealPlanMember { get; set; } = new(); [ForeignKey("MemberId")] diff --git a/Hotel/HotelOrganiserApp/Controllers/HomeController.cs b/Hotel/HotelOrganiserApp/Controllers/HomeController.cs index dc96aeb..dd4d3f3 100644 --- a/Hotel/HotelOrganiserApp/Controllers/HomeController.cs +++ b/Hotel/HotelOrganiserApp/Controllers/HomeController.cs @@ -17,6 +17,161 @@ namespace HotelOrganiserApp.Controllers _logger = logger; } + /*--------------------MealPlans------------------------*/ + + public IActionResult CreateMealPlan() + { + if (APIClient.Organiser == null) + { + return Redirect("~/Home/Enter"); + } + return View(); + } + + [HttpPost] + public void CreateMealPlan(string mealPlanName, double mealPlanPrice) + { + if (APIClient.Organiser == null) + { + throw new Exception("Необходима авторизация"); + } + if (string.IsNullOrEmpty(mealPlanName) || string.IsNullOrEmpty(mealPlanPrice.ToString())) + { + throw new Exception("Введите название"); + } + if (string.IsNullOrEmpty(mealPlanPrice.ToString())) + { + throw new Exception("Введите стоимость"); + } + APIClient.PostRequest("api/main/createmealplan", new MealPlanBindingModel + { + MealPlanName = mealPlanName, + MealPlanPrice = mealPlanPrice, + OrganiserId = APIClient.Organiser.Id, + }); + Response.Redirect("ListMealPlans"); + } + + public IActionResult DeleteMealPlan() + { + if (APIClient.Organiser == null) + { + return Redirect("~/Home/Enter"); + } + ViewBag.MealPlans = APIClient.GetRequest>($"api/main/getmealplanlist?organiserId={APIClient.Organiser.Id}"); + return View(); + } + + [HttpPost] + public void DeleteMealPlan(int mealPlan) + { + if (APIClient.Organiser == null) + { + throw new Exception("Необходима авторизация"); + } + APIClient.PostRequest("api/main/deletemealplan", new MealPlanBindingModel + { + Id = mealPlan + }); + Response.Redirect("ListMealPlans"); + } + + public IActionResult UpdateMealPlan() + { + if (APIClient.Organiser == null) + { + return Redirect("~/Home/Enter"); + } + ViewBag.MealPlans = APIClient.GetRequest>($"api/main/getmealplanlist?organiserId={APIClient.Organiser.Id}"); + return View(); + } + + [HttpPost] + public void UpdateMealPlan(int mealPlan, string mealPlanName, double mealPlanPrice) + { + if (APIClient.Organiser == null) + { + throw new Exception("Необходима авторизация"); + } + if (string.IsNullOrEmpty(mealPlanName)) + { + throw new Exception("Название не может быть пустым"); + } + if (string.IsNullOrEmpty(mealPlanPrice.ToString())) + { + throw new Exception("стоимсоть не может быть пустым"); + } + APIClient.PostRequest("api/main/updatemealplan", new MealPlanBindingModel + { + Id = mealPlan, + MealPlanName = mealPlanName, + MealPlanPrice = mealPlanPrice, + OrganiserId = APIClient.Organiser.Id + }); + Response.Redirect("ListMealPlans"); + } + + [HttpGet] + public Tuple? GetMealPlan(int mealPlanId) + { + if (APIClient.Organiser == null) + { + throw new Exception("Необходима авторизация"); + } + var result = APIClient.GetRequest>>>($"api/main/getmealplan?mealPlanId={mealPlanId}"); + if (result == null) + { + return default; + } + string table = ""; + for (int i = 0; i < result.Item2.Count; i++) + { + var memberFIO = result.Item2[i].Item1; + var citizenship = result.Item2[i].Item2; + table += ""; + table += $"{memberFIO}"; + table += $"{citizenship}"; + table += ""; + } + return Tuple.Create(result.Item1, table); + } + + public IActionResult AddMemberToMealPlan() + { + if (APIClient.Organiser == null) + { + return Redirect("~/Home/Enter"); + } + ViewBag.MealPlans = APIClient.GetRequest>($"api/main/getmealplanlist?organiserId={APIClient.Organiser.Id}"); + ViewBag.Members = APIClient.GetRequest>($"api/main/getmemberlist?organiserId={APIClient.Organiser.Id}"); + return View(); + } + + [HttpPost] + public void AddMemberToMealPlan(int mealPlan, int member) + { + if (APIClient.Organiser == null) + { + throw new Exception("Необходима авторизация"); + } + APIClient.PostRequest("api/main/AddMemberToMealPlan", Tuple.Create( + new MealPlanSearchModel() { Id = mealPlan }, + new MemberViewModel() { Id = member } + )); + Response.Redirect("ListMealPlans"); + } + + public IActionResult ListMealPlans() + { + if (APIClient.Organiser == null) + { + return Redirect("~/Home/Enter"); + } + return View(APIClient.GetRequest>($"api/main/getmealplanlist?organiserId={APIClient.Organiser.Id}")); + } + + /*--------------------Members------------------------*/ + public IActionResult CreateMember() { if (APIClient.Organiser == null) @@ -147,6 +302,8 @@ namespace HotelOrganiserApp.Controllers return View(APIClient.GetRequest>($"api/main/getmemberlist?organiserId={APIClient.Organiser.Id}")); } + /*--------------------Conferences------------------------*/ + public IActionResult CreateConference() { if (APIClient.Organiser == null) @@ -298,6 +455,8 @@ namespace HotelOrganiserApp.Controllers return View(APIClient.GetRequest>($"api/main/getconferencelist?organiserId={APIClient.Organiser.Id}")); } + /*--------------------Organisers------------------------*/ + [HttpGet] public IActionResult Privacy() { diff --git a/Hotel/HotelOrganiserApp/Views/Home/AddMemberToMealPlan.cshtml b/Hotel/HotelOrganiserApp/Views/Home/AddMemberToMealPlan.cshtml new file mode 100644 index 0000000..f3cf2fe --- /dev/null +++ b/Hotel/HotelOrganiserApp/Views/Home/AddMemberToMealPlan.cshtml @@ -0,0 +1,27 @@ +@using HotelContracts.ViewModels; +@using HotelDataModels.Models; + +@{ + ViewData["Title"] = "AddMemberToMealPlan"; +} + +@model Dictionary + +
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
\ No newline at end of file diff --git a/Hotel/HotelOrganiserApp/Views/Home/CreateMealPlan.cshtml b/Hotel/HotelOrganiserApp/Views/Home/CreateMealPlan.cshtml new file mode 100644 index 0000000..209edfc --- /dev/null +++ b/Hotel/HotelOrganiserApp/Views/Home/CreateMealPlan.cshtml @@ -0,0 +1,31 @@ +@{ + ViewData["Title"] = "CreateMealPlan"; +} + + + + + +
+
+ + +
+ +
+
+
+
+
diff --git a/Hotel/HotelOrganiserApp/Views/Home/DeleteMealPlan.cshtml b/Hotel/HotelOrganiserApp/Views/Home/DeleteMealPlan.cshtml new file mode 100644 index 0000000..a252321 --- /dev/null +++ b/Hotel/HotelOrganiserApp/Views/Home/DeleteMealPlan.cshtml @@ -0,0 +1,18 @@ +@{ + ViewData["Title"] = "DeleteMealPlan"; +} + + + +
+
+ +
+ +
+
+
+
+
+
+
diff --git a/Hotel/HotelOrganiserApp/Views/Home/ListMealPlans.cshtml b/Hotel/HotelOrganiserApp/Views/Home/ListMealPlans.cshtml new file mode 100644 index 0000000..ec59a9e --- /dev/null +++ b/Hotel/HotelOrganiserApp/Views/Home/ListMealPlans.cshtml @@ -0,0 +1,95 @@ +@using HotelContracts.ViewModels + +@model List + +@{ + ViewData["Title"] = "ListMealPlans"; +} + + + + + +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + @foreach (var item in Model) + { + + + + + + } + +
+ Номер + + Название плана питания + + Стоимость +
+ @Html.DisplayFor(modelItem => item.Id) + + @Html.DisplayFor(modelItem => item.MealPlanName) + + @Html.DisplayFor(modelItem => item.MealPlanPrice) +
+
+
+
+ +
+
+
+
+
+ diff --git a/Hotel/HotelOrganiserApp/Views/Home/UpdateMealPlan.cshtml b/Hotel/HotelOrganiserApp/Views/Home/UpdateMealPlan.cshtml new file mode 100644 index 0000000..2d06e74 --- /dev/null +++ b/Hotel/HotelOrganiserApp/Views/Home/UpdateMealPlan.cshtml @@ -0,0 +1,89 @@ +@using HotelContracts.ViewModels; +@using HotelDataModels.Models; + +@{ + ViewData["Title"] = "UpdateMealPlan"; +} + + + + + + +
+
+ +
+ +
+
+
+ + +
+ +
+ + + + + + + + + + + + + + + +
+ Участники + + Гражданство +
+
+
+
+
+
+
+ +@section Scripts + { + +} diff --git a/Hotel/HotelRestApi/Controllers/MainController.cs b/Hotel/HotelRestApi/Controllers/MainController.cs index 68d54ff..af1f260 100644 --- a/Hotel/HotelRestApi/Controllers/MainController.cs +++ b/Hotel/HotelRestApi/Controllers/MainController.cs @@ -340,6 +340,66 @@ namespace HotelRestApi.Controllers } } + [HttpPost] + public void UpdateMealPlan(MealPlanBindingModel model) + { + try + { + model.MealPlanMembers = null!; + _mealPlan.Update(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка обновления данных"); + throw; + } + } + + [HttpGet] + public Tuple>>? GetMealPlan(int mealPlanId) + { + try + { + var elem = _mealPlan.ReadElement(new MealPlanSearchModel { Id = mealPlanId }); + if (elem == null) + return null; + return Tuple.Create(elem, elem.MealPlanMembers.Select(x => Tuple.Create(x.Value.MemberFIO, x.Value.Citizenship)).ToList()); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения плана питания по id={Id}", mealPlanId); + throw; + } + } + + [HttpPost] + public void DeleteMealPlan(MealPlanBindingModel model) + { + try + { + _mealPlan.Delete(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления плана питания"); + throw; + } + } + + [HttpPost] + public void AddMemberToMealPlan(Tuple model) + { + try + { + _mealPlan.AddMemberToMealPlan(model.Item1, model.Item2); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка добавления участника в план питания."); + throw; + } + } + [HttpPost] public void CreateRoom(RoomBindingModel model) {