Skip to content

Commit

Permalink
Merge pull request #589 from DKU-Dgaja/588-be-refactor-ui-피드백-반영-및-사소…
Browse files Browse the repository at this point in the history
…한-버그-수정

[BE] refactor(#588): UI 피드백 반영 및 사소한 버그 수정
  • Loading branch information
saesang authored Sep 2, 2024
2 parents 4f17ff5 + 1450183 commit 8dfd4dc
Show file tree
Hide file tree
Showing 8 changed files with 134 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public ResponseEntity<Void> approveCommit(@AuthenticationPrincipal User user,
}

@ApiResponse(responseCode = "200", description = "커밋 거절 성공")
@GetMapping("/{commitId}/reject")
@PostMapping("/{commitId}/reject")
public ResponseEntity<Void> rejectCommit(@AuthenticationPrincipal User user,
@RequestParam(name = "studyInfoId") Long studyInfoId,
@Valid @RequestBody CommitRejectionRequest request,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example.backend.study.api.controller.todo;

import com.example.backend.auth.api.controller.auth.response.UserInfoResponse;
import com.example.backend.domain.define.account.user.User;
import com.example.backend.study.api.controller.todo.request.StudyTodoRequest;
import com.example.backend.study.api.controller.todo.request.StudyTodoUpdateRequest;
Expand Down Expand Up @@ -122,9 +123,9 @@ public ResponseEntity<StudyTodoProgressResponse> readStudyTodoProgress(@Authenti
@PathVariable(name = "studyInfoId") Long studyInfoId) {

// 스터디 멤버인지 검증
studyMemberService.isValidateStudyMember(user, studyInfoId);
UserInfoResponse findUser = studyMemberService.isValidateStudyMember(user, studyInfoId);

return ResponseEntity.ok().body(studyTodoService.readStudyTodoProgress(studyInfoId));
return ResponseEntity.ok().body(studyTodoService.readStudyTodoProgress(findUser.getUserId(), studyInfoId));
}

// Todo별 커밋 리스트 조회
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example.backend.study.api.controller.todo.response;

import com.example.backend.domain.define.study.todo.mapping.constant.StudyTodoStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -10,17 +11,21 @@
@NoArgsConstructor
@AllArgsConstructor
public class StudyTodoProgressResponse {

private StudyTodoResponse todo; // 마감일이 가장 가까운 To-do 정보

private int totalMemberCount; // 총 스터디원 수

private int completeMemberCount; // 완료한 스터디원 수

private StudyTodoStatus myStatus; // 자신의 완료 여부 상태

public static StudyTodoProgressResponse empty() {
return StudyTodoProgressResponse.builder()
.todo(null)
.totalMemberCount(0)
.completeMemberCount(0)
.build();
.todo(null)
.totalMemberCount(0)
.completeMemberCount(0)
.myStatus(StudyTodoStatus.TODO_INCOMPLETE)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.example.backend.study.api.service.todo;


import static com.example.backend.domain.define.study.todo.mapping.constant.StudyTodoStatus.TODO_COMPLETE;

import com.example.backend.common.exception.ExceptionMessage;
import com.example.backend.common.exception.study.StudyInfoException;
import com.example.backend.common.exception.todo.TodoException;
Expand Down Expand Up @@ -250,7 +252,7 @@ private List<Long> extractUserIds(List<StudyMember> activeMembers) {
}

@Transactional
public StudyTodoProgressResponse readStudyTodoProgress(Long studyInfoId) {
public StudyTodoProgressResponse readStudyTodoProgress(Long userId, Long studyInfoId) {
// 해당 스터디에서 활동중인 스터디원 인원수
int memberCount = studyMemberRepository.findActiveMembersByStudyInfoId(studyInfoId).size();

Expand All @@ -260,11 +262,20 @@ public StudyTodoProgressResponse readStudyTodoProgress(Long studyInfoId) {
// 투두 완료 멤버 인원 수
int completeMemberCount = studyTodoMappingRepository.findCompleteTodoMappingCountByTodoId(todo.getId());

// 자신의 투두 완료 여부 확인
StudyTodoMapping findTodoMapping = studyTodoMappingRepository.findByTodoIdAndUserId(
todo.getId(), userId).orElseThrow(() -> {
log.warn(">>>> {} <<<<",
ExceptionMessage.STUDY_TODO_MAPPING_NOT_FOUND.getText());
throw new TodoException(ExceptionMessage.STUDY_TODO_MAPPING_NOT_FOUND);
});

return StudyTodoProgressResponse.builder()
.todo(StudyTodoResponse.of(todo))
.totalMemberCount(memberCount)
.completeMemberCount(completeMemberCount)
.build();
.todo(StudyTodoResponse.of(todo))
.totalMemberCount(memberCount)
.completeMemberCount(completeMemberCount)
.myStatus(findTodoMapping.getStatus())
.build();
})
.orElseGet(StudyTodoProgressResponse::empty);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,15 @@ public static StudyTodoMapping createOverdueStudyTodoMapping(Long todoId, Long u
.build();
}

// 테스트용 미완료된 studyTodoMapping 생성
public static StudyTodoMapping createInCompleteStudyTodoMapping(Long todoId, Long userId) {
return StudyTodoMapping.builder()
.todoId(todoId)
.userId(userId)
.status(StudyTodoStatus.TODO_INCOMPLETE)
.build();
}

// 테스트용 To do 등록
public static StudyTodoRequest generateStudyTodoRequest() {
return StudyTodoRequest.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import static com.example.backend.auth.config.fixture.UserFixture.generateAuthUser;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
Expand Down Expand Up @@ -239,7 +240,7 @@ class StudyCommitControllerTest extends MockTestConfig {
doNothing().when(studyCommitService).rejectCommit(anyLong(), anyString());

// when
mockMvc.perform(get("/commits/" + commitId + "/reject")
mockMvc.perform(post("/commits/" + commitId + "/reject")
.contentType(MediaType.APPLICATION_JSON)
.param("studyInfoId", "1")
.content(objectMapper.writeValueAsString(request))
Expand All @@ -265,7 +266,7 @@ class StudyCommitControllerTest extends MockTestConfig {
String accessToken = jwtService.generateAccessToken(map, user);

// when
mockMvc.perform(get("/commits/" + commitId + "/reject")
mockMvc.perform(post("/commits/" + commitId + "/reject")
.contentType(MediaType.APPLICATION_JSON)
.param("studyInfoId", "1")
.content(objectMapper.writeValueAsString(request))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@

import static com.example.backend.auth.config.fixture.UserFixture.generateAuthUser;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
Expand Down Expand Up @@ -328,7 +329,7 @@ void tearDown() {

when(studyMemberService.isValidateStudyMember(any(User.class), any(Long.class)))
.thenReturn(UserInfoResponse.of(savedUser));
when(studyTodoService.readStudyTodoProgress(any(Long.class))).thenReturn(response);
when(studyTodoService.readStudyTodoProgress(anyLong(), any(Long.class))).thenReturn(response);

// when
mockMvc.perform(get("/study/" + 1L + "/todo/progress")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@

import static com.example.backend.auth.config.fixture.UserFixture.*;
import static com.example.backend.domain.define.study.commit.StudyCommitFixture.createDefaultStudyCommitList;
import static com.example.backend.domain.define.study.todo.mapping.constant.StudyTodoStatus.TODO_COMPLETE;
import static com.example.backend.domain.define.study.todo.mapping.constant.StudyTodoStatus.TODO_INCOMPLETE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
Expand Down Expand Up @@ -487,7 +488,7 @@ void readStudyTodo_status() {
StudyInfo studyInfo = StudyInfoFixture.createDefaultPublicStudyInfo(leader.getId());
studyInfoRepository.save(studyInfo);

StudyMember A = StudyMemberFixture.createStudyMemberLeader(member1.getId(), studyInfo.getId());
StudyMember A = StudyMemberFixture.createStudyMemberLeader(leader.getId(), studyInfo.getId());
StudyMember koo = StudyMemberFixture.createDefaultStudyMember(member1.getId(), studyInfo.getId());
StudyMember Lee = StudyMemberFixture.createDefaultStudyMember(member2.getId(), studyInfo.getId());
studyMemberRepository.saveAll(List.of(A, koo, Lee));
Expand All @@ -506,7 +507,7 @@ void readStudyTodo_status() {
studyTodoMappingRepository.save(StudyTodoFixture.createStudyTodoMapping(studyTodoB.getId(), koo.getUserId()));

// when
StudyTodoProgressResponse response = studyTodoService.readStudyTodoProgress(studyInfo.getId());
StudyTodoProgressResponse response = studyTodoService.readStudyTodoProgress(leader.getId(), studyInfo.getId());

// then
assertEquals(response.getTodo().getId(), studyTodoA.getId());
Expand All @@ -526,7 +527,7 @@ void readStudyTodo_status() {

// 스터디장 To do 생성
// when
StudyTodoProgressResponse response = studyTodoService.readStudyTodoProgress(studyInfo.getId());
StudyTodoProgressResponse response = studyTodoService.readStudyTodoProgress(leader.getId(), studyInfo.getId());

// then
assertNull(response.getTodo());
Expand Down Expand Up @@ -570,4 +571,91 @@ void readStudyTodo_status() {
}

}

@Test
void 가장_빠른_마감일을_가진_Todo_진행률_조회_시_자신의_완료_여부도_함께_반환한다A() {
// given
int expectedTotalMemberCnt = 3;
int expectedCompleteMemberCnt = 2;

User leader = userRepository.save(generateAuthUser());
User member1 = userRepository.save(generateKaKaoUser());
User member2 = userRepository.save(generateGoogleUser());

StudyInfo studyInfo = StudyInfoFixture.createDefaultPublicStudyInfo(leader.getId());
studyInfoRepository.save(studyInfo);

StudyMember A = StudyMemberFixture.createStudyMemberLeader(leader.getId(), studyInfo.getId());
StudyMember koo = StudyMemberFixture.createDefaultStudyMember(member1.getId(), studyInfo.getId());
StudyMember Lee = StudyMemberFixture.createDefaultStudyMember(member2.getId(), studyInfo.getId());
studyMemberRepository.saveAll(List.of(A, koo, Lee));

// 스터디장 To do 생성
StudyTodo studyTodoA = StudyTodoFixture.createStudyTodoByTodoDate(studyInfo.getId(), LocalDate.now().plusDays(2));
StudyTodo studyTodoB = StudyTodoFixture.createStudyTodoByTodoDate(studyInfo.getId(), LocalDate.now().plusDays(3));
studyTodoRepository.save(studyTodoA);
studyTodoRepository.save(studyTodoB);

StudyTodoMapping studyTodoMapping1 = StudyTodoFixture.createStudyTodoMapping(studyTodoA.getId(), koo.getUserId());
StudyTodoMapping studyTodoMapping2 = StudyTodoFixture.createCompleteStudyTodoMapping(studyTodoA.getId(), Lee.getUserId());
StudyTodoMapping studyTodoMapping3 = StudyTodoFixture.createCompleteStudyTodoMapping(studyTodoA.getId(), A.getUserId());
studyTodoMappingRepository.saveAll(List.of(studyTodoMapping1, studyTodoMapping2, studyTodoMapping3));

studyTodoMappingRepository.save(StudyTodoFixture.createStudyTodoMapping(studyTodoB.getId(), koo.getUserId()));

// when
StudyTodoProgressResponse response = studyTodoService.readStudyTodoProgress(leader.getId(), studyInfo.getId());

// then
assertEquals(response.getTodo().getId(), studyTodoA.getId());
assertEquals(response.getTodo().getTitle(), studyTodoA.getTitle());
assertEquals(response.getTotalMemberCount(), expectedTotalMemberCnt);
assertEquals(response.getCompleteMemberCount(), expectedCompleteMemberCnt);
assertSame(response.getMyStatus(), TODO_COMPLETE);

}

@Test
void 가장_빠른_마감일을_가진_Todo_진행률_조회_시_자신의_완료_여부도_함께_반환한다B() {
// given
int expectedTotalMemberCnt = 3;
int expectedCompleteMemberCnt = 1;

User leader = userRepository.save(generateAuthUser());
User member1 = userRepository.save(generateKaKaoUser());
User member2 = userRepository.save(generateGoogleUser());

StudyInfo studyInfo = StudyInfoFixture.createDefaultPublicStudyInfo(leader.getId());
studyInfoRepository.save(studyInfo);

StudyMember study_leader = StudyMemberFixture.createStudyMemberLeader(leader.getId(), studyInfo.getId());
StudyMember koo = StudyMemberFixture.createDefaultStudyMember(member1.getId(), studyInfo.getId());
StudyMember Lee = StudyMemberFixture.createDefaultStudyMember(member2.getId(), studyInfo.getId());
studyMemberRepository.saveAll(List.of(study_leader, koo, Lee));

// 스터디장 To do 생성
StudyTodo studyTodoA = StudyTodoFixture.createStudyTodoByTodoDate(studyInfo.getId(), LocalDate.now().plusDays(2));
StudyTodo studyTodoB = StudyTodoFixture.createStudyTodoByTodoDate(studyInfo.getId(), LocalDate.now().plusDays(3));
studyTodoRepository.save(studyTodoA);
studyTodoRepository.save(studyTodoB);

StudyTodoMapping studyTodoMapping1 = StudyTodoFixture.createStudyTodoMapping(studyTodoA.getId(), koo.getUserId());
StudyTodoMapping studyTodoMapping2 = StudyTodoFixture.createInCompleteStudyTodoMapping(studyTodoA.getId(), Lee.getUserId());
StudyTodoMapping studyTodoMapping3 = StudyTodoFixture.createCompleteStudyTodoMapping(studyTodoA.getId(), study_leader.getUserId());
studyTodoMappingRepository.saveAll(List.of(studyTodoMapping1, studyTodoMapping2, studyTodoMapping3));

studyTodoMappingRepository.save(StudyTodoFixture.createStudyTodoMapping(studyTodoB.getId(), koo.getUserId()));

// when
StudyTodoProgressResponse response = studyTodoService.readStudyTodoProgress(Lee.getUserId(), studyInfo.getId());

// then
assertEquals(response.getTodo().getId(), studyTodoA.getId());
assertEquals(response.getTodo().getTitle(), studyTodoA.getTitle());
assertEquals(response.getTotalMemberCount(), expectedTotalMemberCnt);
assertEquals(response.getCompleteMemberCount(), expectedCompleteMemberCnt);
assertSame(response.getMyStatus(), TODO_INCOMPLETE);

}

}

0 comments on commit 8dfd4dc

Please sign in to comment.