Skip to content

Commit 7ff4dd4

Browse files
authored
Merge pull request #125 from Capstone-OpenStep/refactor/#124-get-task
REFACTOR: 상태 변경(FORKED->PROGRESS) api 추가
2 parents 7b38eb3 + 95a78d6 commit 7ff4dd4

File tree

6 files changed

+30
-16
lines changed

6 files changed

+30
-16
lines changed

src/main/java/com/chungang/capstone/openstep/domain/Task/controller/TaskController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.chungang.capstone.openstep.domain.Task.converter.TaskConverter;
1515
import com.chungang.capstone.openstep.domain.Task.dto.TaskResponseDTO;
1616
import com.chungang.capstone.openstep.domain.Task.entity.Task;
17+
import com.chungang.capstone.openstep.domain.Task.entity.TaskStatus;
1718
import com.chungang.capstone.openstep.domain.Task.service.TaskQueryService;
1819
import com.chungang.capstone.openstep.global.apiPayload.ApiResponse;
1920
import com.chungang.capstone.openstep.global.apiPayload.code.status.SuccessStatus;
@@ -57,6 +58,15 @@ public ApiResponse<TaskResponseDTO.Status> getTaskStatus(
5758
Member member= SecurityUtils.getCurrentMember();
5859
return ApiResponse.onSuccess(SuccessStatus.TASK_BRANCH_GET_OK, taskQueryService.getStatusByTaskId(taskId,member));
5960
}
61+
@Operation(summary = "특정 테스크의 상태 변경 API", description = "특정 기여(테스크) 상태를 FORKED -> PROGRESS로 변경합니다.")
62+
@PatchMapping("/{task-id}/status")
63+
public ApiResponse<TaskResponseDTO.Status> updateTaskStatus(
64+
@PathVariable("task-id") Long taskId
65+
) {
66+
Member member = SecurityUtils.getCurrentMember();
67+
TaskResponseDTO.Status updatedStatus = taskQueryService.updateTaskStatusToProgress(taskId, member);
68+
return ApiResponse.onSuccess(SuccessStatus.TASK_STATUS_UPDATE_OK, updatedStatus);
69+
}
6070

6171

6272

src/main/java/com/chungang/capstone/openstep/domain/Task/repository/TaskRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ public interface TaskRepository extends JpaRepository<Task, Long> {
3030
long countByMemberIdAndStatus(@Param("memberId") Long memberId, @Param("status") TaskStatus status);
3131

3232
// 특정 날짜 이후의 활동이 있었던 날들 조회
33-
@Query("SELECT DISTINCT DATE(t.updatedAt) FROM Task t WHERE t.member.memberId = :memberId AND t.updatedAt >= :fromDate ORDER BY DATE(t.updatedAt)")
33+
@Query("SELECT DISTINCT CAST(t.createdAt AS LocalDate) FROM Task t WHERE t.member.memberId = :memberId AND t.createdAt >= :since ORDER BY CAST(t.createdAt AS LocalDate)")
3434
List<LocalDate> findDistinctActivityDatesByMemberIdSince(
3535
@Param("memberId") Long memberId,
36-
@Param("fromDate") LocalDateTime fromDate
36+
@Param("since") LocalDateTime since
3737
);
3838

3939
// Explorer 업적용: distinct repo 개수

src/main/java/com/chungang/capstone/openstep/domain/Task/service/TaskQueryService.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import com.chungang.capstone.openstep.domain.Rank.repository.TaskXpLogRepository;
1010
import com.chungang.capstone.openstep.domain.Rank.service.RankCommandService;
1111

12-
import org.springframework.context.ApplicationEventPublisher;
1312
import org.springframework.stereotype.Service;
1413

1514
import com.chungang.capstone.openstep.domain.Github.service.GitHubStatusResolverService;
@@ -20,10 +19,6 @@
2019
import com.chungang.capstone.openstep.domain.Task.entity.Task;
2120
import com.chungang.capstone.openstep.domain.Task.entity.TaskStatus;
2221
import com.chungang.capstone.openstep.domain.Task.repository.TaskRepository;
23-
import com.chungang.capstone.openstep.domain.achievement.entity.MemberAchievement;
24-
import com.chungang.capstone.openstep.domain.achievement.event.PrCreatedEvent;
25-
import com.chungang.capstone.openstep.domain.achievement.event.TaskActivityEvent;
26-
import com.chungang.capstone.openstep.domain.achievement.event.TaskCompletedEvent;
2722
import com.chungang.capstone.openstep.domain.achievement.service.AchievementService;
2823
import com.chungang.capstone.openstep.global.apiPayload.code.status.ErrorStatus;
2924
import com.chungang.capstone.openstep.global.apiPayload.exception.TaskException;
@@ -263,4 +258,17 @@ public TaskResponseDTO.TaskDetail updatePRUrl(Long taskId,String prUrl ,Member m
263258
taskRepository.save(task);
264259
return TaskConverter.toTaskDetail(task);
265260
}
261+
262+
public TaskResponseDTO.Status updateTaskStatusToProgress(Long taskId, Member member) {
263+
Task task = taskRepository.findById(taskId).orElseThrow(() ->
264+
new TaskException(ErrorStatus.TASK_NOT_FOUND));
265+
266+
if(task.getStatus()!=TaskStatus.FORKED) {
267+
throw new TaskException(ErrorStatus.TASK_STATUS_UPDATE_FORBIDDEN);
268+
}
269+
task.updateStatus(TaskStatus.PROGRESS);
270+
taskRepository.save(task);
271+
272+
return TaskConverter.toTaskStatus(task);
273+
}
266274
}

