Skip to content

Commit 22411ca

Browse files
authored
Merge pull request #300 from Modagbul/MNG-28
MNG-28 feat: 미션 댓글 생성 시 푸시알림 기능 추가
2 parents 5fccfaa + 4a3950e commit 22411ca

File tree

25 files changed

+287
-50
lines changed

25 files changed

+287
-50
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@ data.sql
5353

5454
firebase-key.json
5555
apple-key.p8
56+
logs/

src/docs/asciidoc/AlarmHistory-API.adoc

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ operation::alarm-history-controller-test/get_all_alarm_history[snippets='http-re
2424
| `REJECT_TEAM`
2525
| 소모임 반려
2626

27+
| `COMMENT`
28+
| 댓글 생성 알림
2729
|===
2830

2931
[[AlarmHistory-알림-단건-조회하기]]

src/main/java/com/moing/backend/domain/boardComment/application/service/CreateBoardCommentUseCase.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class CreateBoardCommentUseCase {
2121
private final BoardCommentSaveService boardCommentSaveService;
2222
private final BaseBoardService baseBoardService;
2323
private final CheckLeaderUseCase checkLeaderUseCase;
24-
private final SendCommentAlarmUseCase sendCommentAlarmUseCase;
24+
private final SendBoardCommentAlarmUseCase sendCommentAlarm;
2525
/**
2626
* 게시글 댓글 생성
2727
*/
@@ -33,7 +33,7 @@ public CreateCommentResponse createBoardComment(String socialId, Long teamId, Lo
3333
// 2. 게시글 댓글 개수 증가
3434
data.getBoard().incrComNum();
3535
// 3. 게시글 댓글 알림
36-
sendCommentAlarmUseCase.sendNewUploadAlarm(data, boardComment);
36+
sendCommentAlarm.sendCommentAlarm(data, boardComment);
3737
return new CreateCommentResponse(boardComment.getBoardCommentId());
3838
}
3939
}

src/main/java/com/moing/backend/domain/boardComment/application/service/SendCommentAlarmUseCase.java renamed to src/main/java/com/moing/backend/domain/boardComment/application/service/SendBoardCommentAlarmUseCase.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
@Service
2929
@RequiredArgsConstructor
3030
@Transactional
31-
public class SendCommentAlarmUseCase {
31+
public class SendBoardCommentAlarmUseCase {
3232

3333
private final ApplicationEventPublisher eventPublisher;
3434
private final BoardCommentGetService boardCommentGetService;
3535

36-
public void sendNewUploadAlarm(BaseBoardServiceResponse response, BoardComment comment) {
36+
public void sendCommentAlarm(BaseBoardServiceResponse response, BoardComment comment) {
3737
Member member = response.getMember();
3838
Team team = response.getTeam();
3939
Board board = response.getBoard();
@@ -50,15 +50,15 @@ private void sendBoardWriter(Board board, Member member, String title, String bo
5050
Member receiver = board.getTeamMember().getMember();
5151

5252
if (checkBoardWriter(receiver, member, newUploadInfos)) {
53-
eventPublisher.publishEvent(new SingleFcmEvent(receiver, title, body, createIdInfo(team.getTeamId(), board.getBoardId()), team.getName(), AlarmType.NEW_UPLOAD, PagePath.NOTICE_PATH.getValue(), receiver.isNewUploadPush()));
53+
eventPublisher.publishEvent(new SingleFcmEvent(receiver, title, body, createIdInfo(team.getTeamId(), board.getBoardId()), team.getName(), AlarmType.COMMENT, PagePath.NOTICE_PATH.getValue(), receiver.isCommentPush()));
5454
}
5555
}
5656

5757
private void sendBoardCommentWriter(Board board, Member member, String title, String body, Team team, Optional<List<NewUploadInfo>> newUploadInfos) {
5858
Optional<List<MemberIdAndToken>> memberIdAndTokensByPush = AlarmHistoryMapper.getNewUploadPushInfo(newUploadInfos);
5959
Optional<List<MemberIdAndToken>> memberIdAndTokensBySave = AlarmHistoryMapper.getNewUploadSaveInfo(newUploadInfos);
6060

61-
eventPublisher.publishEvent(new MultiFcmEvent(title, body, memberIdAndTokensByPush, memberIdAndTokensBySave, createIdInfo(team.getTeamId(), board.getBoardId()), team.getName(), AlarmType.NEW_UPLOAD, PagePath.NOTICE_PATH.getValue()));
61+
eventPublisher.publishEvent(new MultiFcmEvent(title, body, memberIdAndTokensByPush, memberIdAndTokensBySave, createIdInfo(team.getTeamId(), board.getBoardId()), team.getName(), AlarmType.COMMENT, PagePath.NOTICE_PATH.getValue()));
6262
}
6363

6464
private String createIdInfo(Long teamId, Long boardId) {

src/main/java/com/moing/backend/domain/boardComment/domain/repository/BoardCommentCustomRepositoryImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public Optional<List<NewUploadInfo>> findNewUploadInfo(Long memberId, Long board
6969
List<NewUploadInfo> result = queryFactory.select(Projections.constructor(NewUploadInfo.class,
7070
boardComment.teamMember.member.fcmToken,
7171
boardComment.teamMember.member.memberId,
72-
boardComment.teamMember.member.isNewUploadPush,
72+
boardComment.teamMember.member.isCommentPush,
7373
boardComment.teamMember.member.isSignOut))
7474
.distinct()
7575
.from(boardComment)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.moing.backend.domain.fire.application.dto.req;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
@NoArgsConstructor
8+
@Getter
9+
public class FireThrowReq {
10+
11+
private String message;
12+
13+
@Builder
14+
public FireThrowReq(String message) {
15+
this.message = message;
16+
}
17+
}

src/main/java/com/moing/backend/domain/fire/application/service/FireThrowAlarmUseCase.java

+14-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.moing.backend.domain.fire.application.service;
22

3+
import com.moing.backend.domain.fire.application.dto.req.FireThrowReq;
34
import com.moing.backend.domain.history.domain.entity.AlarmType;
45
import com.moing.backend.domain.member.domain.entity.Member;
56
import com.moing.backend.domain.mission.domain.entity.Mission;
@@ -24,28 +25,31 @@ public class FireThrowAlarmUseCase {
2425

2526
private final ApplicationEventPublisher eventPublisher;
2627

27-
public void sendFireThrowAlarm(Member throwMember, Member receiveMember, Team team, Mission mission) {
28+
public void sendFireThrowAlarm(Member throwMember, Member receiveMember, Team team, Mission mission, FireThrowReq fireThrowReq) {
2829

29-
Random random = new Random(System.currentTimeMillis());
30-
int randomNum = random.nextInt(2);
30+
int randomNum = new Random(System.currentTimeMillis()).nextInt(2);
3131

32-
String title = getTitle(throwMember.getNickName(), receiveMember.getNickName(), randomNum);
33-
String message = getMessage(throwMember.getNickName(), receiveMember.getNickName(), randomNum);
32+
String title = fireThrowReq != null ? NEW_FIRE_THROW_TITLE_WITH_COMMENT.to(throwMember.getNickName())
33+
: getRandomTitle(throwMember.getNickName(), receiveMember.getNickName(), randomNum);
34+
String message = fireThrowReq != null ? fireThrowReq.getMessage()
35+
: getRandomMessage(throwMember.getNickName(), receiveMember.getNickName(), randomNum);
3436
String idInfo = createIdInfo(mission.getType() == MissionType.REPEAT, mission.getTeam().getTeamId(), mission.getId());
3537

3638
eventPublisher.publishEvent(new SingleFcmEvent(receiveMember, title, message, idInfo, team.getName(), AlarmType.FIRE, MISSION_PATH.getValue(), receiveMember.isFirePush()));
3739
}
3840

39-
public String getMessage(String pusher, String receiver, int num) {
41+
public String getRandomMessage(String pusher, String receiver, int num) {
4042

4143
switch (num) {
42-
case 0: return pusher + "님이 " + receiver + NEW_FIRE_THROW_MESSAGE1.getMessage();
43-
case 1: return receiver + "님! " + pusher + NEW_FIRE_THROW_MESSAGE2.getMessage();
44+
case 0:
45+
return NEW_FIRE_THROW_MESSAGE1.fromTo(pusher, receiver);
46+
case 1: return NEW_FIRE_THROW_MESSAGE2.toFrom(receiver, pusher);
47+
4448
}
45-
return pusher + "님이" + receiver + NEW_FIRE_THROW_MESSAGE1.getMessage();
49+
return NEW_FIRE_THROW_MESSAGE1.fromTo(pusher, receiver);
4650
}
4751

48-
public String getTitle(String pusher, String receiver, int num) {
52+
public String getRandomTitle(String pusher, String receiver, int num) {
4953

5054
switch (num) {
5155
case 0:

src/main/java/com/moing/backend/domain/fire/application/service/FireThrowUseCase.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.moing.backend.domain.fire.application.service;
22

3+
import com.moing.backend.domain.fire.application.dto.req.FireThrowReq;
34
import com.moing.backend.domain.fire.application.dto.res.FireReceiveRes;
45
import com.moing.backend.domain.fire.application.dto.res.FireThrowRes;
56
import com.moing.backend.domain.fire.application.mapper.FireMapper;
@@ -19,6 +20,7 @@
1920
import org.springframework.transaction.annotation.Transactional;
2021

2122
import java.util.List;
23+
import java.util.Optional;
2224

2325
@Service
2426
@Transactional
@@ -33,7 +35,7 @@ public class FireThrowUseCase {
3335
private final MissionQueryService missionQueryService;
3436
private final TeamGetService teamGetService;
3537

36-
public FireThrowRes createFireThrow(String userId, Long receiveMemberId, Long missionId, Long teamId) {
38+
public FireThrowRes createFireThrow(String userId, Long receiveMemberId, Long missionId, Long teamId, FireThrowReq fireThrowReq) {
3739

3840
Member throwMember = memberGetService.getMemberBySocialId(userId);
3941
Member receiveMember = memberGetService.getMemberByMemberId(receiveMemberId);
@@ -50,12 +52,14 @@ public FireThrowRes createFireThrow(String userId, Long receiveMemberId, Long mi
5052
throw new NoAuthThrowFireException();
5153
}
5254

53-
fireThrowAlarmUseCase.sendFireThrowAlarm(throwMember, receiveMember, team, mission);
55+
fireThrowAlarmUseCase.sendFireThrowAlarm(throwMember, receiveMember, team, mission, fireThrowReq);
5456

55-
return FireMapper.mapToFireThrowRes(fireSaveService.save(Fire.builder()
57+
Fire save = fireSaveService.save(Fire.builder()
5658
.throwMemberId(throwMember.getMemberId())
5759
.receiveMemberId(receiveMemberId)
58-
.build()));
60+
.build());
61+
62+
return FireMapper.mapToFireThrowRes(fireSaveService.save(save));
5963
}
6064

6165
public List<FireReceiveRes> getFireReceiveList(String userId,Long teamId, Long missionId) {

src/main/java/com/moing/backend/domain/fire/domain/entity/Fire.java

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
@AllArgsConstructor
1616
public class Fire extends BaseTimeEntity {
1717

18-
1918
@Id
2019
@GeneratedValue(strategy = GenerationType.IDENTITY)
2120
@Column(name = "fire_id")

src/main/java/com/moing/backend/domain/fire/presentation/FireController.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.moing.backend.domain.fire.presentation;
22

3+
import com.moing.backend.domain.fire.application.dto.req.FireThrowReq;
34
import com.moing.backend.domain.fire.application.dto.res.FireReceiveRes;
45
import com.moing.backend.domain.fire.application.dto.res.FireThrowRes;
56
import com.moing.backend.domain.fire.application.service.FireThrowUseCase;
@@ -30,8 +31,8 @@ public class FireController {
3031

3132
@PostMapping("/{receiveMemberId}")
3233
public ResponseEntity<SuccessResponse<FireThrowRes>> throwFire (@AuthenticationPrincipal User user, @PathVariable("teamId") Long teamId,
33-
@PathVariable("receiveMemberId") Long receiveMemberId, @PathVariable("missionId") Long missionId) {
34-
return ResponseEntity.ok(SuccessResponse.create(THROW_FIRE_SUCCESS.getMessage(), this.fireThrowUseCase.createFireThrow(user.getSocialId(), receiveMemberId, missionId, teamId)));
34+
@PathVariable("receiveMemberId") Long receiveMemberId, @PathVariable("missionId") Long missionId, @RequestBody(required = false) FireThrowReq fireThrowReq) {
35+
return ResponseEntity.ok(SuccessResponse.create(THROW_FIRE_SUCCESS.getMessage(), this.fireThrowUseCase.createFireThrow(user.getSocialId(), receiveMemberId, missionId, teamId, fireThrowReq)));
3536
}
3637

3738
/**

src/main/java/com/moing/backend/domain/history/domain/entity/AlarmType.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ public enum AlarmType {
88
FIRE,
99
REMIND,
1010
APPROVE_TEAM,
11-
REJECT_TEAM
11+
REJECT_TEAM,
12+
COMMENT
1213
}

src/main/java/com/moing/backend/domain/member/domain/entity/Member.java

+8
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ public class Member extends BaseTimeEntity {
7979
@Column(nullable = false)
8080
private boolean isFirePush;
8181

82+
@ColumnDefault("true")
83+
@Column(nullable = false)
84+
private boolean isCommentPush;
85+
8286
private boolean isDeleted;
8387

8488
private LocalDateTime lastSignInTime;
@@ -140,6 +144,10 @@ public void updateFirePush(boolean firePush) {
140144
this.isFirePush = firePush;
141145
}
142146

147+
public void updateCommentPush(boolean commentPush){
148+
this.isCommentPush=commentPush;
149+
}
150+
143151
public void updateAllPush(boolean allPush) {
144152
this.isNewUploadPush = allPush;
145153
this.isRemindPush = allPush;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.moing.backend.domain.missionArchive.application.service;
2+
3+
import lombok.Getter;
4+
import lombok.RequiredArgsConstructor;
5+
6+
@Getter
7+
@RequiredArgsConstructor
8+
public enum MissionArchiveCreateMessage {
9+
10+
CREATOR_CREATE_MISSION_ARCHIVE("%s님이 미션을 인증했어요!"),
11+
TEAM_AND_TITLE("[%s] %s");
12+
13+
private final String message;
14+
15+
public String to(String creator) {
16+
return String.format(message, creator);
17+
}
18+
19+
public String teamAndTitle(String team, String title) {
20+
return String.format(message, team, title);
21+
}
22+
}

src/main/java/com/moing/backend/domain/missionArchive/application/service/MissionArchiveCreateUseCase.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public class MissionArchiveCreateUseCase {
3434

3535
private final TeamScoreUpdateUseCase teamScoreUpdateUseCase;
3636

37+
private final SendMissionArchiveCreateAlarmUseCase sendMissionArchiveCreateAlarmUseCase;
38+
3739
public MissionArchiveRes createArchive(String userSocialId, Long missionId, MissionArchiveReq missionReq) {
3840

3941
Member member = memberGetService.getMemberBySocialId(userSocialId);
@@ -59,7 +61,6 @@ public MissionArchiveRes createArchive(String userSocialId, Long missionId, Miss
5961

6062
newArchive.updateCount(missionArchiveQueryService.findMyDoneArchives(memberId, missionId) + 1);
6163
missionArchiveRes = MissionArchiveMapper.mapToMissionArchiveRes(missionArchiveSaveService.save(newArchive), memberId);
62-
6364
}
6465

6566
// 한번 미션일 경우
@@ -78,13 +79,16 @@ public MissionArchiveRes createArchive(String userSocialId, Long missionId, Miss
7879
missionArchiveRes.updateCount(doneSingleArchives);
7980

8081
}
81-
// TODO : 소모임원 3명 이상일 경우 보너스 점수
82+
// 소모임원 3명 이상일 경우 보너스 점수
8283
if (mission.getTeam().getNumOfMember() > 2) {
8384
gainBonusScore(mission, newArchive);
8485
}
85-
// TODO : 미션 인증 1회당 점수
86+
// 미션 인증 1회당 점수
8687
teamScoreUpdateUseCase.gainScoreOfArchive(mission, ScoreStatus.PLUS);
8788

89+
// 미션 인증 시 다른 팀원에게 알림 전송
90+
sendMissionArchiveCreateAlarmUseCase.sendNewMissionArchiveUploadAlarm(member,mission);
91+
8892
return missionArchiveRes;
8993
}
9094

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.moing.backend.domain.missionArchive.application.service;
2+
3+
import com.moing.backend.domain.history.application.dto.response.MemberIdAndToken;
4+
import com.moing.backend.domain.history.application.dto.response.NewUploadInfo;
5+
import com.moing.backend.domain.history.application.mapper.AlarmHistoryMapper;
6+
import com.moing.backend.domain.history.domain.entity.AlarmType;
7+
import com.moing.backend.domain.history.domain.entity.PagePath;
8+
import com.moing.backend.domain.member.domain.entity.Member;
9+
import com.moing.backend.domain.mission.domain.entity.Mission;
10+
import com.moing.backend.domain.mission.domain.entity.constant.MissionStatus;
11+
import com.moing.backend.domain.mission.domain.entity.constant.MissionType;
12+
import com.moing.backend.domain.team.domain.entity.Team;
13+
import com.moing.backend.domain.teamMember.domain.service.TeamMemberGetService;
14+
import com.moing.backend.global.config.fcm.dto.event.MultiFcmEvent;
15+
import lombok.RequiredArgsConstructor;
16+
import net.minidev.json.JSONObject;
17+
import org.springframework.context.ApplicationEventPublisher;
18+
import org.springframework.stereotype.Service;
19+
20+
import javax.transaction.Transactional;
21+
import java.util.List;
22+
import java.util.Optional;
23+
24+
import static com.moing.backend.domain.missionArchive.application.service.MissionArchiveCreateMessage.CREATOR_CREATE_MISSION_ARCHIVE;
25+
import static com.moing.backend.domain.missionArchive.application.service.MissionArchiveCreateMessage.TEAM_AND_TITLE;
26+
import static com.moing.backend.global.config.fcm.constant.NewMissionTitle.NEW_SINGLE_MISSION_COMING;
27+
28+
@Service
29+
@Transactional
30+
@RequiredArgsConstructor
31+
public class SendMissionArchiveCreateAlarmUseCase {
32+
33+
private final TeamMemberGetService teamMemberGetService;
34+
private final ApplicationEventPublisher eventPublisher;
35+
36+
public void sendNewMissionArchiveUploadAlarm(Member member, Mission mission) {
37+
Team team = mission.getTeam();
38+
39+
String title = CREATOR_CREATE_MISSION_ARCHIVE.to(member.getNickName());
40+
String message = TEAM_AND_TITLE.teamAndTitle(team.getName(),mission.getTitle());
41+
42+
43+
Optional<List<NewUploadInfo>> newUploadInfos=teamMemberGetService.getNewUploadInfo(team.getTeamId(), member.getMemberId());
44+
45+
Optional<List<MemberIdAndToken>> memberIdAndTokensByPush = AlarmHistoryMapper.getNewUploadPushInfo(newUploadInfos);
46+
Optional<List<MemberIdAndToken>> memberIdAndTokensBySave = AlarmHistoryMapper.getNewUploadSaveInfo(newUploadInfos);
47+
// 알림 보내기
48+
eventPublisher.publishEvent(new MultiFcmEvent(title, message, memberIdAndTokensByPush, memberIdAndTokensBySave, createIdInfo(team.getTeamId(), mission.getId(),mission.getType(),mission.getStatus()), team.getName(), AlarmType.NEW_UPLOAD, PagePath.MISSION_PATH.getValue()));
49+
}
50+
51+
private String createIdInfo(Long teamId, Long missionId,MissionType type, MissionStatus status) {
52+
JSONObject jo = new JSONObject();
53+
jo.put("isRepeated", type.equals(MissionType.REPEAT));
54+
jo.put("teamId", teamId);
55+
jo.put("missionId", missionId);
56+
jo.put("status", status.name());
57+
return jo.toJSONString();
58+
}
59+
}
60+

src/main/java/com/moing/backend/domain/missionComment/application/service/CreateMissionCommentUseCase.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.moing.backend.domain.missionComment.application.service;
22

3-
import com.moing.backend.domain.boardComment.application.service.SendCommentAlarmUseCase;
43
import com.moing.backend.domain.comment.application.dto.request.CreateCommentRequest;
54
import com.moing.backend.domain.comment.application.dto.response.CreateCommentResponse;
65
import com.moing.backend.domain.missionComment.application.mapper.MissionCommentMapper;
@@ -22,7 +21,7 @@ public class CreateMissionCommentUseCase {
2221
private final MissionCommentSaveService missionCommentSaveService;
2322
private final BaseMissionService baseMissionService;
2423
private final CheckLeaderUseCase checkLeaderUseCase;
25-
private final SendCommentAlarmUseCase sendCommentAlarmUseCase;
24+
private final SendMissionCommentAlarmUseCase sendCommentAlarm;
2625
/**
2726
* 게시글 댓글 생성
2827
*/
@@ -33,8 +32,8 @@ public CreateCommentResponse createBoardComment(String socialId, Long teamId, Lo
3332
MissionComment missionComment = missionCommentSaveService.saveComment(MissionCommentMapper.toMissionComment(data.getTeamMember(), data.getMissionArchive(), createCommentRequest, isLeader));
3433
// 2. 미션 게시글 댓글 개수 증가
3534
data.getMissionArchive().incrComNum();
36-
// // 3. 미션 게시글 댓글 알림
37-
// sendCommentAlarmUseCase.sendNewUploadAlarm(data, missionComment);
35+
// 3. 미션 게시글 댓글 알림
36+
sendCommentAlarm.sendCommentAlarm(data, missionComment);
3837
return new CreateCommentResponse(missionComment.getMissionCommentId());
3938
}
4039
}

src/main/java/com/moing/backend/domain/missionComment/application/service/SendMissionAlarmUseCase.java

-4
This file was deleted.

0 commit comments

Comments
 (0)