@@ -53,15 +53,15 @@ public void updateTaskOrder(Long processorId, UpdateTaskOrderRequest request) {
5353 if (request .prevTaskId () == 0 ) {
5454 Task nextTask = findByIdAndStatus (request .nextTaskId (), targetTask .getTaskStatus ());
5555 // 해당 상태에서 바로 앞에 있는 작업 찾기
56- Task prevTask = loadTaskPort .findPrevOrderTaskByProcessorIdAndStatus (processorId , targetTask .getTaskStatus (), nextTask .getProcessorOrder ()).orElse (null );
56+ Task prevTask = loadTaskPort .findPrevOrderTaskByProcessorOrderAndStatus (processorId , targetTask .getTaskStatus (), nextTask .getProcessorOrder ()).orElse (null );
5757 long newOrder = taskOrderCalculationPolicy .calculateOrderForTop (prevTask , nextTask );
5858 updateNewTaskOrder (targetTask , newOrder );
5959 }
6060 // 가장 하위로 이동
6161 else if (request .nextTaskId () == 0 ) {
6262 Task prevTask = findByIdAndStatus (request .prevTaskId (), targetTask .getTaskStatus ());
6363 // 해당 상태에서 바로 뒤에 있는 작업 찾기
64- Task nextTask = loadTaskPort .findNextOrderTaskByProcessorIdAndStatus (processorId , targetTask .getTaskStatus (), prevTask .getProcessorOrder ()).orElse (null );
64+ Task nextTask = loadTaskPort .findNextOrderTaskByProcessorOrderAndStatus (processorId , targetTask .getTaskStatus (), prevTask .getProcessorOrder ()).orElse (null );
6565 long newOrder = taskOrderCalculationPolicy .calculateOrderForBottom (prevTask , nextTask );
6666 updateNewTaskOrder (targetTask , newOrder );
6767 } else {
@@ -98,21 +98,50 @@ public void updateTaskOrderAndStatus(Long processorId, UpdateTaskOrderRequest re
9898 Task targetTask = taskService .findById (request .targetTaskId ());
9999 processorValidationPolicy .validateProcessor (processorId , targetTask );
100100
101- if (request .prevTaskId () == 0 ) {
102- Task nextTask = findByIdAndStatus (request .nextTaskId (), targetStatus );
101+ Task prevTask ;
102+ Task nextTask ;
103+
104+ // 조회된 작업 보드에서 하나의 작업만 존재하고, 이 작업을 이동할 때
105+ if (request .prevTaskId () == 0 && request .nextTaskId () == 0 ) {
106+
107+ // 요청 시간 기준으로 가장 가장 근접한 이전의 Task를 조회
108+ prevTask = loadTaskPort .findPrevOrderTaskByTaskIdAndStatus (processorId , targetStatus , targetTask .getTaskId ()).orElse (null );
109+ if (prevTask != null ) {
110+ // 이전 Task가 있다면 바로 다음의 Task 조회
111+ nextTask = loadTaskPort .findNextOrderTaskByProcessorOrderAndStatus (processorId , targetStatus , prevTask .getProcessorOrder ()).orElse (null );
112+ } // 요청 시간 기준으로 가장 가장 근접한 이후의 Task를 조회
113+ else
114+ nextTask = loadTaskPort .findNextOrderTaskByTaskIdAndStatus (processorId , targetStatus , targetTask .getTaskId ()).orElse (null );
115+
116+ // 하나의 task만 존재할 경우 상태만 update
117+ if (prevTask == null && nextTask == null ) {
118+ targetTask .updateTaskStatus (targetStatus );
119+ taskService .upsert (targetTask );
120+ } else if (prevTask == null ) {
121+ long newOrder = taskOrderCalculationPolicy .calculateOrderForBottom (null , nextTask );
122+ updateNewTaskOrderAndStatus (targetStatus , targetTask , newOrder );
123+ } else if (nextTask == null ) {
124+ long newOrder = taskOrderCalculationPolicy .calculateOrderForBottom (prevTask , null );
125+ updateNewTaskOrderAndStatus (targetStatus , targetTask , newOrder );
126+ } else {
127+ long newOrder = taskOrderCalculationPolicy .calculateNewProcessorOrder (prevTask .getProcessorOrder (), nextTask .getProcessorOrder ());
128+ updateNewTaskOrderAndStatus (targetStatus , targetTask , newOrder );
129+ }
130+ } else if (request .prevTaskId () == 0 ) {
131+ nextTask = findByIdAndStatus (request .nextTaskId (), targetStatus );
103132 // 해당 상태에서 바로 앞 있는 작업 찾기
104- Task prevTask = loadTaskPort .findPrevOrderTaskByProcessorIdAndStatus (processorId , targetStatus , nextTask .getProcessorOrder ()).orElse (null );
133+ prevTask = loadTaskPort .findPrevOrderTaskByProcessorOrderAndStatus (processorId , targetStatus , nextTask .getProcessorOrder ()).orElse (null );
105134 long newOrder = taskOrderCalculationPolicy .calculateOrderForTop (prevTask , nextTask );
106135 updateNewTaskOrderAndStatus (targetStatus , targetTask , newOrder );
107136 } else if (request .nextTaskId () == 0 ) {
108- Task prevTask = findByIdAndStatus (request .prevTaskId (), targetStatus );
137+ prevTask = findByIdAndStatus (request .prevTaskId (), targetStatus );
109138 // 해당 상태에서 바로 뒤에 있는 작업 찾기
110- Task nextTask = loadTaskPort .findNextOrderTaskByProcessorIdAndStatus (processorId , targetStatus , prevTask .getProcessorOrder ()).orElse (null );
139+ nextTask = loadTaskPort .findNextOrderTaskByProcessorOrderAndStatus (processorId , targetStatus , prevTask .getProcessorOrder ()).orElse (null );
111140 long newOrder = taskOrderCalculationPolicy .calculateOrderForBottom (prevTask , nextTask );
112141 updateNewTaskOrderAndStatus (targetStatus , targetTask , newOrder );
113142 } else {
114- Task prevTask = findByIdAndStatus (request .prevTaskId (), targetStatus );
115- Task nextTask = findByIdAndStatus (request .nextTaskId (), targetStatus );
143+ prevTask = findByIdAndStatus (request .prevTaskId (), targetStatus );
144+ nextTask = findByIdAndStatus (request .nextTaskId (), targetStatus );
116145 long newOrder = taskOrderCalculationPolicy .calculateNewProcessorOrder (prevTask .getProcessorOrder (), nextTask .getProcessorOrder ());
117146 updateNewTaskOrderAndStatus (targetStatus , targetTask , newOrder );
118147 }
@@ -131,11 +160,6 @@ private void updateNewTaskOrderAndStatus(TaskStatus targetStatus, Task targetTas
131160 * 순서 변경 요청의 유효성을 검증하는 메서드
132161 */
133162 public void validateRequest (UpdateTaskOrderRequest request , TaskStatus targetStatus ) {
134- // 이전 및 다음 작업 ID가 모두 0인 경우 예외 발생
135- if (request .prevTaskId () == 0 && request .nextTaskId () == 0 ) {
136- throw new ApplicationException (TaskErrorCode .INVALID_TASK_STATUS_TRANSITION );
137- }
138-
139163 // 타겟 상태가 유효한지 검증
140164 if (targetStatus != null && !TaskPolicyConstants .TASK_BOARD_STATUS_FILTER .contains (targetStatus )) {
141165 throw new ApplicationException (TaskErrorCode .INVALID_TASK_STATUS_TRANSITION );
0 commit comments