From 3d2a7d5425679d4ee4c8b727223c70655b06ccda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D1=8F=D1=87=D0=B5=D1=81=D0=BB=D0=B0=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Sat, 30 Mar 2024 14:49:59 +0400 Subject: [PATCH] =?UTF-8?q?=D1=87=D1=82=D0=BE-=D1=82=D0=BE=20=D1=82=D0=B8?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=BE=D0=B1=D0=AD=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/HomeController.cs | 160 ++++++++++++++++-- .../Views/Home/CreateLunch.cshtml | 26 +++ .../Views/Home/DeleteLunch.cshtml | 17 ++ .../Views/Home/Enter.cshtml | 39 +++++ .../Views/Home/Index.cshtml | 4 - .../Views/Home/ListLunches.cshtml | 67 ++++++++ .../Views/Home/Register.cshtml | 7 +- .../Views/Home/UpdateLunch.cshtml | 62 +++++++ .../ConferenceBookingController.cs | 145 ++++++++++++++++ .../Controllers/LunchController.cs | 112 ++++++++++++ .../Controllers/RoomController.cs | 127 ++++++++++++++ 11 files changed, 744 insertions(+), 22 deletions(-) create mode 100644 Hotel/HotelHeadwaiterApp/Views/Home/CreateLunch.cshtml create mode 100644 Hotel/HotelHeadwaiterApp/Views/Home/DeleteLunch.cshtml create mode 100644 Hotel/HotelHeadwaiterApp/Views/Home/Enter.cshtml create mode 100644 Hotel/HotelHeadwaiterApp/Views/Home/ListLunches.cshtml create mode 100644 Hotel/HotelHeadwaiterApp/Views/Home/UpdateLunch.cshtml create mode 100644 Hotel/HotelRestApi/Controllers/ConferenceBookingController.cs create mode 100644 Hotel/HotelRestApi/Controllers/LunchController.cs create mode 100644 Hotel/HotelRestApi/Controllers/RoomController.cs diff --git a/Hotel/HotelHeadwaiterApp/Controllers/HomeController.cs b/Hotel/HotelHeadwaiterApp/Controllers/HomeController.cs index 78c93ed..605bd28 100644 --- a/Hotel/HotelHeadwaiterApp/Controllers/HomeController.cs +++ b/Hotel/HotelHeadwaiterApp/Controllers/HomeController.cs @@ -1,7 +1,9 @@ using HostrelHeadwaiterApp; using HotelContracts.BindingModels; +using HotelContracts.ViewModels; using HotelHeadwaiterApp.Models; using Microsoft.AspNetCore.Mvc; +using Microsoft.IdentityModel.Tokens; using System.Diagnostics; namespace HotelHeadwaiterApp.Controllers @@ -17,9 +19,62 @@ namespace HotelHeadwaiterApp.Controllers public IActionResult Index() { + if (APIClient.Headwaiter == null) + { + return Redirect("~/Home/Enter"); + } return View(); } + [HttpGet] + public IActionResult Register() + { + return View(); + } + + [HttpPost] + public void Register(string login, string email, string password, string surname, string name, string patronymic, string telephone) + { + if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(surname) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(patronymic)) + { + throw new Exception("Введите логин, пароль, фамилию, имя и отчество"); + } + APIClient.PostRequest("api/headwaiter/register", new HeadwaiterBindingModel + { + HeadwaiterSurname = surname, + HeadwaiterName = name, + HeadwaiterPatronymic = patronymic, + HeadwaiterLogin = login, + HeadwaiterPassword = password, + HeadwaiterEmail = email, + HeadwaiterPhoneNumber = telephone + }); + + Response.Redirect("Enter"); + return; + } + + [HttpGet] + public IActionResult Enter() + { + return View(); + } + + [HttpPost] + public void Enter(string login, string password) + { + if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password)) + { + throw new Exception("Введите логин и пароль"); + } + APIClient.Headwaiter = APIClient.GetRequest($"api/headwaiter/login?login={login}&password={password}"); + if (APIClient.Headwaiter == null) + { + throw new Exception("Неверный логин/пароль"); + } + Response.Redirect("Index"); + } + [HttpGet] public IActionResult Privacy() { @@ -63,32 +118,107 @@ namespace HotelHeadwaiterApp.Controllers Response.Redirect("Index"); } - [HttpGet] - public IActionResult Register() + public IActionResult ListLunches() { + if (APIClient.Headwaiter == null) + { + return Redirect("~/Home/Enter"); + } + return View(APIClient.GetRequest>($"api/lunch/getlunchlist?headwaiterId={APIClient.Headwaiter.Id}")); + } + + public IActionResult CreateLunch() + { + if (APIClient.Headwaiter == null) + { + return Redirect("~/Home/Enter"); + } return View(); } [HttpPost] - public void Register(string login, string email, string password, string surname, string name, string patronymic, string telephone) + public void CreateLunch(string lunchName, double lunchPrice) { - if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(surname) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(patronymic)) + if (APIClient.Headwaiter == null) { - throw new Exception("Введите логин, пароль, фамилию, имя и отчество"); + throw new Exception("Необходима авторизация"); } - APIClient.PostRequest("api/headwaiter/register", new HeadwaiterBindingModel + if (string.IsNullOrEmpty(lunchName)) { - HeadwaiterSurname = surname, - HeadwaiterName = name, - HeadwaiterPatronymic = patronymic, - HeadwaiterLogin = login, - HeadwaiterPassword = password, - HeadwaiterEmail = email, - HeadwaiterPhoneNumber = telephone + throw new Exception("Введите имя"); + } + if (lunchPrice < 0) + { + throw new Exception("Цена не может быть отрицательной"); + } + APIClient.PostRequest("api/lunch/createlunch", new LunchBindingModel + { + LunchPrice = lunchPrice, + LunchName = lunchName, + HeadwaiterId = APIClient.Headwaiter.Id, + }); + Response.Redirect("ListLunches"); + } + + public IActionResult UpdateLunch() + { + if (APIClient.Headwaiter == null) + { + return Redirect("~/Home/Enter"); + } + ViewBag.Lunches = APIClient.GetRequest>($"api/lunch/getlunchlist?headwaiterId={APIClient.Headwaiter.Id}"); + return View(); + } + + [HttpPost] + public void UpdateLunch(int lunch, string lunchName, double lunchPrice) + { + if (APIClient.Headwaiter == null) + { + throw new Exception("Необходима авторизация"); + } + if (string.IsNullOrEmpty(lunchName)) + { + throw new Exception("Имя не может быть пустым"); + } + if (lunchPrice < 0) + { + throw new Exception("Цена не может быть отрицательной"); + } + + APIClient.PostRequest("api/lunch/updatelunch", new LunchBindingModel + { + Id = lunch, + LunchName = lunchName, + LunchPrice = lunchPrice, + HeadwaiterId = APIClient.Headwaiter.Id, }); - Response.Redirect("Enter"); - return; + Response.Redirect("ListLunches"); + } + + public IActionResult DeleteLunch() + { + if (APIClient.Headwaiter == null) + { + return Redirect("~/Home/Enter"); + } + ViewBag.Lunches = APIClient.GetRequest>($"api/lunch/getlunchlist?headwaiterId={APIClient.Headwaiter.Id}"); + return View(); + } + + [HttpPost] + public void DeleteLunch(int lunch) + { + if (APIClient.Headwaiter == null) + { + throw new Exception("Необходима авторизация"); + } + APIClient.PostRequest("api/lunch/deletelunch", new LunchBindingModel + { + Id = lunch + }); + Response.Redirect("ListLunches"); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] diff --git a/Hotel/HotelHeadwaiterApp/Views/Home/CreateLunch.cshtml b/Hotel/HotelHeadwaiterApp/Views/Home/CreateLunch.cshtml new file mode 100644 index 0000000..07b2dc0 --- /dev/null +++ b/Hotel/HotelHeadwaiterApp/Views/Home/CreateLunch.cshtml @@ -0,0 +1,26 @@ +@{ + ViewData["Title"] = "CreateLunch"; +} + +
+
+

