Skip to content

Commit 390109c

Browse files
authored
v0.2.0
v0.2.0
2 parents 2700966 + 1f207f2 commit 390109c

File tree

253 files changed

+1654
-1216
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

253 files changed

+1654
-1216
lines changed

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ include(
2323
include(
2424
"sseudam-core:core-api",
2525
"sseudam-core:core-domain",
26+
"sseudam-core:core-application",
2627
"sseudam-core:core-contract",
2728
)
2829

sseudam-admin/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ dependencies {
77
implementation(libs.spring.boot.starter.security)
88
testImplementation(libs.spring.security.test)
99

10+
implementation(project(":sseudam-core:core-application"))
1011
implementation(project(":sseudam-core:core-domain"))
1112
implementation(project(":sseudam-core:core-contract"))
1213
implementation(project(":sseudam-storage:db-core"))

sseudam-admin/src/main/kotlin/com/sseudam/admin/application/AdminFacade.kt

Lines changed: 13 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,26 @@ import com.sseudam.admin.domain.AdminToken
44
import com.sseudam.admin.domain.AdminUserProfile
55
import com.sseudam.auth.AuthenticationService
66
import com.sseudam.notification.NotificationService
7-
import com.sseudam.notification.NotificationStored
8-
import com.sseudam.notification.ReadStatus
7+
import com.sseudam.notification.command.CreateNotificationStoredCommand
8+
import com.sseudam.notification.command.FirebaseCloudMessageCommand
99
import com.sseudam.notification.fcm.FcmSender
10-
import com.sseudam.notification.fcm.NewFirebaseCloudMessage
11-
import com.sseudam.pet.PetPointAction
12-
import com.sseudam.pet.event.PetEventPublisher
1310
import com.sseudam.report.ReportFacade
1411
import com.sseudam.report.ReportService
1512
import com.sseudam.report.ReportType
1613
import com.sseudam.report.SpotReport
17-
import com.sseudam.report.UpdateReport
14+
import com.sseudam.report.command.UpdateReportCommand
1815
import com.sseudam.suggestion.SpotSuggestion
1916
import com.sseudam.suggestion.SuggestionService
2017
import com.sseudam.suggestion.SuggestionStatus
21-
import com.sseudam.suggestion.UpdateSuggestionCommand
22-
import com.sseudam.suggestion.event.SuggestionEventPublisher
23-
import com.sseudam.support.CacheRepository
18+
import com.sseudam.suggestion.command.UpdateSuggestionCommand
2419
import com.sseudam.support.cursor.OffsetPageRequest
2520
import com.sseudam.support.error.ErrorException
2621
import com.sseudam.support.error.ErrorType
2722
import com.sseudam.support.page.Page
28-
import com.sseudam.support.tx.TxAdvice
2923
import com.sseudam.trashspot.TrashSpotService
30-
import com.sseudam.trashspot.image.TrashSpotImage
31-
import com.sseudam.trashspot.image.TrashSpotImageService
24+
import com.sseudam.user.UserDeviceService
3225
import com.sseudam.user.UserProfile
3326
import com.sseudam.user.UserService
34-
import com.sseudam.user.device.UserDeviceService
3527
import com.sseudam.visit.SpotVisitedService
3628
import org.springframework.security.crypto.password.PasswordEncoder
3729
import org.springframework.stereotype.Service
@@ -50,16 +42,7 @@ class AdminFacade(
5042
private val notificationService: NotificationService,
5143
private val passwordEncoder: PasswordEncoder,
5244
private val reportFacade: ReportFacade,
53-
private val cacheRepository: CacheRepository,
54-
private val trashSpotImageService: TrashSpotImageService,
55-
private val petEventPublisher: PetEventPublisher,
56-
private val suggestionEventPublisher: SuggestionEventPublisher,
57-
private val txAdvice: TxAdvice,
5845
) {
59-
companion object {
60-
private const val SPOT_DETAIL_CACHE_KEY_PREFIX = "spot:detail:"
61-
}
62-
6346
fun login(
6447
loginId: String,
6548
password: String,
@@ -109,39 +92,13 @@ class AdminFacade(
10992

11093
fun findReportDetails(reportId: Long): SpotReport.Detail = reportFacade.findReportDetails(reportId)
11194

112-
fun updateSpotSuggestionStatus(command: UpdateSuggestionCommand): SpotSuggestion.UpdateResult =
113-
txAdvice.write {
114-
val suggestion = suggestionService.updateStatus(command.suggestionId, command.status)
115-
val spotId: Long =
116-
when (suggestion.status) {
117-
SuggestionStatus.APPROVE -> {
118-
val trashSpot = trashSpotService.createTrashSpotBySuggestion(suggestion)
119-
trashSpotImageService.append(
120-
TrashSpotImage.Create(trashSpot.id, suggestion.imageUrl),
121-
)
122-
petEventPublisher.publish(suggestion.userId, PetPointAction.SUGGESTION_APPROVED)
123-
cacheRepository.delete(SPOT_DETAIL_CACHE_KEY_PREFIX + trashSpot.id)
124-
trashSpot.id
125-
}
126-
SuggestionStatus.REJECT -> {
127-
if (!command.reason.isNullOrBlank()) {
128-
suggestionService.appendReject(command.suggestionId, command.reason)
129-
}
130-
0L
131-
}
132-
else -> {
133-
0L
134-
}
135-
}
136-
suggestionEventPublisher.publish(suggestion)
137-
return@write SpotSuggestion.UpdateResult.of(suggestion, spotId)
138-
}
95+
fun updateSpotSuggestionStatus(command: UpdateSuggestionCommand) =
96+
SpotSuggestion.UpdateResult.of(
97+
suggestionService.updateStatus(command.suggestionId, command.status, command.reason),
98+
)
13999

140-
fun updateSpotReportStatus(updateReport: UpdateReport): SpotReport.Info {
141-
val spotReportInfo = reportService.updateSpotReport(updateReport)
142-
cacheRepository.delete(SPOT_DETAIL_CACHE_KEY_PREFIX + spotReportInfo.spotId)
143-
return spotReportInfo
144-
}
100+
fun updateSpotReportStatus(updateReportCommand: UpdateReportCommand): SpotReport.Info =
101+
reportService.updateSpotReport(updateReportCommand)
145102

146103
fun pushToAllUsers(
147104
topic: String,
@@ -155,7 +112,7 @@ class AdminFacade(
155112
userDevices
156113
.filter { it.fcmToken.isNotBlank() }
157114
.map { device ->
158-
NewFirebaseCloudMessage(
115+
FirebaseCloudMessageCommand(
159116
fcmToken = device.fcmToken,
160117
title = topic,
161118
body = contents,
@@ -165,14 +122,13 @@ class AdminFacade(
165122
notificationService.appendAll(
166123
messages
167124
.mapNotNull { message ->
168-
NotificationStored.Create(
125+
CreateNotificationStoredCommand(
169126
userId = deviceTokenMap[message.fcmToken]?.userId ?: return@mapNotNull null,
170127
notificationStoredKey = "",
171128
type = "ADMIN_PUSH",
172129
parameterValue = "/",
173130
topic = message.title,
174131
contents = message.body,
175-
readStatus = ReadStatus.UNREAD,
176132
)
177133
},
178134
)

sseudam-admin/src/main/kotlin/com/sseudam/admin/infrastructure/AdminCoreRepository.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@ import com.sseudam.admin.application.AdminRepository
44
import com.sseudam.admin.domain.Admin
55
import com.sseudam.support.error.ErrorException
66
import com.sseudam.support.error.ErrorType
7-
import com.sseudam.support.tx.TxAdvice
7+
import com.sseudam.support.tx.Tx
88
import org.springframework.stereotype.Repository
99

1010
@Repository
1111
class AdminCoreRepository(
1212
private val adminJpaRepository: AdminJpaRepository,
13-
private val txAdvice: TxAdvice,
1413
) : AdminRepository {
1514
override fun findByLogin(loginId: String): Admin.Info =
16-
txAdvice.readOnly {
15+
Tx.readable {
1716
val adminAuthentication =
1817
adminJpaRepository.findByLoginId(loginId)
1918
?: throw ErrorException(ErrorType.NOT_FOUND_DATA)

sseudam-admin/src/main/kotlin/com/sseudam/admin/presentation/request/report/AdminUpdateReportRequest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.sseudam.admin.presentation.request.report
22

33
import com.sseudam.report.ReportStatus
4-
import com.sseudam.report.UpdateReport
4+
import com.sseudam.report.command.UpdateReportCommand
55
import io.swagger.v3.oas.annotations.media.Schema
66

77
@Schema(description = "신고 반영 요청 Json")
@@ -14,7 +14,7 @@ data class AdminUpdateReportRequest(
1414
val reason: String? = null,
1515
) {
1616
fun toCommand(reportId: Long) =
17-
UpdateReport(
17+
UpdateReportCommand(
1818
reportId = reportId,
1919
spotId = spotId,
2020
status = status,

sseudam-admin/src/main/kotlin/com/sseudam/admin/presentation/request/suggestion/AdminUpdateSuggestionRequest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.sseudam.admin.presentation.request.suggestion
22

33
import com.sseudam.suggestion.SuggestionStatus
4-
import com.sseudam.suggestion.UpdateSuggestionCommand
4+
import com.sseudam.suggestion.command.UpdateSuggestionCommand
55
import io.swagger.v3.oas.annotations.media.Schema
66

77
data class AdminUpdateSuggestionRequest(

sseudam-batch/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
dependencies {
22
implementation(libs.spring.boot.starter.aop)
3-
implementation(project(":sseudam-core:core-domain"))
3+
implementation(project(":sseudam-core:core-application"))
44
}
Lines changed: 5 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,22 @@
11
package com.sseudam.pet
22

3-
import com.sseudam.notification.NotificationMessages
4-
import com.sseudam.notification.NotificationService
5-
import com.sseudam.notification.NotificationStored
6-
import com.sseudam.notification.NotificationStoredKeyGenerator
7-
import com.sseudam.notification.ReadStatus
8-
import com.sseudam.notification.fcm.FcmSender
9-
import com.sseudam.notification.fcm.NewFirebaseCloudMessage
10-
import com.sseudam.user.UserService
11-
import com.sseudam.user.device.UserDeviceService
3+
import com.sseudam.notification.NotificationFacade
124
import org.springframework.scheduling.annotation.Scheduled
135
import org.springframework.stereotype.Component
146
import java.time.LocalDate
157
import java.time.Month
168

179
@Component
1810
class PetScheduler(
19-
private val petService: PetService,
20-
private val userDeviceService: UserDeviceService,
21-
private val fcmSender: FcmSender,
22-
private val userService: UserService,
23-
private val userPetService: UserPetService,
24-
private val notificationService: NotificationService,
25-
private val notificationStoredKeyGenerator: NotificationStoredKeyGenerator,
11+
private val userPetFacade: UserPetFacade,
12+
private val notificationFacade: NotificationFacade,
2613
) {
2714
@Scheduled(cron = "0 0 0 1 * *")
2815
fun createPetSeason() {
2916
val nextDay = LocalDate.now().plusDays(1)
3017
val currentYear = nextDay.year
3118
val currentMonth = Month.from(nextDay)
32-
val createLevelOnePet = petService.createPetSeason(currentYear, currentMonth)
33-
val allUserPet = userPetService.findAll()
34-
userPetService.initPointForAllUsers(allUserPet, createLevelOnePet.id)
35-
sendNewPetNotifications()
36-
}
37-
38-
private fun sendNewPetNotifications() {
39-
val userDevices =
40-
userDeviceService
41-
.findAll()
42-
.filter { it.fcmToken.isNotBlank() }
43-
if (userDevices.isEmpty()) return
44-
val userProfiles =
45-
userService
46-
.findAllBy(userDevices.map { it.userId }.distinct())
47-
.associateBy { it.id }
48-
val messages =
49-
userDevices.map { device ->
50-
NewFirebaseCloudMessage(
51-
fcmToken = device.fcmToken,
52-
title = NotificationMessages.DEFAULT_TITLE,
53-
body =
54-
NotificationMessages.newPetContents(
55-
userProfiles[device.userId]?.nickname
56-
?: DEFAULT_USER_NICKNAME,
57-
),
58-
)
59-
}
60-
fcmSender.sendAll(messages.toSet()).apply {
61-
notificationService.appendAll(
62-
messages
63-
.map { message ->
64-
NotificationStored.Create(
65-
userId =
66-
userDevices
67-
.find { it.fcmToken == message.fcmToken }
68-
?.userId
69-
?: return@map null,
70-
notificationStoredKey = notificationStoredKeyGenerator.generate(),
71-
type = "PET_SEASON",
72-
parameterValue = "",
73-
topic = message.title,
74-
contents = message.body,
75-
readStatus = ReadStatus.UNREAD,
76-
)
77-
}.filterNotNull(),
78-
)
79-
}
80-
}
81-
82-
companion object {
83-
private const val DEFAULT_USER_NICKNAME = "사용자"
19+
userPetFacade.createBatchUserPet(currentYear, currentMonth)
20+
notificationFacade.sendNewPetNotifications()
8421
}
8522
}

sseudam-clients/aws/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ dependencies {
22
compileOnly(libs.spring.boot.starter.web)
33

44
implementation(libs.bundles.aws.client)
5-
implementation(project(":sseudam-core:core-domain"))
5+
implementation(project(":sseudam-core:core-application"))
66

77
testImplementation(libs.spring.boot.starter.web)
88
testImplementation(testFixtures(project(":sseudam-tests:test-container")))

sseudam-clients/notification/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ dependencies {
55
implementation(libs.spring.retry)
66
implementation(libs.spring.boot.starter.aop)
77

8-
implementation(project(":sseudam-core:core-domain"))
8+
implementation(project(":sseudam-core:core-application"))
99
implementation(project(":sseudam-core:core-contract"))
1010

1111
testImplementation(project(":sseudam-tests:test-helper"))

0 commit comments

Comments
 (0)