Skip to content

Commit

Permalink
feat: 미션 내역 리스트 조회 (#107)
Browse files Browse the repository at this point in the history
* feat: 미션 기록 조회

* fix: findByMissionId -> findById로 변경

* fix: spotlessApply

* fix: validateYearMonthFormat 검증 수정

* fix: spotlessApply

* fix: remart -> remark 오타 수정

* fix: RequestParam String -> YearMonth로 변경

* refactor: yearMonth 조건 분리

* fix: missionRecordId -> recordId 변경

* chore: git pending test
  • Loading branch information
char-yb authored Jan 9, 2024
1 parent a5e45b6 commit 81f8147
Show file tree
Hide file tree
Showing 12 changed files with 102 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

import com.depromeet.domain.member.domain.Member;
import com.depromeet.domain.mission.domain.Mission;
import java.util.Optional;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;

public interface MissionRepositoryCustom {
Optional<Mission> findByMissionId(Long missionId);

Slice<Mission> findAllMission(Member member, Pageable pageable, Long lastId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
Expand All @@ -21,18 +20,6 @@
public class MissionRepositoryImpl implements MissionRepositoryCustom {
private final JPAQueryFactory jpaQueryFactory;

@Override
public Optional<Mission> findByMissionId(Long missionId) {
Mission findMission =
jpaQueryFactory
.selectFrom(mission)
.leftJoin(mission.missionRecords, missionRecord)
.fetchJoin()
.where(mission.id.eq(missionId))
.fetchOne();
return Optional.ofNullable(findMission);
}

@Override
public Slice<Mission> findAllMission(Member member, Pageable pageable, Long lastId) {
JPAQuery<Mission> query =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public MissionCreateResponse createMission(MissionCreateRequest missionCreateReq
public MissionFindResponse findOneMission(Long missionId) {
Mission mission =
missionRepository
.findByMissionId(missionId)
.findById(missionId)
.orElseThrow(() -> new CustomException(ErrorCode.MISSION_NOT_FOUND));
return MissionFindResponse.from(mission);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
package com.depromeet.domain.missionRecord.api;

import com.depromeet.domain.missionRecord.dto.request.MissionRecordCreateRequest;
import com.depromeet.domain.missionRecord.dto.response.MissionRecordFindResponse;
import com.depromeet.domain.missionRecord.service.MissionRecordService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import java.time.YearMonth;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "3. [미션 기록]", description = "미션 기록 관련 API")
Expand All @@ -27,4 +32,12 @@ public ResponseEntity<Long> missionRecordCreate(
Long missionRecordId = missionRecordService.createMissionRecord(request);
return ResponseEntity.status(HttpStatus.CREATED).body(missionRecordId);
}

@Operation(summary = "미션 기록 조회 (캘린더 뷰)", description = "미션 기록을 조회합니다.")
@GetMapping
public List<MissionRecordFindResponse> missionRecordFind(
@RequestParam("missionId") Long missionId,
@RequestParam("yearMonth") YearMonth yearMonth) {
return missionRecordService.findAllMissionRecord(missionId, yearMonth);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
import com.depromeet.domain.missionRecord.domain.MissionRecord;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MissionRecordRepository extends JpaRepository<MissionRecord, Long> {}
public interface MissionRecordRepository
extends JpaRepository<MissionRecord, Long>, MissionRecordRepositoryCustom {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.depromeet.domain.missionRecord.dao;

import com.depromeet.domain.missionRecord.domain.MissionRecord;
import java.time.YearMonth;
import java.util.List;

public interface MissionRecordRepositoryCustom {

List<MissionRecord> findAllByMissionIdAndYearMonth(Long missionId, YearMonth yearMonth);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.depromeet.domain.missionRecord.dao;

import static com.depromeet.domain.missionRecord.domain.QMissionRecord.*;

import com.depromeet.domain.missionRecord.domain.MissionRecord;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.time.YearMonth;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class MissionRecordRepositoryImpl implements MissionRecordRepositoryCustom {

private final JPAQueryFactory jpaQueryFactory;

@Override
public List<MissionRecord> findAllByMissionIdAndYearMonth(Long missionId, YearMonth yearMonth) {
return jpaQueryFactory
.selectFrom(missionRecord)
.where(
missionIdEq(missionId),
yearEq(yearMonth.getYear()),
monthEq(yearMonth.getMonthValue()))
.orderBy(missionRecord.startedAt.asc())
.fetch();
}

private BooleanExpression missionIdEq(Long missionId) {
return missionRecord.mission.id.eq(missionId);
}

private BooleanExpression yearEq(int year) {
return missionRecord.startedAt.year().eq(year);
}

private BooleanExpression monthEq(int month) {
return missionRecord.startedAt.month().eq(month);
}
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.depromeet.domain.missionRecord.dto.response;

import com.depromeet.domain.missionRecord.domain.MissionRecord;
import java.time.LocalDateTime;

public record MissionRecordFindResponse(
Long recordId,
String remark,
String imageUrl,
int missionDay,
LocalDateTime startedAt,
LocalDateTime finishedAt) {
public static MissionRecordFindResponse from(MissionRecord missionRecord) {
return new MissionRecordFindResponse(
missionRecord.getId(),
missionRecord.getRemark(),
missionRecord.getImageUrl(),
missionRecord.getStartedAt().getDayOfMonth(),
missionRecord.getStartedAt(),
missionRecord.getFinishedAt());
}
}
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@
import com.depromeet.domain.missionRecord.dao.MissionRecordRepository;
import com.depromeet.domain.missionRecord.domain.MissionRecord;
import com.depromeet.domain.missionRecord.dto.request.MissionRecordCreateRequest;
import com.depromeet.domain.missionRecord.dto.response.MissionRecordFindResponse;
import com.depromeet.global.error.exception.CustomException;
import com.depromeet.global.error.exception.ErrorCode;
import com.depromeet.global.util.MemberUtil;
import java.time.Duration;
import java.time.YearMonth;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down Expand Up @@ -38,9 +41,16 @@ public Long createMissionRecord(MissionRecordCreateRequest request) {
return missionRecordRepository.save(missionRecord).getId();
}

public List<MissionRecordFindResponse> findAllMissionRecord(
Long missionId, YearMonth yearMonth) {
List<MissionRecord> missionRecords =
missionRecordRepository.findAllByMissionIdAndYearMonth(missionId, yearMonth);
return missionRecords.stream().map(MissionRecordFindResponse::from).toList();
}

private Mission findMission(MissionRecordCreateRequest request) {
return missionRepository
.findByMissionId(request.missionId())
.findById(request.missionId())
.orElseThrow(() -> new CustomException(ErrorCode.MISSION_NOT_FOUND));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ void setUp() {
startedAt.plusWeeks(2),
saveMember));
// when
Optional<Mission> findMission = missionRepository.findByMissionId(saveMission.getId());
Optional<Mission> findMission = missionRepository.findById(saveMission.getId());

// then
assertThat(findMission).isPresent();
Expand Down

0 comments on commit 81f8147

Please sign in to comment.