Добавление обеда

+
+ +
+
+ +
+ +
+
+ +
+
\ No newline at end of file diff --git a/Hotel/HotelHeadwaiterApp/Views/Home/DeleteLunch.cshtml b/Hotel/HotelHeadwaiterApp/Views/Home/DeleteLunch.cshtml new file mode 100644 index 0000000..3a1c5cb --- /dev/null +++ b/Hotel/HotelHeadwaiterApp/Views/Home/DeleteLunch.cshtml @@ -0,0 +1,17 @@ +@{ + ViewData["Title"] = "DeleteLunch"; +} + +
+
+

Удаление обеда

+
+
+ + +
+
+
+ +
+
\ No newline at end of file diff --git a/Hotel/HotelHeadwaiterApp/Views/Home/Enter.cshtml b/Hotel/HotelHeadwaiterApp/Views/Home/Enter.cshtml new file mode 100644 index 0000000..bcaa188 --- /dev/null +++ b/Hotel/HotelHeadwaiterApp/Views/Home/Enter.cshtml @@ -0,0 +1,39 @@ +@{ + ViewData["Title"] = "Enter"; +} + +
+
+
+
+
+
+
+
+

Вход

+
+
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/Hotel/HotelHeadwaiterApp/Views/Home/Index.cshtml b/Hotel/HotelHeadwaiterApp/Views/Home/Index.cshtml index 86c8d12..44fbe87 100644 --- a/Hotel/HotelHeadwaiterApp/Views/Home/Index.cshtml +++ b/Hotel/HotelHeadwaiterApp/Views/Home/Index.cshtml @@ -10,7 +10,3 @@ - -
- -
diff --git a/Hotel/HotelHeadwaiterApp/Views/Home/ListLunches.cshtml b/Hotel/HotelHeadwaiterApp/Views/Home/ListLunches.cshtml new file mode 100644 index 0000000..ea1d69b --- /dev/null +++ b/Hotel/HotelHeadwaiterApp/Views/Home/ListLunches.cshtml @@ -0,0 +1,67 @@ +@using HotelContracts.ViewModels + +@model List + +@{ + ViewData["Title"] = "ListLunches"; +} + +
+

