Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 [로깅]")
Expand All @@ -36,9 +35,15 @@ public class LogController {
public ResponseEntity<PageResponse<AnonymousLogResponse>> 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));
}

Expand All @@ -48,9 +53,15 @@ public ResponseEntity<PageResponse<AnonymousLogResponse>> getLoginAttempts(
public ResponseEntity<PageResponse<MemberLogResponse>> 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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -26,7 +29,7 @@ public Page<AnonymousLogEntity> 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()));
Expand All @@ -41,7 +44,7 @@ public Page<AnonymousLogEntity> filterAnonymousLogs(FilterLogRequest request, Pa
List<AnonymousLogEntity> result = queryFactory
.selectFrom(anonymousLogEntity)
.where(builder)
.orderBy(anonymousLogEntity.createdAt.desc())
.orderBy(getOrderSpecifiers(pageable))
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
Expand All @@ -51,4 +54,21 @@ public Page<AnonymousLogEntity> 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<OrderSpecifier<?>> 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]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -30,7 +32,7 @@ public Page<MemberLogEntity> 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()));
Expand All @@ -46,7 +48,7 @@ public Page<MemberLogEntity> 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();
Expand All @@ -56,4 +58,21 @@ public Page<MemberLogEntity> 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<OrderSpecifier<?>> 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]);
}
}