diff --git a/src/docs/asciidoc/MissionArchive-API.adoc b/src/docs/asciidoc/MissionArchive-API.adoc index b6bfb4e1..fee04ef4 100644 --- a/src/docs/asciidoc/MissionArchive-API.adoc +++ b/src/docs/asciidoc/MissionArchive-API.adoc @@ -50,3 +50,10 @@ operation::mission-archive-controller-test/미션_인증물_좋아요[snippets=' --- + +[[MissionArchive-미션상태조회]] +== 미션 상태 조회 +operation::mission-archive-controller-test/미션_상태_조회[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] + +--- + diff --git a/src/main/java/com/moing/backend/BackendApplication.java b/src/main/java/com/moing/backend/BackendApplication.java index 8e3ecf24..d60008aa 100644 --- a/src/main/java/com/moing/backend/BackendApplication.java +++ b/src/main/java/com/moing/backend/BackendApplication.java @@ -4,7 +4,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.scheduling.annotation.EnableAsync; +@EnableAsync @EnableFeignClients @SpringBootApplication @EnableJpaAuditing diff --git a/src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MyArchiveStatus.java b/src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MyArchiveStatus.java new file mode 100644 index 00000000..102b47ea --- /dev/null +++ b/src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MyArchiveStatus.java @@ -0,0 +1,13 @@ +package com.moing.backend.domain.missionArchive.application.dto.res; + +import lombok.*; + +@ToString +@AllArgsConstructor +@Builder +@NoArgsConstructor +@Getter +public class MyArchiveStatus { + private boolean end; + private String status; +} diff --git a/src/main/java/com/moing/backend/domain/missionArchive/application/service/MissionArchiveReadUseCase.java b/src/main/java/com/moing/backend/domain/missionArchive/application/service/MissionArchiveReadUseCase.java index 497ddb9a..763726a7 100644 --- a/src/main/java/com/moing/backend/domain/missionArchive/application/service/MissionArchiveReadUseCase.java +++ b/src/main/java/com/moing/backend/domain/missionArchive/application/service/MissionArchiveReadUseCase.java @@ -75,6 +75,15 @@ public MissionArchiveStatusRes getMissionDoneStatus(Long missionId) { } + public MyArchiveStatus getMissionArchiveStatus(String userSocialId,Long missionId , Long teamId) { + + Long memberId = memberGetService.getMemberBySocialId(userSocialId).getMemberId(); + + return missionArchiveQueryService.findMissionStatusById(memberId, missionId, teamId); + + } + + } diff --git a/src/main/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepository.java b/src/main/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepository.java index 20265798..ac242d4c 100644 --- a/src/main/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepository.java +++ b/src/main/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepository.java @@ -6,6 +6,7 @@ import com.moing.backend.domain.mission.application.dto.res.SingleMissionBoardRes; import com.moing.backend.domain.mission.domain.entity.constant.MissionStatus; import com.moing.backend.domain.missionArchive.application.dto.res.MissionArchivePhotoRes; +import com.moing.backend.domain.missionArchive.application.dto.res.MyArchiveStatus; import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive; import com.moing.backend.domain.missionArchive.domain.entity.MissionArchiveStatus; import org.springframework.stereotype.Repository; @@ -35,4 +36,7 @@ public interface MissionArchiveCustomRepository { Optional> findHavingRemainMissionsByQuerydsl() ; + + MyArchiveStatus findMissionStatusById(Long memberId, Long missionId, Long teamId); + } diff --git a/src/main/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepositoryImpl.java b/src/main/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepositoryImpl.java index 720c237f..8d342bf2 100644 --- a/src/main/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepositoryImpl.java +++ b/src/main/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepositoryImpl.java @@ -9,6 +9,7 @@ import com.moing.backend.domain.mission.domain.entity.constant.MissionType; import com.moing.backend.domain.mission.domain.entity.constant.MissionWay; import com.moing.backend.domain.missionArchive.application.dto.res.MissionArchivePhotoRes; +import com.moing.backend.domain.missionArchive.application.dto.res.MyArchiveStatus; import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive; import com.moing.backend.domain.missionArchive.domain.entity.MissionArchiveStatus; import com.moing.backend.domain.missionArchive.domain.entity.QMissionArchive; @@ -20,6 +21,7 @@ import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.CaseBuilder; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQuery; @@ -454,6 +456,32 @@ public Optional> findHavingRemainMissionsByQuerydsl() { } + @Override + public MyArchiveStatus findMissionStatusById(Long memberId, Long missionId, Long teamId) { + + return queryFactory + .select(Projections.constructor(MyArchiveStatus.class, + mission.status.eq(MissionStatus.END), + new CaseBuilder() + .when(mission.status.eq(MissionStatus.WAIT).or(mission.status.eq(MissionStatus.ONGOING))) + .then(missionArchive.status.stringValue().coalesce(mission.status.stringValue())) + .otherwise(missionArchive.status.stringValue().coalesce("FAIL")) + + )).distinct() + .from(mission) + .leftJoin(missionArchive) + .on( + missionArchive.mission.eq(mission), + missionArchive.member.memberId.eq(memberId)) + .where( + mission.team.teamId.eq(teamId), + mission.id.eq(missionId) + ) + .fetchFirst(); + + } + + } \ No newline at end of file diff --git a/src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveQueryService.java b/src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveQueryService.java index a374bbbd..2e46966e 100644 --- a/src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveQueryService.java +++ b/src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveQueryService.java @@ -6,6 +6,7 @@ import com.moing.backend.domain.mission.domain.entity.constant.MissionStatus; import com.moing.backend.domain.mission.domain.repository.MissionRepository; import com.moing.backend.domain.missionArchive.application.dto.res.MissionArchivePhotoRes; +import com.moing.backend.domain.missionArchive.application.dto.res.MyArchiveStatus; import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive; import com.moing.backend.domain.missionArchive.domain.repository.MissionArchiveRepository; import com.moing.backend.domain.missionArchive.exception.NotFoundMissionArchiveException; @@ -129,6 +130,10 @@ public boolean findDoneTodayArchive(Long memberId, Long missionId) { return missionArchiveRepository.findMyArchivesToday(memberId, missionId); } + public MyArchiveStatus findMissionStatusById(Long memberId, Long missionId, Long teamId) { + return missionArchiveRepository.findMissionStatusById(memberId, missionId, teamId); + } + } diff --git a/src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveScheduleQueryService.java b/src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveScheduleQueryService.java index 8747de95..3560526b 100644 --- a/src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveScheduleQueryService.java +++ b/src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveScheduleQueryService.java @@ -25,36 +25,6 @@ public class MissionArchiveScheduleQueryService { public List getRemainMissionPeople() { return missionArchiveRepository.findHavingRemainMissionsByQuerydsl().orElseThrow(); -// return Optional.of(maps.stream() -// .map(map -> { -// Object memberIdObject = map.get("memberId"); -// Long memberId = ((BigInteger) memberIdObject).longValue(); -// -// Object fcmObject = map.get("fcmToken"); -// String fcmToken = fcmObject.toString(); -// -// return MemberIdAndToken.builder() -// .fcmToken(fcmToken) -// .memberId(memberId) -// .build(); -// }) -// .collect(Collectors.toList())); - -// return null; - -// return maps.stream() -// .map(map -> { -// String fcmToken = Optional.ofNullable(map.get("fcmToken")).map(Object::toString).orElse("undef"); -// Long memberId = map.get("memberId"); -// -// return MemberIdAndToken.builder() -// .fcmToken(fcmToken) -// .memberId(memberId) -// .build(); -// -// }) -// .collect(Collectors.toList()); - } diff --git a/src/main/java/com/moing/backend/domain/missionArchive/presentation/MissionArchiveController.java b/src/main/java/com/moing/backend/domain/missionArchive/presentation/MissionArchiveController.java index 3f0a41f5..a321467f 100644 --- a/src/main/java/com/moing/backend/domain/missionArchive/presentation/MissionArchiveController.java +++ b/src/main/java/com/moing/backend/domain/missionArchive/presentation/MissionArchiveController.java @@ -3,10 +3,7 @@ import com.moing.backend.domain.member.domain.entity.Member; import com.moing.backend.domain.mission.application.dto.res.GatherRepeatMissionRes; import com.moing.backend.domain.missionArchive.application.dto.req.MissionArchiveReq; -import com.moing.backend.domain.missionArchive.application.dto.res.MissionArchiveRes; -import com.moing.backend.domain.missionArchive.application.dto.res.MissionArchiveStatusRes; -import com.moing.backend.domain.missionArchive.application.dto.res.MyMissionArchiveRes; -import com.moing.backend.domain.missionArchive.application.dto.res.PersonalArchiveRes; +import com.moing.backend.domain.missionArchive.application.dto.res.*; import com.moing.backend.domain.missionArchive.application.service.*; @@ -152,4 +149,13 @@ public ResponseEntity> getMyMissionDone } + @GetMapping("/mission-status") + public ResponseEntity> getMyMissionStatus(@AuthenticationPrincipal User user, + @PathVariable("teamId") Long teamId, + @PathVariable("missionId") Long missionId) { + return ResponseEntity.ok(SuccessResponse.create(MISSION_ARCHIVE_PEOPLE_STATUS_SUCCESS.getMessage(), this.missionArchiveReadUseCase.getMissionArchiveStatus(user.getSocialId(), missionId,teamId))); + } + + + } \ No newline at end of file diff --git a/src/test/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepositoryImplTest.java b/src/test/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepositoryImplTest.java index 823795a4..e2dd262b 100644 --- a/src/test/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepositoryImplTest.java +++ b/src/test/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveCustomRepositoryImplTest.java @@ -1,11 +1,21 @@ //package com.moing.backend.domain.missionArchive.domain.repository; // //import com.moing.backend.domain.history.application.dto.response.MemberIdAndToken; +//import com.moing.backend.domain.member.domain.entity.Member; +//import com.moing.backend.domain.mission.application.dto.res.FinishMissionBoardRes; //import com.moing.backend.domain.mission.application.dto.res.SingleMissionBoardRes; //import com.moing.backend.domain.mission.application.service.MissionRemindAlarmUseCase; //import com.moing.backend.domain.mission.domain.entity.Mission; //import com.moing.backend.domain.mission.domain.entity.constant.MissionStatus; //import com.moing.backend.domain.mission.domain.repository.MissionRepository; +//import com.moing.backend.domain.missionArchive.application.dto.req.MissionArchiveReq; +//import com.moing.backend.domain.missionArchive.application.dto.res.MissionArchiveRes; +//import com.moing.backend.domain.missionArchive.application.dto.res.MyArchiveStatus; +//import com.moing.backend.domain.missionArchive.application.dto.res.PersonalArchiveRes; +//import com.moing.backend.domain.missionArchive.application.mapper.MissionArchiveMapper; +//import com.moing.backend.domain.missionArchive.application.service.MissionArchiveCreateUseCase; +//import com.moing.backend.domain.missionArchive.application.service.MissionArchiveReadUseCase; +//import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive; //import com.moing.backend.domain.missionArchive.domain.service.MissionArchiveScheduleQueryService; //import com.querydsl.jpa.impl.JPAQueryFactory; //import org.junit.jupiter.api.Test; @@ -37,19 +47,13 @@ // @Autowired // MissionArchiveScheduleQueryService missionArchiveScheduleQueryService; // +// @Autowired +// MissionArchiveCreateUseCase missionArchiveCreateUseCase; // -// @Test -// void findPeopleRemainMission() { +// @Autowired +// MissionArchiveReadUseCase missionArchiveReadUseCase; // -// //System.out.println("!!!"+ missionArchiveRepository.findHavingRemainMissions().get().size()); // -// List remainMissionPeople = missionArchiveScheduleQueryService.getRemainMissionPeople().orElseThrow(); -// for (MemberIdAndToken remainMissionPerson : remainMissionPeople) { -// System.out.println("!!"+remainMissionPerson.getFcmToken() + " " + remainMissionPerson.getMemberId()); -// -// } -// missionRemindAlarmUseCase.sendRemindMissionAlarm(); -// } // // // @Test @@ -70,4 +74,78 @@ // System.out.println(singleMissionBoardRes.getTitle()); // } // } +// +// @Test +// void findMissionStatus() { +// MissionArchive missionArchive = missionArchiveRepository.findById(198L).orElseThrow(); +// MissionArchiveRes missionArchiveRes = MissionArchiveMapper.mapToMissionArchiveRes(missionArchive,33L); +// System.out.println(missionArchiveRes.toString()); +// } +// +// @Test +// void createMissionArchive() { +// System.out.println(missionArchiveCreateUseCase.createArchive("KAKAO@tester02", 211L, MissionArchiveReq.builder() +// .status("SKIP") +// .archive("hihi") +// .build())); +// +// System.out.println(); +// +// +// } +// +// +// @Test +// void findRemainPeople() { +// +// List members = missionRepository.findRepeatMissionPeopleByStatus(MissionStatus.WAIT).orElseThrow(); +// for (Member member : members) { +// System.out.println(member.getNickName()); +// } } +// +//// @Test +//// void report() { +//// +//// reportCreateUseCase.createReport("KAKAO@tester02", 550L, "MISSION"); +//// +//// List teams = new ArrayList<>(); +//// teams.add(48L); +//// List top5ArchivesByTeam = missionArchiveRepository.findTop5ArchivesByTeam(teams).orElseThrow(); +//// +//// System.out.println(top5ArchivesByTeam.get(0).getPhoto().get(0).toString()); +//// +//// } +// +// +// @Test +// void catHeartList() { +// +// List personalArchive = missionArchiveReadUseCase.getPersonalArchive("APPLE@001616.4e6d97f481fa441aa3a6169666c5552a.0841", 234L); +// for (PersonalArchiveRes personalArchiveRes : personalArchive) { +// System.out.println(personalArchiveRes); +// } +// } +// +// @Test +// void finishiMissions() { +// List finishMissionBoardResList = missionArchiveRepository.findFinishMissionsByStatus(33L, 48L).orElseThrow(); +// for (FinishMissionBoardRes finishMissionBoardRes : finishMissionBoardResList) { +// System.out.println(finishMissionBoardRes.toString()); +// } +// } +// +// @Test +// void finishArchives() { +// List missionArchives = missionArchiveRepository.findMyArchives(33L, 323L).orElseThrow(); +// for (MissionArchive missionArchive : missionArchives) { +// System.out.println(missionArchive.toString()); +// } +// } +// +// @Test +// void isstatus() { +// +// MyArchiveStatus missionStatusById = missionArchiveRepository.findMissionStatusById(51L, 323L, 48L); +// System.out.println(missionStatusById); +// } //} \ No newline at end of file diff --git a/src/test/java/com/moing/backend/domain/missionArchive/representation/MissionArchiveControllerTest.java b/src/test/java/com/moing/backend/domain/missionArchive/representation/MissionArchiveControllerTest.java index bef311b4..9c189db1 100644 --- a/src/test/java/com/moing/backend/domain/missionArchive/representation/MissionArchiveControllerTest.java +++ b/src/test/java/com/moing/backend/domain/missionArchive/representation/MissionArchiveControllerTest.java @@ -3,10 +3,7 @@ import com.moing.backend.config.CommonControllerTest; import com.moing.backend.domain.missionArchive.application.dto.req.MissionArchiveHeartReq; import com.moing.backend.domain.missionArchive.application.dto.req.MissionArchiveReq; -import com.moing.backend.domain.missionArchive.application.dto.res.MissionArchiveRes; -import com.moing.backend.domain.missionArchive.application.dto.res.MissionArchiveStatusRes; -import com.moing.backend.domain.missionArchive.application.dto.res.MyMissionArchiveRes; -import com.moing.backend.domain.missionArchive.application.dto.res.PersonalArchiveRes; +import com.moing.backend.domain.missionArchive.application.dto.res.*; import com.moing.backend.domain.missionArchive.application.service.*; import com.moing.backend.domain.missionArchive.presentation.MissionArchiveController; import com.moing.backend.domain.missionHeart.application.dto.MissionHeartRes; @@ -497,6 +494,52 @@ public class MissionArchiveControllerTest extends CommonControllerTest { } + @Test + public void 미션_상태_조회() throws Exception { + //given + + MyArchiveStatus output = MyArchiveStatus.builder() + .end(Boolean.TRUE) + .status("WAIT/ONGOING/COMPLETE/SKIP/FAIL") + .build(); + + given(missionArchiveReadUseCase.getMissionArchiveStatus(any(),any(),any())).willReturn(output); + + Long teamId = 1L; + Long missionId = 1L; + //when + ResultActions actions = mockMvc.perform(RestDocumentationRequestBuilders. + get("/api/team/{teamId}/missions/{missionId}/archive/mission-status",teamId,missionId) + .header("Authorization", "Bearer ACCESS_TOKEN") + .contentType(MediaType.APPLICATION_JSON) + + ); + + //then + actions + .andExpect(MockMvcResultMatchers.status().isOk()) + .andDo( + restDocs.document( + requestHeaders( + headerWithName("Authorization").description("접근 토큰") + ), + pathParameters( + parameterWithName("teamId").description("팀 아이디"), + parameterWithName("missionId").description("미션 아이디") + ), + responseFields( + fieldWithPath("isSuccess").description("true"), + fieldWithPath("message").description(MISSION_ARCHIVE_PEOPLE_STATUS_SUCCESS.getMessage()), + fieldWithPath("data.end").description("미션 종료 여부"), + fieldWithPath("data.status").description("미션 인증 상태 ") + ) + ) + ) + .andReturn(); + + } + +