ScientificReport
PublicationController.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using Microsoft.AspNetCore.Authorization;
5 using Microsoft.AspNetCore.Mvc;
12 
13 namespace ScientificReport.Controllers
14 {
15  [Authorize(Roles = UserProfileRole.Any)]
16  public class PublicationController : Controller
17  {
18  private readonly IPublicationService _publicationService;
19  private readonly IUserProfileService _userProfileService;
20  private readonly IDepartmentService _departmentService;
21  private readonly IArticleService _articleService;
22  private readonly IScientificWorkService _scientificWorkService;
23  private readonly IConferenceService _conferenceService;
24  private readonly IReportThesisService _reportThesisService;
25 
27  IPublicationService publicationService,
28  IUserProfileService userProfileService,
29  IDepartmentService departmentService,
30  IArticleService articleService,
31  IScientificWorkService scientificWorkService,
32  IConferenceService conferenceService,
33  IReportThesisService reportThesisService
34  )
35  {
36  _publicationService = publicationService;
37  _userProfileService = userProfileService;
38  _departmentService = departmentService;
39  _articleService = articleService;
40  _scientificWorkService = scientificWorkService;
41  _conferenceService = conferenceService;
42  _reportThesisService = reportThesisService;
43  }
44 
45  // GET: /Publication
46  public IActionResult Index(PublicationIndexModel model)
47  {
48  model.Publications = FilterPublications(model, PageHelpers.IsAdmin(User), PageHelpers.IsHeadOfDepartment(User));
49  model.ReportTheses = _reportThesisService.GetAll();
50  return View(model);
51  }
52 
53  // GET: /Publication/Details/{id}
54  public IActionResult Details(Guid? id)
55  {
56  if (id == null)
57  {
58  return NotFound();
59  }
60 
61  var publication = _publicationService.GetById(id.Value);
62  if (publication == null)
63  {
64  return NotFound();
65  }
66 
67  var authors = _publicationService.GetPublicationAuthors(id.Value);
68  var model = new PublicationDetailsModel
69  {
70  Publication = publication,
71  Authors = authors,
72  UserIsAuthor = authors.Contains(_userProfileService.Get(User))
73  };
74 
75  return View(model);
76  }
77 
78  // GET: /Publication/Create
79  public IActionResult Create()
80  {
81  return View(new PublicationCreateModel
82  {
83  ReportThesis =
84  {
85  Conferences = _conferenceService.GetAll()
86  }
87  });
88  }
89 
90  // POST: /Publication/Create
91  [HttpPost]
92  [ValidateAntiForgeryToken]
93  public IActionResult Create(PublicationCreateModel model)
94  {
95  if (!ModelState.IsValid)
96  {
97  return View(model);
98  }
99 
100  switch (model.PublicationType)
101  {
103  _articleService.CreateItem(model.ToArticle());
104  _articleService.AddAuthor(
105  _articleService.Get(a => a.Title == model.Article.Title),
106  _userProfileService.Get(u => u.UserName == User.Identity.Name)
107  );
108  break;
109  case PublicationCreateModel.PublicationTypes.ScientificWork:
110  if (PageHelpers.IsHeadOfDepartment(User))
111  {
112  _scientificWorkService.CreateItem(model.ScientificWork);
113  }
114 
115  break;
116  case PublicationCreateModel.PublicationTypes.ReportThesis:
117  model.ReportThesis.Conference = _conferenceService.GetById(model.ReportThesis.ConferenceId);
118  _reportThesisService.CreateItem(model.ReportThesis);
119  _reportThesisService.AddAuthor(
120  _reportThesisService.Get(r => r.Thesis == model.ReportThesis.Thesis).Id,
121  _userProfileService.Get(User).Id);
122  break;
124  var newPublication = model.ToPublication();
125  _publicationService.CreateItem(newPublication);
126  _publicationService.AddAuthor(
127  _publicationService.Get(p => p.Title == newPublication.Title && p.PublishingYear == newPublication.PublishingYear && p.Specification == newPublication.Specification),
128  _userProfileService.Get(User)
129  );
130  break;
131  default:
132  return BadRequest();
133  }
134 
135  return RedirectToAction(nameof(Index));
136  }
137 
138  // GET: /Publication/Edit/{id}
139  public IActionResult Edit(Guid? id)
140  {
141  if (id == null)
142  {
143  return NotFound();
144  }
145 
146  var publication = _publicationService.GetById(id.Value);
147  if (publication == null)
148  {
149  return NotFound();
150  }
151 
152  if (!AllowUserToEditPublication(publication))
153  {
154  return Forbid();
155  }
156 
157  var editModel = new PublicationEditModel(publication)
158  {
159  Authors = _publicationService.GetPublicationAuthors(publication.Id),
160  Users = _userProfileService.GetAll()
161  };
162 
163  return View(editModel);
164  }
165 
166  // POST: /Publication/Edit/{id}
167  [HttpPost]
168  [ValidateAntiForgeryToken]
169  public IActionResult Edit(Guid id, PublicationEditModel model)
170  {
171  if (id != model.Id)
172  {
173  return NotFound();
174  }
175 
176  if (!_publicationService.PublicationExists(id))
177  {
178  return NotFound();
179  }
180 
181  var publication = _publicationService.GetById(id);
182  if (ModelState.IsValid)
183  {
184  publication.PublicationType = model.Type;
185  publication.Title = model.Title;
186  publication.Specification = model.Specification;
187  publication.PublishingPlace = model.PublishingPlace;
188  publication.PublishingHouseName = model.PublishingHouseName;
189  publication.PublishingYear = model.PublishingYear;
190  publication.PagesAmount = model.PagesAmount;
191  publication.PrintStatus = model.PrintStatus;
192  _publicationService.UpdateItem(publication);
193  return RedirectToAction("Index");
194  }
195 
196  var editModel = new PublicationEditModel(publication)
197  {
198  Authors = _publicationService.GetPublicationAuthors(publication.Id),
199  Users = _userProfileService.GetAll()
200  };
201  return View(editModel);
202  }
203 
204  // POST: /Publication/AddSelfToAuthors/{id}
205  [HttpPost]
206  public IActionResult AddSelfToAuthors(Guid? id)
207  {
208  if (id == null)
209  {
210  return NotFound();
211  }
212 
213  var publication = _publicationService.GetById(id.Value);
214  if (publication == null)
215  {
216  return NotFound();
217  }
218 
219  var user = _userProfileService.Get(User);
220  if (!_publicationService.GetPublicationAuthors(publication.Id).Contains(user))
221  {
222  _publicationService.AddAuthor(publication, user);
223  }
224 
225  return RedirectToAction("Details", new { id = id.Value });
226  }
227 
228  // POST: /Publication/AddUserToAuthors/{publicationId}
229  [HttpPost]
230  [Authorize(Roles = UserProfileRole.HeadOfDepartmentOrAdmin)]
231  public IActionResult AddUserToAuthors(Guid? id, [FromBody] UpdateUserRequest request)
232  {
233  if (id == null)
234  {
235  return NotFound();
236  }
237 
238  var user = _userProfileService.GetById(request.UserId);
239  if (user == null)
240  {
241  return Json(ApiResponse.Fail);
242  }
243 
244  var publication = _publicationService.GetById(id.Value);
245  if (publication == null)
246  {
247  return NotFound();
248  }
249 
250  if (!AllowUserToEditPublication(publication))
251  {
252  return Json(ApiResponse.Fail);
253  }
254 
255  if (!_publicationService.GetPublicationAuthors(publication.Id).Contains(user))
256  {
257  _publicationService.AddAuthor(publication, user);
258  }
259 
260  return Json(ApiResponse.Ok);
261  }
262 
263  // POST: /Publication/RemoveUserFromAuthors/{publicationId}
264  [HttpPost]
265  [Authorize(Roles = UserProfileRole.HeadOfDepartmentOrAdmin)]
266  public IActionResult RemoveUserFromAuthors(Guid? id, [FromBody] UpdateUserRequest request)
267  {
268  if (id == null)
269  {
270  return NotFound();
271  }
272 
273  var user = _userProfileService.GetById(request.UserId);
274  if (user == null)
275  {
276  return Json(ApiResponse.Fail);
277  }
278 
279  var publication = _publicationService.GetById(id.Value);
280  if (publication == null)
281  {
282  return NotFound();
283  }
284 
285  if (!AllowUserToEditPublication(publication))
286  {
287  return Json(ApiResponse.Fail);
288  }
289 
290  if (_publicationService.GetPublicationAuthors(publication.Id).Contains(user))
291  {
292  _publicationService.RemoveAuthor(publication, user);
293  }
294 
295  return Json(ApiResponse.Ok);
296  }
297 
298  // GET: /Publication/Delete/{id}
299  public IActionResult Delete(Guid? id)
300  {
301  if (id == null)
302  {
303  return NotFound();
304  }
305 
306  var publication = _publicationService.GetById(id.Value);
307  if (publication == null)
308  {
309  return NotFound();
310  }
311 
312  if (!PageHelpers.IsAdmin(User))
313  {
314  return Forbid();
315  }
316 
317  return View(publication);
318  }
319 
320  // POST: /Publication/Delete/{id}
321  [HttpPost, ActionName("Delete")]
322  [ValidateAntiForgeryToken]
323  public IActionResult DeleteConfirmed(Guid id)
324  {
325  var publication = _publicationService.GetById(id);
326  if (publication == null)
327  {
328  return NotFound();
329  }
330 
331  if (!PageHelpers.IsAdmin(User))
332  {
333  return Forbid();
334  }
335 
336  _publicationService.DeleteById(id);
337  return RedirectToAction(nameof(Index));
338  }
339 
340  public IActionResult SearchPublications(string substring, Publication.PublicationTypes? type)
341  {
342  if (substring == null || type == null)
343  {
344  return Json(ApiResponse.Fail);
345  }
346 
347  var publications = _publicationService.GetAllWhere(p => p.PublicationType == type.Value && p.Title.ToLower().Contains(substring.ToLower()));
348  return Json(new PublicationSearchApiResponse
349  {
350  Publications = publications.Select(p => new PublicationApiResponse
351  {
352  Id = p.Id,
353  Title = p.Title
354  }),
355  Success = true
356  });
357  }
358 
359  private bool AllowUserToEditPublication(Publication publication)
360  {
361  var user = _userProfileService.Get(User);
362  var department = _departmentService.Get(d => d.Staff.Contains(user));
363  var isHeadOfDepartment = PageHelpers.IsHeadOfDepartment(User) && publication.UserProfilesPublications.Any(p => department.Staff.Contains(p.UserProfile));
364  return PageHelpers.IsAdmin(User) || isHeadOfDepartment ||
365  publication.UserProfilesPublications.Any(p => p.UserProfile.UserName == User.Identity.Name);
366  }
367 
368  private List<PublicationBase> GetAllPublications()
369  {
370  var publications = new List<PublicationBase>();
371  publications.AddRange(_publicationService.GetAll());
372  publications.AddRange(_articleService.GetAll());
373  publications.AddRange(_scientificWorkService.GetAll());
374  return publications;
375  }
376 
377  private IEnumerable<PublicationBase> FilterPublications(PublicationIndexModel model, bool userIsAdmin, bool userIsHead)
378  {
379  var allPublications = GetAllPublications();
380  model.Count = allPublications.Count;
381  var publications = allPublications.ToList().Skip((model.CurrentPage - 1) * model.PageSize).Take(model.PageSize);
382  if (model.SortBy != null)
383  {
385  publications = SortPublicationsBy(model.SortBy.Value, model.CurrentPage, model.PageSize);
386  }
387  else
388  {
389  var yearFrom = -1;
390  if (model.YearFromFilter != null)
391  {
392  yearFrom = model.YearFromFilter.Value;
393  }
394 
395  var yearTo = -1;
396  if (model.YearToFilter != null)
397  {
398  yearTo = model.YearToFilter.Value;
399  }
400 
401  var user = _userProfileService.Get(u => u.UserName == User.Identity.Name);
402 
403  if (model.PublicationSetType == null)
404  {
405  if (userIsAdmin)
406  {
408  }
409  else if (userIsHead)
410  {
412  }
413  else
414  {
416  }
417  }
418 
419  switch (model.PublicationSetType.Value)
420  {
421  case Publication.PublicationSetType.Department:
422  var department = _departmentService.Get(u => u.Staff.Contains(user));
423  publications = department != null
424  ? publications.Where(p => Helpers.CheckForDepartmentPublication(p, department))
425  : publications.Where(p => Helpers.CheckForPersonalPublication(p, user));
426  break;
427  case Publication.PublicationSetType.Faculty:
428  break;
429  case Publication.PublicationSetType.Personal:
430  publications = publications.Where(p => Helpers.CheckForPersonalPublication(p, user));
431  break;
432  default:
433  publications = publications.Where(p => Helpers.CheckForPersonalPublication(p, user));
434  break;
435  }
436 
437  if (yearFrom != -1)
438  {
439  publications = publications.Where(p => p.PublishingYear >= yearFrom);
440  }
441 
442  if (yearTo != -1)
443  {
444  publications = publications.Where(p => p.PublishingYear <= yearTo);
445  }
446  }
447 
448  return publications;
449  }
450 
451  private IEnumerable<PublicationBase> SortPublicationsBy(Publication.SortByOptions option, int page, int count)
452  {
453  var publications = GetAllPublications().Skip((page - 1) * count).Take(count);
454  switch (option)
455  {
456  case Publication.SortByOptions.Title:
457  publications = publications.OrderBy(p => p.Title);
458  break;
459  default:
460  return publications;
461  }
462 
463  return publications;
464  }
465  }
466 }
IActionResult RemoveUserFromAuthors(Guid?id, [FromBody] UpdateUserRequest request)
IActionResult Edit(Guid id, PublicationEditModel model)
static bool CheckForPersonalPublication(PublicationBase publication, UserProfile user)
Definition: Helpers.cs:11
IEnumerable< DAL.Entities.Publications.PublicationBase > Publications
DAL.Entities.Publications.Publication.PublicationTypes Type
IActionResult Create(PublicationCreateModel model)
DAL.Entities.Publications.Publication.SortByOptions SortBy
static bool CheckForDepartmentPublication(PublicationBase publication, Department department)
Definition: Helpers.cs:31
PublicationController(IPublicationService publicationService, IUserProfileService userProfileService, IDepartmentService departmentService, IArticleService articleService, IScientificWorkService scientificWorkService, IConferenceService conferenceService, IReportThesisService reportThesisService)
DAL.Entities.Publications.Publication.PublicationSetType PublicationSetType
IActionResult SearchPublications(string substring, Publication.PublicationTypes?type)
IActionResult Index(PublicationIndexModel model)
DAL.Entities.Publications.Publication.PrintStatuses PrintStatus
virtual ICollection< UserProfilesPublications > UserProfilesPublications
Definition: Publication.cs:40
IActionResult AddUserToAuthors(Guid?id, [FromBody] UpdateUserRequest request)