Skip to content

Commit 60cac5a

Browse files
authored
feat : 미션 test 생성 (#103)
* 미션 코드 전체 수정 * ëãN+1 ë 문제 해결 * 미션 필요없는 메소드 삭제 * mission 리팩토링 & test 작성
1 parent f78db16 commit 60cac5a

26 files changed

+1670
-517
lines changed

backend/src/main/java/com/back/domain/mission/controller/ApiV1MissionController.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,26 @@ public ResponseEntity<ApiResponse<Void>> deleteMission(
7878
.status(HttpStatus.OK)
7979
.body(ApiResponse.success("200", "미션 삭제 성공"));
8080
}
81+
82+
@GetMapping("/all")
83+
@Operation(summary = "전체 미션 목록 조회", description = "모든 사용자의 미션을 조회합니다.")
84+
public ResponseEntity<ApiResponse<MissionOverviewResponse>> getAllMissions() {
85+
MissionOverviewResponse response = missionService.getAllMissionsForAdmin();
86+
87+
return ResponseEntity
88+
.status(HttpStatus.OK)
89+
.body(ApiResponse.success("200", "전체 미션 조회 성공", response));
90+
}
91+
92+
@GetMapping("/all/{missionId}")
93+
@Operation(summary = "미션 상세 조회 (모든 주차)", description = "모든 주차의 Task를 제한없이 조회합니다.")
94+
public ResponseEntity<ApiResponse<MissionResponse>> getMissionAllDetail(
95+
@PathVariable Integer missionId) {
96+
97+
MissionResponse response = missionService.getMissionDetailAdmin(missionId);
98+
99+
return ResponseEntity
100+
.status(HttpStatus.OK)
101+
.body(ApiResponse.success("200", "미션 상세 조회 성공", response));
102+
}
81103
}

backend/src/main/java/com/back/domain/mission/controller/ApiV1TaskController.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.back.domain.member.entity.Member;
44
import com.back.domain.mission.dto.request.TaskCompleteRequest;
5+
import com.back.domain.mission.dto.request.WeekTaskUpdateRequest;
56
import com.back.domain.mission.dto.response.TaskCompleteResponse;
67
import com.back.domain.mission.dto.response.TaskResponse;
78
import com.back.domain.mission.service.TaskService;
@@ -64,5 +65,32 @@ public ResponseEntity<ApiResponse<TaskCompleteResponse>> completeTask(
6465
.status(HttpStatus.OK)
6566
.body(ApiResponse.success("200", "태스크 완료 처리 성공", response));
6667
}
68+
69+
@PutMapping("/{taskId}")
70+
@Operation(summary = "태스크 수정", description = "태스크 제목을 수정합니다.")
71+
public ResponseEntity<ApiResponse<TaskResponse>> updateTask(
72+
@PathVariable Integer taskId,
73+
@RequestBody String newTitle) {
74+
75+
Member actor = rq.getActorFromDb();
76+
TaskResponse response = taskService.updateTask(actor.getId(), taskId, newTitle);
77+
78+
return ResponseEntity
79+
.status(HttpStatus.OK)
80+
.body(ApiResponse.success("200", "태스크 수정 성공", response));
81+
}
82+
83+
@PutMapping("/week")
84+
@Operation(summary = "주차 Task 일괄 수정", description = "한 주차의 여러 Task를 한번에 수정합니다.")
85+
public ResponseEntity<ApiResponse<List<TaskResponse>>> updateWeekTasks(
86+
@Valid @RequestBody WeekTaskUpdateRequest request) {
87+
88+
Member actor = rq.getActorFromDb();
89+
List<TaskResponse> responses = taskService.updateWeekTasks(actor.getId(), request);
90+
91+
return ResponseEntity
92+
.status(HttpStatus.OK)
93+
.body(ApiResponse.success("200", "주차 Task 일괄 수정 성공", responses));
94+
}
6795
}
6896

backend/src/main/java/com/back/domain/mission/controller/ApiV1WeeklyUpdateController.java

