diff --git a/application/src/main/java/org/depromeet/spot/application/common/jwt/JwtAuthenticationFilter.java b/application/src/main/java/org/depromeet/spot/application/common/jwt/JwtAuthenticationFilter.java index 6790e7e2..b656e83d 100644 --- a/application/src/main/java/org/depromeet/spot/application/common/jwt/JwtAuthenticationFilter.java +++ b/application/src/main/java/org/depromeet/spot/application/common/jwt/JwtAuthenticationFilter.java @@ -60,6 +60,8 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { "/api/v2/GOOGLE", Set.of("GET"), "/api/v2/KAKAO", + Set.of("GET"), + "/api/v1/admin/memberCount", Set.of("GET")); @Override diff --git a/application/src/main/java/org/depromeet/spot/application/member/controller/MemberController.java b/application/src/main/java/org/depromeet/spot/application/member/controller/MemberController.java index f4f06595..e6330f7d 100644 --- a/application/src/main/java/org/depromeet/spot/application/member/controller/MemberController.java +++ b/application/src/main/java/org/depromeet/spot/application/member/controller/MemberController.java @@ -117,4 +117,11 @@ public MyHomeResponse findMemberHomeFeed(@Parameter(hidden = true) Long memberId public void softDelete(@Parameter(hidden = true) Long memberId) { memberUsecase.softDelete(memberId); } + + @GetMapping("/admin/membersCount") + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "(admin) 가입 멤버 수 조회 API") + public int membersCount() { + return memberUsecase.membersCount(); + } } diff --git a/common/src/main/java/org/depromeet/spot/common/exception/member/MemberErrorCode.java b/common/src/main/java/org/depromeet/spot/common/exception/member/MemberErrorCode.java index 47d8e2d4..8469aca5 100644 --- a/common/src/main/java/org/depromeet/spot/common/exception/member/MemberErrorCode.java +++ b/common/src/main/java/org/depromeet/spot/common/exception/member/MemberErrorCode.java @@ -12,7 +12,7 @@ public enum MemberErrorCode implements ErrorCode { INVALID_LEVEL(HttpStatus.INTERNAL_SERVER_ERROR, "M003", "잘못된 레벨입니다."), INACTIVE_MEMBER(HttpStatus.GONE, "M004", "탈퇴한 유저입니다."), MEMBER_CONFLICT(HttpStatus.BAD_REQUEST, "M005", "이미 가입된 유저입니다."), - ; + MEMBERS_NOT_EXIST(HttpStatus.NOT_FOUND, "M006", "가입한 유저가 없습니다."); private final HttpStatus status; private final String code; diff --git a/common/src/main/java/org/depromeet/spot/common/exception/member/MemberException.java b/common/src/main/java/org/depromeet/spot/common/exception/member/MemberException.java index eb3c2550..a00099f4 100644 --- a/common/src/main/java/org/depromeet/spot/common/exception/member/MemberException.java +++ b/common/src/main/java/org/depromeet/spot/common/exception/member/MemberException.java @@ -24,6 +24,16 @@ public MemberNicknameConflictException() { } } + public static class MembersNotExistException extends MemberException { + public MembersNotExistException() { + super(MemberErrorCode.MEMBERS_NOT_EXIST); + } + + public MembersNotExistException(Object o) { + super(MemberErrorCode.MEMBERS_NOT_EXIST.appended(o)); + } + } + public static class InvalidLevelException extends MemberException { public InvalidLevelException() { super(MemberErrorCode.INVALID_LEVEL); diff --git a/infrastructure/src/main/java/org/depromeet/spot/infrastructure/jpa/member/repository/MemberJpaRepository.java b/infrastructure/src/main/java/org/depromeet/spot/infrastructure/jpa/member/repository/MemberJpaRepository.java index f644722e..ece94dc0 100644 --- a/infrastructure/src/main/java/org/depromeet/spot/infrastructure/jpa/member/repository/MemberJpaRepository.java +++ b/infrastructure/src/main/java/org/depromeet/spot/infrastructure/jpa/member/repository/MemberJpaRepository.java @@ -43,4 +43,7 @@ void updateDeletedAt( "update MemberEntity m set m.deletedAt = null, m.updatedAt = :updatedAt where m.id = :memberId") void updateDeletedAtAndUpdatedAt( @Param("memberId") Long memberId, @Param("updatedAt") LocalDateTime updatedAt); + + @Query("select count(*) from MemberEntity m") + Optional findMemberCount(); } diff --git a/infrastructure/src/main/java/org/depromeet/spot/infrastructure/jpa/member/repository/MemberRepositoryImpl.java b/infrastructure/src/main/java/org/depromeet/spot/infrastructure/jpa/member/repository/MemberRepositoryImpl.java index 16035eb7..3c40c7b1 100644 --- a/infrastructure/src/main/java/org/depromeet/spot/infrastructure/jpa/member/repository/MemberRepositoryImpl.java +++ b/infrastructure/src/main/java/org/depromeet/spot/infrastructure/jpa/member/repository/MemberRepositoryImpl.java @@ -4,6 +4,7 @@ import java.util.Optional; import org.depromeet.spot.common.exception.member.MemberException.MemberNotFoundException; +import org.depromeet.spot.common.exception.member.MemberException.MembersNotExistException; import org.depromeet.spot.domain.member.Level; import org.depromeet.spot.domain.member.Member; import org.depromeet.spot.infrastructure.jpa.member.entity.MemberEntity; @@ -70,4 +71,9 @@ public void updateDeletedAt(Long memberId, LocalDateTime deletedAt) { public void updateDeletedAtAndUpdatedAt(Long memberId, LocalDateTime updatedAt) { memberJpaRepository.updateDeletedAtAndUpdatedAt(memberId, updatedAt); } + + @Override + public int membersCount() { + return memberJpaRepository.findMemberCount().orElseThrow(MembersNotExistException::new); + } } diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/port/in/member/MemberUsecase.java b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/member/MemberUsecase.java index b5cabe43..b76b0890 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/port/in/member/MemberUsecase.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/member/MemberUsecase.java @@ -23,6 +23,8 @@ public interface MemberUsecase { void softDelete(Long memberId); + int membersCount(); + @Getter @Builder @AllArgsConstructor diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/port/out/member/MemberRepository.java b/usecase/src/main/java/org/depromeet/spot/usecase/port/out/member/MemberRepository.java index deb1044d..50018991 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/port/out/member/MemberRepository.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/port/out/member/MemberRepository.java @@ -25,4 +25,6 @@ public interface MemberRepository { void updateDeletedAt(Long memberId, LocalDateTime deletedAt); void updateDeletedAtAndUpdatedAt(Long memberId, LocalDateTime updatedAt); + + int membersCount(); } diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/service/member/MemberService.java b/usecase/src/main/java/org/depromeet/spot/usecase/service/member/MemberService.java index 28b49bf1..fb2e65b7 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/service/member/MemberService.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/service/member/MemberService.java @@ -117,4 +117,9 @@ public void softDelete(Long memberId) { memberRepository.updateDeletedAt(memberId, LocalDateTime.now()); } + + @Override + public int membersCount() { + return memberRepository.membersCount(); + } }