diff --git a/Application-Module/src/main/kotlin/com/asap/application/space/port/out/SpaceManagementPort.kt b/Application-Module/src/main/kotlin/com/asap/application/space/port/out/SpaceManagementPort.kt index 720f5c92..24705d2d 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/space/port/out/SpaceManagementPort.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/space/port/out/SpaceManagementPort.kt @@ -26,5 +26,7 @@ interface SpaceManagementPort { fun deleteBy(space: Space) + fun deleteAll() + fun countByUserId(userId: DomainId): Long } diff --git a/Application-Module/src/main/kotlin/com/asap/application/space/service/SpaceCommandService.kt b/Application-Module/src/main/kotlin/com/asap/application/space/service/SpaceCommandService.kt index 029673c1..e3046d8d 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/space/service/SpaceCommandService.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/space/service/SpaceCommandService.kt @@ -26,6 +26,7 @@ class SpaceCommandService( override fun create(command: CreateSpaceUsecase.Command) { val userId = DomainId(command.userId) Space.create( + id = DomainId.generate(), userId = userId, name = command.spaceName, templateType = command.templateType, diff --git a/Application-Module/src/main/kotlin/com/asap/application/user/port/out/UserManagementPort.kt b/Application-Module/src/main/kotlin/com/asap/application/user/port/out/UserManagementPort.kt index 7222f091..29508738 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/user/port/out/UserManagementPort.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/user/port/out/UserManagementPort.kt @@ -11,4 +11,6 @@ interface UserManagementPort { @Throws(UserException.UserNotFoundException::class) fun getUserNotNull(userId: DomainId): User + + fun findById(userId: DomainId): User? } diff --git a/Application-Module/src/main/kotlin/com/asap/application/user/service/SocialLoginService.kt b/Application-Module/src/main/kotlin/com/asap/application/user/service/SocialLoginService.kt index 9a7bf07b..75e14503 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/user/service/SocialLoginService.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/user/service/SocialLoginService.kt @@ -25,7 +25,7 @@ class SocialLoginService( userManagementPort.getUser(userAuth.userId)?.let { user -> val accessToken = userTokenConvertPort.generateAccessToken(user) val refreshToken = userTokenConvertPort.generateRefreshToken(user) - userTokenManagementPort.saveUserToken(UserToken(token = refreshToken, userId = user.id)) + userTokenManagementPort.saveUserToken(UserToken.create(token = refreshToken, userId = user.id)) SocialLoginUsecase.Success(accessToken, refreshToken, user.isProcessedOnboarding()) } ?: run { throw DefaultException.InvalidStateException("사용자 인증정보만 존재합니다. - ${userAuth.userId}") @@ -39,7 +39,7 @@ class SocialLoginService( profileImage = authInfo.profileImage, email = authInfo.email, ) - userTokenManagementPort.saveUserToken(UserToken(token = registerToken)) + userTokenManagementPort.saveUserToken(UserToken.create(token = registerToken)) SocialLoginUsecase.NonRegistered(registerToken) } } diff --git a/Application-Module/src/main/kotlin/com/asap/application/user/service/UserCommandService.kt b/Application-Module/src/main/kotlin/com/asap/application/user/service/UserCommandService.kt index bd5f500f..18add50d 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/user/service/UserCommandService.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/user/service/UserCommandService.kt @@ -48,7 +48,7 @@ class UserCommandService( email = userClaims.email, ) val userAuth = - UserAuth( + UserAuth.create( userId = registerUser.id, socialId = userClaims.socialId, socialLoginProvider = userClaims.socialLoginProvider, @@ -60,7 +60,7 @@ class UserCommandService( val accessToken = userTokenConvertPort.generateAccessToken(registerUser) val refreshToken = userTokenConvertPort.generateRefreshToken(registerUser) - userTokenManagementPort.saveUserToken(UserToken(token = refreshToken, userId = registerUser.id)) + userTokenManagementPort.saveUserToken(UserToken.create(token = refreshToken, userId = registerUser.id)) return RegisterUserUsecase.Response(accessToken, refreshToken) } diff --git a/Application-Module/src/main/kotlin/com/asap/application/user/service/UserTokenCommandService.kt b/Application-Module/src/main/kotlin/com/asap/application/user/service/UserTokenCommandService.kt index 4007cbd3..e756e8d1 100644 --- a/Application-Module/src/main/kotlin/com/asap/application/user/service/UserTokenCommandService.kt +++ b/Application-Module/src/main/kotlin/com/asap/application/user/service/UserTokenCommandService.kt @@ -39,7 +39,7 @@ class UserTokenCommandService( val accessToken = userTokenConvertPort.generateAccessToken(user) val refreshToken = userTokenConvertPort.generateRefreshToken(user) - userTokenManagementPort.saveUserToken(UserToken(userId = user.id, token = refreshToken)) + userTokenManagementPort.saveUserToken(UserToken.create(userId = user.id, token = refreshToken)) return ReissueTokenUsecase.Response( accessToken = accessToken, refreshToken = refreshToken, diff --git a/Application-Module/src/test/kotlin/com/asap/application/user/service/SocialLoginServiceTest.kt b/Application-Module/src/test/kotlin/com/asap/application/user/service/SocialLoginServiceTest.kt index 45231c1c..ef1e7223 100644 --- a/Application-Module/src/test/kotlin/com/asap/application/user/service/SocialLoginServiceTest.kt +++ b/Application-Module/src/test/kotlin/com/asap/application/user/service/SocialLoginServiceTest.kt @@ -38,7 +38,7 @@ class SocialLoginServiceTest : var command = SocialLoginUsecase.Command(SocialLoginProvider.KAKAO.name, "registered") val authInfo = AuthInfo(SocialLoginProvider.KAKAO, "socialId", "name", "email", "profileImage") val getUserAuth = - UserAuth( + UserAuth.create( userId = DomainId.generate(), socialId = "socialId", socialLoginProvider = SocialLoginProvider.KAKAO, diff --git a/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterMockManager.kt b/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterMockManager.kt index 514881c7..ba8df345 100644 --- a/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterMockManager.kt +++ b/Application-Module/src/testFixtures/kotlin/com/asap/application/letter/LetterMockManager.kt @@ -129,6 +129,7 @@ class LetterMockManager( ), spaceId = DomainId(spaceId), receiveDate = LocalDate.now(), + ) spaceLetterManagementPort.save( spaceLetter, diff --git a/Application-Module/src/testFixtures/kotlin/com/asap/application/space/SpaceMockManager.kt b/Application-Module/src/testFixtures/kotlin/com/asap/application/space/SpaceMockManager.kt index f9d6510f..093f316c 100644 --- a/Application-Module/src/testFixtures/kotlin/com/asap/application/space/SpaceMockManager.kt +++ b/Application-Module/src/testFixtures/kotlin/com/asap/application/space/SpaceMockManager.kt @@ -14,6 +14,7 @@ class SpaceMockManager( ): Space { val space = Space.create( + id = DomainId.generate(), userId = DomainId(userId), name = "test", templateType = 0, @@ -28,4 +29,8 @@ class SpaceMockManager( } } } + + fun clear() { + spaceManagementPort.deleteAll() + } } diff --git a/Application-Module/src/testFixtures/kotlin/com/asap/application/user/UserMockManager.kt b/Application-Module/src/testFixtures/kotlin/com/asap/application/user/UserMockManager.kt index c4f2310c..972c4377 100644 --- a/Application-Module/src/testFixtures/kotlin/com/asap/application/user/UserMockManager.kt +++ b/Application-Module/src/testFixtures/kotlin/com/asap/application/user/UserMockManager.kt @@ -8,6 +8,7 @@ import com.asap.domain.user.entity.UserAuth import com.asap.domain.user.enums.SocialLoginProvider import com.asap.domain.user.vo.UserPermission import java.time.LocalDate +import java.time.LocalDateTime class UserMockManager( private val userManagementPort: UserManagementPort, @@ -33,7 +34,9 @@ class UserMockManager( permission = UserPermission(true, true, true), birthday = LocalDate.now(), email = "email", - onboardingAt = null, + onboardingAt = LocalDateTime.now(), + createdAt = LocalDateTime.now(), + updatedAt = LocalDateTime.now() ), ) @@ -43,7 +46,7 @@ class UserMockManager( provider: String = "KAKAO", ) { userAuthManagementPort.saveUserAuth( - UserAuth( + UserAuth.create( userId = DomainId(userId), socialId = socialId, socialLoginProvider = SocialLoginProvider.parse(provider), diff --git a/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/letter/LetterApiIntegrationTest.kt b/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/letter/LetterApiIntegrationTest.kt index 3626cce0..058b862a 100644 --- a/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/letter/LetterApiIntegrationTest.kt +++ b/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/letter/LetterApiIntegrationTest.kt @@ -878,6 +878,7 @@ class LetterApiIntegrationTest : IntegrationSupporter() { contentType = MediaType.APPLICATION_JSON header("Authorization", "Bearer $accessToken") } + // then response.andExpect { status { isOk() } @@ -893,6 +894,32 @@ class LetterApiIntegrationTest : IntegrationSupporter() { } } } + + @Test + fun getAllLetterCount_with_space_count(){ + // given + val senderId = userMockManager.settingUser() + val receiverId = userMockManager.settingUser() + val accessToken = jwtMockManager.generateAccessToken(receiverId) + val space = spaceMockManager.settingSpace(receiverId) + + // when + val response = + mockMvc.get("/api/v1/letters/count") { + contentType = MediaType.APPLICATION_JSON + header("Authorization", "Bearer $accessToken") + } + + // then + response.andExpect { + status { isOk() } + jsonPath("$.spaceCount") { + exists() + isNumber() + value(1) + } + } + } } @Test diff --git a/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/user/UserApiIntegrationTest.kt b/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/user/UserApiIntegrationTest.kt index ff63b9b9..0f9f97f2 100644 --- a/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/user/UserApiIntegrationTest.kt +++ b/Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/user/UserApiIntegrationTest.kt @@ -1,10 +1,13 @@ package com.asap.bootstrap.integration.user import com.asap.application.user.exception.UserException +import com.asap.application.user.port.out.UserManagementPort import com.asap.bootstrap.IntegrationSupporter import com.asap.bootstrap.web.user.dto.LogoutRequest import com.asap.bootstrap.web.user.dto.RegisterUserRequest import com.asap.bootstrap.web.user.dto.UpdateBirthdayRequest +import com.asap.domain.common.DomainId +import io.kotest.matchers.comparables.shouldBeGreaterThan import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import org.springframework.http.MediaType @@ -14,7 +17,9 @@ import org.springframework.test.web.servlet.post import org.springframework.test.web.servlet.put import java.time.LocalDate -class UserApiIntegrationTest : IntegrationSupporter() { +class UserApiIntegrationTest( + private val userManagementPort: UserManagementPort +) : IntegrationSupporter() { @Test fun registerUserSuccessTest() { // given @@ -260,4 +265,23 @@ class UserApiIntegrationTest : IntegrationSupporter() { status { isOk() } } } + + @Test + fun deleteUser_user_updated_at_updated() { + // given + val userId = userMockManager.settingUser() + userMockManager.settingUserAuth(userId = userId) + val accessToken = jwtMockManager.generateAccessToken(userId) + + // when + mockMvc.delete("/api/v1/users") { + contentType = MediaType.APPLICATION_JSON + header("Authorization", "Bearer $accessToken") + } + + + // then + val user = userManagementPort.getUserNotNull(DomainId(userId)) + user.updatedAt shouldBeGreaterThan user.createdAt + } } diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/common/Aggregate.kt b/Domain-Module/src/main/kotlin/com/asap/domain/common/Aggregate.kt index 9d90f20f..4aefc95a 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/common/Aggregate.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/common/Aggregate.kt @@ -1,10 +1,13 @@ package com.asap.domain.common import io.github.oshai.kotlinlogging.KotlinLogging +import java.time.LocalDateTime abstract class Aggregate>( - val id: DomainId, -) { + id: DomainId, + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +): BaseEntity(id, createdAt, updatedAt) { private val logger = KotlinLogging.logger {} private val events: MutableList> = mutableListOf() diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/common/BaseEntity.kt b/Domain-Module/src/main/kotlin/com/asap/domain/common/BaseEntity.kt index 1cf328e9..c965e86b 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/common/BaseEntity.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/common/BaseEntity.kt @@ -1,6 +1,14 @@ package com.asap.domain.common +import java.time.LocalDateTime + abstract class BaseEntity( - val id: DomainId = DomainId.generate() + val id: DomainId = DomainId.generate(), + val createdAt: LocalDateTime, + var updatedAt: LocalDateTime, ) { + + protected fun updateTime() { + updatedAt = LocalDateTime.now() + } } \ No newline at end of file diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/DraftLetter.kt b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/DraftLetter.kt index 56203e79..9adb1f05 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/DraftLetter.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/DraftLetter.kt @@ -10,8 +10,9 @@ class DraftLetter( var receiverName: String, val ownerId: DomainId, var images: List, - var lastUpdated: LocalDateTime = LocalDateTime.now(), -) : Aggregate(id) { + var lastUpdated: LocalDateTime, + createdAt: LocalDateTime, +) : Aggregate(id, createdAt, lastUpdated) { companion object { fun default(ownerId: DomainId) = DraftLetter( @@ -20,6 +21,8 @@ class DraftLetter( content = "", receiverName = "", images = emptyList(), + lastUpdated = LocalDateTime.now(), + createdAt = LocalDateTime.now(), ) } @@ -32,5 +35,6 @@ class DraftLetter( this.receiverName = receiverName this.images = images this.lastUpdated = LocalDateTime.now() + updateTime() } } diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/IndependentLetter.kt b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/IndependentLetter.kt index d389ce21..f5e15b9a 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/IndependentLetter.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/IndependentLetter.kt @@ -17,7 +17,9 @@ class IndependentLetter( val receiveDate: LocalDate, val movedAt: LocalDateTime, var isOpened: Boolean, -) : Aggregate(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : Aggregate(id, createdAt, updatedAt) { companion object { fun createBySpaceLetter( spaceLetter: SpaceLetter, @@ -31,6 +33,8 @@ class IndependentLetter( receiveDate = spaceLetter.receiveDate, movedAt = LocalDateTime.now(), isOpened = false, + createdAt = spaceLetter.createdAt, + updatedAt = LocalDateTime.now(), ) fun create( @@ -42,6 +46,8 @@ class IndependentLetter( movedAt: LocalDateTime = LocalDateTime.now(), isOpened: Boolean = false, draftId: DomainId? = null, + createdAt: LocalDateTime = LocalDateTime.now(), + updatedAt: LocalDateTime = LocalDateTime.now(), ): IndependentLetter = IndependentLetter( id = id, @@ -51,6 +57,8 @@ class IndependentLetter( receiveDate = receiveDate, movedAt = movedAt, isOpened = isOpened, + createdAt = createdAt, + updatedAt = updatedAt, ).also { it.registerEvent(IndependentLetterEvent.IndependentLetterCreatedEvent(it, draftId?.value)) } @@ -60,6 +68,7 @@ class IndependentLetter( fun read() { isOpened = true + updateTime() } fun update( @@ -72,11 +81,13 @@ class IndependentLetter( this.content.updateContent(content) this.content.updateImages(images.toMutableList()) this.content.updateTemplateType(templateType) + updateTime() } fun delete() { this.content.delete() this.sender.delete() + updateTime() } fun getOwnerId(): DomainId = receiver.receiverId diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/LetterLog.kt b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/LetterLog.kt index e14fddc7..8dd6aad7 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/LetterLog.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/LetterLog.kt @@ -10,18 +10,24 @@ class LetterLog( val loggedAt: LocalDateTime, val logType: LetterLogType, val content: String, -) : BaseEntity(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : BaseEntity(id, createdAt, updatedAt) { companion object { fun create( targetLetterId: DomainId, logType: LetterLogType, content: String, + createdAt: LocalDateTime = LocalDateTime.now(), + updatedAt: LocalDateTime = LocalDateTime.now(), ): LetterLog = LetterLog( targetLetterId = targetLetterId, loggedAt = LocalDateTime.now(), logType = logType, content = content, + createdAt = createdAt, + updatedAt = updatedAt, ) } } diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/ReceiveDraftLetter.kt b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/ReceiveDraftLetter.kt index 7a73ddce..6adc5604 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/ReceiveDraftLetter.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/ReceiveDraftLetter.kt @@ -10,9 +10,10 @@ class ReceiveDraftLetter( var senderName: String, val ownerId: DomainId, var images: List, - var lastUpdated: LocalDateTime = LocalDateTime.now(), + var lastUpdated: LocalDateTime, val type: ReceiveDraftLetterType, // TODO: 상속 구조를 통한 타입 구분 생각해보기 -) : BaseEntity(id) { + createdAt: LocalDateTime, +) : BaseEntity(id, createdAt, lastUpdated) { companion object { fun default(ownerId: DomainId) = ReceiveDraftLetter( @@ -22,6 +23,8 @@ class ReceiveDraftLetter( senderName = "", images = emptyList(), type = ReceiveDraftLetterType.PHYSICAL, + lastUpdated = LocalDateTime.now(), + createdAt = LocalDateTime.now(), ) } @@ -34,6 +37,7 @@ class ReceiveDraftLetter( this.senderName = senderName this.images = images this.lastUpdated = LocalDateTime.now() + updateTime() } } diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt index c8eab132..4ff0ec91 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SendLetter.kt @@ -16,9 +16,10 @@ class SendLetter( var receiverName: String, var letterCode: String?, var status: LetterStatus, - val createdAt: LocalDateTime, var receiverId: DomainId?, -) : Aggregate(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : Aggregate(id, createdAt, updatedAt) { val createdDate: LocalDate = createdAt.toLocalDate() companion object { @@ -28,9 +29,10 @@ class SendLetter( receiverName: String, letterCode: String?, status: LetterStatus = LetterStatus.SENDING, - createdAt: LocalDateTime = LocalDateTime.now(), receiverId: DomainId? = null, draftId: DomainId? = null, + createdAt: LocalDateTime = LocalDateTime.now(), + updatedAt: LocalDateTime = LocalDateTime.now(), ) = SendLetter( id = DomainId.generate(), content = content, @@ -38,8 +40,9 @@ class SendLetter( receiverName = receiverName, letterCode = letterCode, status = status, - createdAt = createdAt, receiverId = receiverId, + createdAt = createdAt, + updatedAt = updatedAt, ).also { it.registerEvent(SendLetterEvent.SendLetterCreatedEvent(it, draftId?.value)) } @@ -53,11 +56,13 @@ class SendLetter( fun readLetter(receiverId: DomainId) { this.receiverId = receiverId this.status = LetterStatus.READ + updateTime() } fun receiveLetter() { status = LetterStatus.RECEIVED letterCode = null + updateTime() } fun delete() { @@ -65,5 +70,6 @@ class SendLetter( this.receiverName = "" this.letterCode = null this.receiverId = null + updateTime() } } diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SpaceLetter.kt b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SpaceLetter.kt index 1ec8c4fb..317a7e51 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SpaceLetter.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/letter/entity/SpaceLetter.kt @@ -16,7 +16,9 @@ class SpaceLetter( val receiver: ReceiverInfo, val receiveDate: LocalDate, val movedAt: LocalDateTime, -) : Aggregate(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : Aggregate(id, createdAt, updatedAt) { companion object { fun createByIndependentLetter( independentLetter: IndependentLetter, @@ -30,6 +32,8 @@ class SpaceLetter( receiver = independentLetter.receiver, receiveDate = independentLetter.receiveDate, movedAt = LocalDateTime.now(), + createdAt = independentLetter.createdAt, + updatedAt = LocalDateTime.now(), ) fun create( @@ -40,6 +44,8 @@ class SpaceLetter( content: LetterContent, receiveDate: LocalDate, movedAt: LocalDateTime = LocalDateTime.now(), + createdAt: LocalDateTime = LocalDateTime.now(), + updatedAt: LocalDateTime = LocalDateTime.now(), ): SpaceLetter = SpaceLetter( id = id, @@ -49,6 +55,8 @@ class SpaceLetter( content = content, receiveDate = receiveDate, movedAt = movedAt, + createdAt = createdAt, + updatedAt = updatedAt, ) } diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/space/entity/Space.kt b/Domain-Module/src/main/kotlin/com/asap/domain/space/entity/Space.kt index bcd128d0..bdba20f5 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/space/entity/Space.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/space/entity/Space.kt @@ -3,6 +3,7 @@ package com.asap.domain.space.entity import com.asap.domain.common.Aggregate import com.asap.domain.common.DomainId import com.asap.domain.space.event.SpaceEvent +import java.time.LocalDateTime class Space( id: DomainId, @@ -11,14 +12,18 @@ class Space( var index: Int, val templateType: Int, var isMain: Boolean = false, -) : Aggregate(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : Aggregate(id, createdAt, updatedAt) { companion object { fun create( - id: DomainId = DomainId.generate(), + id: DomainId, userId: DomainId, name: String, templateType: Int, index: Int = -1, + createdAt: LocalDateTime = LocalDateTime.now(), + updatedAt: LocalDateTime = LocalDateTime.now(), ): Space = Space( id = id, @@ -26,6 +31,8 @@ class Space( name = name, templateType = templateType, index = index, + createdAt = createdAt, + updatedAt = updatedAt, ).also { it.registerEvent(SpaceEvent.SpaceCreatedEvent(it)) } @@ -33,22 +40,27 @@ class Space( fun updateName(name: String) { this.name = name + updateTime() } fun updateToMain() { this.isMain = true + updateTime() } fun updateToSub() { this.isMain = false + updateTime() } fun updateIndex(index: Int) { check(index >= 0) { "Index must be greater than or equal to 0" } this.index = index + updateTime() } fun delete() { this.registerEvent(SpaceEvent.SpaceDeletedEvent(this)) + updateTime() } } diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/User.kt b/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/User.kt index a75e5aa3..7de6b249 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/User.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/User.kt @@ -15,7 +15,9 @@ class User( val permission: UserPermission, var birthday: LocalDate?, var onboardingAt: LocalDateTime?, -) : Aggregate(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : Aggregate(id, createdAt, updatedAt) { companion object { fun create( id: DomainId = DomainId.generate(), @@ -24,27 +26,30 @@ class User( email: String, permission: UserPermission, birthday: LocalDate?, + createdAt: LocalDateTime = LocalDateTime.now(), + updatedAt: LocalDateTime = LocalDateTime.now(), ): User = - User(id, username, profileImage, email, permission, birthday, null).also { + User(id, username, profileImage, email, permission, birthday, null, createdAt, updatedAt).also { it.registerEvent(UserEvent.UserCreatedEvent(it)) } } fun delete() { - this.username = "UNKNOWN" this.profileImage = "UNKNOWN" - this.email = "UNKNOWN" this.birthday = null registerEvent(UserEvent.UserDeletedEvent(this)) + updateTime() } fun updateBirthday(birthday: LocalDate) { this.birthday = birthday + updateTime() } fun updateOnboarding() { this.onboardingAt = LocalDateTime.now() + updateTime() } fun isProcessedOnboarding(): Boolean { diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/UserAuth.kt b/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/UserAuth.kt index d5b9e4ca..1b2927b0 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/UserAuth.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/UserAuth.kt @@ -1,15 +1,39 @@ package com.asap.domain.user.entity +import com.asap.domain.common.BaseEntity import com.asap.domain.common.DomainId import com.asap.domain.user.enums.SocialLoginProvider +import java.time.LocalDateTime -data class UserAuth( - val id: DomainId = DomainId.generate(), +class UserAuth( + id: DomainId, val userId: DomainId, var socialId: String, val socialLoginProvider: SocialLoginProvider, -) { - fun delete() { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : BaseEntity(id, createdAt, updatedAt) { + companion object { + fun create( + userId: DomainId, + socialId: String, + socialLoginProvider: SocialLoginProvider, + createdAt: LocalDateTime = LocalDateTime.now(), + updatedAt: LocalDateTime = LocalDateTime.now(), + ): UserAuth = + UserAuth( + id = DomainId.generate(), + userId = userId, + socialId = socialId, + socialLoginProvider = socialLoginProvider, + createdAt = createdAt, + updatedAt = updatedAt, + ) + + } + + fun delete() { this.socialId = "UNKNOWN" + updateTime() } } diff --git a/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/UserToken.kt b/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/UserToken.kt index 876dd5db..834d98a0 100644 --- a/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/UserToken.kt +++ b/Domain-Module/src/main/kotlin/com/asap/domain/user/entity/UserToken.kt @@ -1,9 +1,27 @@ package com.asap.domain.user.entity +import com.asap.domain.common.BaseEntity import com.asap.domain.common.DomainId +import java.time.LocalDateTime -data class UserToken( - val id: DomainId = DomainId.generate(), +class UserToken( + id: DomainId, val userId: DomainId? = null, val token: String, -) + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +): BaseEntity(id, createdAt, updatedAt) { + companion object { + fun create( + userId: DomainId? = null, + token: String, + ): UserToken = + UserToken( + id = DomainId.generate(), + userId = userId, + token = token, + createdAt = LocalDateTime.now(), + updatedAt = LocalDateTime.now(), + ) + } +} diff --git a/Domain-Module/src/testFixtures/kotlin/com/asap/domain/LetterFixture.kt b/Domain-Module/src/testFixtures/kotlin/com/asap/domain/LetterFixture.kt index dd23c77d..ce9f1e8b 100644 --- a/Domain-Module/src/testFixtures/kotlin/com/asap/domain/LetterFixture.kt +++ b/Domain-Module/src/testFixtures/kotlin/com/asap/domain/LetterFixture.kt @@ -62,6 +62,8 @@ object LetterFixture { receiveDate = receiveDate, movedAt = movedAt, isOpened = isOpened, + createdAt = LocalDateTime.now(), + updatedAt = LocalDateTime.now(), ) fun generateSpaceLetter( @@ -94,5 +96,7 @@ object LetterFixture { ), receiveDate = receiveDate, movedAt = movedAt, + createdAt = LocalDateTime.now(), + updatedAt = LocalDateTime.now(), ) } diff --git a/Domain-Module/src/testFixtures/kotlin/com/asap/domain/SpaceFixture.kt b/Domain-Module/src/testFixtures/kotlin/com/asap/domain/SpaceFixture.kt index d10dc7a2..855dcd14 100644 --- a/Domain-Module/src/testFixtures/kotlin/com/asap/domain/SpaceFixture.kt +++ b/Domain-Module/src/testFixtures/kotlin/com/asap/domain/SpaceFixture.kt @@ -2,6 +2,7 @@ package com.asap.domain import com.asap.domain.common.DomainId import com.asap.domain.space.entity.Space +import java.time.LocalDateTime object SpaceFixture { fun createSpace( @@ -18,7 +19,9 @@ object SpaceFixture { name = name, templateType = templateType, index = index, - isMain = isMain + isMain = isMain, + createdAt = LocalDateTime.now(), + updatedAt = LocalDateTime.now(), ) } } \ No newline at end of file diff --git a/Domain-Module/src/testFixtures/kotlin/com/asap/domain/UserFixture.kt b/Domain-Module/src/testFixtures/kotlin/com/asap/domain/UserFixture.kt index 655fdb57..70c842cf 100644 --- a/Domain-Module/src/testFixtures/kotlin/com/asap/domain/UserFixture.kt +++ b/Domain-Module/src/testFixtures/kotlin/com/asap/domain/UserFixture.kt @@ -28,7 +28,7 @@ object UserFixture { socialId: String = "socialId", socialLoginProvider: SocialLoginProvider = SocialLoginProvider.KAKAO, ): UserAuth = - UserAuth( + UserAuth.create( userId = DomainId(userId), socialId = socialId, socialLoginProvider = socialLoginProvider, diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/common/AggregateRoot.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/common/AggregateRoot.kt index 26441a06..d77441aa 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/common/AggregateRoot.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/common/AggregateRoot.kt @@ -1,5 +1,9 @@ package com.asap.persistence.jpa.common +import java.time.LocalDateTime + abstract class AggregateRoot>( override val id: String, -) : BaseEntity(id) + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : BaseEntity(id, createdAt, updatedAt) diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/common/BaseEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/common/BaseEntity.kt index d73aaed6..420c00ae 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/common/BaseEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/common/BaseEntity.kt @@ -9,11 +9,9 @@ import java.time.LocalDateTime abstract class BaseEntity( @Id open val id: String = DomainId.generate().value, + var createdAt: LocalDateTime, + var updatedAt: LocalDateTime ) { - var createdAt: LocalDateTime = LocalDateTime.now() - - open var updatedAt: LocalDateTime = LocalDateTime.now() - fun update() { this.updatedAt = LocalDateTime.now() } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/DraftLetterMapper.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/DraftLetterMapper.kt index e21eecf9..35bbef4c 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/DraftLetterMapper.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/DraftLetterMapper.kt @@ -12,6 +12,7 @@ object DraftLetterMapper { receiverName = draftLetter.receiverName, ownerId = draftLetter.ownerId.value, images = draftLetter.images, + createdAt = draftLetter.createdAt, updatedAt = draftLetter.lastUpdated, ) @@ -22,6 +23,7 @@ object DraftLetterMapper { receiverName = draftLetterEntity.receiverName, ownerId = DomainId(draftLetterEntity.ownerId), images = draftLetterEntity.images, + createdAt = draftLetterEntity.createdAt, lastUpdated = draftLetterEntity.updatedAt, ) } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/LetterLogMapper.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/LetterLogMapper.kt index 2fb56daa..08e08110 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/LetterLogMapper.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/LetterLogMapper.kt @@ -11,7 +11,9 @@ object LetterLogMapper { targetLetterId = letterLog.targetLetterId.value, loggedAt = letterLog.loggedAt, logType = letterLog.logType, - content = letterLog.content + content = letterLog.content, + createdAt = letterLog.createdAt, + updatedAt = letterLog.updatedAt ) } @@ -21,7 +23,9 @@ object LetterLogMapper { targetLetterId = DomainId(letterLogEntity.targetLetterId), loggedAt = letterLogEntity.loggedAt, logType = letterLogEntity.logType, - content = letterLogEntity.content + content = letterLogEntity.content, + createdAt = letterLogEntity.createdAt, + updatedAt = letterLogEntity.updatedAt ) } } \ No newline at end of file diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/ReceiveDraftLetterMapper.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/ReceiveDraftLetterMapper.kt index 3245acc5..c48f3d54 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/ReceiveDraftLetterMapper.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/ReceiveDraftLetterMapper.kt @@ -12,8 +12,9 @@ object ReceiveDraftLetterMapper { senderName = receiveDraftLetter.senderName, ownerId = receiveDraftLetter.ownerId.value, images = receiveDraftLetter.images, - updatedAt = receiveDraftLetter.lastUpdated, type = receiveDraftLetter.type, + createdAt = receiveDraftLetter.createdAt, + updatedAt = receiveDraftLetter.lastUpdated, ) fun toDomain(receiveDraftLetterEntity: ReceiveDraftLetterEntity): ReceiveDraftLetter = @@ -25,5 +26,6 @@ object ReceiveDraftLetterMapper { images = receiveDraftLetterEntity.images, lastUpdated = receiveDraftLetterEntity.updatedAt, type = receiveDraftLetterEntity.type, + createdAt = receiveDraftLetterEntity.createdAt, ) } \ No newline at end of file diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/ReceiverLetterMapper.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/ReceiverLetterMapper.kt index c7d4ca3a..56fdebb3 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/ReceiverLetterMapper.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/ReceiverLetterMapper.kt @@ -30,6 +30,8 @@ object ReceiverLetterMapper { receiveDate = receiveLetterEntity.receiveDate, movedAt = receiveLetterEntity.movedAt, isOpened = receiveLetterEntity.isOpened, + createdAt = receiveLetterEntity.createdAt, + updatedAt = receiveLetterEntity.updatedAt, ) fun toSpaceLetter(receiveLetterEntity: ReceiveLetterEntity): SpaceLetter = @@ -53,5 +55,7 @@ object ReceiverLetterMapper { receiveDate = receiveLetterEntity.receiveDate, spaceId = receiveLetterEntity.spaceId!!.let { DomainId(it) }, movedAt = receiveLetterEntity.movedAt, + createdAt = receiveLetterEntity.createdAt, + updatedAt = receiveLetterEntity.updatedAt, ) } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/SendLetterMapper.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/SendLetterMapper.kt index c8b224cf..38087c43 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/SendLetterMapper.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/SendLetterMapper.kt @@ -21,6 +21,7 @@ object SendLetterMapper { receiverId = sendLetterEntity.receiverId?.let { DomainId(it) }, status = sendLetterEntity.letterStatus, createdAt = sendLetterEntity.createdAt, + updatedAt = sendLetterEntity.updatedAt, ) fun toSendLetterEntity(sendLetter: SendLetter): SendLetterEntity = @@ -34,5 +35,7 @@ object SendLetterMapper { letterCode = sendLetter.letterCode, receiverId = sendLetter.receiverId?.value, letterStatus = sendLetter.status, + createdAt = sendLetter.createdAt, + updatedAt = sendLetter.updatedAt, ) } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/adapter/ReceiveLetterManagementJpaAdapter.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/adapter/ReceiveLetterManagementJpaAdapter.kt index 7b65abba..6c79e9cf 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/adapter/ReceiveLetterManagementJpaAdapter.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/adapter/ReceiveLetterManagementJpaAdapter.kt @@ -35,6 +35,8 @@ class ReceiveLetterManagementJpaAdapter( movedAt = letter.movedAt, isOpened = letter.isOpened, spaceId = null, + createdAt = letter.createdAt, + updatedAt = letter.updatedAt, ).also { receiveLetterJpaRepository.save(it) eventPublisher.publishAll(letter.pullEvents()) @@ -97,6 +99,8 @@ class ReceiveLetterManagementJpaAdapter( spaceId = letter.spaceId.value, movedAt = LocalDateTime.now(), isOpened = false, + createdAt = letter.createdAt, + updatedAt = letter.updatedAt, ).apply { receiveLetterJpaRepository.save(this) } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/DraftLetterEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/DraftLetterEntity.kt index ebf6862d..abdb1c0b 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/DraftLetterEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/DraftLetterEntity.kt @@ -17,8 +17,9 @@ class DraftLetterEntity( receiverName: String, ownerId: String, images: List, + createdAt: LocalDateTime, updatedAt: LocalDateTime, -) : AggregateRoot(id) { +) : AggregateRoot(id, createdAt, updatedAt) { @Column( name = "content", nullable = false, @@ -48,6 +49,4 @@ class DraftLetterEntity( columnDefinition = "text", ) var images: List = images - - override var updatedAt: LocalDateTime = updatedAt } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/LetterLogEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/LetterLogEntity.kt index 4106dedb..36306747 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/LetterLogEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/LetterLogEntity.kt @@ -14,8 +14,10 @@ class LetterLogEntity( targetLetterId: String, loggedAt: LocalDateTime, logType: LetterLogType, - content: String -):BaseEntity(id) { + content: String, + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +):BaseEntity(id, createdAt, updatedAt) { @Column( name = "target_letter_id", nullable = false, diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/ReceiveDraftLetterEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/ReceiveDraftLetterEntity.kt index 58b263f2..2ef2081d 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/ReceiveDraftLetterEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/ReceiveDraftLetterEntity.kt @@ -18,9 +18,10 @@ class ReceiveDraftLetterEntity( senderName: String, ownerId: String, images: List, + type: ReceiveDraftLetterType, + createdAt: LocalDateTime, updatedAt: LocalDateTime, - type: ReceiveDraftLetterType -) : BaseEntity(id) { +) : BaseEntity(id, createdAt, updatedAt) { @Column( name = "content", nullable = false, @@ -51,8 +52,6 @@ class ReceiveDraftLetterEntity( ) var images: List = images - override var updatedAt: LocalDateTime = updatedAt - @Enumerated(EnumType.STRING) @Column( name = "type", diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/ReceiveLetterEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/ReceiveLetterEntity.kt index b8db3845..4dafeb1c 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/ReceiveLetterEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/ReceiveLetterEntity.kt @@ -24,7 +24,9 @@ class ReceiveLetterEntity( movedAt: LocalDateTime, isOpened: Boolean, spaceId: String? = null, -) : AggregateRoot(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : AggregateRoot(id, createdAt, updatedAt) { @Column( name = "content", nullable = false, diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/SendLetterEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/SendLetterEntity.kt index aaa84371..1f258e8e 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/SendLetterEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/letter/entity/SendLetterEntity.kt @@ -7,6 +7,7 @@ import com.asap.persistence.jpa.user.entity.UserEntity import jakarta.persistence.* import org.hibernate.annotations.JdbcTypeCode import org.hibernate.type.SqlTypes +import java.time.LocalDateTime @Entity @Table( @@ -29,7 +30,9 @@ class SendLetterEntity( letterCode: String?, receiverId: String?, letterStatus: LetterStatus, -) : AggregateRoot(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : AggregateRoot(id, createdAt, updatedAt) { @Column( name = "content", nullable = false, diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/SpaceMapper.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/SpaceMapper.kt index 9c7b1fe8..076b8ae9 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/SpaceMapper.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/SpaceMapper.kt @@ -13,6 +13,8 @@ object SpaceMapper { templateType = spaceEntity.templateType, index = spaceEntity.index, isMain = spaceEntity.isMain, + createdAt = spaceEntity.createdAt, + updatedAt = spaceEntity.updatedAt, ) fun toSpaceEntity( @@ -24,5 +26,7 @@ object SpaceMapper { templateType = space.templateType, index = space.index, isMain = space.isMain, + createdAt = space.createdAt, + updatedAt = space.updatedAt, ) } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/adapter/SpaceManagementJpaAdapter.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/adapter/SpaceManagementJpaAdapter.kt index 8a22d4be..7b5ba97a 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/adapter/SpaceManagementJpaAdapter.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/adapter/SpaceManagementJpaAdapter.kt @@ -99,5 +99,12 @@ class SpaceManagementJpaAdapter( eventPublisher.publishAll(space.pullEvents()) } - override fun countByUserId(userId: DomainId): Long = spaceJpaRepository.countActiveSpaceByUserId(userId.value) + override fun deleteAll() { + spaceJpaRepository.deleteAll() + } + + override fun countByUserId(userId: DomainId): Long{ + return spaceJpaRepository.countActiveSpaceByUserId(userId.value) + } + } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/entity/SpaceEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/entity/SpaceEntity.kt index 289364cd..92916e57 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/entity/SpaceEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/space/entity/SpaceEntity.kt @@ -5,6 +5,7 @@ import com.asap.persistence.jpa.common.AggregateRoot import com.asap.persistence.jpa.common.EntityStatus import com.asap.persistence.jpa.user.entity.UserEntity import jakarta.persistence.* +import java.time.LocalDateTime @Entity @Table(name = "space") @@ -15,7 +16,9 @@ class SpaceEntity( templateType: Int, index: Int, isMain: Boolean, -) : AggregateRoot(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : AggregateRoot(id, createdAt, updatedAt) { @Column(name = "user_id", nullable = false) var userId: String = userId diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/UserMapper.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/UserMapper.kt index 2cff86d8..ce459607 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/UserMapper.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/UserMapper.kt @@ -26,6 +26,8 @@ object UserMapper { ), email = user.email, onboardingAt = user.onboardingAt, + createdAt = user.createdAt, + updatedAt = user.updatedAt, ) fun toUser(userEntity: UserEntity): User = @@ -42,6 +44,8 @@ object UserMapper { birthday = userEntity.birthday, email = userEntity.email, onboardingAt = userEntity.onboardingAt, + createdAt = userEntity.createdAt, + updatedAt = userEntity.updatedAt, ) fun toUserAuthEntity(userAuth: UserAuth): UserAuthEntity = @@ -50,6 +54,8 @@ object UserMapper { socialId = userAuth.socialId, socialLoginProvider = userAuth.socialLoginProvider.name, userId = userAuth.userId.value, + createdAt = userAuth.createdAt, + updatedAt = userAuth.updatedAt, ) fun toUserAuth(userAuthEntity: UserAuthEntity): UserAuth = @@ -58,6 +64,8 @@ object UserMapper { socialId = userAuthEntity.socialId, socialLoginProvider = SocialLoginProvider.parse(userAuthEntity.socialLoginProvider), userId = DomainId(userAuthEntity.userId), + createdAt = userAuthEntity.createdAt, + updatedAt = userAuthEntity.updatedAt, ) fun toUserTokenEntity(userToken: UserToken): UserTokenEntity = @@ -65,6 +73,8 @@ object UserMapper { id = userToken.id.value, token = userToken.token, userId = userToken.userId?.value, + createdAt = userToken.createdAt, + updatedAt = userToken.updatedAt, ) fun toUserToken(userTokenEntity: UserTokenEntity): UserToken = @@ -72,5 +82,7 @@ object UserMapper { id = DomainId(userTokenEntity.id), token = userTokenEntity.token, userId = userTokenEntity.userId?.let { DomainId(it) }, + createdAt = userTokenEntity.createdAt, + updatedAt = userTokenEntity.updatedAt, ) } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/adapter/UserManagementJpaAdapter.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/adapter/UserManagementJpaAdapter.kt index e8019548..558791c9 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/adapter/UserManagementJpaAdapter.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/adapter/UserManagementJpaAdapter.kt @@ -27,4 +27,8 @@ class UserManagementJpaAdapter( override fun getUserNotNull(userId: DomainId): User = userJpaRepository.findByIdOrNull(userId.value)?.let { UserMapper.toUser(it) } ?: throw UserException.UserNotFoundException() + + override fun findById(userId: DomainId): User? { + return userJpaRepository.findByIdOrNull(userId.value)?.let { UserMapper.toUser(it) } + } } diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserAuthEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserAuthEntity.kt index 231b57ac..c16cffcd 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserAuthEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserAuthEntity.kt @@ -2,6 +2,7 @@ package com.asap.persistence.jpa.user.entity import com.asap.persistence.jpa.common.AggregateRoot import jakarta.persistence.* +import java.time.LocalDateTime @Entity @Table( @@ -15,7 +16,9 @@ class UserAuthEntity( userId: String, socialId: String, socialLoginProvider: String, -) : AggregateRoot(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : AggregateRoot(id, createdAt, updatedAt) { @Column(nullable = false) val userId: String = userId diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserEntity.kt index 2048dc12..5c569ca4 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserEntity.kt @@ -15,7 +15,9 @@ class UserEntity( userPermission: UserPermissionEntity, birthday: LocalDate?, onboardingAt: LocalDateTime?, -) : AggregateRoot(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : AggregateRoot(id, createdAt, updatedAt) { @Column(nullable = false) val username: String = username diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserPermissionEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserPermissionEntity.kt index cfb8d18e..da2c6076 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserPermissionEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserPermissionEntity.kt @@ -3,6 +3,7 @@ package com.asap.persistence.jpa.user.entity import com.asap.persistence.jpa.common.BaseEntity import jakarta.persistence.Entity import jakarta.persistence.Table +import java.time.LocalDateTime @Entity @Table(name = "user_permission") @@ -10,4 +11,4 @@ class UserPermissionEntity( val servicePermission: Boolean, val privatePermission: Boolean, val marketingPermission: Boolean, -) : BaseEntity() +) : BaseEntity(createdAt = LocalDateTime.now(), updatedAt = LocalDateTime.now()) diff --git a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserTokenEntity.kt b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserTokenEntity.kt index aba196df..3f105333 100644 --- a/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserTokenEntity.kt +++ b/Infrastructure-Module/Persistence/src/main/kotlin/com/asap/persistence/jpa/user/entity/UserTokenEntity.kt @@ -2,6 +2,7 @@ package com.asap.persistence.jpa.user.entity import com.asap.persistence.jpa.common.AggregateRoot import jakarta.persistence.* +import java.time.LocalDateTime @Entity @Table( @@ -14,7 +15,9 @@ class UserTokenEntity( id: String, token: String, userId: String?, -) : AggregateRoot(id) { + createdAt: LocalDateTime, + updatedAt: LocalDateTime, +) : AggregateRoot(id, createdAt, updatedAt) { @Column( nullable = false, columnDefinition = "text", diff --git a/Infrastructure-Module/Security/src/testFixtures/kotlin/com/asap/security/jwt/JwtMockManager.kt b/Infrastructure-Module/Security/src/testFixtures/kotlin/com/asap/security/jwt/JwtMockManager.kt index dd71aff9..e1fd848f 100644 --- a/Infrastructure-Module/Security/src/testFixtures/kotlin/com/asap/security/jwt/JwtMockManager.kt +++ b/Infrastructure-Module/Security/src/testFixtures/kotlin/com/asap/security/jwt/JwtMockManager.kt @@ -38,7 +38,7 @@ class JwtMockManager( ), userJwtProperties.secret, ).apply { - userTokenManagementPort.saveUserToken(UserToken(token = this)) + userTokenManagementPort.saveUserToken(UserToken.create(token = this)) } fun generateAccessToken( @@ -79,7 +79,7 @@ class JwtMockManager( ), userJwtProperties.secret, ).apply { - userTokenManagementPort.saveUserToken(UserToken(token = this, userId = DomainId(userId))) + userTokenManagementPort.saveUserToken(UserToken.create(token = this, userId = DomainId(userId))) } fun generateExpiredToken( @@ -104,7 +104,7 @@ class JwtMockManager( when (tokenType) { TokenType.REFRESH -> userTokenManagementPort.saveUserToken( - UserToken( + UserToken.create( token = it, userId = DomainId(userId), ),