public async Task <IActionResult> PutCourseDefinition(Guid id, CourseDefinitionDTO courseDefinition) { if (id != courseDefinition.Id) { return(BadRequest()); } var year = await _context.AcademicYears.FirstAsync(y => y.Id == courseDefinition.Year); if (year is null) { ModelState.AddModelError("year", "Invalid course year provided."); return(BadRequest(ModelState)); } var courseDef = courseMapper.MapDefinitionDTO(courseDefinition, year); courseDef.Slug = slugService.TransformText(courseDef.Name); var existingDef = await _context.CourseDefinitions.FirstOrDefaultAsync(c => c.Id != courseDef.Id && c.Slug == courseDef.Slug); if (!(existingDef is null)) { ModelState.AddModelError("name", $"Failed to generate unique url slug from the course name. The generated slug ({courseDef.Slug}) is used by another course."); return(BadRequest(ModelState)); } _context.Entry(courseDef).State = EntityState.Modified; try { await _context.SaveChangesAsync(); await cache.ClearCourseDefinitionCacheAsync(id); } catch (DbUpdateConcurrencyException) { if (!CourseDefinitionExists(id)) { return(NotFound()); } else { throw; } } return(NoContent()); }
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()); }