Skip to content

Commit

Permalink
[FEAT] 프로젝트 카드 동적 쿼리 조회 로직 구현, 커서 기반 페이지네이션 적용 (#74)
Browse files Browse the repository at this point in the history
* [FEAT] 프로젝트 카드 동적 쿼리 조회 로직 구현, 커서 기반 페이지네이션 적용

* [REFACT] 불필요한 프로젝트 카드 조회 메서드 제거, Slice 생성 로직 수정

* [FIX] cursorId에 대해 더 큰 값을 가져오도록 오류 수정 (eq -> gt)
  • Loading branch information
JIN-076 authored Feb 18, 2024
1 parent 5c07b8a commit ecb7864
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import org.springframework.stereotype.Repository;

@Repository
public interface ProjectJpaRepository extends JpaRepository<Project, Long> {
public interface ProjectJpaRepository extends JpaRepository<Project, Long>, ProjectRepositoryCustom {

@Query("select p from Project p where p.id = :id and p.deletedAt is null")
@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.oeid.mogakgo.domain.project.infrastructure;

import io.oeid.mogakgo.domain.geo.domain.enums.Region;
import io.oeid.mogakgo.domain.project.domain.entity.Project;
import io.oeid.mogakgo.domain.project.domain.entity.enums.ProjectStatus;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;

public interface ProjectRepositoryCustom {

Slice<Project> findByCondition(
Long cursorId, Long userId, Region region, ProjectStatus projectStatus, Pageable pageable
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package io.oeid.mogakgo.domain.project.infrastructure;

import static io.oeid.mogakgo.domain.project.domain.entity.QProject.project;

import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import io.oeid.mogakgo.domain.geo.domain.enums.Region;
import io.oeid.mogakgo.domain.project.domain.entity.Project;
import io.oeid.mogakgo.domain.project.domain.entity.enums.ProjectStatus;
import org.springframework.data.domain.Pageable;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.SliceImpl;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class ProjectRepositoryCustomImpl implements ProjectRepositoryCustom {

private final JPAQueryFactory jpaQueryFactory;

@Override
public Slice<Project> findByCondition(
Long cursorId, Long userId, Region region, ProjectStatus projectStatus, Pageable pageable
) {
List<Project> result = jpaQueryFactory.selectFrom(project)
.where(
cursorIdEq(cursorId),
userIdEq(userId),
regionEq(region),
projectStatusEq(projectStatus)
)
.limit(pageable.getPageSize() + 1)
.fetch();
boolean hasNext = checkLastPage(result, pageable);
return new SliceImpl<>(result, pageable, hasNext);
}

private BooleanExpression userIdEq(Long userId) {
return userId != null ? project.creator.id.eq(userId) : null;
}

private BooleanExpression regionEq(Region region) {
return region != null ? project.creatorInfo.region.eq(region) : null;
}

private BooleanExpression projectStatusEq(ProjectStatus projectStatus) {
return projectStatus != null ? project.projectStatus.eq(projectStatus) : null;
}

private BooleanExpression cursorIdEq(Long cursorId) {
return cursorId != null ? project.id.gt(cursorId) : null;
}

private boolean checkLastPage(List<Project> projects, Pageable pageable) {
if (projects.size() > pageable.getPageSize()) {
projects.remove(pageable.getPageSize());
return true;
}
return false;
}
}

0 comments on commit ecb7864

Please sign in to comment.