public async Task <ActionResult <TrackListInfoVM> > PostMeList(TrackListPutVM vm) { using (var transa = await _context.Database.BeginTransactionAsync()) { var user = await GetLoginUser(); if (user == null) { return(GetErrorResult("no_login")); } var list = vm.ToList(); list.owner = user.id; _context.Lists.Add(list); await _context.SaveChangesAsync(); RETRY: user.lists.Add(list.id); user.version++; // _context.Entry(user).State = EntityState.Modified; if (await _context.FailedSavingChanges()) { goto RETRY; } await transa.CommitAsync(); return(list.ToTrackListInfo()); } }
public async Task <IActionResult> PutList(int id, TrackListPutVM vm) { if (id != vm.id) { return(GetErrorResult("bad_request")); } var user = await GetLoginUser(); if (user == null) { return(GetErrorResult("no_login")); } var list = await _context.Lists.FindAsync(id); if (list == null || list.owner != user.id) { return(GetErrorResult("list_not_found")); } if (vm.version != null && list.version != vm.version) { goto LIST_CHANGED; } //// Skip track id checks since we check visibility on reading //if (vm.trackids != null) { // var ids = vm.trackids; // var foundTracks = await _context.Tracks.AsNoTracking().Where(x => ids.Contains(x.id)).ToListAsync(); // foundTracks = foundTracks.Where(x => x.IsVisibleToUser(user)).ToList(); // vm.trackids = vm.trackids.Where(x => foundTracks.Any(t => t.id == x)).ToList(); //} vm.ApplyToList(list); list.version++; if (await _context.FailedSavingChanges()) { goto LIST_CHANGED; } _message.TriggerEvent("l-" + id, c => list.IsVisibleToUser(c.User), new { version = list.version }); return(NoContent()); LIST_CHANGED: return(GetErrorResult("list_changed")); }
public async Task <ActionResult <TrackList> > PostList(TrackListPutVM vm) { var user = await GetLoginUser(); if (user == null) { return(GetErrorResult("no_login")); } var list = vm.ToList(); list.owner = user.id; _context.Lists.Add(list); await _context.SaveChangesAsync(); return(CreatedAtAction(nameof(GetList), new { id = list.id }, list.ToTrackListInfo())); }