Skip to content

Commit

Permalink
Merge branch 'develop' into feature/109-mission-record-image-upload-e…
Browse files Browse the repository at this point in the history
…xception-case
  • Loading branch information
kdomo authored Jan 9, 2024
2 parents 13ab87a + 81f8147 commit 68c8c9a
Show file tree
Hide file tree
Showing 16 changed files with 404 additions and 22 deletions.
2 changes: 1 addition & 1 deletion src/main/java/com/depromeet/ExampleController.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "health-check", description = "상태 체크")
@Tag(name = "etc. [health-check]", description = "상태 체크")
@RestController
public class ExampleController {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "미션 API", description = "미션 관련 API입니다.")
@Tag(name = "2. [미션]", description = "미션 관련 API입니다.")
@RestController
@RequestMapping("/missions")
@RequiredArgsConstructor
Expand Down
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,19 +1,24 @@
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 = "[미션 기록]", description = "미션 기록 관련 API")
@Tag(name = "3. [미션 기록]", description = "미션 기록 관련 API")
@RestController
@RequestMapping("/records")
@RequiredArgsConstructor
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 @@ -9,10 +9,13 @@
import com.depromeet.domain.missionRecord.domain.MissionRecordTTL;
import com.depromeet.domain.missionRecord.dto.request.MissionRecordCreateRequest;
import com.depromeet.global.common.constants.RedisExpireEventConstants;
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 @@ -51,9 +54,16 @@ public Long createMissionRecord(MissionRecordCreateRequest request) {
return createdMissionRecord.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
Empty file.
Loading

0 comments on commit 68c8c9a

Please sign in to comment.