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() )); }
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()); }