Example #1
0
        MergeResultsAsync(int queryId, IList <TodoItemReference> lastResults, IList <TodoListItem> matchedItems)
        {
            // remove stale result items
            var mergedResults = new List <TodoItemReference>();

            foreach (TodoItemReference result in lastResults)
            {
                var item = matchedItems.FirstOrDefault(i => i.Id == result.Item.Id);
                if (item != null)
                {
                    // result still relevant, remove it from matching list
                    matchedItems.Remove(item);
                    mergedResults.Add(result);
                }
                else
                {
                    // result is stale, remove it from result set
                    PositionAdjuster.AdjustForDelete(result, lastResults.ToList <ISortable>());
                    _context.TodoReferences.Delete(result);
                }
            }

            // append new ones
            foreach (TodoListItem item in matchedItems)
            {
                var result = new TodoItemReference()
                {
                    Item        = item,
                    Position    = mergedResults.Count,
                    TodoQueryId = queryId
                };

                mergedResults.Add(result);
                await _context.TodoReferences.AddAsync(result);
            }

            return(mergedResults);
        }
Example #2
0
        public async Task <ActionResult <TodoItemReference> > MoveReferenceAsync(int id, [FromBody] TodoItemReference reference)
        {
            var current = await _context.TodoReferences.GetAsync(id);

            if (current == null)
            {
                return(NotFound());
            }

            // re-arrange other references affected by move
            var references = await _context.TodoReferences.GetAsync(r => r.TodoQueryId == reference.TodoQueryId);

            PositionAdjuster.AdjustForUpdate(reference, references.ToList <ISortable>(), current);

            // move reference to desired location
            current.UpdateFrom(reference);

            _context.TodoReferences.Update(current);
            await _context.SaveChangesAsync();

            return(current);
        }