public async Task <IActionResult> Create([FromBody] VmCreateForm form, CancellationToken ct) { if (!ModelState.IsValid) { throw new InvalidOperationException(); } var createdVm = await _vmService.CreateAsync(form, ct); return(CreatedAtAction(nameof(this.Get), new { id = createdVm.Id }, createdVm)); }
public async Task <Vm> CreateAsync(VmCreateForm form, CancellationToken ct) { if (_context.Vms.Where(v => v.Id == form.Id).Any()) { throw new ForbiddenException("Vm already exists"); } var vmEntity = _mapper.Map <Domain.Models.Vm>(form); var formTeams = vmEntity.VmTeams.Select(v => v.TeamId).Distinct(); if (!formTeams.Any()) { throw new ForbiddenException("Must include at least 1 team"); } if (!(await _playerService.CanManageTeamsAsync(formTeams, true, ct))) { throw new ForbiddenException(); } if (!(await _permissionsService.CanWrite(formTeams, ct))) { throw new ForbiddenException(); } var teamList = await _context.Teams .Where(t => formTeams.Contains(t.Id)) .Select(t => t.Id) .ToListAsync(ct); foreach (var vmTeam in vmEntity.VmTeams) { if (!teamList.Contains(vmTeam.TeamId)) { _context.Teams.Add(new Domain.Models.Team() { Id = vmTeam.TeamId }); } } _context.Vms.Add(vmEntity); await _context.SaveChangesAsync(ct); return(_mapper.Map <Vm>(vmEntity)); }