CRUD для комментариев готов

This commit is contained in:
Николай 2023-05-16 14:38:49 +04:00 committed by dasha
parent 7ee3f34450
commit a3bd2346ca
7 changed files with 302 additions and 35 deletions

View File

@ -56,7 +56,6 @@ namespace HardwareShopDatabaseImplement.Implements.Worker
return context.Builds return context.Builds
.Include(x => x.Purchases) .Include(x => x.Purchases)
.ThenInclude(x => x.Purchase) .ThenInclude(x => x.Purchase)
.Where(x => x.Id == model.Id)
.FirstOrDefault(x => (!string.IsNullOrEmpty(model.BuildName) && x.BuildName == model.BuildName) || .FirstOrDefault(x => (!string.IsNullOrEmpty(model.BuildName) && x.BuildName == model.BuildName) ||
(model.Id.HasValue && x.Id == model.Id)) (model.Id.HasValue && x.Id == model.Id))
?.GetViewModel; ?.GetViewModel;
@ -75,7 +74,6 @@ namespace HardwareShopDatabaseImplement.Implements.Worker
return context.Builds return context.Builds
.Include(x => x.Purchases) .Include(x => x.Purchases)
.ThenInclude(x => x.Purchase) .ThenInclude(x => x.Purchase)
.Where(x => x.UserId == model.Id)
.FirstOrDefault(x => x.Id == newBuild.Id) .FirstOrDefault(x => x.Id == newBuild.Id)
?.GetViewModel; ?.GetViewModel;
} }
@ -89,7 +87,6 @@ namespace HardwareShopDatabaseImplement.Implements.Worker
var build = context.Builds var build = context.Builds
.Include(x => x.Purchases) .Include(x => x.Purchases)
.ThenInclude(x => x.Purchase) .ThenInclude(x => x.Purchase)
.Where(x => x.UserId == model.UserId)
.FirstOrDefault(x => x.Id == model.Id); .FirstOrDefault(x => x.Id == model.Id);
if (build == null) if (build == null)
{ {
@ -114,7 +111,6 @@ namespace HardwareShopDatabaseImplement.Implements.Worker
var element = context.Builds var element = context.Builds
.Include(x => x.Purchases) .Include(x => x.Purchases)
.ThenInclude(x => x.Purchase) .ThenInclude(x => x.Purchase)
.Where(x => x.UserId == model.Id)
.FirstOrDefault(rec => rec.Id == model.Id); .FirstOrDefault(rec => rec.Id == model.Id);
if (element != null) if (element != null)
{ {

View File

@ -63,7 +63,10 @@ namespace HardwareShopDatabaseImplement.Implements.Worker
} }
context.Comments.Add(newComment); context.Comments.Add(newComment);
context.SaveChanges(); context.SaveChanges();
return newComment.GetViewModel; return context.Comments
.Include(x => x.Build)
.FirstOrDefault(x => x.Id == newComment.Id)
?.GetViewModel;
} }
public CommentViewModel? Update(CommentBindingModel model) public CommentViewModel? Update(CommentBindingModel model)

View File

