Skip to content

Commit

Permalink
User bounded context에서 JPA 사용하도록 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
Zeniuus committed Jul 14, 2024
1 parent e460cfd commit 8c1b119
Show file tree
Hide file tree
Showing 34 changed files with 363 additions and 392 deletions.
4 changes: 4 additions & 0 deletions app-server/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import org.springframework.boot.gradle.tasks.bundling.BootJar

plugins {
kotlin("jvm")
kotlin("plugin.spring")
kotlin("plugin.jpa")
id("org.springframework.boot")
id("io.gitlab.arturbosch.detekt")
id("io.spring.dependency-management")
Expand All @@ -27,6 +29,8 @@ val detektExcludedProjects = listOf(
)
subprojects {
apply(plugin = "kotlin")
apply(plugin = "kotlin-spring")
apply(plugin = "kotlin-jpa")

java {
sourceCompatibility = JavaVersion.VERSION_17
Expand Down
2 changes: 2 additions & 0 deletions app-server/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ pluginManagement {
plugins {
kotlin("jvm") version kotlinVersion
kotlin("plugin.serialization") version kotlinVersion
kotlin("plugin.spring") version kotlinVersion apply false
kotlin("plugin.jpa") version kotlinVersion apply false

id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion
id("org.springframework.boot") version springBootVersion
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
dependencies {
implementation("jakarta.persistence:jakarta.persistence-api")
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,51 @@
package club.staircrusher.user.domain.model

import jakarta.persistence.Column
import jakarta.persistence.Convert
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import jakarta.persistence.Transient
import java.time.Instant

data class User(
@Entity
@Table(name = "scc_user")
class User(
@Id
val id: String,
var nickname: String,
@Deprecated("닉네임 로그인은 사라질 예정") var encryptedPassword: String?,
var instagramId: String?,
var email: String?, // FIXME: 레거시 계정이 모두 사라지면 non-nullable로 변경
@Column(columnDefinition = "TEXT")
@Convert(converter = UserMobilityToolListToTextAttributeConverter::class)
val mobilityTools: MutableList<UserMobilityTool>,
val createdAt: Instant,
) {
var deletedAt: Instant? = null // private으로 둘 방법이 없을까? 지금은 persistence_model 모듈에서 써야 해서 안 된다.

@get:Transient
val isDeleted: Boolean
get() = deletedAt != null

fun delete(deletedAt: Instant) {
this.deletedAt = deletedAt
}

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false

other as User

return id == other.id
}

override fun hashCode(): Int {
return id.hashCode()
}

override fun toString(): String {
return "User(nickname='$nickname', id='$id', encryptedPassword=$encryptedPassword, instagramId=$instagramId, email=$email, mobilityTools=$mobilityTools, createdAt=$createdAt, deletedAt=$deletedAt, isDeleted=$isDeleted)"
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
package club.staircrusher.user.domain.model

import club.staircrusher.stdlib.clock.SccClock
import jakarta.persistence.Entity
import jakarta.persistence.EnumType
import jakarta.persistence.Enumerated
import jakarta.persistence.Id
import java.time.Instant

@Entity
class UserAuthInfo(
@Id
val id: String,
val userId: String,
@Enumerated(EnumType.STRING)
val authProviderType: UserAuthProviderType,
val externalId: String,
var externalRefreshToken: String,
var externalRefreshTokenExpiresAt: Instant,
val createdAt: Instant = SccClock.instant()
) {

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package club.staircrusher.user.domain.model

import club.staircrusher.stdlib.jpa.ListToTextAttributeConverter
import jakarta.persistence.Converter

@Converter
object UserMobilityToolListToTextAttributeConverter : ListToTextAttributeConverter<UserMobilityTool>() {
override fun convertElementFromTextColumn(text: String): UserMobilityTool {
return UserMobilityTool.valueOf(text)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id("org.springframework.boot")
id("io.spring.dependency-management")
kotlin("plugin.serialization")
kotlin("plugin.spring")
}

dependencies {
Expand All @@ -10,6 +11,8 @@ dependencies {
api(projects.apiSpecification.api)
implementation(projects.crossCuttingConcern.infra.persistenceModel)
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-jdbc")
implementation("org.springframework:spring-webflux")
implementation("io.projectreactor.netty:reactor-netty")

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package club.staircrusher.user.infra.adapter.out.persistence

import club.staircrusher.user.domain.model.UserAuthInfo
import club.staircrusher.user.domain.model.UserAuthProviderType
import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository

@Repository
interface JpaUserAuthInfoRepository : CrudRepository<UserAuthInfo, String> {
fun findFirstByAuthProviderTypeAndExternalId(authProviderType: UserAuthProviderType, externalId: String): UserAuthInfo?
fun findByUserId(userId: String): List<UserAuthInfo>
fun removeByUserId(userId: String)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package club.staircrusher.user.infra.adapter.out.persistence

import club.staircrusher.user.domain.model.User
import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository

@Repository
interface JpaUserRepository : CrudRepository<User, String> {
fun findFirstByNickname(nickname: String): User?
fun findFirstByEmail(email: String): User?
}
Original file line number Diff line number Diff line change
@@ -1,51 +1,43 @@
package club.staircrusher.user.infra.adapter.out.persistence

import club.staircrusher.infra.persistence.sqldelight.DB
import club.staircrusher.user.domain.model.UserAuthInfo
import club.staircrusher.stdlib.di.annotation.Component
import club.staircrusher.user.domain.model.UserAuthInfo
import club.staircrusher.user.domain.model.UserAuthProviderType
import org.springframework.data.repository.findByIdOrNull

@Component
class UserAuthInfoRepository(
db: DB,
class UserAuthInfoRepositoryImplWithJpa(
private val delegatee: JpaUserAuthInfoRepository,
) : club.staircrusher.user.application.port.out.persistence.UserAuthInfoRepository {
private val queries = db.userAuthInfoQueries
override fun save(entity: UserAuthInfo): UserAuthInfo {
queries.save(entity.toPersistenceModel())
return entity
return delegatee.save(entity)
}

override fun saveAll(entities: Collection<UserAuthInfo>) {
entities.forEach(::save)
delegatee.saveAll(entities)
}

override fun removeAll() {
queries.removeAll()
delegatee.deleteAll()
}

override fun findById(id: String): UserAuthInfo {
return findByIdOrNull(id) ?: throw IllegalArgumentException("UserAuthInfo of id $id does not exist.")
return delegatee.findByIdOrNull(id) ?: throw IllegalArgumentException("UserAuthInfo of id $id does not exist.")
}

override fun findByIdOrNull(id: String): UserAuthInfo? {
return queries.findById(id = id)
.executeAsOneOrNull()
?.toDomainModel()
return delegatee.findByIdOrNull(id)
}

override fun findByExternalId(authProviderType: UserAuthProviderType, externalId: String): UserAuthInfo? {
return queries.findByExternalId(authProviderType, externalId)
.executeAsOneOrNull()
?.toDomainModel()
return delegatee.findFirstByAuthProviderTypeAndExternalId(authProviderType, externalId)
}

override fun findByUserId(userId: String): List<UserAuthInfo> {
return queries.findByUserId(userId)
.executeAsList()
.map { it.toDomainModel() }
return delegatee.findByUserId(userId)
}

override fun removeByUserId(userId: String) {
queries.removeByUserId(userId)
delegatee.removeByUserId(userId)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package club.staircrusher.user.infra.adapter.out.persistence

import club.staircrusher.stdlib.di.annotation.Component
import club.staircrusher.user.application.port.out.persistence.UserRepository
import club.staircrusher.user.domain.model.User
import org.springframework.data.repository.findByIdOrNull

@Component
class UserRepositoryImplWithJpa(
private val delegatee: JpaUserRepository
) : UserRepository {
override fun save(entity: User): User {
return delegatee.save(entity)
}

override fun saveAll(entities: Collection<User>) {
delegatee.saveAll(entities)
}

override fun removeAll() {
delegatee.deleteAll()
}

override fun findById(id: String): User {
return delegatee.findByIdOrNull(id) ?: throw IllegalArgumentException("User of id $id does not exist.")
}

override fun findByIdOrNull(id: String): User? {
return delegatee.findByIdOrNull(id)
}

override fun findByNickname(nickname: String): User? {
return delegatee.findFirstByNickname(nickname = nickname)
}

override fun findByEmail(email: String): User? {
return delegatee.findFirstByEmail(email = email)
}

override fun findByIdIn(ids: Collection<String>): List<User> {
return delegatee.findAllById(ids).toList()
}

override fun findAll(): List<User> {
return delegatee.findAll().toList()
}
}
Loading

0 comments on commit 8c1b119

Please sign in to comment.