Skip to content

Commit b28cb4b

Browse files
authored
Merge pull request #281 from Modagbul/MNG-22
MNG-22 : 미션 관련 스케쥴링 추가
2 parents ca942fc + 6cd134c commit b28cb4b

File tree

8 files changed

+62
-156
lines changed

8 files changed

+62
-156
lines changed

src/main/java/com/moing/backend/domain/mission/application/service/MissionRemindAlarmUseCase.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import com.moing.backend.global.config.fcm.dto.request.MultiRequest;
1313
import com.moing.backend.global.config.fcm.service.MultiMessageSender;
1414
import lombok.RequiredArgsConstructor;
15-
import org.springframework.context.ApplicationEventPublisher;
1615
import org.springframework.stereotype.Service;
1716

1817
import javax.transaction.Transactional;
@@ -31,15 +30,14 @@ public class MissionRemindAlarmUseCase {
3130

3231
private final MissionArchiveScheduleQueryService missionArchiveScheduleQueryService;
3332
private final MissionQueryService missionQueryService;
34-
private final ApplicationEventPublisher eventPublisher;
3533

3634
private final MultiMessageSender multiMessageSender;
3735
private final SaveMultiAlarmHistoryUseCase saveMultiAlarmHistoryUseCase;
3836

3937
String REMIND_NAME = "미션 리마인드";
4038

4139

42-
public Boolean sendRemindMissionAlarm() {
40+
public void sendRemindMissionAlarm() {
4341

4442
Random random = new Random(System.currentTimeMillis());
4543
String title = getTitle(random.nextInt(4));
@@ -50,16 +48,12 @@ public Boolean sendRemindMissionAlarm() {
5048
Optional<List<MemberIdAndToken>> memberIdAndTokens = mapToMemberAndToken(remainMissionPeople);
5149
Optional<List<MemberIdAndToken>> pushMemberIdAndToken = isPushMemberIdAndToken(remainMissionPeople);
5250

53-
// eventPublisher.publishEvent(new MultiFcmEvent(title, message, pushMemberIdAndToken, memberIdAndTokens,
54-
// "",REMIND_NAME, AlarmType.REMIND, PagePath.MISSION_ALL_PTAH.getValue()));
55-
5651
if (pushMemberIdAndToken.isPresent() && !pushMemberIdAndToken.get().isEmpty()) {
5752
multiMessageSender.send(new MultiRequest(pushMemberIdAndToken.get(), title, message, "", REMIND_NAME, AlarmType.REMIND, PagePath.MISSION_ALL_PTAH.getValue()));
5853
}
5954
if (memberIdAndTokens.isPresent() && !memberIdAndTokens.get().isEmpty()) {
6055
saveMultiAlarmHistoryUseCase.saveAlarmHistories(AlarmHistoryMapper.getMemberIds(memberIdAndTokens.get()),"",title,message,REMIND_NAME, AlarmType.REMIND, PagePath.MISSION_ALL_PTAH.getValue());
6156
}
62-
return true;
6357
}
6458

6559

@@ -137,15 +131,15 @@ public Boolean sendRepeatMissionRemindOnMonday() {
137131

138132
}
139133

140-
public Optional<List<MemberIdAndToken>> mapToMemberAndToken(List<Member> members) {
134+
private Optional<List<MemberIdAndToken>> mapToMemberAndToken(List<Member> members) {
141135
return Optional.of(members.stream()
142136
.map(member -> MemberIdAndToken.builder()
143137
.fcmToken(member.getFcmToken())
144138
.memberId(member.getMemberId())
145139
.build())
146140
.collect(Collectors.toList()));
147141
}
148-
public Optional<List<MemberIdAndToken>> isPushMemberIdAndToken(List<Member> members) {
142+
private Optional<List<MemberIdAndToken>> isPushMemberIdAndToken(List<Member> members) {
149143
return Optional.of(members.stream()
150144
.map(member -> {
151145
if (member.isRemindPush() && !member.isSignOut()) {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.moing.backend.domain.mission.application.service;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.springframework.context.annotation.Profile;
6+
import org.springframework.scheduling.annotation.EnableAsync;
7+
import org.springframework.scheduling.annotation.EnableScheduling;
8+
import org.springframework.scheduling.annotation.Scheduled;
9+
import org.springframework.stereotype.Service;
10+
import org.springframework.transaction.annotation.Transactional;
11+
12+
13+
@Slf4j
14+
@Service
15+
@Transactional
16+
@EnableAsync
17+
@EnableScheduling
18+
@RequiredArgsConstructor
19+
@Profile("prod")
20+
public class MissionScheduleUseCase {
21+
22+
private final MissionRemindAlarmUseCase missionRemindAlarmUseCase;
23+
private final MissionUpdateUseCase missionUpdateUseCase;
24+
25+
/**
26+
* 단일 미션 마감
27+
* 해당 시간 미션 마감
28+
* 한시간 마다 실행
29+
*/
30+
@Scheduled(cron = "0 1 * * * *")
31+
public void singleMissionEndRoutine() {
32+
missionUpdateUseCase.terminateMissionByAdmin();
33+
}
34+
35+
/**
36+
* 리마인드 알림
37+
* 인증하지 않은 미션이 있는 경우 알림
38+
* 매일 오후 8시
39+
*/
40+
@Scheduled(cron = "0 0 20 * * *")
41+
public void MissionRemindAlarm() {
42+
missionRemindAlarmUseCase.sendRemindMissionAlarm();
43+
}
44+
}

src/main/java/com/moing/backend/domain/mission/application/service/MissionTerminationUseCase.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

src/main/java/com/moing/backend/domain/mission/application/service/MissionUpdateUseCase.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@
1010
import com.moing.backend.domain.mission.domain.entity.constant.MissionStatus;
1111
import com.moing.backend.domain.mission.domain.service.MissionQueryService;
1212
import com.moing.backend.domain.mission.domain.service.MissionSaveService;
13-
import com.moing.backend.domain.mission.exception.NoAccessCreateMission;
14-
import com.moing.backend.domain.mission.exception.NoAccessDeleteMission;
1513
import com.moing.backend.domain.mission.exception.NoAccessUpdateMission;
1614
import com.moing.backend.domain.team.domain.entity.Team;
1715
import lombok.RequiredArgsConstructor;
1816
import org.springframework.stereotype.Service;
1917
import org.springframework.transaction.annotation.Transactional;
2018

2119
import java.time.LocalDateTime;
20+
import java.util.List;
2221

2322
@Service
2423
@Transactional
@@ -31,17 +30,12 @@ public class MissionUpdateUseCase {
3130

3231
public MissionCreateRes updateMission(String userSocialId, Long missionId, MissionReq missionReq) {
3332

34-
3533
Member member = memberGetService.getMemberBySocialId(userSocialId);
3634
Mission mission = missionQueryService.findMissionById(missionId);
3735
Team team = mission.getTeam();
3836

3937
Long memberId = member.getMemberId();
4038

41-
/**
42-
* 미션 생성자 확인
43-
*/
44-
4539
if (!((memberId.equals(mission.getMakerId())) || memberId.equals(team.getLeaderId())) ) {
4640
throw new NoAccessUpdateMission();
4741
}
@@ -51,11 +45,11 @@ public MissionCreateRes updateMission(String userSocialId, Long missionId, Missi
5145

5246
}
5347

54-
public MissionReadRes updateMissionStatus(String userSocialId, Long missionId) {
55-
48+
public MissionReadRes terminateMissionByUser(String userSocialId, Long missionId) {
5649

5750
Member member = memberGetService.getMemberBySocialId(userSocialId);
5851
Long memberId = member.getMemberId();
52+
5953
Mission findMission = missionQueryService.findMissionById(missionId);
6054
Team team = findMission.getTeam();
6155

@@ -69,4 +63,10 @@ public MissionReadRes updateMissionStatus(String userSocialId, Long missionId) {
6963
return MissionMapper.mapToMissionReadRes(findMission,member);
7064

7165
}
66+
67+
public void terminateMissionByAdmin() {
68+
missionQueryService.findMissionByDueTo().stream().forEach(
69+
mission -> mission.updateStatus(MissionStatus.END)
70+
);
71+
}
7272
}

src/main/java/com/moing/backend/domain/mission/domain/repository/MissionCustomRepositoryImpl.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,11 @@ private JPQLQuery<Long> RepeatMissionDonePeopleByWeek(NumberPath<Long> missionId
128128
@Override
129129
public Optional<List<Mission>> findMissionByDueTo() {
130130

131-
LocalDateTime now = LocalDateTime.now();
132-
133131
return Optional.ofNullable(queryFactory
134132
.selectFrom(mission)
135133
.where(
136-
mission.dueTo.before(now),
137134
mission.status.eq(MissionStatus.WAIT).or(mission.status.eq(MissionStatus.ONGOING)),
135+
mission.dueTo.before(LocalDateTime.now()),
138136
mission.type.eq(MissionType.ONCE)
139137
).fetch());
140138
}

src/main/java/com/moing/backend/domain/mission/presentation/MissionController.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,11 @@
2020
@RequestMapping("/api/team/{teamId}/missions")
2121
public class MissionController {
2222

23-
2423
private final MissionCreateUseCase missionCreateUseCase;
2524
private final MissionReadUseCase missionReadUseCase;
2625
private final MissionUpdateUseCase missionUpdateUseCase;
2726
private final MissionDeleteUseCase missionDeleteUseCase;
2827

29-
// private final MissionRemindAlarmUseCase missionRemindAlarmUseCase;
30-
3128
/**
3229
* 미션 조회
3330
* [GET] {teamId}/missions/{missionId}
@@ -39,8 +36,6 @@ public ResponseEntity<SuccessResponse<MissionReadRes>> getMission(@Authenticatio
3936
return ResponseEntity.ok(SuccessResponse.create(READ_MISSION_SUCCESS.getMessage(), this.missionReadUseCase.getMission(user.getSocialId(),missionId)));
4037
}
4138

42-
43-
4439
/**
4540
* 미션 생성
4641
* [POST] {teamId}/missions
@@ -68,8 +63,8 @@ public ResponseEntity<SuccessResponse<MissionCreateRes>> updateMission(@Authenti
6863
* 작성자 : 정승연
6964
*/
7065
@PutMapping("/{missionId}/end")
71-
public ResponseEntity<SuccessResponse<MissionReadRes>> endMission(@AuthenticationPrincipal User user,@PathVariable("teamId") Long teamId,@PathVariable Long missionId) {
72-
return ResponseEntity.ok(SuccessResponse.create(END_MISSION_SUCCESS.getMessage(), this.missionUpdateUseCase.updateMissionStatus(user.getSocialId(),missionId)));
66+
public ResponseEntity<SuccessResponse<MissionReadRes>> terminateMission(@AuthenticationPrincipal User user, @PathVariable("teamId") Long teamId, @PathVariable Long missionId) {
67+
return ResponseEntity.ok(SuccessResponse.create(END_MISSION_SUCCESS.getMessage(), this.missionUpdateUseCase.terminateMissionByUser(user.getSocialId(),missionId)));
7368
}
7469

7570
/**
@@ -78,7 +73,7 @@ public ResponseEntity<SuccessResponse<MissionReadRes>> endMission(@Authenticatio
7873
* 작성자 : 정승연
7974
*/
8075
@DeleteMapping("/{missionId}")
81-
public ResponseEntity<SuccessResponse<Long>> deleteMission(@AuthenticationPrincipal User user,@PathVariable Long missionId) {
76+
public ResponseEntity<SuccessResponse<Long>> deleteMission(@AuthenticationPrincipal User user,@PathVariable("teamId") Long teamId,@PathVariable Long missionId) {
8277
return ResponseEntity.ok(SuccessResponse.create(DELETE_MISSION_SUCCESS.getMessage(), this.missionDeleteUseCase.deleteMission(user.getSocialId(),missionId)));
8378
}
8479

@@ -92,6 +87,7 @@ public ResponseEntity<SuccessResponse<Long>> deleteMission(@AuthenticationPrinci
9287
public ResponseEntity<SuccessResponse<String>> recommendMission(@AuthenticationPrincipal User user,@PathVariable Long teamId) {
9388
return ResponseEntity.ok(SuccessResponse.create(RECOMMEND_MISSION_SUCCESS.getMessage(), this.missionReadUseCase.getTeamCategory(teamId)));
9489
}
90+
9591
/**
9692
* 미션 추천
9793
* [GET] {teamId}/missions/isLeader
@@ -103,10 +99,6 @@ public ResponseEntity<SuccessResponse<Boolean>> isLeader(@AuthenticationPrincipa
10399
return ResponseEntity.ok(SuccessResponse.create(RECOMMEND_MISSION_SUCCESS.getMessage(), this.missionCreateUseCase.getIsLeader(user.getSocialId(),teamId)));
104100
}
105101

106-
// @PostMapping("/remind")
107-
// public ResponseEntity<SuccessResponse<Boolean>> remindAlarm(@AuthenticationPrincipal User user,@PathVariable Long teamId) {
108-
// return ResponseEntity.ok(SuccessResponse.create(RECOMMEND_MISSION_SUCCESS.getMessage(), this.missionRemindAlarmUseCase.sendRepeatMissionRemind()));
109-
// }
110102

111103
/**
112104
* 미션 설명 확인 (미션 읽음 처리)
@@ -124,5 +116,4 @@ public ResponseEntity<SuccessResponse<MissionConfirmRes>> confirmMissionExplanat
124116

125117

126118

127-
128119
}
Lines changed: 0 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,18 @@
11
package com.moing.backend.domain.missionArchive.domain.repository;
22

3-
import com.moing.backend.domain.history.application.dto.response.MemberIdAndToken;
4-
import com.moing.backend.domain.member.domain.entity.Member;
5-
import com.moing.backend.domain.mission.domain.entity.constant.MissionStatus;
63
import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive;
7-
import com.moing.backend.domain.missionArchive.domain.entity.MissionArchiveStatus;
8-
import com.querydsl.core.Tuple;
94
import feign.Param;
10-
import org.hibernate.annotations.NamedNativeQuery;
11-
import org.hibernate.annotations.Parameter;
125
import org.springframework.data.jpa.repository.JpaRepository;
136
import org.springframework.data.jpa.repository.Query;
147
import org.springframework.stereotype.Repository;
158

16-
import javax.persistence.ColumnResult;
17-
import javax.persistence.ConstructorResult;
18-
import javax.persistence.SqlResultSetMapping;
199
import java.util.List;
20-
import java.util.Map;
2110
import java.util.Optional;
2211

2312
@Repository
2413
public interface MissionArchiveRepository extends JpaRepository<MissionArchive, Long>,MissionArchiveCustomRepository {
2514

26-
@Query("select m from MissionArchive as m where m.member =:memberId" )
27-
Optional<List<MissionArchive>> findByMemberId(@Param("memberId") Long memberId);
28-
2915
@Query("select m from MissionArchive as m where m.mission.id = :missionId and m.member.memberId =:memberId order by m.createdDate")
3016
Optional<List<MissionArchive>> findArchivesByMissionIdAndMemberId(@Param("memberId") Long memberId, @Param("missionId")Long missionId);
3117

32-
@Query("select m from MissionArchive as m where m.mission.id = :missionId and m.member.memberId =:memberId")
33-
Optional<MissionArchive> findByMissionIdAndMemberId(@Param("memberId") Long memberId, @Param("missionId")Long missionId);
34-
35-
36-
@Query("select m from MissionArchive as m where m.mission.id IN :missionIds and m.member.memberId =:memberId")
37-
Optional<List<MissionArchive>> findRepeatMissionArchivesByMission (@Param("memberId") Long memberId, @Param("missionIds") List <Long> missionIds);
38-
39-
40-
// @Query(value = "SELECT distinct tmSub.fcm_token, tmSub.member_id" +
41-
// "FROM ( " +
42-
// " SELECT distinct COALESCE(tm.member_id, 0) AS member_id, t.team_id, me.fcm_token " +
43-
// " FROM mission m " +
44-
// " LEFT JOIN team t ON m.team_id = t.team_id " +
45-
// " LEFT JOIN team_member tm ON t.team_id = tm.team_id AND tm.is_deleted = 'False' " +
46-
// " LEFT JOIN member me on tm.member_id = me.member_id " +
47-
// " ) tmSub " +
48-
// " LEFT JOIN mission m ON NOT (m.status = 'END' OR m.status = 'SUCCESS') and m.team_id = tmSub.team_id " +
49-
// " LEFT JOIN mission_archive ms ON m.mission_id = ms.mission_id and ms.member_id = tmSub.member_id " +
50-
// "GROUP BY tmSub.member_id, m.mission_id, m.number " +
51-
// "having COUNT(ms.mission_archive_id) < m.number", nativeQuery = true)
52-
// Optional<List<MemberIdAndToken>> findHavingRemainMissions();
53-
54-
55-
@Query(value = "SELECT distinct COALESCE(tmSub.fcm_token,'undef') as fcmToken, tmSub.member_id as memberId " +
56-
"FROM (SELECT distinct COALESCE(tm.member_id, 0) AS member_id, t.team_id, me.fcm_token " +
57-
"FROM mission m " +
58-
"LEFT JOIN team t ON m.team_id = t.team_id " +
59-
"LEFT JOIN team_member tm ON t.team_id = tm.team_id AND tm.is_deleted = 'False' " +
60-
"LEFT JOIN member me on tm.member_id = me.member_id) tmSub " +
61-
"LEFT JOIN mission m ON NOT (m.status = 'END' OR m.status = 'SUCCESS') and m.team_id = tmSub.team_id " +
62-
"LEFT JOIN mission_archive ms ON m.mission_id = ms.mission_id and ms.member_id = tmSub.member_id " +
63-
"GROUP BY tmSub.member_id, m.mission_id, m.number " +
64-
"HAVING COUNT(ms.mission_archive_id) < m.number", nativeQuery = true
65-
)
66-
Optional<List<Map<String, Long>>> findHavingRemainMissions();
67-
68-
69-
// @Query(value = "SELECT distinct tmSub.fcm_token as fcmToken, tmSub.member_id as memberId " +
70-
// "FROM (SELECT distinct COALESCE(tm.member_id, 0) AS member_id, t.team_id, me.fcm_token " +
71-
// "FROM mission m " +
72-
// "LEFT JOIN team t ON m.team_id = t.team_id " +
73-
// "LEFT JOIN team_member tm ON t.team_id = tm.team_id AND tm.is_deleted = 'False' " +
74-
// "LEFT JOIN member me on tm.member_id = me.member_id) tmSub " +
75-
// "LEFT JOIN mission m ON NOT (m.status = 'END' OR m.status = 'SUCCESS') and m.team_id = tmSub.team_id " +
76-
// "LEFT JOIN mission_archive ms ON m.mission_id = ms.mission_id and ms.member_id = tmSub.member_id " +
77-
// "GROUP BY tmSub.member_id, m.mission_id, m.number " +
78-
// "HAVING COUNT(ms.mission_archive_id) < m.number", nativeQuery = true
79-
// )
80-
// Optional<List<MemberIdAndToken>> findHavingRemainMissions();
81-
82-
83-
84-
8518
}

0 commit comments

Comments
 (0)