From 70c57f56fcdc03694def4294287217bf1ac57256 Mon Sep 17 00:00:00 2001 From: songmingyu Date: Tue, 12 May 2026 20:14:52 +0900 Subject: [PATCH] fix(admin): apply member exclusion to all remaining endpoints Previously missed modules now covered: - /admin/outline: use countExcluding() for all 4 aggregate counts - /admin/template/choice-count, click-count: NOT IN excludedIds - /admin/space/count: findAllByCategory NOT IN excludedIds - AdminMemberSpaceRelation member count: NOT IN excludedIds - AdminSpaceRepository.countAllByEventTimeBetween: NOT IN excludedIds Co-Authored-By: Claude Sonnet 4.6 --- .../org/layer/admin/common/CommonController.java | 10 ++++------ .../member/repository/AdminMemberRepository.java | 3 +++ .../repository/AdminRetrospectAnswerRepository.java | 3 +++ .../AdminRetrospectHistoryRepository.java | 5 +++-- .../retrospect/service/AdminRetrospectService.java | 2 +- .../AdminMemberSpaceRelationRepository.java | 5 ++++- .../space/repository/AdminSpaceRepository.java | 13 ++++++++++--- .../admin/space/service/AdminSpaceService.java | 4 ++-- .../repository/AdminTemplateChoiceRepository.java | 9 +++++++-- .../AdminTemplateClickHistoryRepository.java | 8 +++++++- .../template/service/AdminTemplateService.java | 7 ++++--- 11 files changed, 48 insertions(+), 21 deletions(-) diff --git a/layer-admin/src/main/java/org/layer/admin/common/CommonController.java b/layer-admin/src/main/java/org/layer/admin/common/CommonController.java index 4520e7a3..22e4541d 100644 --- a/layer-admin/src/main/java/org/layer/admin/common/CommonController.java +++ b/layer-admin/src/main/java/org/layer/admin/common/CommonController.java @@ -14,22 +14,20 @@ @RequiredArgsConstructor public class CommonController { - // 간단한 기능이기에 바로 repository를 사용합니다. private final AdminMemberRepository adminMemberRepository; private final AdminSpaceRepository adminSpaceRepository; private final AdminRetrospectHistoryRepository adminRetrospectHistoryRepository; private final AdminRetrospectAnswerRepository adminRetrospectAnswerRepository; - @GetMapping("/admin/outline") public ResponseEntity getOutline() { return ResponseEntity.ok( new OutlineResponse( - adminMemberRepository.count(), - adminSpaceRepository.count(), - adminRetrospectHistoryRepository.count(), - adminRetrospectAnswerRepository.count() + adminMemberRepository.countExcluding(ExcludedMembers.ID_LIST), + adminSpaceRepository.countExcluding(ExcludedMembers.ID_LIST), + adminRetrospectHistoryRepository.countExcluding(ExcludedMembers.ID_LIST), + adminRetrospectAnswerRepository.countExcluding(ExcludedMembers.ID_LIST) ) ); } diff --git a/layer-admin/src/main/java/org/layer/admin/member/repository/AdminMemberRepository.java b/layer-admin/src/main/java/org/layer/admin/member/repository/AdminMemberRepository.java index 6e9887fe..cf2194a8 100644 --- a/layer-admin/src/main/java/org/layer/admin/member/repository/AdminMemberRepository.java +++ b/layer-admin/src/main/java/org/layer/admin/member/repository/AdminMemberRepository.java @@ -26,4 +26,7 @@ List findMemberIdsByEventTimeBetween( @Param("endTime") LocalDateTime endTime, @Param("excludedIds") Collection excludedIds ); + + @Query("SELECT COUNT(a) FROM AdminMemberSignupHistory a WHERE a.memberId NOT IN :excludedIds") + long countExcluding(@Param("excludedIds") Collection excludedIds); } diff --git a/layer-admin/src/main/java/org/layer/admin/retrospect/repository/AdminRetrospectAnswerRepository.java b/layer-admin/src/main/java/org/layer/admin/retrospect/repository/AdminRetrospectAnswerRepository.java index 42034cbb..9ac3b920 100644 --- a/layer-admin/src/main/java/org/layer/admin/retrospect/repository/AdminRetrospectAnswerRepository.java +++ b/layer-admin/src/main/java/org/layer/admin/retrospect/repository/AdminRetrospectAnswerRepository.java @@ -112,4 +112,7 @@ long countDistinctRetrospectIdByAnswerEndTimeBetween( @Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("excludedIds") Collection excludedIds); + + @Query("SELECT COUNT(a) FROM AdminRetrospectAnswerHistory a WHERE a.memberId NOT IN :excludedIds") + long countExcluding(@Param("excludedIds") Collection excludedIds); } diff --git a/layer-admin/src/main/java/org/layer/admin/retrospect/repository/AdminRetrospectHistoryRepository.java b/layer-admin/src/main/java/org/layer/admin/retrospect/repository/AdminRetrospectHistoryRepository.java index dbcf404e..bc9882d1 100644 --- a/layer-admin/src/main/java/org/layer/admin/retrospect/repository/AdminRetrospectHistoryRepository.java +++ b/layer-admin/src/main/java/org/layer/admin/retrospect/repository/AdminRetrospectHistoryRepository.java @@ -1,6 +1,7 @@ package org.layer.admin.retrospect.repository; import java.time.LocalDateTime; +import java.util.Collection; import java.util.List; import org.layer.admin.retrospect.entity.AdminRetrospectHistory; @@ -23,6 +24,6 @@ List findRetrospectCountGroupedBySpaceWithPeriod( @Param("endTime") LocalDateTime endTime ); - - + @Query("SELECT COUNT(a) FROM AdminRetrospectHistory a WHERE a.memberId NOT IN :excludedIds") + long countExcluding(@Param("excludedIds") Collection excludedIds); } diff --git a/layer-admin/src/main/java/org/layer/admin/retrospect/service/AdminRetrospectService.java b/layer-admin/src/main/java/org/layer/admin/retrospect/service/AdminRetrospectService.java index aa48bac1..df61b5f6 100644 --- a/layer-admin/src/main/java/org/layer/admin/retrospect/service/AdminRetrospectService.java +++ b/layer-admin/src/main/java/org/layer/admin/retrospect/service/AdminRetrospectService.java @@ -258,7 +258,7 @@ public CumulativeRetrospectCountResponse getCumulativeRetrospectCount( .mapToLong(SpaceRetrospectCountDto::count) .sum(); - Long totalSpaceCount = adminSpaceRepository.countAllByEventTimeBetween(startTime, endTime); + Long totalSpaceCount = adminSpaceRepository.countAllByEventTimeBetween(startTime, endTime, ExcludedMembers.ID_LIST); double averageCumulativeCount = totalSpaceCount == 0 ? 0.0 : (double)totalRetrospectCount / totalSpaceCount; return new CumulativeRetrospectCountResponse(averageCumulativeCount); } diff --git a/layer-admin/src/main/java/org/layer/admin/space/repository/AdminMemberSpaceRelationRepository.java b/layer-admin/src/main/java/org/layer/admin/space/repository/AdminMemberSpaceRelationRepository.java index 5e1208b1..d60cb1e6 100644 --- a/layer-admin/src/main/java/org/layer/admin/space/repository/AdminMemberSpaceRelationRepository.java +++ b/layer-admin/src/main/java/org/layer/admin/space/repository/AdminMemberSpaceRelationRepository.java @@ -1,6 +1,7 @@ package org.layer.admin.space.repository; import java.time.LocalDateTime; +import java.util.Collection; import java.util.List; import org.layer.admin.space.entity.AdminMemberSpaceRelation; @@ -18,10 +19,12 @@ public interface AdminMemberSpaceRelationRepository extends JpaRepository= :startDate + AND r.memberId NOT IN :excludedIds GROUP BY r.spaceId """) List findProceedingSpacesWithMemberCount( - @Param("startDate") LocalDateTime startDate + @Param("startDate") LocalDateTime startDate, + @Param("excludedIds") Collection excludedIds ); @Query("SELECT m FROM AdminMemberSpaceRelation m WHERE m.spaceId IN :spaceIds") diff --git a/layer-admin/src/main/java/org/layer/admin/space/repository/AdminSpaceRepository.java b/layer-admin/src/main/java/org/layer/admin/space/repository/AdminSpaceRepository.java index 45093dfb..d9d41599 100644 --- a/layer-admin/src/main/java/org/layer/admin/space/repository/AdminSpaceRepository.java +++ b/layer-admin/src/main/java/org/layer/admin/space/repository/AdminSpaceRepository.java @@ -16,17 +16,24 @@ public interface AdminSpaceRepository @Query("SELECT new org.layer.admin.space.controller.dto.SpaceCountResponse(a.category, COUNT(a)) " + "FROM AdminSpaceHistory a " + "WHERE a.eventTime BETWEEN :startTime AND :endTime " + + "AND a.memberId NOT IN :excludedIds " + "GROUP BY a.category") List findAllByCategory( @Param("startTime") LocalDateTime startTime, - @Param("endTime") LocalDateTime endTime + @Param("endTime") LocalDateTime endTime, + @Param("excludedIds") Collection excludedIds ); @Query("SELECT COUNT(a) FROM AdminSpaceHistory a " + - "WHERE a.eventTime BETWEEN :startTime AND :endTime") + "WHERE a.eventTime BETWEEN :startTime AND :endTime " + + "AND a.memberId NOT IN :excludedIds") Long countAllByEventTimeBetween( @Param("startTime") LocalDateTime startTime, - @Param("endTime") LocalDateTime endTime); + @Param("endTime") LocalDateTime endTime, + @Param("excludedIds") Collection excludedIds); + + @Query("SELECT COUNT(a) FROM AdminSpaceHistory a WHERE a.memberId NOT IN :excludedIds") + long countExcluding(@Param("excludedIds") Collection excludedIds); List findAllBySpaceIdIn(Collection spaceIds); } diff --git a/layer-admin/src/main/java/org/layer/admin/space/service/AdminSpaceService.java b/layer-admin/src/main/java/org/layer/admin/space/service/AdminSpaceService.java index 1e417bc3..b1309161 100644 --- a/layer-admin/src/main/java/org/layer/admin/space/service/AdminSpaceService.java +++ b/layer-admin/src/main/java/org/layer/admin/space/service/AdminSpaceService.java @@ -54,7 +54,7 @@ public class AdminSpaceService { private final AdminMemberSpaceRelationRepository adminMemberSpaceRelationRepository; public List getSpaceCount(LocalDateTime startDate, LocalDateTime endDate) { - return adminSpaceRepository.findAllByCategory(startDate, endDate); + return adminSpaceRepository.findAllByCategory(startDate, endDate, ExcludedMembers.ID_LIST); } public TeamSpaceRatioResponse getAverageTeamSpaceRatioPerMember( @@ -114,7 +114,7 @@ public SpaceAbandonRate calculateAbandonRate(LocalDateTime startDate, LocalDateT List proceedingSpaceIds = adminRetrospectRepository.findProceedingSpacesByMember(startDate, endDate); - Map spaceMemberCountMap = adminMemberSpaceRelationRepository.findProceedingSpacesWithMemberCount(startDate) + Map spaceMemberCountMap = adminMemberSpaceRelationRepository.findProceedingSpacesWithMemberCount(startDate, ExcludedMembers.ID_LIST) .stream() .collect(Collectors.toMap( ProceedingSpaceDto::spaceId, diff --git a/layer-admin/src/main/java/org/layer/admin/template/repository/AdminTemplateChoiceRepository.java b/layer-admin/src/main/java/org/layer/admin/template/repository/AdminTemplateChoiceRepository.java index 73a84e48..3293e245 100644 --- a/layer-admin/src/main/java/org/layer/admin/template/repository/AdminTemplateChoiceRepository.java +++ b/layer-admin/src/main/java/org/layer/admin/template/repository/AdminTemplateChoiceRepository.java @@ -1,6 +1,7 @@ package org.layer.admin.template.repository; import java.time.LocalDateTime; +import java.util.Collection; import java.util.List; import org.layer.admin.template.controller.dto.TemplateChoiceCountResponse; @@ -16,19 +17,23 @@ public interface AdminTemplateChoiceRepository extends JpaRepository countByChoiceType( @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, - @Param("choiceType") AdminChoiceType choiceType + @Param("choiceType") AdminChoiceType choiceType, + @Param("excludedIds") Collection excludedIds ); @Query("SELECT new org.layer.admin.template.controller.dto.TemplateChoiceCountResponse(r.formTag, COUNT(r)) " + "FROM AdminTemplateChoice r " + "WHERE r.eventTime BETWEEN :startTime AND :endTime " + + "AND r.memberId NOT IN :excludedIds " + "GROUP BY r.formTag") List countAll( @Param("startTime") LocalDateTime startTime, - @Param("endTime") LocalDateTime endTime + @Param("endTime") LocalDateTime endTime, + @Param("excludedIds") Collection excludedIds ); } diff --git a/layer-admin/src/main/java/org/layer/admin/template/repository/AdminTemplateClickHistoryRepository.java b/layer-admin/src/main/java/org/layer/admin/template/repository/AdminTemplateClickHistoryRepository.java index de29cadf..a766863a 100644 --- a/layer-admin/src/main/java/org/layer/admin/template/repository/AdminTemplateClickHistoryRepository.java +++ b/layer-admin/src/main/java/org/layer/admin/template/repository/AdminTemplateClickHistoryRepository.java @@ -1,17 +1,23 @@ package org.layer.admin.template.repository; import java.time.LocalDateTime; +import java.util.Collection; import java.util.List; import org.layer.admin.template.controller.dto.TemplateClickCountResponse; import org.layer.admin.template.entity.AdminTemplateClickHistory; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface AdminTemplateClickHistoryRepository extends JpaRepository { @Query("SELECT new org.layer.admin.template.controller.dto.TemplateClickCountResponse(v.viewType, COUNT(v)) " + "FROM AdminTemplateClickHistory v " + "WHERE v.eventTime BETWEEN :startDate AND :endDate " + + "AND v.memberId NOT IN :excludedIds " + "GROUP BY v.viewType ") - List countByViewType(LocalDateTime startDate, LocalDateTime endDate); + List countByViewType( + LocalDateTime startDate, + LocalDateTime endDate, + @Param("excludedIds") Collection excludedIds); } diff --git a/layer-admin/src/main/java/org/layer/admin/template/service/AdminTemplateService.java b/layer-admin/src/main/java/org/layer/admin/template/service/AdminTemplateService.java index 1e8bb099..16fcdc0e 100644 --- a/layer-admin/src/main/java/org/layer/admin/template/service/AdminTemplateService.java +++ b/layer-admin/src/main/java/org/layer/admin/template/service/AdminTemplateService.java @@ -5,6 +5,7 @@ import java.time.LocalDateTime; import java.util.List; +import org.layer.admin.common.ExcludedMembers; import org.layer.admin.template.controller.dto.TemplateChoiceCountResponse; import org.layer.admin.template.controller.dto.TemplateClickCountResponse; import org.layer.admin.template.entity.AdminTemplateChoice; @@ -35,16 +36,16 @@ public List getTemplateChoiceCount( LocalDateTime startDate, LocalDateTime endDate, AdminChoiceType choiceType) { if (choiceType != null) { - return templateChoiceRepository.countByChoiceType(startDate, endDate, choiceType); + return templateChoiceRepository.countByChoiceType(startDate, endDate, choiceType, ExcludedMembers.ID_LIST); } - return templateChoiceRepository.countAll(startDate, endDate); + return templateChoiceRepository.countAll(startDate, endDate, ExcludedMembers.ID_LIST); } public List getTemplateClickCount( LocalDateTime startDate, LocalDateTime endDate) { - return templateClickHistoryRepository.countByViewType(startDate, endDate); + return templateClickHistoryRepository.countByViewType(startDate, endDate, ExcludedMembers.ID_LIST); } @Transactional(propagation = REQUIRES_NEW)