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 5c123f8a..0829a404 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 @@ -35,16 +35,11 @@ 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, + @RequestParam(defaultValue = "DESC") String sortDirection, @ModelAttribute @Valid FilterLogRequest anonymousLogRequest, @AuthenticationPrincipal SecurityUserDetails userInfo) { - Pageable pageable = PageRequest.of( - page, - pageSize, - "asc".equalsIgnoreCase(sortDirection) ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending() - ); - return ResponseEntity.ok(findApiLogsUsecase.filterAnonymousLogs(anonymousLogRequest, pageable)); + Pageable pageable = PageRequest.of(page, pageSize); + return ResponseEntity.ok(findApiLogsUsecase.filterAnonymousLogs(anonymousLogRequest, pageable, sortDirection)); } @Operation(summary = "작업 로그 목록 조회") @@ -53,15 +48,10 @@ 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, + @RequestParam(defaultValue = "DESC") String sortDirection, @ModelAttribute @Valid FilterLogRequest memberLogRequest, @AuthenticationPrincipal SecurityUserDetails userInfo) { - Pageable pageable = PageRequest.of( - page, - pageSize, - "asc".equalsIgnoreCase(sortDirection) ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending() - ); - return ResponseEntity.ok(findApiLogsUsecase.filterMemberLogs(memberLogRequest, pageable)); + Pageable pageable = PageRequest.of(page, pageSize); + return ResponseEntity.ok(findApiLogsUsecase.filterMemberLogs(memberLogRequest, pageable, sortDirection)); } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/ApiLogPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/ApiLogPersistenceAdapter.java index 5dfec914..469f171d 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/ApiLogPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/ApiLogPersistenceAdapter.java @@ -41,14 +41,14 @@ public void saveAnonymousLog(AnonymousLog anonymousLog) { @Override - public Page filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable) { - return memberLogRepository.filterMemberLogs(memberLogRequest, pageable) + public Page filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection) { + return memberLogRepository.filterMemberLogs(memberLogRequest, pageable, sortDirection) .map(apiLogPersistenceMapper::mapMemberLogEntityToDomain); } @Override - public Page filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable) { - return anonymousLogRepository.filterAnonymousLogs(anonymousLogRequest, pageable) + public Page filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable, String sortDirection) { + return anonymousLogRepository.filterAnonymousLogs(anonymousLogRequest, pageable, sortDirection) .map(apiLogPersistenceMapper::mapAnonymousLogEntityToDomain); } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepository.java index 580959ff..269df757 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepository.java @@ -6,5 +6,5 @@ import org.springframework.data.domain.Pageable; public interface AnonymousLogCustomRepository { - Page filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable); + Page filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable, String sortDirection); } 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 feb58233..4d6404c0 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 @@ -24,7 +24,7 @@ public class AnonymousLogCustomRepositoryImpl implements AnonymousLogCustomRepos private final JPAQueryFactory queryFactory; @Override - public Page filterAnonymousLogs(FilterLogRequest request, Pageable pageable) { + public Page filterAnonymousLogs(FilterLogRequest request, Pageable pageable, String sortDirection) { BooleanBuilder builder = new BooleanBuilder(); if (request.term() != null) { @@ -40,11 +40,14 @@ public Page filterAnonymousLogs(FilterLogRequest request, Pa if (!request.clientIp().isEmpty()) { builder.and(anonymousLogEntity.clientIp.contains(request.clientIp())); } + OrderSpecifier orderSpecifier = sortDirection.equalsIgnoreCase("ASC") + ? anonymousLogEntity.requestAt.asc() + : anonymousLogEntity.requestAt.desc(); List result = queryFactory .selectFrom(anonymousLogEntity) .where(builder) - .orderBy(getOrderSpecifiers(pageable)) + .orderBy(orderSpecifier) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); @@ -54,21 +57,4 @@ 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/MemberLogCustomRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepository.java index 4ed6242f..5440a5d5 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepository.java @@ -6,5 +6,5 @@ import org.springframework.data.domain.Pageable; public interface MemberLogCustomRepository { - Page filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable); + Page filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection); } 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 13546ff7..1a813a99 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 @@ -27,7 +27,7 @@ public class MemberLogCustomRepositoryImpl implements MemberLogCustomRepository{ private final JPAQueryFactory queryFactory; @Override - public Page filterMemberLogs(FilterLogRequest request, Pageable pageable) { + public Page filterMemberLogs(FilterLogRequest request, Pageable pageable, String sortDirection) { BooleanBuilder builder = new BooleanBuilder(); if (request.term() != null) { @@ -43,12 +43,15 @@ public Page filterMemberLogs(FilterLogRequest request, Pageable if (!request.clientIp().isEmpty()) { builder.and(memberLogEntity.clientIp.contains(request.clientIp())); } + OrderSpecifier orderSpecifier = sortDirection.equalsIgnoreCase("ASC") + ? memberLogEntity.requestAt.asc() + : memberLogEntity.requestAt.desc(); List result = queryFactory .selectFrom(memberLogEntity) .where(builder) .leftJoin(memberLogEntity.member, memberEntity) - .orderBy(getOrderSpecifiers(pageable)) + .orderBy(orderSpecifier) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); @@ -58,21 +61,4 @@ 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]); - } } diff --git a/src/main/java/clap/server/application/port/inbound/log/FindApiLogsUsecase.java b/src/main/java/clap/server/application/port/inbound/log/FindApiLogsUsecase.java index 34f11b6d..43322086 100644 --- a/src/main/java/clap/server/application/port/inbound/log/FindApiLogsUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/log/FindApiLogsUsecase.java @@ -12,6 +12,6 @@ import java.util.List; public interface FindApiLogsUsecase { - PageResponse filterAnonymousLogs(FilterLogRequest anonymousLogsRequest, Pageable pageable); - PageResponse filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable); + PageResponse filterAnonymousLogs(FilterLogRequest anonymousLogsRequest, Pageable pageable, String sortDirection); + PageResponse filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/outbound/log/LoadLogPort.java b/src/main/java/clap/server/application/port/outbound/log/LoadLogPort.java index a517ba4a..51314cec 100644 --- a/src/main/java/clap/server/application/port/outbound/log/LoadLogPort.java +++ b/src/main/java/clap/server/application/port/outbound/log/LoadLogPort.java @@ -12,7 +12,7 @@ import java.util.List; public interface LoadLogPort { - Page filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable); + Page filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable, String sortDirection); - Page filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable); + Page filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection); } diff --git a/src/main/java/clap/server/application/service/log/FindApiLogsService.java b/src/main/java/clap/server/application/service/log/FindApiLogsService.java index fc5fc1cc..02152b73 100644 --- a/src/main/java/clap/server/application/service/log/FindApiLogsService.java +++ b/src/main/java/clap/server/application/service/log/FindApiLogsService.java @@ -29,8 +29,8 @@ public class FindApiLogsService implements FindApiLogsUsecase { private final LoadLogPort loadLogPort; @Override - public PageResponse filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable) { - Page anonymousLogs = loadLogPort.filterAnonymousLogs(anonymousLogRequest, pageable); + public PageResponse filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable, String sortDirection) { + Page anonymousLogs = loadLogPort.filterAnonymousLogs(anonymousLogRequest, pageable, sortDirection); Page anonymousLogResponses = anonymousLogs.map(anonymousLog -> { int failedAttempts = loginDomainService.getFailedAttemptCount(anonymousLog.getLoginNickname()); return LogMapper.toAnonymousLogResponse(anonymousLog, failedAttempts); @@ -39,8 +39,8 @@ public PageResponse filterAnonymousLogs(FilterLogRequest a } @Override - public PageResponse filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable) { - Page memberLogs = loadLogPort.filterMemberLogs(memberLogRequest, pageable); + public PageResponse filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection) { + Page memberLogs = loadLogPort.filterMemberLogs(memberLogRequest, pageable, sortDirection); Page memberLogResponses = memberLogs.map(LogMapper::toMemberLogResponse); return PageResponse.from(memberLogResponses); } diff --git a/src/main/resources/db/migration/dev/V20250203236__Modify_Log_Status_From_Api_Log.sql b/src/main/resources/db/migration/dev/V20250203236__Modify_Log_Status_From_Api_Log.sql new file mode 100644 index 00000000..1fbf4584 --- /dev/null +++ b/src/main/resources/db/migration/dev/V20250203236__Modify_Log_Status_From_Api_Log.sql @@ -0,0 +1,4 @@ +ALTER TABLE api_log + MODIFY COLUMN log_status ENUM('LOGIN', 'LOGOUT', 'REQUEST_CREATED', 'REQUEST_UPDATED', 'REQUEST_CANCELLED', + 'REQUEST_APPROVED', 'ASSIGNER_CHANGED', 'COMMENT_ADDED', + 'COMMENT_UPDATED', 'STATUS_CHANGED', 'TASK_VIEWED') NOT NULL; \ No newline at end of file diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 015a4da0..a6acd661 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -58,5 +58,4 @@ jwt: password: policy: length: 12 - characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+ - + characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+ \ No newline at end of file