Список обедов

+
+ +
+
+
+
+ +
+ + + + + + + + + + @foreach (var item in Model) + { + + + + + + } + +
+ Номер + + Цена обеда + + Название обеда +
+ @Html.DisplayFor(modelItem => item.Id) + + @Html.DisplayFor(modelItem => item.LunchPrice) + + @Html.DisplayFor(modelItem => item.LunchName) +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/Hotel/HotelHeadwaiterApp/Views/Home/Register.cshtml b/Hotel/HotelHeadwaiterApp/Views/Home/Register.cshtml index 2cc70c3..173df9f 100644 --- a/Hotel/HotelHeadwaiterApp/Views/Home/Register.cshtml +++ b/Hotel/HotelHeadwaiterApp/Views/Home/Register.cshtml @@ -1,9 +1,7 @@ @{ ViewData["Title"] = "Register"; } -
-

Регистрация

-
+
@@ -11,6 +9,9 @@
+
+

Регистрация

+
+
+

Изменение обеда

+
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+ + + +@section Scripts +{ + +} \ No newline at end of file diff --git a/Hotel/HotelRestApi/Controllers/ConferenceBookingController.cs b/Hotel/HotelRestApi/Controllers/ConferenceBookingController.cs new file mode 100644 index 0000000..3209675 --- /dev/null +++ b/Hotel/HotelRestApi/Controllers/ConferenceBookingController.cs @@ -0,0 +1,145 @@ +using HotelContracts.BindingModels; +using HotelContracts.BusinessLogicsContracts; +using HotelContracts.SearchModels; +using HotelContracts.ViewModels; +using Microsoft.AspNetCore.Mvc; + +namespace HotelRestApi.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + public class ConferenceBookingController : Controller + { + private readonly ILogger _logger; + private readonly IConferenceBookingLogic _conferenceBooking; + + public ConferenceBookingController(ILogger logger, IConferenceBookingLogic conferenceBooking) + { + _logger = logger; + _conferenceBooking = conferenceBooking; + } + + [HttpGet] + public List? GetConferenceBookingList(int headwaiterId) + { + try + { + return _conferenceBooking.ReadList(new ConferenceBookingSearchModel + { + HeadwaiterId = headwaiterId, + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения списка бронирования по конференции"); + throw; + } + } + + [HttpGet] + public ConferenceBookingViewModel? GetConferenceBookingById(int conferenceBookingId) + { + try + { + var elem = _conferenceBooking.ReadElement(new ConferenceBookingSearchModel + { + Id = conferenceBookingId + }); + + if (elem == null) + { + return null; + } + + return elem; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения по id={Id}", conferenceBookingId); + throw; + } + } + + [HttpGet] + public Tuple>>? GetConferenceBooking(int conferenceBookingId) + { + try + { + var elem = _conferenceBooking.ReadElement(new ConferenceBookingSearchModel + { + Id = conferenceBookingId + }); + + if (elem == null) + { + return null; + } + + return Tuple.Create(elem, elem.ConferenceBookingLunches.Select(x => Tuple.Create(x.Value.LunchName, x.Value.LunchPrice)).ToList()); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения по id={Id}", conferenceBookingId); + throw; + } + } + + [HttpPost] + public void CreateConferenceBooking(ConferenceBookingBindingModel model) + { + try + { + _conferenceBooking.Create(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка создания бронирования по конференции"); + throw; + } + } + + [HttpPost] + public void UpdateConferenceBooking(ConferenceBookingBindingModel model) + { + + try + { + model.ConferenceBookingLunches = null!; + _conferenceBooking.Update(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка обновления данных бронирования по конференции"); + throw; + } + } + + [HttpPost] + public void DeleteConferenceBooking(ConferenceBookingBindingModel model) + { + try + { + _conferenceBooking.Delete(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления бронирования по конференции"); + throw; + } + } + + [HttpPost] + public void AddLunchToConferenceBooking(Tuple model) + { + try + { + _conferenceBooking.AddLunchToConferenceBooking(model.Item1, model.Item2); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка добавления обеда в бронирование по конференции."); + throw; + } + } + } +} diff --git a/Hotel/HotelRestApi/Controllers/LunchController.cs b/Hotel/HotelRestApi/Controllers/LunchController.cs new file mode 100644 index 0000000..26a1c41 --- /dev/null +++ b/Hotel/HotelRestApi/Controllers/LunchController.cs @@ -0,0 +1,112 @@ +using HotelContracts.BindingModels; +using HotelContracts.BusinessLogicsContracts; +using HotelContracts.SearchModels; +using HotelContracts.ViewModels; +using Microsoft.AspNetCore.Mvc; + +namespace HotelRestApi.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + public class LunchController : Controller + { + private readonly ILogger _logger; + private readonly ILunchLogic _lunch; + + public LunchController(ILogger logger, ILunchLogic lunch) + { + _logger = logger; + _lunch = lunch; + } + + [HttpGet] + public List? GetLunchList(int headwaiterId) + { + try + { + return _lunch.ReadList(new LunchSearchModel + { + HeadwaiterId = headwaiterId, + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения списка обедов"); + throw; + } + } + + [HttpGet] + public List? GetLunches() + { + try + { + return _lunch.ReadList(null); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения списка обедов"); + throw; + } + } + + [HttpGet] + public LunchViewModel? GetLunchById(int lunchId) + { + try + { + return _lunch.ReadElement(new LunchSearchModel + { + Id = lunchId + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения обеда по id={Id}", lunchId); + throw; + } + } + + [HttpPost] + public void CreateLunch(LunchBindingModel model) + { + try + { + _lunch.Create(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка создания обеда"); + throw; + } + } + + [HttpPost] + public void UpdateLunch(LunchBindingModel model) + { + try + { + _lunch.Update(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка обновления данных обеда"); + throw; + } + } + + [HttpPost] + public void DeleteLunch(LunchBindingModel model) + { + try + { + _lunch.Delete(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления обеда"); + throw; + } + } + } +} diff --git a/Hotel/HotelRestApi/Controllers/RoomController.cs b/Hotel/HotelRestApi/Controllers/RoomController.cs new file mode 100644 index 0000000..8f9a61a --- /dev/null +++ b/Hotel/HotelRestApi/Controllers/RoomController.cs @@ -0,0 +1,127 @@ +using HotelContracts.BindingModels; +using HotelContracts.BusinessLogicsContracts; +using HotelContracts.SearchModels; +using HotelContracts.ViewModels; +using Microsoft.AspNetCore.Mvc; + +namespace HotelRestApi.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + public class RoomController : Controller + { + private readonly ILogger _logger; + private readonly IRoomLogic _room; + + public RoomController(ILogger logger, IRoomLogic room) + { + _logger = logger; + _room = room; + } + + [HttpGet] + public List? GetRoomList(int headwaiterId) + { + try + { + return _room.ReadList(new RoomSearchModel + { + HeadwaiterId = headwaiterId, + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения списка номеров"); + throw; + } + } + + [HttpGet] + public List? GetRooms() + { + try + { + return _room.ReadList(null); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения списка номеров"); + throw; + } + } + + [HttpGet] + public RoomViewModel? GetRoomById(int roomId) + { + try + { + return _room.ReadElement(new RoomSearchModel + { + Id = roomId + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения номера по id={Id}", roomId); + throw; + } + } + + [HttpPost] + public void CreateRoom(RoomBindingModel model) + { + try + { + _room.Create(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка создания номера"); + throw; + } + } + + [HttpPost] + public void UpdateRoom(RoomBindingModel model) + { + try + { + model.RoomLunches = null!; + _room.Update(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка обновления данных номера"); + throw; + } + } + + [HttpPost] + public void DeleteRoom(RoomBindingModel model) + { + try + { + _room.Delete(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления номера"); + throw; + } + } + + [HttpPost] + public void AddLunchToRoom(Tuple model) + { + try + { + _room.AddLunchToRoom(model.Item1, model.Item2); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка добавления обеда к номеру."); + throw; + } + } + } +}