From dc2cba859dedfce29b5dd312445dbe23a4709852 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Sun, 2 Feb 2025 16:21:44 +0900 Subject: [PATCH 1/4] =?UTF-8?q?CLAP-215=20fix:=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inbound/web/log/LogController.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/log/LogController.java b/src/main/java/clap/server/adapter/inbound/web/log/LogController.java index fb2a8495..a3820db7 100644 --- a/src/main/java/clap/server/adapter/inbound/web/log/LogController.java +++ b/src/main/java/clap/server/adapter/inbound/web/log/LogController.java @@ -10,16 +10,14 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.util.List; - @Tag(name = "05. Admin") @WebAdapter @RestController @@ -35,9 +33,15 @@ public class LogController { public ResponseEntity> getLoginAttempts( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, + @RequestParam(defaultValue = "timestamp") String sortBy, + @RequestParam(defaultValue = "desc") String sortDirection, @ModelAttribute FilterLogRequest anonymousLogRequest, @AuthenticationPrincipal SecurityUserDetails userInfo) { - Pageable pageable = PageRequest.of(page, pageSize); + Pageable pageable = PageRequest.of( + page, + pageSize, + "asc".equalsIgnoreCase(sortDirection) ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending() + ); return ResponseEntity.ok(findApiLogsUsecase.filterAnonymousLogs(anonymousLogRequest, pageable)); } @@ -47,9 +51,15 @@ public ResponseEntity> getLoginAttempts( public ResponseEntity> getApiCalls( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, + @RequestParam(defaultValue = "timestamp") String sortBy, + @RequestParam(defaultValue = "desc") String sortDirection, @ModelAttribute FilterLogRequest memberLogRequest, @AuthenticationPrincipal SecurityUserDetails userInfo) { - Pageable pageable = PageRequest.of(page, pageSize); + Pageable pageable = PageRequest.of( + page, + pageSize, + "asc".equalsIgnoreCase(sortDirection) ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending() + ); return ResponseEntity.ok(findApiLogsUsecase.filterMemberLogs(memberLogRequest, pageable)); } } From 66f44645bb050957f4098605ce2e2da96df428f6 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Sun, 2 Feb 2025 21:44:38 +0900 Subject: [PATCH 2/4] =?UTF-8?q?CLAP-215=20fix:=EC=A0=95=EB=A0=AC=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20requestAt=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clap/server/adapter/inbound/web/log/LogController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/log/LogController.java b/src/main/java/clap/server/adapter/inbound/web/log/LogController.java index a3820db7..936aa3a0 100644 --- a/src/main/java/clap/server/adapter/inbound/web/log/LogController.java +++ b/src/main/java/clap/server/adapter/inbound/web/log/LogController.java @@ -33,7 +33,7 @@ public class LogController { public ResponseEntity> getLoginAttempts( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, - @RequestParam(defaultValue = "timestamp") String sortBy, + @RequestParam(defaultValue = "requestedAt") String sortBy, @RequestParam(defaultValue = "desc") String sortDirection, @ModelAttribute FilterLogRequest anonymousLogRequest, @AuthenticationPrincipal SecurityUserDetails userInfo) { @@ -51,7 +51,7 @@ public ResponseEntity> getLoginAttempts( public ResponseEntity> getApiCalls( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, - @RequestParam(defaultValue = "timestamp") String sortBy, + @RequestParam(defaultValue = "requestedAt") String sortBy, @RequestParam(defaultValue = "desc") String sortDirection, @ModelAttribute FilterLogRequest memberLogRequest, @AuthenticationPrincipal SecurityUserDetails userInfo) { From 82d1ba759480acc7a932147719cd52bfe103fad6 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Mon, 3 Feb 2025 00:33:07 +0900 Subject: [PATCH 3/4] =?UTF-8?q?CLAP-215=20fix:requestAt=EA=B8=B0=EC=A4=80?= =?UTF-8?q?=20=EC=A0=95=EB=A0=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inbound/web/log/LogController.java | 4 ++-- .../log/AnonymousLogCustomRepositoryImpl.java | 24 +++++++++++++++++-- .../log/MemberLogCustomRepositoryImpl.java | 23 ++++++++++++++++-- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/log/LogController.java b/src/main/java/clap/server/adapter/inbound/web/log/LogController.java index 936aa3a0..483d1412 100644 --- a/src/main/java/clap/server/adapter/inbound/web/log/LogController.java +++ b/src/main/java/clap/server/adapter/inbound/web/log/LogController.java @@ -33,7 +33,7 @@ public class LogController { public ResponseEntity> getLoginAttempts( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, - @RequestParam(defaultValue = "requestedAt") String sortBy, + @RequestParam(defaultValue = "requestAt") String sortBy, @RequestParam(defaultValue = "desc") String sortDirection, @ModelAttribute FilterLogRequest anonymousLogRequest, @AuthenticationPrincipal SecurityUserDetails userInfo) { @@ -51,7 +51,7 @@ public ResponseEntity> getLoginAttempts( public ResponseEntity> getApiCalls( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, - @RequestParam(defaultValue = "requestedAt") String sortBy, + @RequestParam(defaultValue = "requestAt") String sortBy, @RequestParam(defaultValue = "desc") String sortDirection, @ModelAttribute FilterLogRequest memberLogRequest, @AuthenticationPrincipal SecurityUserDetails userInfo) { diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepositoryImpl.java index 62058480..e89b12ed 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepositoryImpl.java @@ -3,6 +3,7 @@ import clap.server.adapter.inbound.web.dto.log.FilterLogRequest; import clap.server.adapter.outbound.persistense.entity.log.AnonymousLogEntity; import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.OrderSpecifier; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -11,9 +12,11 @@ import org.springframework.stereotype.Repository; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import static clap.server.adapter.outbound.persistense.entity.log.QAnonymousLogEntity.anonymousLogEntity; +import static clap.server.adapter.outbound.persistense.entity.log.QMemberLogEntity.memberLogEntity; @Repository @RequiredArgsConstructor @@ -26,7 +29,7 @@ public Page filterAnonymousLogs(FilterLogRequest request, Pa if (request.term() != null) { LocalDateTime fromDate = LocalDateTime.now().minusHours(request.term()); - builder.and(anonymousLogEntity.createdAt.after(fromDate)); + builder.and(anonymousLogEntity.requestAt.after(fromDate)); } if (!request.logStatus().isEmpty()) { builder.and(anonymousLogEntity.logStatus.in(request.logStatus())); @@ -41,7 +44,7 @@ public Page filterAnonymousLogs(FilterLogRequest request, Pa List result = queryFactory .selectFrom(anonymousLogEntity) .where(builder) - .orderBy(anonymousLogEntity.createdAt.desc()) + .orderBy(getOrderSpecifiers(pageable)) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); @@ -51,4 +54,21 @@ public Page filterAnonymousLogs(FilterLogRequest request, Pa .fetch().size(); return new PageImpl<>(result, pageable, total); } + + // Pageable의 Sort 조건을 확인하여 동적으로 OrderSpecifier를 생성 + private OrderSpecifier[] getOrderSpecifiers(Pageable pageable) { + if (!pageable.getSort().isSorted()) { + // 정렬 조건이 없으면 requestAt 내림차순 + return new OrderSpecifier[]{ anonymousLogEntity.requestAt.desc() }; + } + List> orderSpecifiers = new ArrayList<>(); + pageable.getSort().forEach(order -> { + if ("requestAt".equalsIgnoreCase(order.getProperty())) { + orderSpecifiers.add(order.isAscending() + ? anonymousLogEntity.requestAt.asc() + : anonymousLogEntity.requestAt.desc()); + } + }); + return orderSpecifiers.toArray(new OrderSpecifier[0]); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepositoryImpl.java index 7eebfff9..3fc392d2 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepositoryImpl.java @@ -4,6 +4,7 @@ import clap.server.adapter.inbound.web.dto.log.FilterLogRequest; import clap.server.adapter.outbound.persistense.entity.log.MemberLogEntity; import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.OrderSpecifier; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -12,6 +13,7 @@ import org.springframework.stereotype.Repository; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import static clap.server.adapter.outbound.persistense.entity.log.QMemberLogEntity.memberLogEntity; @@ -30,7 +32,7 @@ public Page filterMemberLogs(FilterLogRequest request, Pageable if (request.term() != null) { LocalDateTime fromDate = LocalDateTime.now().minusHours(request.term()); - builder.and(memberLogEntity.createdAt.after(fromDate)); + builder.and(memberLogEntity.requestAt.after(fromDate)); } if (!request.logStatus().isEmpty()) { builder.and(memberLogEntity.logStatus.in(request.logStatus())); @@ -46,7 +48,7 @@ public Page filterMemberLogs(FilterLogRequest request, Pageable .selectFrom(memberLogEntity) .where(builder) .leftJoin(memberLogEntity.member, memberEntity) - .orderBy(memberLogEntity.createdAt.desc()) + .orderBy(getOrderSpecifiers(pageable)) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); @@ -56,4 +58,21 @@ public Page filterMemberLogs(FilterLogRequest request, Pageable .fetch().size(); return new PageImpl<>(result, pageable, total); } + + // Pageable의 Sort 조건을 확인하여 동적으로 OrderSpecifier를 생성 + private OrderSpecifier[] getOrderSpecifiers(Pageable pageable) { + if (!pageable.getSort().isSorted()) { + // 정렬 조건이 없으면 requestAt 내림차순 + return new OrderSpecifier[]{ memberLogEntity.requestAt.desc() }; + } + List> orderSpecifiers = new ArrayList<>(); + pageable.getSort().forEach(order -> { + if ("requestAt".equalsIgnoreCase(order.getProperty())) { + orderSpecifiers.add(order.isAscending() + ? memberLogEntity.requestAt.asc() + : memberLogEntity.requestAt.desc()); + } + }); + return orderSpecifiers.toArray(new OrderSpecifier[0]); + } } From 3ec5a05b38640cf96831cc4f24ac6453bc411430 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Mon, 3 Feb 2025 12:07:50 +0900 Subject: [PATCH 4/4] =?UTF-8?q?CLAP-215=20fix:parameter=20=EB=B6=88?= =?UTF-8?q?=EC=9D=BC=EC=B9=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/clap/server/adapter/inbound/web/log/LogController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/clap/server/adapter/inbound/web/log/LogController.java b/src/main/java/clap/server/adapter/inbound/web/log/LogController.java index f9de4048..5c123f8a 100644 --- a/src/main/java/clap/server/adapter/inbound/web/log/LogController.java +++ b/src/main/java/clap/server/adapter/inbound/web/log/LogController.java @@ -37,6 +37,7 @@ public ResponseEntity> getLoginAttempts( @RequestParam(defaultValue = "20") int pageSize, @RequestParam(defaultValue = "requestAt") String sortBy, @RequestParam(defaultValue = "desc") String sortDirection, + @ModelAttribute @Valid FilterLogRequest anonymousLogRequest, @AuthenticationPrincipal SecurityUserDetails userInfo) { Pageable pageable = PageRequest.of( page,