private IssueCreate convertToViewModel(IssueCreateDTO dto, IssueCreate viewModel = null) { IssueCreate converted = viewModel ?? new IssueCreate(); converted.Description = dto.Description; converted.ProjectID = dto.ProjectID; converted.Title = dto.Title; converted.IssueID = dto.IssueID == 0 ? converted.IssueID : dto.IssueID; return(converted); }
public ActionResult Create(IssueCreateDTO dto) { if (ModelState.IsValid) { string userID = User.Identity.GetUserId(); Issue issue = null; if (!this.db.HasProjectAccess(dto.ProjectID, userID)) { return(new HttpStatusCodeResult(HttpStatusCode.Forbidden)); } if (dto.IssueID > 0) { issue = this.db.Issues.Find(dto.IssueID); if (issue == null || !this.db.HasProjectAccess(issue.ProjectID, userID) || (issue.ReporterID != userID && !this.db.HasProjectRole(issue.ProjectID, userID, Role.Manager)) ) { return(new HttpStatusCodeResult(HttpStatusCode.Forbidden)); } } else { issue = new Issue(); issue.RaportDate = DateTime.UtcNow; issue.ReporterID = userID; issue.Status = IssueStatus.Reported; issue.IssueNumber = this.db.Issues.Where(i => i.ProjectID == dto.ProjectID).Count() + 1; } issue.ProjectID = dto.ProjectID; issue.Description = dto.Description; issue.LastModified = DateTime.UtcNow; issue.Title = dto.Title; if (dto.IssueID == 0) { db.Issues.Add(issue); } db.SaveChanges(); return(RedirectToAction("Index")); } else { IssueCreate viewModel = this.getCreateModel(); viewModel = this.convertToViewModel(dto, viewModel); return(View(viewModel)); } }
/// <summary> /// Borrow a book if available /// </summary> /// <param name="issue">Issue details.</param> /// <param name="username">To whom will the book be issued.</param> /// <param name="bookId">Id of the book to borrow.</param> /// <returns>Null if book not found, true if borrowed, false if out of capacity</returns> public async Task <(bool?, IssueDetailDTO?)> Borrow(string username, Guid bookId, IssueCreateDTO issue) { var book = await _books.Find(x => x.Id == bookId).FirstOrDefaultAsync(); if (book == null) { return(null, null); } var update = Builders <Book> .Update.Inc(x => x.Issued, 1); var result = await _books.UpdateOneAsync(x => x.Id == bookId && x.Issued < book.Quantity, update); if (result.ModifiedCount == 0) { return(false, null); } var entity = new Issue { Id = Guid.NewGuid(), IssuedTo = username }; entity = _mapper.Map(issue, entity); entity = _mapper.Map(book, entity); await _issues.InsertOneAsync(entity); return(true, _mapper.Map <IssueDetailDTO>(entity)); }