public async Task <ActionResult <AssignmentDTO> > PostAssignment(AssignmentEditDTO assignment) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var dbAssignment = assignmentMapper.MapAssignmentEditDTO(assignment); dbAssignment.Slug = slugService.TransformText(dbAssignment.Name); var existingAssignment = await _context.Assignments .Where(a => a.Course.Id == dbAssignment.Course.Id && a.Slug == dbAssignment.Slug) .FirstOrDefaultAsync(); if (existingAssignment != 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.CanCreateCoursePolicy); if (!authorization.Succeeded) { return(Forbid()); } dbAssignment.DateAdded = DateTime.UtcNow; dbAssignment.LastUpdated = DateTime.UtcNow; _context.Assignments.Add(dbAssignment); await _context.SaveChangesAsync(); dbAssignment = await _context.Assignments .Include(a => a.Course).ThenInclude(c => c.CourseInfo) .Include(a => a.Course).ThenInclude(c => c.Professor) .Include(a => a.AssignmentTasks).ThenInclude(t => t.StudentsAssigned).ThenInclude(sa => sa.Student).ThenInclude(si => si.User) .FirstOrDefaultAsync(a => a.Id == dbAssignment.Id); return(CreatedAtAction("GetAssignment", new { id = dbAssignment.Id }, assignmentMapper.MapAssignment(dbAssignment))); }
public Assignment MapAssignmentEditDTO(AssignmentEditDTO assignment) { return(new Assignment { Id = assignment.Id ?? Guid.Empty, Course = new Course { Id = assignment.Course.Id }, Name = assignment.Name, Type = assignment.Type, NumberOfDuplicates = assignment.NumberOfDuplicates ?? 1, Description = assignment.Description, DateAdded = assignment.DateAdded, StartDate = assignment.StartDate, LastUpdated = assignment.LastUpdated, EndDate = assignment.EndDate }); }
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()); }