public async Task <ViewModels.Exercise> CreateAsync(ViewModels.Exercise exercise, CancellationToken ct) { if (!(await _authorizationService.AuthorizeAsync(_user, null, new ExerciseCreationRequirement())).Succeeded) { throw new ForbiddenException(); } var exerciseEntity = Mapper.Map <ExerciseEntity>(exercise); var exerciseAdminPermission = await _context.Permissions .Where(p => p.Key == PlayerClaimTypes.ExerciseAdmin.ToString()) .FirstOrDefaultAsync(ct); if (exerciseAdminPermission == null) { throw new EntityNotFoundException <Permission>($"{PlayerClaimTypes.ExerciseAdmin.ToString()} Permission not found."); } var userId = _user.GetId(); // Create an Admin team with the caller as a member var teamEntity = new TeamEntity() { Name = "Admin" }; teamEntity.Permissions.Add(new TeamPermissionEntity() { Permission = exerciseAdminPermission }); var exerciseMembershipEntity = new ExerciseMembershipEntity { Exercise = exerciseEntity, UserId = userId }; exerciseEntity.Teams.Add(teamEntity); exerciseEntity.Memberships.Add(exerciseMembershipEntity); _context.Exercises.Add(exerciseEntity); await _context.SaveChangesAsync(ct); var teamMembershipEntity = new TeamMembershipEntity { Team = teamEntity, UserId = userId, ExerciseMembership = exerciseMembershipEntity }; exerciseMembershipEntity.PrimaryTeamMembership = teamMembershipEntity; _context.TeamMemberships.Add(teamMembershipEntity); _context.ExerciseMemberships.Update(exerciseMembershipEntity); await _context.SaveChangesAsync(ct); return(await GetAsync(exerciseEntity.Id, ct)); }
public async Task <ViewModels.Exercise> UpdateAsync(Guid id, ViewModels.Exercise exercise, CancellationToken ct) { if (!(await _authorizationService.AuthorizeAsync(_user, null, new ExerciseAdminRequirement(id))).Succeeded) { throw new ForbiddenException(); } var exerciseToUpdate = await _context.Exercises.SingleOrDefaultAsync(v => v.Id == id, ct); if (exerciseToUpdate == null) { throw new EntityNotFoundException <Exercise>(); } Mapper.Map(exercise, exerciseToUpdate); _context.Exercises.Update(exerciseToUpdate); await _context.SaveChangesAsync(ct); return(_mapper.Map(exerciseToUpdate, exercise)); }