Skip to content

Commit

Permalink
feat: 미션 기록 display 필드 추가 및 로직 변경 (#259)
Browse files Browse the repository at this point in the history
  • Loading branch information
char-yb authored Sep 11, 2024
1 parent 13aeb58 commit fb57dbd
Show file tree
Hide file tree
Showing 8 changed files with 110 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static com.depromeet.stonebed.domain.missionRecord.domain.QMissionRecordBoost.*;

import com.depromeet.stonebed.domain.feed.dto.FindFeedDto;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordDisplay;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordStatus;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression;
Expand Down Expand Up @@ -44,6 +45,8 @@ private JPAQuery<FindFeedDto> getFeedBaseQuery(Long missionRecordId, Long member
.on(missionHistory.mission.eq(mission))
.where(
missionRecord.status.eq(MissionRecordStatus.COMPLETED),
// TODO: 추후 피드 Request에 파라미터 전달받을 계획
missionRecord.display.in(MissionRecordDisplay.PUBLIC),
ltMissionRecordId(missionRecordId),
eqMemberId(memberId))
.groupBy(missionRecord.id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordRepository;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordBoost;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordDisplay;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordStatus;
import com.depromeet.stonebed.domain.missionRecord.dto.request.MissionRecordCalendarRequest;
import com.depromeet.stonebed.domain.missionRecord.dto.response.MissionRecordCalendarDto;
Expand Down Expand Up @@ -63,13 +64,7 @@ public MissionRecordIdResponse startMission(Long missionId) {
MissionRecord missionRecord =
missionRecordRepository
.findByMemberAndMissionHistory(member, missionHistory)
.orElseGet(
() ->
MissionRecord.builder()
.member(member)
.missionHistory(missionHistory)
.status(MissionRecordStatus.IN_PROGRESS)
.build());
.orElseGet(() -> MissionRecord.createMissionRecord(member, missionHistory));

MissionRecord saveMissionRecord = missionRecordRepository.save(missionRecord);
return MissionRecordIdResponse.of(saveMissionRecord.getId());
Expand Down Expand Up @@ -130,11 +125,8 @@ public void createBoost(Long missionRecordId, Long boostCount) {
}

MissionRecordBoost missionRecordBoost =
MissionRecordBoost.builder()
.missionRecord(missionRecord)
.member(currentMember)
.count(boostCount)
.build();
MissionRecordBoost.createMissionRecordBoost(
missionRecord, currentMember, boostCount);

missionRecordBoostRepository.save(missionRecordBoost);

Expand All @@ -150,12 +142,22 @@ private MissionHistory findMissionHistoryByIdAndRaisePet(Long missionId, RaisePe
@Transactional(readOnly = true)
public MissionRecordCalendarResponse getMissionRecordsForCalendar(
MissionRecordCalendarRequest request) {
Long findMemberId =
Optional.ofNullable(request.memberId())
.orElseGet(() -> memberUtil.getCurrentMember().getId());
Long findMemberId;
List<MissionRecordDisplay> displays;

if (request.memberId() == null) {
// 요청한 memberId가 null인 경우: 자신의 기록을 조회
findMemberId = memberUtil.getCurrentMember().getId();
displays = List.of(MissionRecordDisplay.PUBLIC, MissionRecordDisplay.PRIVATE);
} else {
// 요청한 memberId가 있는 경우: 다른 회원의 기록을 조회
findMemberId = request.memberId();
displays = List.of(MissionRecordDisplay.PUBLIC);
}

Pageable pageable = createPageable(request.limit());
List<MissionRecord> records = getMissionRecords(request.cursor(), findMemberId, pageable);
List<MissionRecord> records =
getMissionRecords(request.cursor(), findMemberId, displays, pageable);
List<MissionRecordCalendarDto> calendarData = convertToCalendarDto(records);
String nextCursor = getNextCursor(records, request.limit());

Expand All @@ -172,15 +174,17 @@ private List<MissionRecordCalendarDto> convertToCalendarDto(List<MissionRecord>
.toList();
}

private List<MissionRecord> getMissionRecords(String cursor, Long memberId, Pageable pageable) {
private List<MissionRecord> getMissionRecords(
String cursor, Long memberId, List<MissionRecordDisplay> displays, Pageable pageable) {
if (cursor == null) {
return missionRecordRepository.findByMemberIdWithPagination(memberId, pageable);
return missionRecordRepository.findByMemberIdWithPagination(
memberId, displays, pageable);
}

try {
LocalDateTime cursorDate = LocalDate.parse(cursor, DATE_FORMATTER).atStartOfDay();
return missionRecordRepository.findByMemberIdAndCreatedAtFromWithPagination(
memberId, cursorDate, pageable);
memberId, cursorDate, displays, pageable);
} catch (DateTimeParseException e) {
throw new CustomException(ErrorCode.INVALID_CURSOR_DATE_FORMAT);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.depromeet.stonebed.domain.missionRecord.dao;

import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordDisplay;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.data.domain.Pageable;

public interface MissionRecordRepositoryCustom {
List<MissionRecord> findByMemberIdWithPagination(Long memberId, Pageable pageable);
List<MissionRecord> findByMemberIdWithPagination(
Long memberId, List<MissionRecordDisplay> displays, Pageable pageable);

List<MissionRecord> findByMemberIdAndCreatedAtFromWithPagination(
Long memberId, LocalDateTime createdAt, Pageable pageable);
Long memberId,
LocalDateTime createdAt,
List<MissionRecordDisplay> displays,
Pageable pageable);

void updateExpiredMissionsToNotCompleted(LocalDateTime dateTime);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static com.depromeet.stonebed.domain.missionRecord.domain.QMissionRecord.missionRecord;

import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordDisplay;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordStatus;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
Expand All @@ -19,10 +20,11 @@ public class MissionRecordRepositoryImpl implements MissionRecordRepositoryCusto
private final JPAQueryFactory queryFactory;

@Override
public List<MissionRecord> findByMemberIdWithPagination(Long memberId, Pageable pageable) {
public List<MissionRecord> findByMemberIdWithPagination(
Long memberId, List<MissionRecordDisplay> displays, Pageable pageable) {
return queryFactory
.selectFrom(missionRecord)
.where(isMemberId(memberId))
.where(isMemberId(memberId).and(InDisplays(displays)))
.orderBy(missionRecord.createdAt.asc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
Expand All @@ -31,10 +33,17 @@ public List<MissionRecord> findByMemberIdWithPagination(Long memberId, Pageable

@Override
public List<MissionRecord> findByMemberIdAndCreatedAtFromWithPagination(
Long memberId, LocalDateTime createdAt, Pageable pageable) {
Long memberId,
LocalDateTime createdAt,
List<MissionRecordDisplay> displays,
Pageable pageable) {
return queryFactory
.selectFrom(missionRecord)
.where(isMemberId(memberId).and(createdAtFrom(createdAt)).and(isCompleted()))
.where(
isMemberId(memberId)
.and(createdAtFrom(createdAt))
.and(isCompleted())
.and(InDisplays(displays)))
.orderBy(missionRecord.createdAt.asc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
Expand Down Expand Up @@ -66,4 +75,8 @@ private BooleanExpression createdAtFrom(LocalDateTime createdAt) {
private BooleanExpression isCompleted() {
return missionRecord.status.eq(MissionRecordStatus.COMPLETED);
}

private BooleanExpression InDisplays(List<MissionRecordDisplay> displays) {
return missionRecord.display.in(displays);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;

@Getter
@Entity
Expand Down Expand Up @@ -41,27 +42,34 @@ public class MissionRecord extends BaseTimeEntity {
@Column(name = "content")
private String content;

@Builder
@Enumerated(EnumType.STRING)
@Schema(description = "미션 기록 ", example = "PUBLIC")
@Column(name = "display", nullable = false)
@ColumnDefault("'PUBLIC'")
private MissionRecordDisplay display;

@Builder(access = AccessLevel.PRIVATE)
public MissionRecord(
Member member,
MissionHistory missionHistory,
String imageUrl,
MissionRecordStatus status,
String content) {
String content,
MissionRecordDisplay display) {
this.member = member;
this.missionHistory = missionHistory;
this.imageUrl = imageUrl;
this.status = status;
this.content = content;
this.display = display;
}

public static MissionRecord createMissionRecord(
String content, Member member, MissionHistory missionHistory) {
public static MissionRecord createMissionRecord(Member member, MissionHistory missionHistory) {
return MissionRecord.builder()
.content(content)
.member(member)
.missionHistory(missionHistory)
.status(MissionRecordStatus.IN_PROGRESS)
.display(MissionRecordDisplay.PUBLIC)
.build();
}

Expand All @@ -76,4 +84,8 @@ public void updateContent(String content) {
public void updateStatus(MissionRecordStatus status) {
this.status = status;
}

public void updateDisplay(MissionRecordDisplay display) {
this.display = display;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,19 @@ public class MissionRecordBoost extends BaseTimeEntity {
@Column(name = "count", nullable = false)
private Long count;

@Builder
@Builder(access = AccessLevel.PRIVATE)
public MissionRecordBoost(MissionRecord missionRecord, Member member, Long count) {
this.missionRecord = missionRecord;
this.member = member;
this.count = count;
}

public static MissionRecordBoost createMissionRecordBoost(
MissionRecord missionRecord, Member member, Long count) {
return MissionRecordBoost.builder()
.missionRecord(missionRecord)
.member(member)
.count(count)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.depromeet.stonebed.domain.missionRecord.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum MissionRecordDisplay {
PUBLIC("PUBLIC"),
PRIVATE("PRIVATE"),
FORBIDDEN("FORBIDDEN"),
;
private final String value;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordRepository;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordBoost;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordDisplay;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordStatus;
import com.depromeet.stonebed.domain.missionRecord.dto.request.MissionRecordCalendarRequest;
import com.depromeet.stonebed.domain.missionRecord.dto.request.MissionRecordSaveRequest;
Expand Down Expand Up @@ -130,10 +131,16 @@ class MissionRecordServiceTest extends FixtureMonkeySetUp {
void 본인의_미션_기록_캘린더를_조회합니다() {
// given
Member member = fixtureMonkey.giveMeOne(Member.class);
List<MissionRecord> missionRecords = fixtureMonkey.giveMe(MissionRecord.class, 5);
List<MissionRecord> missionRecords =
fixtureMonkey
.giveMeBuilder(MissionRecord.class)
.set("member", member)
.set("display", MissionRecordDisplay.PUBLIC)
.sampleList(10);

when(memberUtil.getCurrentMember()).thenReturn(member);
when(missionRecordRepository.findByMemberIdWithPagination(anyLong(), any(Pageable.class)))
when(missionRecordRepository.findByMemberIdWithPagination(
anyLong(), anyList(), any(Pageable.class)))
.thenReturn(missionRecords);

String cursor = null;
Expand All @@ -155,16 +162,23 @@ class MissionRecordServiceTest extends FixtureMonkeySetUp {
verify(missionRecordRepository)
.findByMemberIdWithPagination(
member.getId(),
List.of(MissionRecordDisplay.PUBLIC, MissionRecordDisplay.PRIVATE),
PageRequest.of(0, limit, Sort.by(Sort.Direction.ASC, "createdAt")));
}

@Test
void 다른_사용자의_미션_기록_캘린더를_조회합니다() {
// given
Member member = fixtureMonkey.giveMeOne(Member.class);
List<MissionRecord> missionRecords = fixtureMonkey.giveMe(MissionRecord.class, 5);
List<MissionRecord> missionRecords =
fixtureMonkey
.giveMeBuilder(MissionRecord.class)
.set("member", member)
.set("display", MissionRecordDisplay.PUBLIC)
.sampleList(10);

when(missionRecordRepository.findByMemberIdWithPagination(anyLong(), any(Pageable.class)))
when(missionRecordRepository.findByMemberIdWithPagination(
anyLong(), anyList(), any(Pageable.class)))
.thenReturn(missionRecords);

String cursor = null;
Expand All @@ -184,6 +198,7 @@ class MissionRecordServiceTest extends FixtureMonkeySetUp {
verify(missionRecordRepository)
.findByMemberIdWithPagination(
member.getId(),
List.of(MissionRecordDisplay.PUBLIC),
PageRequest.of(0, limit, Sort.by(Sort.Direction.ASC, "createdAt")));
}

Expand Down

0 comments on commit fb57dbd

Please sign in to comment.