-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: impl server log * refactor: add newline * fix: dependency graph * test: add mocking * refactor: log -> event * feat: check payload type and event type * refactor: function -> val * fix: build * chore: try and catch
- Loading branch information
Showing
23 changed files
with
255 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
dependencies { | ||
implementation(projects.crossCuttingConcern.application.serverEvent) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 4 additions & 0 deletions
4
app-server/subprojects/cross_cutting_concern/application/server_event/build.gradle.kts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
dependencies { | ||
implementation(rootProject.projects.crossCuttingConcern.stdlib) | ||
api(rootProject.projects.crossCuttingConcern.domain.serverEvent) | ||
} |
7 changes: 7 additions & 0 deletions
7
.../main/kotlin/club/staircrusher/application/server_event/port/in/SccServerEventRecorder.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package club.staircrusher.application.server_event.port.`in` | ||
|
||
import club.staircrusher.domain.server_event.ServerEventPayload | ||
|
||
interface SccServerEventRecorder { | ||
fun record(payload: ServerEventPayload) | ||
} |
35 changes: 35 additions & 0 deletions
35
...in/club/staircrusher/application/server_event/port/in/SccServerPersistentEventRecorder.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package club.staircrusher.application.server_event.port.`in` | ||
|
||
import club.staircrusher.application.server_event.port.out.persistence.ServerEventRepository | ||
import club.staircrusher.domain.server_event.ServerEvent | ||
import club.staircrusher.domain.server_event.ServerEventPayload | ||
import club.staircrusher.stdlib.clock.SccClock | ||
import club.staircrusher.stdlib.di.annotation.Component | ||
import club.staircrusher.stdlib.domain.entity.EntityIdGenerator | ||
import club.staircrusher.stdlib.persistence.TransactionManager | ||
import mu.KotlinLogging | ||
|
||
@Component | ||
class SccServerPersistentEventRecorder( | ||
private val transactionManager: TransactionManager, | ||
private val serverEventRepository: ServerEventRepository, | ||
) : SccServerEventRecorder { | ||
private val logger = KotlinLogging.logger { } | ||
|
||
override fun record(payload: ServerEventPayload) = transactionManager.doInTransaction { | ||
val serverEvent = try { | ||
ServerEvent( | ||
id = EntityIdGenerator.generateRandom(), | ||
type = payload.type, | ||
payload = payload, | ||
createdAt = SccClock.instant(), | ||
) | ||
} catch (e: Exception){ | ||
logger.error(e) { "Failed to create server event of payload: $payload" } | ||
null | ||
} | ||
|
||
serverEvent?.let { serverEventRepository.save(it) } | ||
Unit | ||
} | ||
} |
7 changes: 7 additions & 0 deletions
7
.../club/staircrusher/application/server_event/port/out/persistence/ServerEventRepository.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package club.staircrusher.application.server_event.port.out.persistence | ||
|
||
import club.staircrusher.domain.server_event.ServerEvent | ||
|
||
interface ServerEventRepository { | ||
fun save(entity: ServerEvent): ServerEvent | ||
} |
8 changes: 8 additions & 0 deletions
8
app-server/subprojects/cross_cutting_concern/domain/server_event/build.gradle.kts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
dependencies { | ||
val kotlinxSerializationVersion: String by project | ||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinxSerializationVersion") | ||
|
||
val jUnitJupiterVersion: String by project | ||
testImplementation("org.junit.jupiter:junit-jupiter-api:$jUnitJupiterVersion") | ||
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$jUnitJupiterVersion") | ||
} |
7 changes: 7 additions & 0 deletions
7
.../main/kotlin/club/staircrusher/domain/server_event/NewsletterSubscribedOnSignupPayload.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package club.staircrusher.domain.server_event | ||
|
||
data class NewsletterSubscribedOnSignupPayload( | ||
val userId: String, | ||
) : ServerEventPayload { | ||
override val type = ServerEventType.NEWSLETTER_SUBSCRIBED_ON_SIGN_UP | ||
} |
14 changes: 14 additions & 0 deletions
14
.../domain/server_event/src/main/kotlin/club/staircrusher/domain/server_event/ServerEvent.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package club.staircrusher.domain.server_event | ||
|
||
import java.time.Instant | ||
|
||
data class ServerEvent( | ||
val id: String, | ||
val type: ServerEventType, | ||
val payload: ServerEventPayload, | ||
val createdAt: Instant, | ||
) { | ||
init { | ||
check(type == payload.type) | ||
} | ||
} |
5 changes: 5 additions & 0 deletions
5
.../server_event/src/main/kotlin/club/staircrusher/domain/server_event/ServerEventPayload.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package club.staircrusher.domain.server_event | ||
|
||
interface ServerEventPayload { | ||
val type: ServerEventType | ||
} |
8 changes: 8 additions & 0 deletions
8
...ain/server_event/src/main/kotlin/club/staircrusher/domain/server_event/ServerEventType.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package club.staircrusher.domain.server_event | ||
|
||
enum class ServerEventType { | ||
NEWSLETTER_SUBSCRIBED_ON_SIGN_UP, | ||
// For test | ||
// TODO: event type 이 더 생기면 테스트 코드 변경하고 삭제하기 | ||
UNKNOWN, | ||
} |
32 changes: 32 additions & 0 deletions
32
...server_event/src/unitTest/kotlin/club/staircrusher/domain/server_event/ServerEventTest.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package club.staircrusher.domain.server_event | ||
|
||
import org.junit.jupiter.api.Test | ||
import org.junit.jupiter.api.assertDoesNotThrow | ||
import org.junit.jupiter.api.assertThrows | ||
import java.time.Instant | ||
|
||
class ServerEventTest { | ||
|
||
@Test | ||
fun `ServerEvent 의 type 과 주어진 payload 의 type 이 일치해야 한다`() { | ||
val serverEventPayload = NewsletterSubscribedOnSignupPayload("example") | ||
|
||
assertDoesNotThrow { | ||
ServerEvent( | ||
id = "example", | ||
type = ServerEventType.NEWSLETTER_SUBSCRIBED_ON_SIGN_UP, | ||
payload = serverEventPayload, | ||
createdAt = Instant.now(), | ||
) | ||
} | ||
|
||
assertThrows<IllegalStateException> { | ||
ServerEvent( | ||
id = "example", | ||
type = ServerEventType.UNKNOWN, | ||
payload = serverEventPayload, | ||
createdAt = Instant.now(), | ||
) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
13 changes: 13 additions & 0 deletions
13
...elight/club/staircrusher/infra/persistence/sqldelight/migration/V26__add_server_event.sqm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
import club.staircrusher.domain.server_event.ServerEventPayload; | ||
import club.staircrusher.domain.server_event.ServerEventType; | ||
|
||
|
||
CREATE TABLE IF NOT EXISTS server_event ( | ||
id VARCHAR(36) NOT NULL, | ||
type VARCHAR(64) AS ServerEventType NOT NULL, | ||
payload TEXT AS ServerEventPayload NOT NULL DEFAULT '', | ||
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
PRIMARY KEY (id) | ||
); | ||
|
||
CREATE INDEX idx_server_event_1 ON server_event(type, created_at); |
8 changes: 8 additions & 0 deletions
8
...ldelight/club/staircrusher/infra/persistence/sqldelight/query/server_event/ServerEvent.sq
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
save: | ||
INSERT INTO server_event | ||
VALUES :server_event | ||
ON CONFLICT(id) DO UPDATE SET | ||
id = EXCLUDED.id, | ||
type = EXCLUDED.type, | ||
payload = EXCLUDED.payload, | ||
created_at = EXCLUDED.created_at; |
6 changes: 6 additions & 0 deletions
6
app-server/subprojects/cross_cutting_concern/infra/server_event/build.gradle.kts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
dependencies { | ||
implementation(projects.crossCuttingConcern.stdlib) | ||
implementation(projects.crossCuttingConcern.infra.persistenceModel) | ||
api(rootProject.projects.crossCuttingConcern.domain.serverEvent) | ||
api(rootProject.projects.crossCuttingConcern.application.serverEvent) | ||
} |
19 changes: 19 additions & 0 deletions
19
...main/kotlin/club/staircrusher/infra/server_event/out/persistence/ServerEventRepository.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package club.staircrusher.infra.server_event.out.persistence | ||
|
||
import club.staircrusher.application.server_event.port.out.persistence.ServerEventRepository | ||
import club.staircrusher.domain.server_event.ServerEvent | ||
import club.staircrusher.infra.persistence.sqldelight.DB | ||
import club.staircrusher.infra.server_event.out.persistence.sqldelight.toPersistenceModel | ||
import club.staircrusher.stdlib.di.annotation.Component | ||
|
||
@Component | ||
class ServerEventRepository( | ||
db: DB, | ||
) : ServerEventRepository { | ||
private val queries = db.serverEventQueries | ||
|
||
override fun save(entity: ServerEvent): ServerEvent { | ||
queries.save(entity.toPersistenceModel()) | ||
return entity | ||
} | ||
} |
19 changes: 19 additions & 0 deletions
19
...main/kotlin/club/staircrusher/infra/server_event/out/persistence/sqldelight/Converters.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package club.staircrusher.infra.server_event.out.persistence.sqldelight | ||
|
||
import club.staircrusher.domain.server_event.ServerEvent | ||
import club.staircrusher.infra.persistence.sqldelight.migration.Server_event | ||
import club.staircrusher.stdlib.time.toOffsetDateTime | ||
|
||
fun ServerEvent.toPersistenceModel() = Server_event( | ||
id = id, | ||
type = type, | ||
payload = payload, | ||
created_at = createdAt.toOffsetDateTime(), | ||
) | ||
|
||
fun Server_event.toDomainModel() = ServerEvent( | ||
id = id, | ||
type = type, | ||
payload = payload, | ||
createdAt = created_at.toInstant(), | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
...src/integrationTest/kotlin/club/staircrusher/spring_web/mock/MockServerEventRepository.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package club.staircrusher.spring_web.mock | ||
|
||
import club.staircrusher.application.server_event.port.out.persistence.ServerEventRepository | ||
import club.staircrusher.domain.server_event.ServerEvent | ||
import club.staircrusher.stdlib.di.annotation.Component | ||
|
||
@Component | ||
class MockServerEventRepository : ServerEventRepository { | ||
override fun save(entity: ServerEvent): ServerEvent { | ||
return ServerEvent( | ||
id = entity.id, | ||
type = entity.type, | ||
payload = entity.payload, | ||
createdAt = entity.createdAt | ||
) | ||
} | ||
} |