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 @@ -35,16 +35,11 @@ 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,
@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 = "작업 로그 목록 조회")
Expand All @@ -53,15 +48,10 @@ 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,
@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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,14 @@ public void saveAnonymousLog(AnonymousLog anonymousLog) {


@Override
public Page<MemberLog> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable) {
return memberLogRepository.filterMemberLogs(memberLogRequest, pageable)
public Page<MemberLog> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection) {
return memberLogRepository.filterMemberLogs(memberLogRequest, pageable, sortDirection)
.map(apiLogPersistenceMapper::mapMemberLogEntityToDomain);
}

@Override
public Page<AnonymousLog> filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable) {
return anonymousLogRepository.filterAnonymousLogs(anonymousLogRequest, pageable)
public Page<AnonymousLog> filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable, String sortDirection) {
return anonymousLogRepository.filterAnonymousLogs(anonymousLogRequest, pageable, sortDirection)
.map(apiLogPersistenceMapper::mapAnonymousLogEntityToDomain);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
import org.springframework.data.domain.Pageable;

public interface AnonymousLogCustomRepository {
Page<AnonymousLogEntity> filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable);
Page<AnonymousLogEntity> filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable, String sortDirection);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class AnonymousLogCustomRepositoryImpl implements AnonymousLogCustomRepos

private final JPAQueryFactory queryFactory;
@Override
public Page<AnonymousLogEntity> filterAnonymousLogs(FilterLogRequest request, Pageable pageable) {
public Page<AnonymousLogEntity> filterAnonymousLogs(FilterLogRequest request, Pageable pageable, String sortDirection) {
BooleanBuilder builder = new BooleanBuilder();

if (request.term() != null) {
Expand All @@ -40,11 +40,14 @@ public Page<AnonymousLogEntity> filterAnonymousLogs(FilterLogRequest request, Pa
if (!request.clientIp().isEmpty()) {
builder.and(anonymousLogEntity.clientIp.contains(request.clientIp()));
}
OrderSpecifier<LocalDateTime> orderSpecifier = sortDirection.equalsIgnoreCase("ASC")
? anonymousLogEntity.requestAt.asc()
: anonymousLogEntity.requestAt.desc();

List<AnonymousLogEntity> result = queryFactory
.selectFrom(anonymousLogEntity)
.where(builder)
.orderBy(getOrderSpecifiers(pageable))
.orderBy(orderSpecifier)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
Expand All @@ -54,21 +57,4 @@ 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 @@ -6,5 +6,5 @@
import org.springframework.data.domain.Pageable;

public interface MemberLogCustomRepository {
Page<MemberLogEntity> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable);
Page<MemberLogEntity> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection);
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class MemberLogCustomRepositoryImpl implements MemberLogCustomRepository{
private final JPAQueryFactory queryFactory;

@Override
public Page<MemberLogEntity> filterMemberLogs(FilterLogRequest request, Pageable pageable) {
public Page<MemberLogEntity> filterMemberLogs(FilterLogRequest request, Pageable pageable, String sortDirection) {
BooleanBuilder builder = new BooleanBuilder();

if (request.term() != null) {
Expand All @@ -43,12 +43,15 @@ public Page<MemberLogEntity> filterMemberLogs(FilterLogRequest request, Pageable
if (!request.clientIp().isEmpty()) {
builder.and(memberLogEntity.clientIp.contains(request.clientIp()));
}
OrderSpecifier<LocalDateTime> orderSpecifier = sortDirection.equalsIgnoreCase("ASC")
? memberLogEntity.requestAt.asc()
: memberLogEntity.requestAt.desc();

List<MemberLogEntity> result = queryFactory
.selectFrom(memberLogEntity)
.where(builder)
.leftJoin(memberLogEntity.member, memberEntity)
.orderBy(getOrderSpecifiers(pageable))
.orderBy(orderSpecifier)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
Expand All @@ -58,21 +61,4 @@ 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]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@
import java.util.List;

public interface FindApiLogsUsecase {
PageResponse<AnonymousLogResponse> filterAnonymousLogs(FilterLogRequest anonymousLogsRequest, Pageable pageable);
PageResponse<MemberLogResponse> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable);
PageResponse<AnonymousLogResponse> filterAnonymousLogs(FilterLogRequest anonymousLogsRequest, Pageable pageable, String sortDirection);
PageResponse<MemberLogResponse> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import java.util.List;

public interface LoadLogPort {
Page<AnonymousLog> filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable);
Page<AnonymousLog> filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable, String sortDirection);

Page<MemberLog> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable);
Page<MemberLog> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection);
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ public class FindApiLogsService implements FindApiLogsUsecase {
private final LoadLogPort loadLogPort;

@Override
public PageResponse<AnonymousLogResponse> filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable) {
Page<AnonymousLog> anonymousLogs = loadLogPort.filterAnonymousLogs(anonymousLogRequest, pageable);
public PageResponse<AnonymousLogResponse> filterAnonymousLogs(FilterLogRequest anonymousLogRequest, Pageable pageable, String sortDirection) {
Page<AnonymousLog> anonymousLogs = loadLogPort.filterAnonymousLogs(anonymousLogRequest, pageable, sortDirection);
Page<AnonymousLogResponse> anonymousLogResponses = anonymousLogs.map(anonymousLog -> {
int failedAttempts = loginDomainService.getFailedAttemptCount(anonymousLog.getLoginNickname());
return LogMapper.toAnonymousLogResponse(anonymousLog, failedAttempts);
Expand All @@ -39,8 +39,8 @@ public PageResponse<AnonymousLogResponse> filterAnonymousLogs(FilterLogRequest a
}

@Override
public PageResponse<MemberLogResponse> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable) {
Page<MemberLog> memberLogs = loadLogPort.filterMemberLogs(memberLogRequest, pageable);
public PageResponse<MemberLogResponse> filterMemberLogs(FilterLogRequest memberLogRequest, Pageable pageable, String sortDirection) {
Page<MemberLog> memberLogs = loadLogPort.filterMemberLogs(memberLogRequest, pageable, sortDirection);
Page<MemberLogResponse> memberLogResponses = memberLogs.map(LogMapper::toMemberLogResponse);
return PageResponse.from(memberLogResponses);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
3 changes: 1 addition & 2 deletions src/test/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,4 @@ jwt:
password:
policy:
length: 12
characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+

characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+