Lines changed: 0 additions & 65 deletions
This file was deleted.

backend/src/main/java/com/back/domain/mission/dto/request/WeeklyUpdateRequest.java renamed to backend/src/main/java/com/back/domain/mission/dto/request/WeekTaskUpdateRequest.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,25 @@
1111
@NoArgsConstructor
1212
@AllArgsConstructor
1313
@Builder
14-
public class WeeklyUpdateRequest {
14+
public class WeekTaskUpdateRequest {
1515

16-
@NotNull(message = "미션 ID는 필수입니다")
17-
private Integer missionId;
18-
19-
@NotNull(message = "서브골 ID는 필수입니다")
16+
@NotNull(message = "SubGoal ID는 필수입니다")
2017
private Integer subGoalId;
2118

22-
@NotEmpty(message = "수정할 태스크가 필요합니다")
23-
private List<TaskUpdateDto> taskUpdates;
19+
@NotEmpty(message = "수정할 Task 목록이 필요합니다")
20+
private List<TaskUpdateDto> tasks;
2421

2522
@Getter
2623
@Setter
2724
@NoArgsConstructor
2825
@AllArgsConstructor
2926
@Builder
3027
public static class TaskUpdateDto {
28+
@NotNull(message = "Task ID는 필수입니다")
3129
private Integer taskId;
30+
31+
@NotNull(message = "제목은 필수입니다")
3232
private String title;
3333
}
34-
}
34+
35+
}