@ -35,11 +35,12 @@ namespace HardwareShopRestApi.Controllers
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Ошибка получения списка сборок"); _logger.LogError(ex, "Ошибка получения списка сборок пользоватля");
throw; throw;
} }
} }
[HttpGet] [HttpGet]
public BuildViewModel? GetBuild(int buildId) public BuildViewModel? GetBuild(int buildId)
{ {

View File

@ -19,5 +19,78 @@ namespace HardwareShopRestApi.Controllers
_logger = logger; _logger = logger;
_commentLogic = commentLogic; _commentLogic = commentLogic;
} }
[HttpGet]
public List<CommentViewModel>? GetComments(int userId)
{
try
{
return _commentLogic.ReadList(new CommentSearchModel
{
UserId = userId
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения списка комментариев пользоватля");
throw;
}
}
[HttpGet]
public CommentViewModel? GetComment(int commentId)
{
try
{
return _commentLogic.ReadElement(new() { Id = commentId });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка чтения комментария");
throw;
}
}
[HttpPost]
public void Create(CommentBindingModel model)
{
try
{
_commentLogic.Create(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка создания комментария");
throw;
}
}
[HttpPost]
public void Update(CommentBindingModel model)
{
try
{
_commentLogic.Update(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка обновления комментария");
throw;
}
}
[HttpPost]
public void Delete(CommentBindingModel model)
{
try
{
_commentLogic.Delete(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка удаления комментария");
throw;
}
}
} }
} }

View File

@ -6,6 +6,7 @@ using HardwareShopDataModels.Enums;
using HardwareShopWorkerApp.Models; using HardwareShopWorkerApp.Models;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Diagnostics; using System.Diagnostics;
using static System.Net.Mime.MediaTypeNames;
namespace HardwareShopWorkerApp.Controllers namespace HardwareShopWorkerApp.Controllers
{ {
@ -137,8 +138,7 @@ namespace HardwareShopWorkerApp.Controllers
APIClient.PostRequest("api/build/update", new BuildBindingModel APIClient.PostRequest("api/build/update", new BuildBindingModel
{ {
Id = buildId, Id = buildId,
BuildName = name, BuildName = name
UserId = APIClient.User.Id
}); });
Response.Redirect("Builds"); Response.Redirect("Builds");
} }
@ -157,11 +157,11 @@ namespace HardwareShopWorkerApp.Controllers
} }
APIClient.PostRequest("api/build/DeleteBuild", new BuildBindingModel APIClient.PostRequest("api/build/DeleteBuild", new BuildBindingModel
{ {
Id = deleteBuildId, Id = deleteBuildId
UserId = APIClient.User.Id
}); });
Response.Redirect("Builds"); Response.Redirect("Builds");
} }
public IActionResult MainWorker() public IActionResult MainWorker()
{ {
return View(); return View();
@ -169,7 +169,97 @@ namespace HardwareShopWorkerApp.Controllers
public IActionResult Comments() public IActionResult Comments()
{ {
return View(); if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Builds = APIClient.GetRequest<List<BuildViewModel>>($"api/build/getbuilds?userId={APIClient.User.Id}");
return View(APIClient.GetRequest<List<CommentViewModel>>($"api/comment/getcomments?userId={APIClient.User.Id}"));
}
[HttpPost]
public void CreateComment(int buildId, string text)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (string.IsNullOrEmpty(text))
{
throw new Exception($"Текст не должен быть пустым");
}
if (buildId <= 0)
{
throw new Exception($"Идентификатор сборки должен быть больше 0");
}
APIClient.PostRequest("api/comment/create", new CommentBindingModel
{
BuildId = buildId,
UserId = APIClient.User.Id,
Text = text
});
Response.Redirect("Comments");
}
[HttpGet]
public CommentViewModel GetComment(int commentId)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (commentId <= 0)
{
throw new Exception($"Идентификтаор комментария не может быть ниже или равен 0");
}
var result = APIClient.GetRequest<CommentViewModel>($"api/comment/getcomment?commentId={commentId}");
if (result == null)
{
return null;
}
return result;
}
[HttpPost]
public void UpdateComment(string text, int commentId)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (string.IsNullOrEmpty(text))
{
throw new Exception($"Текст комментария не должно быть пустым");
}
if (commentId <= 0)
{
throw new Exception($"Идентификтаор комментария не может быть ниже или равен 0");
}
APIClient.PostRequest("api/comment/update", new CommentBindingModel
{
Id = commentId,
Text = text
});
Response.Redirect("Comments");
}
[HttpPost]
public void DeleteComment(int deleteCommentId)
{
if (APIClient.User == null)
{
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
}
if (deleteCommentId <= 0)
{
throw new Exception($"Идентификтаор комментария не может быть ниже или равен 0");
}
APIClient.PostRequest("api/comment/delete", new CommentBindingModel
{
Id = deleteCommentId,
});
Response.Redirect("Comments");
} }
public IActionResult listComponents() public IActionResult listComponents()
@ -208,8 +298,7 @@ namespace HardwareShopWorkerApp.Controllers
{ {
return Redirect("~/Home/Enter"); return Redirect("~/Home/Enter");
} }
var list = APIClient.GetRequest<List<BuildViewModel>>($"api/build/getbuilds?userId={APIClient.User.Id}"); return View(APIClient.GetRequest<List<BuildViewModel>>($"api/build/getbuilds?userId={APIClient.User.Id}"));
return View(list);
} }
[HttpPost] [HttpPost]

View File

@ -29,6 +29,9 @@
<th> <th>
Название Название
</th> </th>
<th>
Действия
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -45,10 +48,10 @@
@Html.DisplayFor(modelItem => item.BuildName) @Html.DisplayFor(modelItem => item.BuildName)
</td> </td>
<td> <td>
<div>
<button onclick="getBuild(@item.Id)" type="button" class="btn btn-primary btn-lg mb-5" data-bs-toggle="modal" data-bs-target="#updateModal">Изменить</button> <button onclick="getBuild(@item.Id)" type="button" class="btn btn-primary btn-lg mb-5" data-bs-toggle="modal" data-bs-target="#updateModal">Изменить</button>
</td>
<td>
<button onclick="getBuild(@item.Id)" type="button" class="btn btn-primary btn-lg mb-5" data-bs-toggle="modal" data-bs-target="#deleteModal">Удалить</button> <button onclick="getBuild(@item.Id)" type="button" class="btn btn-primary btn-lg mb-5" data-bs-toggle="modal" data-bs-target="#deleteModal">Удалить</button>
</div>
</td> </td>
</tr> </tr>
} }

