Skip to content

Commit

Permalink
Merge pull request #295 from GSM-MSG/294-update/user-list-dynamic-ali…
Browse files Browse the repository at this point in the history
…gnment

🔀  :: 유저 리스트 동적인 정렬 처리
  • Loading branch information
KimTaeO authored Mar 13, 2024
2 parents cd6d17a + dbec4b4 commit 5be3948
Showing 1 changed file with 34 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ import com.msg.gauth.domain.user.QUserRole.userRole
import com.msg.gauth.domain.user.User
import com.msg.gauth.domain.user.enums.UserRoleType
import com.msg.gauth.domain.user.enums.UserState
import com.querydsl.core.types.Order
import com.querydsl.core.types.OrderSpecifier
import com.querydsl.core.types.dsl.BooleanExpression
import com.querydsl.core.types.dsl.PathBuilder
import com.querydsl.jpa.impl.JPAQueryFactory
import org.springframework.stereotype.Repository

Expand All @@ -16,15 +19,37 @@ class CustomUserRepositoryImpl(
) : CustomUserRepository {

override fun search(grade: Int, classNum: Int, keyword: String): List<User> {
return jpaQueryFactory.selectFrom(user)
val gradeEq = gradeEq(grade)
val classNumEq = classNumEq(classNum)
val stateEq = stateEq(UserState.CREATED)
val roleEq = roleEq(UserRoleType.ROLE_STUDENT)

val pathBuilder = PathBuilder(user.type, user.metadata)
val orderSpecifiers = mutableListOf<OrderSpecifier<*>>()

val query = jpaQueryFactory.selectFrom(user)
.leftJoin(userRole).on(userRole.user.eq(user)).fetchJoin()
.where(
gradeEq(grade),
classNumEq(classNum),
keywordLike(keyword),
stateEq(UserState.CREATED),
userRole.userRoleType.eq(UserRoleType.ROLE_STUDENT)
).fetch()
gradeEq,
classNumEq,
stateEq,
roleEq,
keywordLike(keyword)
)


if(gradeEq == null) {
orderSpecifiers.add(OrderSpecifier(Order.ASC, pathBuilder.get(user.grade)))
}

if(classNumEq == null) {
orderSpecifiers.add(OrderSpecifier(Order.ASC, pathBuilder.get(user.classNum)))
}

orderSpecifiers.add(OrderSpecifier(Order.ASC, pathBuilder.get(user.num)))

return query
.orderBy(*orderSpecifiers.toTypedArray()).fetch()
}

private fun gradeEq(grade: Int): BooleanExpression? =
Expand All @@ -36,8 +61,8 @@ class CustomUserRepositoryImpl(
private fun keywordLike(keyword: String): BooleanExpression? =
if(keyword.isNotEmpty()) user.name.like("%${keyword}%") else null

private fun roleContains(userRoleType: UserRoleType): BooleanExpression =
user.roles.contains(userRoleType)
private fun roleEq(userRoleType: UserRoleType): BooleanExpression =
userRole.userRoleType.eq(userRoleType)

private fun stateEq(userState: UserState): BooleanExpression =
user.state.eq(userState)
Expand Down

0 comments on commit 5be3948

Please sign in to comment.