From 3f9ea7ddb720b46dc053d8659baaf108bb6ae8e3 Mon Sep 17 00:00:00 2001 From: Jisu Hong Date: Sun, 7 Jun 2026 03:05:04 +0900 Subject: [PATCH 1/2] =?UTF-8?q?:lipstick:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=A0=95=EC=9B=90=20=ED=91=9C?= =?UTF-8?q?=EA=B8=B0=20=ED=98=95=EC=8B=9D=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/email/service/EmailService.kt | 32 ++++++++++++------- .../service/RegistrationService.kt | 4 +++ .../email/template/registration-banned.html | 2 +- .../template/registration-confirmed.html | 2 +- .../email/template/registration-delete.html | 2 +- .../email/template/registration-demoted.html | 2 +- .../registration-waitlist-promoted.html | 2 +- .../template/registration-waitlisted.html | 2 +- 8 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/com/wafflestudio/spring2025/common/email/service/EmailService.kt b/src/main/kotlin/com/wafflestudio/spring2025/common/email/service/EmailService.kt index e6ce6809..dd663a46 100644 --- a/src/main/kotlin/com/wafflestudio/spring2025/common/email/service/EmailService.kt +++ b/src/main/kotlin/com/wafflestudio/spring2025/common/email/service/EmailService.kt @@ -120,6 +120,7 @@ class EmailService( val endsAt: Instant?, val location: String?, val newCapacity: Int, + val totalCount: Int, val registrationStartsAt: Instant?, val registrationEndsAt: Instant, val description: String?, @@ -138,8 +139,7 @@ class EmailService( .replace("{eventTitle}", formatEventTitle(data.eventTitle)) .replace("{eventDateRange}", formatEventDateRange(data.startsAt, data.endsAt, "-")) .replace("{location}", formatLocation(data.location)) - .replace("{totalCount}", data.totalCount?.toString() ?: "null") - .replace("{capacity}", data.capacity?.toString() ?: "null") + .replace("{capacityDisplay}", formatCapacity(data.totalCount, data.capacity)) .replace( "{registrationDateRange}", formatRegistrationDateRange(data.registrationStartsAt, data.registrationEndsAt), @@ -165,8 +165,7 @@ class EmailService( .replace("{eventTitle}", formatEventTitle(data.eventTitle)) .replace("{eventDateRange}", formatEventDateRange(data.startsAt, data.endsAt, "-")) .replace("{location}", formatLocation(data.location)) - .replace("{totalCount}", data.totalCount?.toString() ?: "null") - .replace("{capacity}", data.capacity?.toString() ?: "null") + .replace("{capacityDisplay}", formatCapacity(data.totalCount, data.capacity)) .replace( "{registrationDateRange}", formatRegistrationDateRange(data.registrationStartsAt, data.registrationEndsAt), @@ -189,8 +188,7 @@ class EmailService( .replace("{eventTitle}", formatEventTitle(data.eventTitle)) .replace("{eventDateRange}", formatEventDateRange(data.startsAt, data.endsAt, "-")) .replace("{location}", formatLocation(data.location)) - .replace("{totalCount}", data.totalCount?.toString() ?: "null") - .replace("{capacity}", data.capacity?.toString() ?: "null") + .replace("{capacityDisplay}", formatCapacity(data.totalCount, data.capacity)) .replace( "{registrationDateRange}", formatRegistrationDateRange(data.registrationStartsAt, data.registrationEndsAt), @@ -217,8 +215,7 @@ class EmailService( .replace("{eventTitle}", formatEventTitle(data.eventTitle)) .replace("{eventDateRange}", formatEventDateRange(data.startsAt, data.endsAt, "-")) .replace("{location}", formatLocation(data.location)) - .replace("{totalCount}", data.totalCount?.toString() ?: "null") - .replace("{capacity}", data.capacity?.toString() ?: "null") + .replace("{capacityDisplay}", formatCapacity(data.totalCount, data.capacity)) .replace( "{registrationDateRange}", formatRegistrationDateRange(data.registrationStartsAt, data.registrationEndsAt), @@ -258,7 +255,7 @@ class EmailService( .replace("{serviceDomain}", emailConfig.serviceDomain) .replace("{name}", data.name) .replace("{waitingNum}", data.waitingNum?.toString() ?: "-") - .replace("{newCapacity}", data.newCapacity.toString()) + .replace("{capacityDisplay}", formatCapacity(data.totalCount, data.newCapacity)) .replace("{eventTitle}", formatEventTitle(data.eventTitle)) .replace("{eventDateRange}", formatEventDateRange(data.startsAt, data.endsAt, "-")) .replace("{location}", formatLocation(data.location)) @@ -302,8 +299,7 @@ class EmailService( .replace("{eventTitle}", formatEventTitle(eventTitle)) .replace("{eventDateRange}", formatEventDateRange(startsAt, endsAt, "~")) .replace("{location}", formatLocation(location)) - .replace("{totalCount}", totalCount?.toString() ?: "null") - .replace("{capacity}", capacity?.toString() ?: "null") + .replace("{capacityDisplay}", formatCapacity(totalCount, capacity)) .replace( "{registrationDateRange}", formatRegistrationDateRange(registrationStartsAt, registrationEndsAt), @@ -368,6 +364,20 @@ class EmailService( } } + private fun formatCapacity( + totalCount: Int?, + capacity: Int?, + ): String { + if (capacity == null) return "${totalCount ?: "-"}명" + val confirmed = if (totalCount != null) minOf(totalCount, capacity) else capacity + val waitlisted = if (totalCount != null) maxOf(0, totalCount - capacity) else 0 + return if (waitlisted > 0) { + "$confirmed/${capacity}명 (대기자 ${waitlisted}명)" + } else { + "$confirmed/${capacity}명" + } + } + private fun formatDescription(description: String?): String { if (description == null) return "-" return description.replace("\r\n", "\n").replace("\n", "
") diff --git a/src/main/kotlin/com/wafflestudio/spring2025/domain/registration/service/RegistrationService.kt b/src/main/kotlin/com/wafflestudio/spring2025/domain/registration/service/RegistrationService.kt index 46ea8c70..286a85a9 100644 --- a/src/main/kotlin/com/wafflestudio/spring2025/domain/registration/service/RegistrationService.kt +++ b/src/main/kotlin/com/wafflestudio/spring2025/domain/registration/service/RegistrationService.kt @@ -673,6 +673,9 @@ RegistrationService( toDemote.forEach { it.status = RegistrationStatus.WAITLISTED } registrationRepository.saveAll(toDemote) + val waitlistedCount = registrationRepository.countByEventIdAndStatus(eventId, RegistrationStatus.WAITLISTED).toInt() + val totalCount = newCapacity + waitlistedCount + val demotedPublicIds = toDemote.map { it.registrationPublicId } val waitlistPositions = registrationRepository @@ -698,6 +701,7 @@ RegistrationService( endsAt = event.endsAt, location = event.location, newCapacity = newCapacity, + totalCount = totalCount, registrationStartsAt = event.registrationStartsAt, registrationEndsAt = event.registrationEndsAt, description = event.description, diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-banned.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-banned.html index 7bd8a682..573ae045 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-banned.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-banned.html @@ -73,7 +73,7 @@ alt="user" width="20" style="display: block; border: 0;"> - 정원 {totalCount}/{capacity}명 + 정원 {capacityDisplay} diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-confirmed.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-confirmed.html index df7afd8c..2e5e62d9 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-confirmed.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-confirmed.html @@ -66,7 +66,7 @@ alt="user" width="18" style="display: block; border: 0;"> - 정원 {totalCount}/{capacity}명 + 정원 {capacityDisplay} diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-delete.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-delete.html index 6c216b92..af2ac0b0 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-delete.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-delete.html @@ -74,7 +74,7 @@ alt="user" width="20" style="display: block; border: 0;"> - 정원 {totalCount}/{capacity}명 + 정원 {capacityDisplay} diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-demoted.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-demoted.html index 0b40c68c..4f790f11 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-demoted.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-demoted.html @@ -74,7 +74,7 @@ alt="user" width="18" style="display: block; border: 0;"> - 정원 {newCapacity}명 + 정원 {capacityDisplay} diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlist-promoted.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlist-promoted.html index 3b181918..08524c5b 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlist-promoted.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlist-promoted.html @@ -66,7 +66,7 @@ alt="user" width="18" style="display: block; border: 0;"> - 정원 {totalCount}/{capacity}명 + 정원 {capacityDisplay} diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlisted.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlisted.html index 6ba1ae53..ebdfbdd2 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlisted.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlisted.html @@ -74,7 +74,7 @@ alt="user" width="18" style="display: block; border: 0;"> - 정원 {totalCount}/{capacity}명 + 정원 {capacityDisplay} From 322d5a3786ab8bdc655edac8561c69b481450d42 Mon Sep 17 00:00:00 2001 From: Jisu Hong Date: Sun, 7 Jun 2026 03:31:47 +0900 Subject: [PATCH 2/2] =?UTF-8?q?:children=5Fcrossing:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=83=81=EC=84=B8=EC=A0=95=EB=B3=B4=20div=EC=97=90?= =?UTF-8?q?=20=EB=A7=81=ED=81=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring2025/common/email/service/EmailService.kt | 3 +++ .../domain/registration/service/RegistrationService.kt | 1 + .../common/email/template/registration-confirmed.html | 2 ++ .../spring2025/common/email/template/registration-delete.html | 2 ++ .../spring2025/common/email/template/registration-demoted.html | 2 ++ .../common/email/template/registration-waitlist-promoted.html | 2 ++ .../common/email/template/registration-waitlisted.html | 2 ++ 7 files changed, 14 insertions(+) diff --git a/src/main/kotlin/com/wafflestudio/spring2025/common/email/service/EmailService.kt b/src/main/kotlin/com/wafflestudio/spring2025/common/email/service/EmailService.kt index dd663a46..f05cf475 100644 --- a/src/main/kotlin/com/wafflestudio/spring2025/common/email/service/EmailService.kt +++ b/src/main/kotlin/com/wafflestudio/spring2025/common/email/service/EmailService.kt @@ -99,6 +99,7 @@ class EmailService( val registrationStartsAt: Instant?, val registrationEndsAt: Instant?, val description: String?, + val publicId: String?, ) data class EventCancellationEmailData( @@ -211,6 +212,7 @@ class EmailService( fun sendRegistrationDeleteEmail(data: RegistrationDeleteEmailData) { val htmlContent = loadTemplate("registration-delete.html") + .replace("{serviceDomain}", emailConfig.serviceDomain) .replace("{name}", data.name) .replace("{eventTitle}", formatEventTitle(data.eventTitle)) .replace("{eventDateRange}", formatEventDateRange(data.startsAt, data.endsAt, "-")) @@ -220,6 +222,7 @@ class EmailService( "{registrationDateRange}", formatRegistrationDateRange(data.registrationStartsAt, data.registrationEndsAt), ).replace("{description}", formatDescription(data.description)) + .replace("{publicId}", data.publicId ?: "-") sendHtmlEmail( to = data.toEmail, diff --git a/src/main/kotlin/com/wafflestudio/spring2025/domain/registration/service/RegistrationService.kt b/src/main/kotlin/com/wafflestudio/spring2025/domain/registration/service/RegistrationService.kt index 286a85a9..6aff4dd7 100644 --- a/src/main/kotlin/com/wafflestudio/spring2025/domain/registration/service/RegistrationService.kt +++ b/src/main/kotlin/com/wafflestudio/spring2025/domain/registration/service/RegistrationService.kt @@ -273,6 +273,7 @@ RegistrationService( registrationStartsAt = event.registrationStartsAt, registrationEndsAt = event.registrationEndsAt, description = event.description, + publicId = event.publicId, ) afterCommit { diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-confirmed.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-confirmed.html index 2e5e62d9..4da10477 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-confirmed.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-confirmed.html @@ -37,6 +37,7 @@ +
{eventTitle}
@@ -74,6 +75,7 @@ style="text-align: right; color: #CCCCCC; font-size: 24px; line-height: 1; font-family: sans-serif; font-weight: 300; margin-top: -10px;"> ›
+
diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-delete.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-delete.html index af2ac0b0..0b02d08f 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-delete.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-delete.html @@ -44,6 +44,7 @@
+
{eventTitle}
@@ -82,6 +83,7 @@ style="text-align: right; color: #CCCCCC; font-size: 24px; line-height: 1; font-family: sans-serif; font-weight: 300; margin-top: -10px;"> ›
+
diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-demoted.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-demoted.html index 4f790f11..541ef4cd 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-demoted.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-demoted.html @@ -44,6 +44,7 @@
+
{eventTitle}
@@ -82,6 +83,7 @@ style="text-align: right; color: #CCCCCC; font-size: 24px; line-height: 1; font-family: sans-serif; font-weight: 300; margin-top: -10px;"> ›
+
diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlist-promoted.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlist-promoted.html index 08524c5b..8cdc2f3f 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlist-promoted.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlist-promoted.html @@ -37,6 +37,7 @@
+
{eventTitle}
@@ -74,6 +75,7 @@ style="text-align: right; color: #CCCCCC; font-size: 24px; line-height: 1; font-family: sans-serif; font-weight: 300; margin-top: -10px;"> ›
+
diff --git a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlisted.html b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlisted.html index ebdfbdd2..491e2959 100644 --- a/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlisted.html +++ b/src/main/resources/com/wafflestudio/spring2025/common/email/template/registration-waitlisted.html @@ -44,6 +44,7 @@
+
{eventTitle}
@@ -82,6 +83,7 @@ style="text-align: right; color: #CCCCCC; font-size: 24px; line-height: 1; font-family: sans-serif; font-weight: 300; margin-top: -10px;"> ›
+