From 49b1fab27b8663273f76098c50021c53ff4daf6e Mon Sep 17 00:00:00 2001 From: minsu20 Date: Sun, 26 Nov 2023 21:34:45 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=86=8C=EB=AA=A8=EC=9E=84=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=EC=99=80=20=EC=9D=B4=EB=A6=84=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/Team-API.adoc | 4 ++ .../dto/response/GetTeamCountResponse.java | 15 +++++++ .../application/dto/response/TeamBlock.java | 1 + .../application/service/GetTeamUseCase.java | 5 +++ .../repository/TeamCustomRepository.java | 2 + .../repository/TeamCustomRepositoryImpl.java | 16 +++++++ .../team/domain/service/TeamGetService.java | 7 +++ .../team/presentation/TeamController.java | 10 +++++ .../constant/TeamResponseMessage.java | 3 +- .../team/presentation/TeamControllerTest.java | 43 +++++++++++++++++++ 10 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/moing/backend/domain/team/application/dto/response/GetTeamCountResponse.java diff --git a/src/docs/asciidoc/Team-API.adoc b/src/docs/asciidoc/Team-API.adoc index b6e71d0d..a7add657 100644 --- a/src/docs/asciidoc/Team-API.adoc +++ b/src/docs/asciidoc/Team-API.adoc @@ -60,3 +60,7 @@ operation::team-controller-test/disband_team[snippets='http-request,path-paramet [[Team-소모임-탈퇴]] == Team 소모임원 강제종료 operation::team-controller-test/withdraw_team[snippets='http-request,path-parameters,http-response,response-fields'] + +[[Team-소모임-개수_이름-조회]] +== Team 소모임 개수 이름 조회 +operation::team-controller-test/get_team_count[snippets='http-request,path-parameters,http-response,response-fields'] diff --git a/src/main/java/com/moing/backend/domain/team/application/dto/response/GetTeamCountResponse.java b/src/main/java/com/moing/backend/domain/team/application/dto/response/GetTeamCountResponse.java new file mode 100644 index 00000000..7cae31ee --- /dev/null +++ b/src/main/java/com/moing/backend/domain/team/application/dto/response/GetTeamCountResponse.java @@ -0,0 +1,15 @@ +package com.moing.backend.domain.team.application.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class GetTeamCountResponse { + + private String teamName; + private Long numOfTeam; + +} diff --git a/src/main/java/com/moing/backend/domain/team/application/dto/response/TeamBlock.java b/src/main/java/com/moing/backend/domain/team/application/dto/response/TeamBlock.java index c4988a47..7c2e1803 100644 --- a/src/main/java/com/moing/backend/domain/team/application/dto/response/TeamBlock.java +++ b/src/main/java/com/moing/backend/domain/team/application/dto/response/TeamBlock.java @@ -18,6 +18,7 @@ @Builder @NoArgsConstructor public class TeamBlock { + private Long teamId; private Long duration; //걸린시간(단위:날짜) private Integer levelOfFire; //불꽃 레벨 diff --git a/src/main/java/com/moing/backend/domain/team/application/service/GetTeamUseCase.java b/src/main/java/com/moing/backend/domain/team/application/service/GetTeamUseCase.java index 9f4ee340..74700bc0 100644 --- a/src/main/java/com/moing/backend/domain/team/application/service/GetTeamUseCase.java +++ b/src/main/java/com/moing/backend/domain/team/application/service/GetTeamUseCase.java @@ -47,4 +47,9 @@ public GetCurrentStatusResponse getCurrentStatus(Long teamId) { public Page getNewTeam(String dateSort, Pageable pageable) { return teamGetService.getNewTeams(dateSort, pageable); } + + public GetTeamCountResponse getTeamCount(String socialId, Long teamId) { + Member member = memberGetService.getMemberBySocialId(socialId); + return teamGetService.getTeamCountAndName(teamId, member.getMemberId()); + } } diff --git a/src/main/java/com/moing/backend/domain/team/domain/repository/TeamCustomRepository.java b/src/main/java/com/moing/backend/domain/team/domain/repository/TeamCustomRepository.java index bed05135..df7083d4 100644 --- a/src/main/java/com/moing/backend/domain/team/domain/repository/TeamCustomRepository.java +++ b/src/main/java/com/moing/backend/domain/team/domain/repository/TeamCustomRepository.java @@ -4,6 +4,7 @@ import com.moing.backend.domain.mypage.application.dto.response.GetMyPageTeamBlock; import com.moing.backend.domain.team.application.dto.response.GetLeaderInfoResponse; import com.moing.backend.domain.team.application.dto.response.GetNewTeamResponse; +import com.moing.backend.domain.team.application.dto.response.GetTeamCountResponse; import com.moing.backend.domain.team.application.dto.response.GetTeamResponse; import com.moing.backend.domain.team.domain.entity.Team; import org.springframework.data.domain.Page; @@ -21,4 +22,5 @@ public interface TeamCustomRepository { void updateTeamStatus(boolean isApproved, List teamIds); List findLeaderInfoByTeamIds(List teamIds); Page findNewTeam(String dateSort, Pageable pageable); + Long findTeamCount(Long memberId); } diff --git a/src/main/java/com/moing/backend/domain/team/domain/repository/TeamCustomRepositoryImpl.java b/src/main/java/com/moing/backend/domain/team/domain/repository/TeamCustomRepositoryImpl.java index 699ec33b..f94c031c 100644 --- a/src/main/java/com/moing/backend/domain/team/domain/repository/TeamCustomRepositoryImpl.java +++ b/src/main/java/com/moing/backend/domain/team/domain/repository/TeamCustomRepositoryImpl.java @@ -177,5 +177,21 @@ public Page findNewTeam(String dateSort, Pageable pageable) return PageableExecutionUtils.getPage(teams, pageable, () -> count); } + @Override + public Long findTeamCount(Long memberId) { + LocalDateTime threeDaysAgo = LocalDateTime.now().minusDays(3); + return queryFactory + .select(team.count()) // 팀의 개수를 세기 위해 수정 + .from(teamMember) + .innerJoin(teamMember.team, team) + .on(teamMember.member.memberId.eq(memberId)) + .where(team.approvalStatus.eq(ApprovalStatus.APPROVAL)) // 승인 되었고 + .where(teamMember.isDeleted.eq(false) // 탈퇴하지 않았다면 + .and(team.isDeleted.eq(false) // 강제종료되지 않았거나 + .or(team.deletionTime.after(threeDaysAgo)))) // 강제종료된 경우 3일이 지나지 않았다면 + .fetchOne(); // 단일 결과 (개수) 반환 + + } + } diff --git a/src/main/java/com/moing/backend/domain/team/domain/service/TeamGetService.java b/src/main/java/com/moing/backend/domain/team/domain/service/TeamGetService.java index 2885b416..6afe5733 100644 --- a/src/main/java/com/moing/backend/domain/team/domain/service/TeamGetService.java +++ b/src/main/java/com/moing/backend/domain/team/domain/service/TeamGetService.java @@ -5,6 +5,7 @@ import com.moing.backend.domain.mypage.application.dto.response.GetMyPageTeamBlock; import com.moing.backend.domain.team.application.dto.response.GetLeaderInfoResponse; import com.moing.backend.domain.team.application.dto.response.GetNewTeamResponse; +import com.moing.backend.domain.team.application.dto.response.GetTeamCountResponse; import com.moing.backend.domain.team.application.dto.response.GetTeamResponse; import com.moing.backend.domain.team.domain.entity.Team; import com.moing.backend.domain.team.domain.repository.TeamRepository; @@ -55,4 +56,10 @@ public Page getNewTeams(String dateSort, Pageable pageable) return teamRepository.findNewTeam(dateSort, pageable); } + public GetTeamCountResponse getTeamCountAndName(Long teamId, Long memberId) { + String teamName = getTeamByTeamId(teamId).getName(); + Long numOfTeam = teamRepository.findTeamCount(memberId); + return new GetTeamCountResponse(teamName, numOfTeam); + } + } diff --git a/src/main/java/com/moing/backend/domain/team/presentation/TeamController.java b/src/main/java/com/moing/backend/domain/team/presentation/TeamController.java index 8e74802a..8e24226f 100644 --- a/src/main/java/com/moing/backend/domain/team/presentation/TeamController.java +++ b/src/main/java/com/moing/backend/domain/team/presentation/TeamController.java @@ -127,4 +127,14 @@ public ResponseEntity> getCurrentStatu return ResponseEntity.ok(SuccessResponse.create(GET_CURRENT_STATUS_SUCCESS.getMessage(), this.getTeamUseCase.getCurrentStatus(teamId))); } + /** + * 소모임 닉네임과 소모임 개수 조회 + * [GET] api/team/{teamId}/count + */ + @GetMapping("/{teamId}/count") + public ResponseEntity> getTeamCount(@AuthenticationPrincipal User user, + @PathVariable Long teamId){ + return ResponseEntity.ok(SuccessResponse.create(GET_TEAM_COUNT_SUCCESS.getMessage(), this.getTeamUseCase.getTeamCount(user.getSocialId(),teamId))); + } + } diff --git a/src/main/java/com/moing/backend/domain/team/presentation/constant/TeamResponseMessage.java b/src/main/java/com/moing/backend/domain/team/presentation/constant/TeamResponseMessage.java index 55dca2b6..c0a1215e 100644 --- a/src/main/java/com/moing/backend/domain/team/presentation/constant/TeamResponseMessage.java +++ b/src/main/java/com/moing/backend/domain/team/presentation/constant/TeamResponseMessage.java @@ -17,6 +17,7 @@ public enum TeamResponseMessage { WITHDRAW_TEAM_SUCCESS("[소모임원 권한] 소모임을 탈퇴하였습니다"), SEND_APPROVAL_ALARM_SUCCESS("소모임들이 승인되었습니다."), SEND_REJECTION_ALARM_SUCCESS("소모임들이 반려되었습니다."), - GET_NEW_TEAM_SUCCESS("새로운 소모임들을 조회했습니다."); + GET_NEW_TEAM_SUCCESS("새로운 소모임들을 조회했습니다."), + GET_TEAM_COUNT_SUCCESS("소모임의 개수와 닉네임을 조회했습니다."); private final String message; } diff --git a/src/test/java/com/moing/backend/domain/team/presentation/TeamControllerTest.java b/src/test/java/com/moing/backend/domain/team/presentation/TeamControllerTest.java index 7ff3399b..56513f5a 100644 --- a/src/test/java/com/moing/backend/domain/team/presentation/TeamControllerTest.java +++ b/src/test/java/com/moing/backend/domain/team/presentation/TeamControllerTest.java @@ -507,4 +507,47 @@ public void get_current_status() throws Exception { ); } + @Test + public void get_team_count() throws Exception { + + // given + Long teamId = 1L; + + GetTeamCountResponse output = GetTeamCountResponse.builder() + .teamName("소모임 이름") + .numOfTeam(2L) + .build(); + + given(getTeamUseCase.getTeamCount(any(), any())).willReturn(output); + + + //when + ResultActions actions = mockMvc.perform(RestDocumentationRequestBuilders. + get("/api/team/{teamId}/count", teamId) + .header("Authorization", "Bearer ACCESS_TOKEN") + .contentType(MediaType.APPLICATION_JSON) + ); + + + //then + actions + .andExpect(status().isOk()) + .andDo( + restDocs.document( + requestHeaders( + headerWithName("Authorization").description("접근 토큰") + ), + pathParameters( + parameterWithName("teamId").description("팀 아이디") + ), + responseFields( + fieldWithPath("isSuccess").description("true"), + fieldWithPath("message").description("소모임을 수정했습니다."), + fieldWithPath("data.teamName").description("소모임 이름"), + fieldWithPath("data.numOfTeam").description("지금까지 가입한 소모임 개수") + ) + ) + ); + } + }