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