View File

@ -1,11 +1,19 @@
@{ @using HardwareShopContracts.ViewModels
@model List<CommentViewModel>
@{
ViewData["Title"] = "Comments"; ViewData["Title"] = "Comments";
Layout = "~/Views/Shared/_LayoutWorker.cshtml"; Layout = "~/Views/Shared/_LayoutWorker.cshtml";
} }
<form method="post" class="d-flex justify-content-evenly"> <div class="d-flex justify-content-evenly">
@{
if (Model == null)
{
<h3 class="display-4">Введите пароль</h3>
return;
}
<div class=" col-sm-8"> <div class=" col-sm-8">
<div class="text-center"> <div class="text-center">
<h2 class="display-4">Комментарии</h2> <h2 class="display-4">Комментарии</h2>
@ -23,23 +31,45 @@
<th> <th>
Название сборки к которой относиться комментарий Название сборки к которой относиться комментарий
</th> </th>
<th>
Действия
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.Text)
</td>
<td>
@Html.DisplayFor(modelItem => item.BuildName)
</td>
<td>
<div>
<button onclick="getComment(@item.Id)" type="button" class="btn btn-primary btn-lg mb-5" data-bs-toggle="modal" data-bs-target="#updateModal">Изменить</button>
<button onclick="getComment(@item.Id)" type="button" class="btn btn-primary btn-lg mb-5" data-bs-toggle="modal" data-bs-target="#deleteModal">Удалить</button>
</div>
</td>
</tr>
}
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
<div class="text-center d-flex flex-column mt-5"> <div class="text-center d-flex flex-column mt-5">
<button type="button" class="btn btn-primary btn-lg mb-5" data-bs-toggle="modal" data-bs-target="#exampleModal">Добавить</button> <button type="button" class="btn btn-primary btn-lg mb-5" data-bs-toggle="modal" data-bs-target="#createModal">Добавить</button>
<button type="button" class="btn btn-primary btn-lg mb-5" data-bs-toggle="modal" data-bs-target="#exampleModal">Изменить</button>
<button type="button" class="btn btn-primary btn-lg mb-5">Удалить</button>
<button type="button" class="btn btn-primary btn-lg mb-5">Обновить</button> <button type="button" class="btn btn-primary btn-lg mb-5">Обновить</button>
</div> </div>
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal fade" id="createModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<form method="post" asp-controller="home" asp-action="CreateComment">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Комментарий</h5> <h5 class="modal-title" id="exampleModalLabel">Комментарий</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
@ -47,21 +77,93 @@
<div class="modal-body"> <div class="modal-body">
<div> <div>
<label class="form-label">Сборка</label> <label class="form-label">Сборка</label>
<select class="form-select"> <select id="buildId" name="buildId" class="form-control" asp-items="@(new SelectList(@ViewBag.Builds,"Id", "BuildName"))"></select>
<option value="1">Сборка 1</option>
<option value="2">Сборка 2</option>
</select>
</div> </div>
<div> <div>
<label class="form-label">Текст</label> <label class="form-label">Текст</label>
<input type="text" class="form-control"> <input type="text" class="form-control" required="required" name="text" />
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
<button type="button" class="btn btn-primary">Сохранить</button> <input type="submit" class="btn btn-primary" value="Сохранить">
</div>
</form>
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" id="updateModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<form method="post" asp-controller="home" asp-action="UpdateComment">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Комментарий</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
</div> </div>
</form> <div class="modal-body">
<div>
<label class="form-label">Сборка</label>
<select id="buildId" name="buildId" class="form-control" asp-items="@(new SelectList(@ViewBag.Builds,"Id", "BuildName"))"></select>
</div>
<div>
<label class="form-label">Текст</label>
<input type="text" class="form-control" required="required" id="text" name="text" />
</div>
<input type="hidden" id="commentId" name="commentId" />
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
<input type="submit" class="btn btn-primary" value="Сохранить">
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<form method="post" asp-controller="home" asp-action="DeleteComment">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Удаление сборки</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
</div>
<div class="modal-body">
<div class="form-group">
<h1>Вы уверенны что хотите удалить сборку?</h1>
</div>
</div>
<input type="hidden" id="deleteCommentId" name="deleteCommentId" />
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
<input type="submit" class="btn btn-primary" value="Удалить">
</div>
</form>
</div>
</div>
</div>
}
</div>
@section Scripts
{
<script>
function getComment(CommentId) {
$.ajax({
method: "GET",
url: "/Home/GetComment",
data: { CommentId: CommentId },
success: function (result) {
if (result != null) {
$('#text').val(result.text);
$('#commentId').val(result.id);
$('#deleteCommentId').val(result.id);
console.log(result);
}
console.log(result);
}
});
}
</script>
}