private async Task <IActionResult> BulkOperation(BoxUpdateModel model, bool clear) { if (!CanPost(model.Id)) { return(Unauthorized()); } var box = await DbContext.Boxes.SingleOrDefaultAsync(x => x.Id == model.Id); if (box == null) { return(BadRequest("Box not found.")); } model.Added = model.Added ?? Enumerable.Empty <int>(); model.Removed = model.Removed ?? Enumerable.Empty <int>(); model.Updated = model.Updated ?? Enumerable.Empty <BoxUnitUpdateModel>(); if (model.Added.Any() || model.Removed.Any() || model.Updated.Any()) { if (clear) { await DbContext.BoxUnits.Where(x => x.BoxId == model.Id && !model.Added.Contains(x.UnitId)).DeleteAsync(); } else if (model.Removed.Any()) { await DbContext.BoxUnits.Where(x => x.BoxId == model.Id && model.Removed.Contains(x.UnitId)).DeleteAsync(); } if (model.Added.Any()) { var existing = box.BoxUnits.Select(x => x.UnitId).ToList(); var real = await DbContext.Units.Where(x => model.Added.Contains(x.Id)).Select(x => x.Id).ToListAsync(); var actual = real.Except(existing); if (actual.Any()) { var newItems = actual.Select(x => new BoxUnit { BoxId = model.Id, UnitId = x }); DbContext.BoxUnits.AddRange(newItems); } } if (model.Updated.Any()) { foreach (var item in model.Updated) { await DbContext.BoxUnits.Where(x => x.BoxId == model.Id && x.UnitId == item.Id).UpdateAsync(x => new BoxUnit { Flags = item.Flags }); } } await DbContext.SaveChangesSafe(); } return(Ok(1)); }
public async Task <IActionResult> Flags([FromBody] BoxUpdateModel model) { return(await BulkOperation(model, false)); }
public async Task <IActionResult> Set([FromBody] BoxUpdateModel model) { return(await BulkOperation(model, true)); }