public async Task <TaskAggregate> MoveTaskToProjectAsync(string taskId, string targetProjectId, string targetListTitle, string requestId)
        {
            if (!(await CheckAndSaveRequestIdAsync(requestId)))
            {
                throw new AlreadyHandledException();
            }

            var task = await _tasksRepository.GetTaskAsync(taskId);

            if (!string.IsNullOrWhiteSpace(task.TransactionId))
            {
                throw new AlreadyInTransactionException();
            }

            if (task.ProjectId == targetProjectId)
            {
                throw new EntityExistsException("Task already in target project");
            }

            List <string> taskMembers = task.Members?.Select(m => m.Id).ToList() ?? new List <string>();

            MoveTaskTransaction moveTransaction = MoveTaskTransaction.Create(taskId, targetProjectId, targetListTitle);

            moveTransaction.State = TransactionStates.Processing;

            var moveMessage = OutboxMessageModel.Create(
                new MoveTaskPrepareListMessage
            {
                TransactionId = moveTransaction.Id,
                ListTitle     = targetListTitle,
                ProjectId     = targetProjectId
            }, Topics.Tasks, TransactionMessageActions.MoveTask_PrepareListRequested);

            await _transactionsRepository.CreateTransactionRecordAsync(moveTransaction, moveMessage);

            await _tasksRepository.SetTransactionAsync(taskId, moveTransaction.Id);

            return(await _tasksRepository.GetTaskAsync(taskId));
        }