Skip to content

Commit 0e8f7a7

Browse files
authored
Merge pull request #455 from depromeet/feat/assignment/#454-push-notification
feat : 지정한 멤버에게 과제 제출 요청 푸시 알림 발송 구현
2 parents a85c772 + 89840c1 commit 0e8f7a7

8 files changed

Lines changed: 94 additions & 1 deletion

File tree

application/src/main/kotlin/core/application/announcement/application/event/AnnouncementNotificationListener.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import core.application.member.application.service.MemberQueryService
66
import core.domain.announcement.enums.AnnouncementType
77
import core.domain.announcement.event.AnnouncementCreatedEvent
88
import core.domain.announcement.event.AnnouncementRemindEvent
9+
import core.domain.announcement.event.AnnouncementRemindToMembersEvent
910
import core.domain.announcement.vo.AnnouncementId
1011
import core.domain.member.vo.MemberId
1112
import core.domain.notification.enums.NotificationMessageType
@@ -43,7 +44,7 @@ class AnnouncementNotificationListener(
4344

4445
@Async
4546
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
46-
fun createdEventHandle(announcementRemindEvent: AnnouncementRemindEvent) {
47+
fun remindEventHandle(announcementRemindEvent: AnnouncementRemindEvent) {
4748
val messageType: NotificationMessageType =
4849
when (announcementRemindEvent.announcement.announcementType) {
4950
AnnouncementType.GENERAL -> NotificationMessageType.ANNOUNCEMENT_REMIND
@@ -71,4 +72,15 @@ class AnnouncementNotificationListener(
7172
data = mapOf("announcementId" to announcementRemindEvent.announcement.id!!.value),
7273
)
7374
}
75+
76+
@Async
77+
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
78+
fun remindToMembersEventHandle(announcementRemindToMembersEvent: AnnouncementRemindToMembersEvent) {
79+
notificationCommandUseCase.sendPushNotificationToMembers(
80+
memberIds = announcementRemindToMembersEvent.memberIds,
81+
messageType = NotificationMessageType.ASSIGNMENT_SUBMIT_REQUEST_TO_MEMBERS,
82+
variables = mapOf("title" to announcementRemindToMembersEvent.announcement.title),
83+
data = mapOf("announcementId" to announcementRemindToMembersEvent.announcement.id!!.value),
84+
)
85+
}
7486
}

application/src/main/kotlin/core/application/announcement/application/service/AnnouncementCommandService.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package core.application.announcement.application.service
33
import core.application.announcement.application.exception.AnnouncementNotFoundException
44
import core.application.announcement.application.exception.AnnouncementTypeCannotBeChangedException
55
import core.application.announcement.application.exception.AssignmentSubmitTypeNotNullException
6+
import core.application.announcement.application.exception.NotAnAssignmentException
67
import core.domain.announcement.aggregate.Announcement
78
import core.domain.announcement.aggregate.AnnouncementAssignment
89
import core.domain.announcement.aggregate.AnnouncementRead
@@ -13,6 +14,7 @@ import core.domain.announcement.enums.SubmitStatus
1314
import core.domain.announcement.enums.SubmitType
1415
import core.domain.announcement.event.AnnouncementCreatedEvent
1516
import core.domain.announcement.event.AnnouncementRemindEvent
17+
import core.domain.announcement.event.AnnouncementRemindToMembersEvent
1618
import core.domain.announcement.port.inbound.AnnouncementAssignmentCommandUseCase
1719
import core.domain.announcement.port.inbound.AnnouncementCommandUseCase
1820
import core.domain.announcement.port.inbound.AnnouncementQueryUseCase
@@ -258,4 +260,19 @@ class AnnouncementCommandService(
258260
),
259261
)
260262
}
263+
264+
override fun remindNotificationToMembers(
265+
announcementId: AnnouncementId,
266+
memberIds: List<MemberId>,
267+
) {
268+
val targetAnnouncement: Announcement = announcementQueryUseCase.getAnnouncementById(announcementId)
269+
if (targetAnnouncement.announcementType != AnnouncementType.ASSIGNMENT) throw NotAnAssignmentException()
270+
271+
eventPublisher.publishEvent(
272+
AnnouncementRemindToMembersEvent.of(
273+
announcement = targetAnnouncement,
274+
memberIds = memberIds,
275+
),
276+
)
277+
}
261278
}

application/src/main/kotlin/core/application/announcement/presentation/controller/AnnouncementCommandApi.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package core.application.announcement.presentation.controller
22

