Exemplo n.º 1
0
        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)));
        }
Exemplo n.º 2
0
        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
            });
        }
Exemplo n.º 3
0
        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());
        }