Skip to content

Commit

Permalink
[refactor] #157 change to querydsl
Browse files Browse the repository at this point in the history
  • Loading branch information
chaewonni committed Feb 3, 2025
1 parent fc8dac3 commit bef10e3
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@
public record PromisesDto(
List<PromiseDto> promises
) {
public static PromisesDto of(List<Promise> promises, Boolean done) {
public static PromisesDto of(List<Promise> promises) {
return new PromisesDto(
promises.stream()
.filter(promise -> done == null || done.equals(promise.isCompleted()))
.map(PromisesDto.PromiseDto::from)
.toList()
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,21 +100,23 @@ public PromisesDto getPromises(
final Boolean done,
final Boolean isParticipant
) {
List<Promise> allPromises = promiseRetriever.findAllByMeetingId(meetingId);
List<Promise> userPromises = promiseRetriever.findPromiseByUserIdAndMeetingId(userId, meetingId);
List<Promise> promises;

if (Boolean.TRUE.equals(isParticipant)) {
promises = userPromises;
} else if (Boolean.FALSE.equals(isParticipant)) {
promises = allPromises.stream()
.filter(promise -> !userPromises.contains(promise))
.collect(Collectors.toList());
} else {
promises = allPromises;
}

return PromisesDto.of(promises, done);
// List<Promise> allPromises = promiseRetriever.findAllByMeetingId(meetingId);
// List<Promise> userPromises = promiseRetriever.findPromiseByUserIdAndMeetingId(userId, meetingId);
// List<Promise> promises;
//
// if (Boolean.TRUE.equals(isParticipant)) {
// promises = userPromises;
// } else if (Boolean.FALSE.equals(isParticipant)) {
// promises = allPromises.stream()
// .filter(promise -> !userPromises.contains(promise))
// .collect(Collectors.toList());
// } else {
// promises = allPromises;
// }

List<Promise> promises = promiseRetriever.findPromisesByConditions(userId, meetingId, done, isParticipant);

return PromisesDto.of(promises);
}

@Transactional(readOnly = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,8 @@ public List<Promise> findPromiseByUserIdAndMeetingId(final Long userId, final Lo
public Promise findByUserIdAndPromiseId(final Long userId, final Long promiseId) {
return promiseRepository.findByUserIdAndPromiseId(userId, promiseId);
}

public List<Promise> findPromisesByConditions(final Long userId, final Long meetingId, final Boolean done, final Boolean isParticipant) {
return promiseRepository.findPromiseByConditions(userId, meetingId, done, isParticipant);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.kkumulkkum.server.domain.promise.repository;

import org.kkumulkkum.server.domain.promise.Promise;
import org.kkumulkkum.server.domain.promise.repository.custom.PromiseRepositoryCustom;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
Expand All @@ -9,7 +10,7 @@
import java.time.LocalDateTime;
import java.util.List;

public interface PromiseRepository extends JpaRepository<Promise, Long> {
public interface PromiseRepository extends JpaRepository<Promise, Long>, PromiseRepositoryCustom {

List<Promise> findAllByMeetingIdOrderByTimeAscCreatedAtAsc(Long meetingId);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.kkumulkkum.server.domain.promise.repository.custom;

import org.kkumulkkum.server.domain.promise.Promise;

import java.util.List;

public interface PromiseRepositoryCustom {
List<Promise> findPromiseByConditions(Long userId, Long meetingId, Boolean done, Boolean isParticipant);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package org.kkumulkkum.server.domain.promise.repository.custom;

import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.kkumulkkum.server.domain.promise.Promise;
import org.springframework.stereotype.Repository;

import java.util.List;

import static org.kkumulkkum.server.domain.member.QMember.member;
import static org.kkumulkkum.server.domain.participant.QParticipant.participant;
import static org.kkumulkkum.server.domain.promise.QPromise.promise;

@Repository
@RequiredArgsConstructor
public class PromiseRepositoryCustomImpl implements PromiseRepositoryCustom {

private final JPAQueryFactory queryFactory;

@Override
public List<Promise> findPromiseByConditions(Long userId, Long meetingId, Boolean done, Boolean isParticipant) {
return queryFactory
.selectFrom(promise)
.join(promise.participants, participant).fetchJoin()
.join(participant.member, member).fetchJoin()
.where(
meetingIdEq(meetingId),
isParticipantEq(userId, meetingId, isParticipant),
doneEq(done)
)
.orderBy(promise.time.asc(), promise.createdAt.asc())
.fetch();
}

private BooleanExpression meetingIdEq(Long meetingId) {
return meetingId != null ? promise.meeting.id.eq(meetingId) : null;
}

private BooleanExpression isParticipantEq(Long userId, Long meetingId, Boolean isParticipant) {
if (isParticipant == null) return null;

if (isParticipant) {
return promise.id.in(
JPAExpressions.select(participant.promise.id)
.from(participant)
.join(participant.member, member)
.where(member.user.id.eq(userId),
participant.promise.meeting.id.eq(meetingId)
)
);
} else {
return promise.id.notIn(
JPAExpressions.select(participant.promise.id)
.from(participant)
.join(participant.member, member)
.where(member.user.id.eq(userId),
participant.promise.meeting.id.eq(meetingId)
)
);
}
}

private BooleanExpression doneEq(Boolean done) {
return done != null ? promise.isCompleted.eq(done) : null;
}

}

0 comments on commit bef10e3

Please sign in to comment.