33
import core.application.announcement.presentation.request.CreateAnnouncementRequest
4+
import core.application.announcement.presentation.request.RemindNotificationToMembersRequest
45
import core.application.announcement.presentation.request.UpdateAnnouncementRequest
56
import core.application.announcement.presentation.request.UpdateSubmitStatusRequest
67
import core.application.common.exception.CustomResponse
@@ -87,4 +88,17 @@ interface AnnouncementCommandApi {
8788
description = "공지나 과제의 리마인드 알림을 발송하는 API입니다",
8889
)
8990
fun remindNotification(announcementId: AnnouncementId): CustomResponse<Void>
91+
92+
@ApiResponse(
93+
responseCode = "200",
94+
description = "지정된 디퍼들에게 공지/과제 리마인드 알림 성공",
95+
)
96+
@Operation(
97+
summary = "지정된 디퍼들에게 공지/과제 리마인드 알림 API",
98+
description = "지정된 디퍼들에게 공지나 과제의 리마인드 알림을 발송하는 API입니다",
99+
)
100+
fun remindNotificationToMembers(
101+
announcementId: AnnouncementId,
102+
remindNotificationToMembersRequest: RemindNotificationToMembersRequest,
103+
): CustomResponse<Void>
90104
}

application/src/main/kotlin/core/application/announcement/presentation/controller/AnnouncementCommandController.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package core.application.announcement.presentation.controller
22

33
import core.application.announcement.application.service.AnnouncementCommandService
44
import core.application.announcement.presentation.request.CreateAnnouncementRequest
5+
import core.application.announcement.presentation.request.RemindNotificationToMembersRequest
56
import core.application.announcement.presentation.request.UpdateAnnouncementRequest
67
import core.application.announcement.presentation.request.UpdateSubmitStatusRequest
78
import core.application.common.converter.TimeMapper.localDateTimeToInstant
@@ -116,4 +117,16 @@ class AnnouncementCommandController(
116117
announcementCommandService.remindNotification(announcementId)
117118
return CustomResponse.ok()
118119
}
120+
121+
@PostMapping("/{announcementId}/remind-notification-to-members")
122+
override fun remindNotificationToMembers(
123+
@PathVariable announcementId: AnnouncementId,
124+
@RequestBody remindNotificationToMembersRequest: RemindNotificationToMembersRequest,
125+
): CustomResponse<Void> {
126+
announcementCommandService.remindNotificationToMembers(
127+
announcementId = announcementId,
128+
memberIds = remindNotificationToMembersRequest.memberIds,
129+
)
130+
return CustomResponse.ok()
131+
}
119132
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package core.application.announcement.presentation.request
2+
3+
import core.domain.member.vo.MemberId
4+
5+
data class RemindNotificationToMembersRequest(
6+
val memberIds: List<MemberId>,
7+
)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package core.domain.announcement.event
2+
3+
import core.domain.announcement.aggregate.Announcement
4+
import core.domain.member.vo.MemberId
5+
6+
data class AnnouncementRemindToMembersEvent(
7+
val announcement: Announcement,
8+
val memberIds: List<MemberId>,
9+
) {
10+
companion object {
11+
fun of(
12+
announcement: Announcement,
13+
memberIds: List<MemberId>,
14+
): AnnouncementRemindToMembersEvent =
15+
AnnouncementRemindToMembersEvent(
16+
announcement = announcement,
17+
memberIds = memberIds,
18+
)
19+
}
20+
}

domain/src/main/kotlin/core/domain/announcement/port/inbound/AnnouncementCommandUseCase.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,9 @@ interface AnnouncementCommandUseCase {
5555
)
5656

5757
fun remindNotification(announcementId: AnnouncementId)
58+
59+
fun remindNotificationToMembers(
60+
announcementId: AnnouncementId,
61+
memberIds: List<MemberId>,
62+
)
5863
}

domain/src/main/kotlin/core/domain/notification/enums/NotificationMessageType.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ enum class NotificationMessageType(
4545
bodyTemplate = "{title}",
4646
description = "과제 미제출자 제출요청 알림",
4747
),
48+
ASSIGNMENT_SUBMIT_REQUEST_TO_MEMBERS(
49+
title = "과제를 제출해주세요!",
50+
bodyTemplate = "{title}",
51+
description = "선택한 멤버 과제 제출요청 알림",
52+
),
4853
ASSIGNMENT_DUE_24H(
4954
title = "과제 제출까지 하루 남았어요.",
5055
bodyTemplate = "잊으신 건 아니죠? 내일 이 시간은 과제 제출 마감이에요. 미리 확인해 보세요!",

0 commit comments

Comments
 (0)