Skip to content

Commit

Permalink
Merge pull request #281 from Modagbul/MNG-22
Browse files Browse the repository at this point in the history
MNG-22 : 미션 관련 스케쥴링 추가
  • Loading branch information
minsu20 authored May 8, 2024
2 parents ca942fc + 6cd134c commit b28cb4b
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 156 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import com.moing.backend.global.config.fcm.dto.request.MultiRequest;
import com.moing.backend.global.config.fcm.service.MultiMessageSender;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;

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

private final MissionArchiveScheduleQueryService missionArchiveScheduleQueryService;
private final MissionQueryService missionQueryService;
private final ApplicationEventPublisher eventPublisher;

private final MultiMessageSender multiMessageSender;
private final SaveMultiAlarmHistoryUseCase saveMultiAlarmHistoryUseCase;

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


public Boolean sendRemindMissionAlarm() {
public void sendRemindMissionAlarm() {

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

// eventPublisher.publishEvent(new MultiFcmEvent(title, message, pushMemberIdAndToken, memberIdAndTokens,
// "",REMIND_NAME, AlarmType.REMIND, PagePath.MISSION_ALL_PTAH.getValue()));

if (pushMemberIdAndToken.isPresent() && !pushMemberIdAndToken.get().isEmpty()) {
multiMessageSender.send(new MultiRequest(pushMemberIdAndToken.get(), title, message, "", REMIND_NAME, AlarmType.REMIND, PagePath.MISSION_ALL_PTAH.getValue()));
}
if (memberIdAndTokens.isPresent() && !memberIdAndTokens.get().isEmpty()) {
saveMultiAlarmHistoryUseCase.saveAlarmHistories(AlarmHistoryMapper.getMemberIds(memberIdAndTokens.get()),"",title,message,REMIND_NAME, AlarmType.REMIND, PagePath.MISSION_ALL_PTAH.getValue());
}
return true;
}


Expand Down Expand Up @@ -137,15 +131,15 @@ public Boolean sendRepeatMissionRemindOnMonday() {

}

public Optional<List<MemberIdAndToken>> mapToMemberAndToken(List<Member> members) {
private Optional<List<MemberIdAndToken>> mapToMemberAndToken(List<Member> members) {
return Optional.of(members.stream()
.map(member -> MemberIdAndToken.builder()
.fcmToken(member.getFcmToken())
.memberId(member.getMemberId())
.build())
.collect(Collectors.toList()));
}
public Optional<List<MemberIdAndToken>> isPushMemberIdAndToken(List<Member> members) {
private Optional<List<MemberIdAndToken>> isPushMemberIdAndToken(List<Member> members) {
return Optional.of(members.stream()
.map(member -> {
if (member.isRemindPush() && !member.isSignOut()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.moing.backend.domain.mission.application.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Slf4j
@Service
@Transactional
@EnableAsync
@EnableScheduling
@RequiredArgsConstructor
@Profile("prod")
public class MissionScheduleUseCase {

private final MissionRemindAlarmUseCase missionRemindAlarmUseCase;
private final MissionUpdateUseCase missionUpdateUseCase;

/**
* 단일 미션 마감
* 해당 시간 미션 마감
* 한시간 마다 실행
*/
@Scheduled(cron = "0 1 * * * *")
public void singleMissionEndRoutine() {
missionUpdateUseCase.terminateMissionByAdmin();
}

/**
* 리마인드 알림
* 인증하지 않은 미션이 있는 경우 알림
* 매일 오후 8시
*/
@Scheduled(cron = "0 0 20 * * *")
public void MissionRemindAlarm() {
missionRemindAlarmUseCase.sendRemindMissionAlarm();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,14 @@
import com.moing.backend.domain.mission.domain.entity.constant.MissionStatus;
import com.moing.backend.domain.mission.domain.service.MissionQueryService;
import com.moing.backend.domain.mission.domain.service.MissionSaveService;
import com.moing.backend.domain.mission.exception.NoAccessCreateMission;
import com.moing.backend.domain.mission.exception.NoAccessDeleteMission;
import com.moing.backend.domain.mission.exception.NoAccessUpdateMission;
import com.moing.backend.domain.team.domain.entity.Team;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Transactional
Expand All @@ -31,17 +30,12 @@ public class MissionUpdateUseCase {

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


Member member = memberGetService.getMemberBySocialId(userSocialId);
Mission mission = missionQueryService.findMissionById(missionId);
Team team = mission.getTeam();

Long memberId = member.getMemberId();

/**
* 미션 생성자 확인
*/

if (!((memberId.equals(mission.getMakerId())) || memberId.equals(team.getLeaderId())) ) {
throw new NoAccessUpdateMission();
}
Expand All @@ -51,11 +45,11 @@ public MissionCreateRes updateMission(String userSocialId, Long missionId, Missi

}

public MissionReadRes updateMissionStatus(String userSocialId, Long missionId) {

public MissionReadRes terminateMissionByUser(String userSocialId, Long missionId) {

Member member = memberGetService.getMemberBySocialId(userSocialId);
Long memberId = member.getMemberId();

Mission findMission = missionQueryService.findMissionById(missionId);
Team team = findMission.getTeam();

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

}

public void terminateMissionByAdmin() {
missionQueryService.findMissionByDueTo().stream().forEach(
mission -> mission.updateStatus(MissionStatus.END)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -128,13 +128,11 @@ private JPQLQuery<Long> RepeatMissionDonePeopleByWeek(NumberPath<Long> missionId
@Override
public Optional<List<Mission>> findMissionByDueTo() {

LocalDateTime now = LocalDateTime.now();

return Optional.ofNullable(queryFactory
.selectFrom(mission)
.where(
mission.dueTo.before(now),
mission.status.eq(MissionStatus.WAIT).or(mission.status.eq(MissionStatus.ONGOING)),
mission.dueTo.before(LocalDateTime.now()),
mission.type.eq(MissionType.ONCE)
).fetch());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,11 @@
@RequestMapping("/api/team/{teamId}/missions")
public class MissionController {


private final MissionCreateUseCase missionCreateUseCase;
private final MissionReadUseCase missionReadUseCase;
private final MissionUpdateUseCase missionUpdateUseCase;
private final MissionDeleteUseCase missionDeleteUseCase;

// private final MissionRemindAlarmUseCase missionRemindAlarmUseCase;

/**
* 미션 조회
* [GET] {teamId}/missions/{missionId}
Expand All @@ -39,8 +36,6 @@ public ResponseEntity<SuccessResponse<MissionReadRes>> getMission(@Authenticatio
return ResponseEntity.ok(SuccessResponse.create(READ_MISSION_SUCCESS.getMessage(), this.missionReadUseCase.getMission(user.getSocialId(),missionId)));
}



/**
* 미션 생성
* [POST] {teamId}/missions
Expand Down Expand Up @@ -68,8 +63,8 @@ public ResponseEntity<SuccessResponse<MissionCreateRes>> updateMission(@Authenti
* 작성자 : 정승연
*/
@PutMapping("/{missionId}/end")
public ResponseEntity<SuccessResponse<MissionReadRes>> endMission(@AuthenticationPrincipal User user,@PathVariable("teamId") Long teamId,@PathVariable Long missionId) {
return ResponseEntity.ok(SuccessResponse.create(END_MISSION_SUCCESS.getMessage(), this.missionUpdateUseCase.updateMissionStatus(user.getSocialId(),missionId)));
public ResponseEntity<SuccessResponse<MissionReadRes>> terminateMission(@AuthenticationPrincipal User user, @PathVariable("teamId") Long teamId, @PathVariable Long missionId) {
return ResponseEntity.ok(SuccessResponse.create(END_MISSION_SUCCESS.getMessage(), this.missionUpdateUseCase.terminateMissionByUser(user.getSocialId(),missionId)));
}

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

Expand All @@ -92,6 +87,7 @@ public ResponseEntity<SuccessResponse<Long>> deleteMission(@AuthenticationPrinci
public ResponseEntity<SuccessResponse<String>> recommendMission(@AuthenticationPrincipal User user,@PathVariable Long teamId) {
return ResponseEntity.ok(SuccessResponse.create(RECOMMEND_MISSION_SUCCESS.getMessage(), this.missionReadUseCase.getTeamCategory(teamId)));
}

/**
* 미션 추천
* [GET] {teamId}/missions/isLeader
Expand All @@ -103,10 +99,6 @@ public ResponseEntity<SuccessResponse<Boolean>> isLeader(@AuthenticationPrincipa
return ResponseEntity.ok(SuccessResponse.create(RECOMMEND_MISSION_SUCCESS.getMessage(), this.missionCreateUseCase.getIsLeader(user.getSocialId(),teamId)));
}

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

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




}
Original file line number Diff line number Diff line change
@@ -1,85 +1,18 @@
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.domain.entity.constant.MissionStatus;
import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive;
import com.moing.backend.domain.missionArchive.domain.entity.MissionArchiveStatus;
import com.querydsl.core.Tuple;
import feign.Param;
import org.hibernate.annotations.NamedNativeQuery;
import org.hibernate.annotations.Parameter;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import javax.persistence.ColumnResult;
import javax.persistence.ConstructorResult;
import javax.persistence.SqlResultSetMapping;
import java.util.List;
import java.util.Map;
import java.util.Optional;

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

@Query("select m from MissionArchive as m where m.member =:memberId" )
Optional<List<MissionArchive>> findByMemberId(@Param("memberId") Long memberId);

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

@Query("select m from MissionArchive as m where m.mission.id = :missionId and m.member.memberId =:memberId")
Optional<MissionArchive> findByMissionIdAndMemberId(@Param("memberId") Long memberId, @Param("missionId")Long missionId);


@Query("select m from MissionArchive as m where m.mission.id IN :missionIds and m.member.memberId =:memberId")
Optional<List<MissionArchive>> findRepeatMissionArchivesByMission (@Param("memberId") Long memberId, @Param("missionIds") List <Long> missionIds);


// @Query(value = "SELECT distinct tmSub.fcm_token, tmSub.member_id" +
// "FROM ( " +
// " SELECT distinct COALESCE(tm.member_id, 0) AS member_id, t.team_id, me.fcm_token " +
// " FROM mission m " +
// " LEFT JOIN team t ON m.team_id = t.team_id " +
// " LEFT JOIN team_member tm ON t.team_id = tm.team_id AND tm.is_deleted = 'False' " +
// " LEFT JOIN member me on tm.member_id = me.member_id " +
// " ) tmSub " +
// " LEFT JOIN mission m ON NOT (m.status = 'END' OR m.status = 'SUCCESS') and m.team_id = tmSub.team_id " +
// " LEFT JOIN mission_archive ms ON m.mission_id = ms.mission_id and ms.member_id = tmSub.member_id " +
// "GROUP BY tmSub.member_id, m.mission_id, m.number " +
// "having COUNT(ms.mission_archive_id) < m.number", nativeQuery = true)
// Optional<List<MemberIdAndToken>> findHavingRemainMissions();


@Query(value = "SELECT distinct COALESCE(tmSub.fcm_token,'undef') as fcmToken, tmSub.member_id as memberId " +
"FROM (SELECT distinct COALESCE(tm.member_id, 0) AS member_id, t.team_id, me.fcm_token " +
"FROM mission m " +
"LEFT JOIN team t ON m.team_id = t.team_id " +
"LEFT JOIN team_member tm ON t.team_id = tm.team_id AND tm.is_deleted = 'False' " +
"LEFT JOIN member me on tm.member_id = me.member_id) tmSub " +
"LEFT JOIN mission m ON NOT (m.status = 'END' OR m.status = 'SUCCESS') and m.team_id = tmSub.team_id " +
"LEFT JOIN mission_archive ms ON m.mission_id = ms.mission_id and ms.member_id = tmSub.member_id " +
"GROUP BY tmSub.member_id, m.mission_id, m.number " +
"HAVING COUNT(ms.mission_archive_id) < m.number", nativeQuery = true
)
Optional<List<Map<String, Long>>> findHavingRemainMissions();


// @Query(value = "SELECT distinct tmSub.fcm_token as fcmToken, tmSub.member_id as memberId " +
// "FROM (SELECT distinct COALESCE(tm.member_id, 0) AS member_id, t.team_id, me.fcm_token " +
// "FROM mission m " +
// "LEFT JOIN team t ON m.team_id = t.team_id " +
// "LEFT JOIN team_member tm ON t.team_id = tm.team_id AND tm.is_deleted = 'False' " +
// "LEFT JOIN member me on tm.member_id = me.member_id) tmSub " +
// "LEFT JOIN mission m ON NOT (m.status = 'END' OR m.status = 'SUCCESS') and m.team_id = tmSub.team_id " +
// "LEFT JOIN mission_archive ms ON m.mission_id = ms.mission_id and ms.member_id = tmSub.member_id " +
// "GROUP BY tmSub.member_id, m.mission_id, m.number " +
// "HAVING COUNT(ms.mission_archive_id) < m.number", nativeQuery = true
// )
// Optional<List<MemberIdAndToken>> findHavingRemainMissions();




}
Loading

0 comments on commit b28cb4b

Please sign in to comment.