diff --git a/apps/user-service/src/main/java/site/icebang/common/dto/PageParams.java b/apps/user-service/src/main/java/site/icebang/common/dto/PageParams.java new file mode 100644 index 00000000..5f2f0d30 --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/common/dto/PageParams.java @@ -0,0 +1,25 @@ +package site.icebang.common.dto; + +import lombok.Data; + +@Data +public class PageParams { + private int current = 1; + private int pageSize = 10; + private String search; + private String[] sorters; + private String[] filters; + + // 계산된 offset + public int getOffset() { + return (current - 1) * pageSize; + } + + public boolean hasSearch() { + return search != null && !search.trim().isEmpty(); + } + + public boolean hasSorters() { + return sorters != null && sorters.length > 0; + } +} diff --git a/apps/user-service/src/main/java/site/icebang/common/dto/PageResult.java b/apps/user-service/src/main/java/site/icebang/common/dto/PageResult.java new file mode 100644 index 00000000..4a2a8bfa --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/common/dto/PageResult.java @@ -0,0 +1,77 @@ +package site.icebang.common.dto; + +import java.util.List; +import java.util.function.Supplier; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class PageResult { + private List data; + private int total; + private int current; + private int pageSize; + private int totalPages; + private boolean hasNext; + private boolean hasPrevious; + + public PageResult(List data, int total, int current, int pageSize) { + this.data = data; + this.total = total; + this.current = current; + this.pageSize = pageSize; + calculatePagination(); + } + + // 페이징 계산 로직 분리 + private void calculatePagination() { + this.totalPages = total > 0 ? (int) Math.ceil((double) total / pageSize) : 0; + this.hasNext = current < totalPages; + this.hasPrevious = current > 1; + } + + // 기존 of 메서드 + public static PageResult of(List data, int total, int current, int pageSize) { + return new PageResult<>(data, total, current, pageSize); + } + + // PageParams를 받는 of 메서드 + public static PageResult of(List data, int total, PageParams pageParams) { + return new PageResult<>(data, total, pageParams.getCurrent(), pageParams.getPageSize()); + } + + // 함수형 인터페이스를 활용한 from 메서드 (트랜잭션 내에서 실행) + public static PageResult from( + PageParams pageParams, Supplier> dataSupplier, Supplier countSupplier) { + List data = dataSupplier.get(); + int total = countSupplier.get(); + return new PageResult<>(data, total, pageParams.getCurrent(), pageParams.getPageSize()); + } + + // 빈 페이지 결과 생성 + public static PageResult empty(PageParams pageParams) { + return new PageResult<>(List.of(), 0, pageParams.getCurrent(), pageParams.getPageSize()); + } + + // 빈 페이지 결과 생성 (기본값) + public static PageResult empty() { + return new PageResult<>(List.of(), 0, 1, 10); + } + + // 데이터가 있는지 확인 + public boolean hasData() { + return data != null && !data.isEmpty(); + } + + // 첫 번째 페이지인지 확인 + public boolean isFirstPage() { + return current == 1; + } + + // 마지막 페이지인지 확인 + public boolean isLastPage() { + return current == totalPages; + } +} diff --git a/apps/user-service/src/main/java/site/icebang/common/service/PageableService.java b/apps/user-service/src/main/java/site/icebang/common/service/PageableService.java new file mode 100644 index 00000000..25d41d29 --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/common/service/PageableService.java @@ -0,0 +1,8 @@ +package site.icebang.common.service; + +import site.icebang.common.dto.PageParams; +import site.icebang.common.dto.PageResult; + +public interface PageableService { + PageResult getPagedResult(PageParams pageParams); +} diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/controller/WorkflowController.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/controller/WorkflowController.java new file mode 100644 index 00000000..39077eca --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/controller/WorkflowController.java @@ -0,0 +1,28 @@ +package site.icebang.domain.workflow.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +import site.icebang.common.dto.ApiResponse; +import site.icebang.common.dto.PageParams; +import site.icebang.common.dto.PageResult; +import site.icebang.domain.workflow.dto.WorkflowCardDto; +import site.icebang.domain.workflow.service.WorkflowService; + +@RestController +@RequestMapping("/v0/workflows") +@RequiredArgsConstructor +public class WorkflowController { + private final WorkflowService workflowService; + + @GetMapping("") + public ApiResponse> getWorkflowList( + @ModelAttribute PageParams pageParams) { + PageResult result = workflowService.getPagedResult(pageParams); + return ApiResponse.success(result); + } +} diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/dto/WorkflowCardDto.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/dto/WorkflowCardDto.java new file mode 100644 index 00000000..b54a29c0 --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/dto/WorkflowCardDto.java @@ -0,0 +1,6 @@ +package site.icebang.domain.workflow.dto; + +import lombok.Data; + +@Data +public class WorkflowCardDto {} diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowService.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowService.java new file mode 100644 index 00000000..1a358924 --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowService.java @@ -0,0 +1,27 @@ +package site.icebang.domain.workflow.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import lombok.RequiredArgsConstructor; + +import site.icebang.common.dto.PageParams; +import site.icebang.common.dto.PageResult; +import site.icebang.common.service.PageableService; +import site.icebang.domain.workflow.dto.WorkflowCardDto; + +@Service +@RequiredArgsConstructor +public class WorkflowService implements PageableService { + + @Override + @Transactional(readOnly = true) + public PageResult getPagedResult(PageParams pageParams) { + throw new RuntimeException("Not implemented"); + // return PageResult.from( + // pageParams, + // () -> workflowMapper.selectWorkflowList(pageParams), + // () -> workflowMapper.selectWorkflowCount(pageParams) + // ); + } +}