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 2da9fae6..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 @@ -11,14 +11,13 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; 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 [로깅]") @@ -36,9 +35,15 @@ public class LogController { public ResponseEntity> getLoginAttempts( @RequestParam(defaultValue = "0") int page, @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, 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)); } @@ -48,9 +53,15 @@ public ResponseEntity> getLoginAttempts( public ResponseEntity> getApiCalls( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, + @RequestParam(defaultValue = "requestAt") String sortBy, + @RequestParam(defaultValue = "desc") String sortDirection, @ModelAttribute @Valid 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)); } } 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 1918b388..feb58233 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 adcf6571..13546ff7 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]); + } }