public async Task <IActionResult> PutAssignment(Guid id, AssignmentEditDTO assignment) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (id != assignment.Id) { return(BadRequest()); } var dbAssignment = assignmentMapper.MapAssignmentEditDTO(assignment); dbAssignment.Slug = slugService.TransformText(dbAssignment.Name); var collidingAssignment = await _context.Assignments .Where(a => a.Course.Id == dbAssignment.Course.Id && a.Id != dbAssignment.Id && a.Slug == dbAssignment.Slug) .FirstOrDefaultAsync(); if (collidingAssignment != null) { ModelState.AddModelError("name", $"Failed to generate unique url slug from the assignment name. The generated slug ({dbAssignment.Slug}) is used by another assignment of this course."); return(BadRequest(ModelState)); } var course = await _context.Courses .Include(c => c.Professor) .Include(c => c.Assistants) .Include(c => c.Groups) .Include(c => c.Students) .FirstOrDefaultAsync(c => c.Id == dbAssignment.Course.Id); var authorization = await authorizationService.AuthorizeAsync(User, course, AuthorizationConstants.CanUpdateCoursePolicy); if (!authorization.Succeeded) { return(Forbid()); } var existingAssignment = await _context.Assignments .AsNoTracking() .FirstOrDefaultAsync(a => a.Id == dbAssignment.Id); dbAssignment.DateAdded = existingAssignment.DateAdded; dbAssignment.LastUpdated = DateTime.UtcNow; _context.Entry(dbAssignment).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!AssignmentExists(id)) { return(NotFound()); } else { throw; } } return(NoContent()); }