backend/src/main/java/com/back/domain/mission/dto/response/MissionResponse.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
@Setter
1212
@NoArgsConstructor
1313
@AllArgsConstructor
14-
@Builder
14+
@Builder(toBuilder = true)
1515
public class MissionResponse {
1616
private Integer missionId;
1717
private String title;
@@ -24,6 +24,18 @@ public class MissionResponse {
2424
private boolean isCompleted; //미션 완료 여부
2525
private boolean isPartyMission; //파티 미션 여부 (개인인지 / 파티인지)
2626
private Integer partyId; // 파티일경우
27-
private Integer progressRate; //미션 전체 진행률 (개인)
27+
private Integer myProgressRate; //미션 진행률 (개인)
28+
private PartyProgressDto partyProgress; // 미션 진행률 파티
2829
private List<SubGoalResponse> subGoals;
30+
31+
@Getter
32+
@Setter
33+
@NoArgsConstructor
34+
@AllArgsConstructor
35+
@Builder
36+
public static class PartyProgressDto {
37+
private Integer myProgress;
38+
private Integer averageProgress;
39+
private Integer totalProgress;
40+
}
2941
}

backend/src/main/java/com/back/domain/mission/dto/response/SubGoalResponse.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,19 @@ public class SubGoalResponse {
1616
private Integer weekNum; // 몇번쨰 주차인지
1717
private LocalDate startDate;
1818
private LocalDate endDate;
19-
private boolean hasBeenEdited; //사용자가 한번이라도 수정했는지
20-
private LocalDate editableUntil; // 수정 가능 기한
21-
private String editStatus; // 수정 상태 표시
22-
private Integer weekProgressRate; //해당주차 진행률
19+
private Integer weekProgressRate; // 개인 미션 진행률
20+
private PartyWeekProgressDto partyWeekProgress; // 파티 미션 진행률
21+
22+
private boolean visible;
2323
private List<TaskResponse> tasks;
24+
25+
@Getter
26+
@Setter
27+
@NoArgsConstructor
28+
@AllArgsConstructor
29+
@Builder
30+
public static class PartyWeekProgressDto {
31+
private Integer myProgress;
32+
private Integer averageProgress;
33+
}
2434
}

backend/src/main/java/com/back/domain/mission/dto/response/TaskCompleteResponse.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ public class TaskCompleteResponse {
1414
private Integer taskId;
1515
private TaskStatus status;
1616
private LocalDate completedDate;
17-
private Integer earnedPoints; //task로 획득한 포인트
18-
private Integer earnedExp; //task로 획득한 경험치
1917
private Integer dailyProgressRate; //일일 진행률
2018
private Integer weeklyProgressRate; //주차별 진행률
2119
private Integer missionProgressRate; //전체 미션 진행률

backend/src/main/java/com/back/domain/mission/dto/response/TaskResponse.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public class TaskResponse {
1818
private LocalDate lastCompletedDate; // 마지막 완료 일자
1919
private boolean isToday; // 오늘 해야하는 task인지 여부
2020

21-
//private boolean hasBeenEdited;// 이미 수정된 Task인지 여부 (true면 1회 수정 끝)
22-
//private LocalDate editableUntil;// 수정 가능 기한 (ex: 이번 주 종료일까지)
23-
//private String editStatus; // 수정 상태 표시 ("가능", "불가", "기간만료")
24-
25-
}
21+
// 🔹 수정 관련 필드
22+
private boolean hasBeenEdited; // 이미 수정됐는지 여부
23+
private boolean canEdit; // 지금 시점에 수정 가능한지 여부
24+
private LocalDate editDeadline; // 수정 마감일
25+
}

backend/src/main/java/com/back/domain/mission/entity/Mission.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.back.global.jpa.entity.BaseEntity;
99
import jakarta.persistence.*;
1010
import lombok.*;
11+
import org.hibernate.annotations.Fetch;
12+
import org.hibernate.annotations.FetchMode;
1113

1214
import java.time.LocalDate;
1315
import java.util.ArrayList;
@@ -53,6 +55,7 @@ public class Mission extends BaseEntity {
5355
private LocalDate endDate;
5456

5557
@OneToMany(mappedBy = "mission", cascade = CascadeType.ALL, orphanRemoval = true)
58+
@Fetch(FetchMode.SUBSELECT)
5659
@Builder.Default
5760
private List<SubGoal> subGoals = new ArrayList<>();
5861

backend/src/main/java/com/back/domain/mission/entity/SubGoal.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import jakarta.persistence.*;
44
import lombok.*;
5+
import org.hibernate.annotations.Fetch;
6+
import org.hibernate.annotations.FetchMode;
57

68
import java.time.LocalDate;
79
import java.util.ArrayList;
@@ -36,26 +38,34 @@ public class SubGoal {
3638
@Column(nullable = false)
3739
private LocalDate endDate;
3840

39-
@Column(nullable = false)
40-
private Boolean hasBeenEdited = false; // Boolean으로 변경
41-
42-
private LocalDate editableUntil;
43-
4441
@OneToMany(mappedBy = "subGoal", cascade = CascadeType.ALL, orphanRemoval = true)
42+
@Fetch(FetchMode.SUBSELECT)
4543
@Builder.Default
4644
private List<Task> tasks = new ArrayList<>();
4745

48-
public Boolean getHasBeenEdited() {
49-
return hasBeenEdited;
46+
public boolean isCurrentWeek() {
47+
LocalDate today = LocalDate.now();
48+
return !today.isBefore(startDate) && !today.isAfter(endDate);
49+
}
50+
51+
public boolean isUpcoming() {
52+
return LocalDate.now().isBefore(startDate);
5053
}
5154

52-
public boolean canEdit() {
53-
if (Boolean.TRUE.equals(hasBeenEdited)) return false;
55+
public boolean isPast() {
56+
return LocalDate.now().isAfter(endDate);
57+
}
5458

55-
LocalDate today = LocalDate.now();
56-
if (today.isBefore(startDate)) return true;
57-
if (editableUntil != null && !today.isAfter(editableUntil)) return true;
59+
public void addTask(Task task) {
60+
tasks.add(task);
61+
task.setSubGoal(this);
62+
}
5863

59-
return false;
64+
public void setMission(Mission mission) {
65+
this.mission = mission;
66+
if (mission != null && !mission.getSubGoals().contains(this)) {
67+
mission.getSubGoals().add(this);
68+
}
6069
}
70+
6171
}

0 commit comments

Comments
 (0)