src/main/java/com/chungang/capstone/openstep/domain/achievement/enums/AchievementType.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,13 @@ public enum AchievementType {
99

1010
// 즉시 달성형
1111
FIRST_COMMIT("첫 커밋", "처음으로 PR을 등록했을 때", 1, AchievementCategory.INSTANT),
12-
13-
// 누적형
1412
BUG_HUNTER("버그 헌터", "bug, fix, error, issue 등의 키워드가 포함된 PR을 생성", 5, AchievementCategory.CUMULATIVE),
15-
PR_MASTER("PR 마스터", "총 PR 생성 횟수가 5회 이상", 5, AchievementCategory.CUMULATIVE),
1613

1714
// 연속형 (활동 기반)
1815
CONSISTENT_DEV("꾸준한 개발자", "7일 연속으로 Task 활동(상태 변경, 업데이트 등)을 진행", 7, AchievementCategory.CONSECUTIVE),
1916

20-
// 탐험형
17+
// 누적형
18+
PR_MASTER("PR 마스터", "총 PR 생성 횟수가 5회 이상", 5, AchievementCategory.CUMULATIVE),
2119
EXPLORER_LV1("탐험가 LV1", "2개 이상의 서로 다른 Repo에서 Task를 생성", 2, AchievementCategory.EXPLORATION),
2220
EXPLORER_LV2("탐험가 LV2", "5개 이상의 서로 다른 Repo에서 Task를 생성", 5, AchievementCategory.EXPLORATION),
2321
EXPLORER_LV3("탐험가 LV3", "10개 이상의 서로 다른 Repo에서 Task를 생성", 10, AchievementCategory.EXPLORATION),

src/main/java/com/chungang/capstone/openstep/domain/achievement/listener/AchievementEventListener.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@
55
import java.util.Arrays;
66
import java.util.HashSet;
77
import java.util.List;
8-
import java.util.Optional;
98
import java.util.Set;
109

1110
import org.springframework.context.event.EventListener;
1211
import org.springframework.scheduling.annotation.Async;
1312
import org.springframework.stereotype.Component;
1413

15-
import com.chungang.capstone.openstep.domain.Member.entity.Member;
16-
import com.chungang.capstone.openstep.domain.Task.entity.Task;
1714
import com.chungang.capstone.openstep.domain.Task.entity.TaskStatus;
1815
import com.chungang.capstone.openstep.domain.Task.repository.TaskRepository;
1916
import com.chungang.capstone.openstep.domain.achievement.enums.AchievementType;
@@ -91,7 +88,7 @@ public void handleTaskActivity(TaskActivityEvent event) {
9188

9289
try {
9390
//활동 기반 꾸준한 개발자 업적 체크
94-
checkConsistendDevAchievement(event);
91+
checkConsistentDevAchievement(event);
9592

9693
} catch (Exception e) {
9794
log.error("Error processing task activity event for user: {}", event.getMemberId(), e);
@@ -137,7 +134,7 @@ private void checkFirstCommitAchievement(PrCreatedEvent event) {
137134
}
138135
}
139136

140-
private void checkConsistendDevAchievement(TaskActivityEvent event) {
137+
private void checkConsistentDevAchievement(TaskActivityEvent event) {
141138
LocalDateTime sevenDaysAgo = LocalDateTime.now().minusDays(7);
142139

143140
// 최근 7일간 활동이 있었던 날들 조회

src/main/java/com/chungang/capstone/openstep/global/apiPayload/code/status/ErrorStatus.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public enum ErrorStatus implements BaseErrorCode {
5858
TASK_NOT_FOUND(HttpStatus.NOT_FOUND, "TASK_4001", "존재하지 않는 테스크입니다."),
5959
TASK_PR_URL_UPDATE_ERROR_INVALID_URL(HttpStatus.BAD_REQUEST, "TASK_4002", "PR URL 형식이 올바르지 않습니다.https://github.com/<owner>/<repo>/pull/<pr-number>"),
6060
TASK_PR_URL_UPDATE_ERROR_EXCEPT_FORKED(HttpStatus.BAD_REQUEST, "TASK_4002", "PR URL 업데이트는 FORKED 상태에서는 불가능합니다"),
61+
TASK_STATUS_UPDATE_FORBIDDEN(HttpStatus.FORBIDDEN, "TASK_4003", "테스크 상태 업데이트는 FORKED -> PROGRESS만 가능합니다."),
6162
TASK_PR_URL_INVALID(HttpStatus.BAD_REQUEST, "TASK_4003", "PR URL 형식이 올바르지 않습니다."),
6263

6364
// Rank 관련 에러 5000

0 commit comments

Comments
 (0)