Пример #1
0
        public async Task <ActionResult> ReorderTodos([FromRoute] int id, [FromRoute] int newOrder)
        {
            var request  = new ReorderTodoCommand(User.Identity?.Name, id, newOrder);
            var response = await _mediator.Send(request);

            return(response.Match <ActionResult>(
                       ok => Ok(),
                       notFound => NotFound()
                       ));
        }
Пример #2
0
        public async Task <OneOf <Ok, NotFound> > Handle(ReorderTodoCommand request, CancellationToken cancellationToken)
        {
            var userTodo = await _todosRepository
                           .GetAsync(todo => todo.Id == request.Id && todo.UserLogin == request.UserLogin);

            if (userTodo == null)
            {
                return(new NotFound());
            }

            var todos = await _todosRepository.Query()
                        .Where(todo => todo.UserLogin == request.UserLogin)
                        .OrderBy(todo => todo.Order)
                        .ToListAsync(cancellationToken);

            if (!todos.Any())
            {
                return(new NotFound());
            }

            var prevOrder = request.NewOrder > 0 ?
                            todos[request.NewOrder - 1].Order : 0;
            var nextOrder = request.NewOrder < todos.Count ?
                            todos[request.NewOrder].Order : (todos.Count + 1) * 1024;

            var deltaOrder = nextOrder - prevOrder;

            userTodo.Order = prevOrder + deltaOrder / 2;

            if (deltaOrder <= 2)
            {
                for (var i = 0; i < todos.Count; i++)
                {
                    todos[i].Order = (i + 1) * 1024;
                }
            }

            await _todosRepository.SaveChangesAsync();

            return(new Ok());
        }