예제 #1
0
        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());
            }
        }
예제 #2
0
        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"));
        }
예제 #3
0
        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()));
        }