ScientificReport
ScientificWorkController.cs
Go to the documentation of this file.
1 using System;
2 using System.Linq;
3 using Microsoft.AspNetCore.Authorization;
4 using Microsoft.AspNetCore.Mvc;
5 using Microsoft.EntityFrameworkCore;
12 
13 namespace ScientificReport.Controllers
14 {
15  [Authorize(Roles = UserProfileRole.Teacher)]
16  public class ScientificWorkController : Controller
17  {
18  private readonly IScientificWorkService _scientificWorkService;
19  private readonly IUserProfileService _userProfileService;
20  private readonly IDepartmentService _departmentService;
21 
23  IScientificWorkService scientificWorkService,
24  IUserProfileService userProfileService,
25  IDepartmentService departmentService
26  )
27  {
28  _scientificWorkService = scientificWorkService;
29  _userProfileService = userProfileService;
30  _departmentService = departmentService;
31  }
32 
33  // GET: ScientificWork/Details/{id}
34  public IActionResult Details(Guid? id)
35  {
36  if (id == null)
37  {
38  return NotFound();
39  }
40 
41  var scientificWork = _scientificWorkService.GetById(id.Value);
42  if (scientificWork == null)
43  {
44  return NotFound();
45  }
46 
47  if (!UserHasPermission(scientificWork))
48  {
49  return Forbid();
50  }
51 
52  var scientificWorksDetails = new ScientificWorksDetails
53  {
54  ScientificWork = scientificWork,
55  Authors = _scientificWorkService.GetAuthors(scientificWork.Id).ToList()
56  };
57 
58  return View(scientificWorksDetails);
59  }
60 
61  // GET: ScientificWork/Edit/{id}
62  public IActionResult Edit(Guid? id)
63  {
64  if (id == null)
65  {
66  return NotFound();
67  }
68 
69  var scientificWork = _scientificWorkService.GetById(id.Value);
70  if (scientificWork == null)
71  {
72  return NotFound();
73  }
74 
75  if (!UserHasPermission(scientificWork))
76  {
77  return Forbid();
78  }
79 
80  var scientificWorksEdit = new ScientificWorksEdit
81  {
82  ScientificWork = scientificWork,
83  Authors = _scientificWorkService.GetAuthors(scientificWork.Id),
84  Users = _userProfileService.GetAll()
85  };
86 
87  return View(scientificWorksEdit);
88  }
89 
90  // POST: ScientificWork/Edit/{id}
91  [HttpPost]
92  [ValidateAntiForgeryToken]
93  public IActionResult Edit(Guid id, ScientificWorksEdit scientificWorksEdit)
94  {
95  var scientificWork = scientificWorksEdit.ScientificWork;
96  if (id != scientificWork.Id)
97  {
98  return NotFound();
99  }
100 
101  if (!UserHasPermission(scientificWork))
102  {
103  return Forbid();
104  }
105 
106  if (!ModelState.IsValid)
107  {
108  scientificWorksEdit.Authors = _scientificWorkService.GetAuthors(scientificWork.Id);
109  scientificWorksEdit.Users = _userProfileService.GetAll();
110  return View(scientificWorksEdit);
111  }
112  try
113  {
114  _scientificWorkService.UpdateItem(scientificWork);
115  }
116  catch (DbUpdateConcurrencyException)
117  {
118  if (!_scientificWorkService.Exists(scientificWork.Id))
119  {
120  return NotFound();
121  }
122  throw;
123  }
124 
125  return RedirectToAction("Index", "Publication");
126  }
127 
128  // GET: ScientificWork/Delete/{id}
129  public IActionResult Delete(Guid? id)
130  {
131  if (id == null)
132  {
133  return NotFound();
134  }
135 
136  var scientificWork = _scientificWorkService.GetById(id.Value);
137  if (scientificWork == null)
138  {
139  return NotFound();
140  }
141 
142  if (!UserHasPermission(scientificWork))
143  {
144  return Forbid();
145  }
146 
147  return View(scientificWork);
148  }
149 
150  // POST: ScientificWork/Delete/{id}
151  [HttpPost, ActionName("Delete")]
152  [ValidateAntiForgeryToken]
153  public IActionResult DeleteConfirmed(Guid id)
154  {
155  if (!_scientificWorkService.Exists(id))
156  {
157  return NotFound();
158  }
159 
160  if (!UserHasPermission(_scientificWorkService.GetById(id)))
161  {
162  return Forbid();
163  }
164 
165  _scientificWorkService.DeleteById(id);
166  return RedirectToAction("Index", "Publication");
167  }
168 
169  // POST: ScientificWork/AddAuthor/{id}
170  [HttpPost]
171  public IActionResult AddAuthor(Guid id, [FromBody] UpdateUserRequest request)
172  {
173  if (!_scientificWorkService.Exists(id))
174  {
175  return NotFound();
176  }
177 
178  if (!UserHasPermission(_scientificWorkService.GetById(id)))
179  {
180  return Forbid();
181  }
182 
183  _scientificWorkService.AddAuthor(id, request.UserId);
184  return Json(ApiResponse.Ok);
185  }
186 
187  // POST: ScientificWork/DeleteAuthor/{id}
188  [HttpPost]
189  public IActionResult DeleteAuthor(Guid id, [FromBody] UpdateUserRequest request)
190  {
191  if (!_scientificWorkService.Exists(id))
192  {
193  return NotFound();
194  }
195 
196  if (!UserHasPermission(_scientificWorkService.GetById(id)))
197  {
198  return Forbid();
199  }
200 
201  _scientificWorkService.RemoveAuthor(id, request.UserId);
202  return Json(ApiResponse.Ok);
203  }
204 
205  private bool UserHasPermission(ScientificWork scientificWork)
206  {
207  var user = _userProfileService.Get(User);
208  var department = _departmentService.Get(d => d.Staff.Contains(user));
209  var isHeadOfDepartment = PageHelpers.IsHeadOfDepartment(User) && scientificWork.UserProfilesScientificWorks.Any(p => department.Staff.Contains(p.UserProfile));
210  return PageHelpers.IsAdmin(User) || isHeadOfDepartment || scientificWork.UserProfilesScientificWorks.Any(p => p.UserProfile.UserName == User.Identity.Name);
211  }
212  }
213 }
ScientificWorkController(IScientificWorkService scientificWorkService, IUserProfileService userProfileService, IDepartmentService departmentService)
IEnumerable< DAL.Entities.UserProfile.UserProfile > Authors
IActionResult DeleteAuthor(Guid id, [FromBody] UpdateUserRequest request)
IActionResult AddAuthor(Guid id, [FromBody] UpdateUserRequest request)
IEnumerable< DAL.Entities.UserProfile.UserProfile > Users
ICollection< UserProfilesScientificWorks > UserProfilesScientificWorks
IActionResult Edit(Guid id, ScientificWorksEdit scientificWorksEdit)