diff --git a/src/main/kotlin/io/csbroker/apiserver/common/util/CookieUtil.kt b/src/main/kotlin/io/csbroker/apiserver/common/util/CookieUtil.kt index 86a1d036..5331a3f2 100644 --- a/src/main/kotlin/io/csbroker/apiserver/common/util/CookieUtil.kt +++ b/src/main/kotlin/io/csbroker/apiserver/common/util/CookieUtil.kt @@ -4,7 +4,11 @@ import jakarta.servlet.http.Cookie import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest -import org.springframework.util.SerializationUtils +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.ObjectInputStream +import java.io.ObjectOutputStream +import java.io.Serializable import java.util.Base64 fun getCookie(request: HttpServletRequest, name: String) = request.cookies?.let { @@ -32,13 +36,25 @@ fun deleteCookie(request: HttpServletRequest, response: HttpServletResponse, nam fun OAuth2AuthorizationRequest.serialize(): String { return Base64.getUrlEncoder() - .encodeToString(SerializationUtils.serialize(this)) + .encodeToString(this.toByteArray()) } -fun deserialize(cookie: Cookie, cls: Class): T { - return cls.cast( - SerializationUtils.deserialize( - Base64.getUrlDecoder().decode(cookie.value), - ), - ) +inline fun Cookie.deserialize(): T { + return Base64.getUrlDecoder().decode(this.value).let { + ByteArrayInputStream(it).use { byteArrayInputStream -> + ObjectInputStream(byteArrayInputStream).use { objectInput -> + objectInput.readObject() + } + } + } as? T ?: throw ClassCastException() +} + +private fun Serializable.toByteArray(): ByteArray { + return ByteArrayOutputStream().use { + ObjectOutputStream(it).use { objectOutputStream -> + objectOutputStream.writeObject(this) + objectOutputStream.flush() + it.toByteArray() + } + } } diff --git a/src/main/kotlin/io/csbroker/apiserver/controller/v1/post/response/CommentResponseDto.kt b/src/main/kotlin/io/csbroker/apiserver/controller/v1/post/response/CommentResponseDto.kt index d0a67c19..da4fd74c 100644 --- a/src/main/kotlin/io/csbroker/apiserver/controller/v1/post/response/CommentResponseDto.kt +++ b/src/main/kotlin/io/csbroker/apiserver/controller/v1/post/response/CommentResponseDto.kt @@ -2,11 +2,13 @@ package io.csbroker.apiserver.controller.v1.post.response import io.csbroker.apiserver.model.Comment import java.time.LocalDateTime +import java.util.UUID data class CommentResponseDto( val id: Long, val content: String, val username: String, + val userId: UUID, val likeCount: Long, val isLiked: Boolean, val createdAt: LocalDateTime, @@ -14,6 +16,7 @@ data class CommentResponseDto( constructor(comment: Comment, likeCount: Long, isLiked: Boolean) : this( id = comment.id, content = comment.content, + userId = comment.user.id!!, username = comment.user.username, likeCount = likeCount, isLiked = isLiked, diff --git a/src/main/kotlin/io/csbroker/apiserver/controller/v1/post/response/PostResponseDto.kt b/src/main/kotlin/io/csbroker/apiserver/controller/v1/post/response/PostResponseDto.kt index bc05cb2c..d4e7088d 100644 --- a/src/main/kotlin/io/csbroker/apiserver/controller/v1/post/response/PostResponseDto.kt +++ b/src/main/kotlin/io/csbroker/apiserver/controller/v1/post/response/PostResponseDto.kt @@ -1,11 +1,13 @@ package io.csbroker.apiserver.controller.v1.post.response import io.csbroker.apiserver.model.Post +import java.util.UUID data class PostResponseDto( val id: Long, val content: String, val username: String, + val userId: UUID, val likeCount: Long, val isLiked: Boolean, val comments: List, @@ -13,9 +15,10 @@ data class PostResponseDto( constructor(post: Post, likeCount: Long, isLiked: Boolean, comments: List) : this( id = post.id, content = post.content, + userId = post.user.id!!, username = post.user.username, likeCount = likeCount, isLiked = isLiked, - comments = comments, + comments = comments.sortedBy { it.createdAt }, ) } diff --git a/src/main/kotlin/io/csbroker/apiserver/repository/common/OAuth2AuthorizationRequestBasedOnCookieRepository.kt b/src/main/kotlin/io/csbroker/apiserver/repository/common/OAuth2AuthorizationRequestBasedOnCookieRepository.kt index b236f04b..1ecad5b8 100644 --- a/src/main/kotlin/io/csbroker/apiserver/repository/common/OAuth2AuthorizationRequestBasedOnCookieRepository.kt +++ b/src/main/kotlin/io/csbroker/apiserver/repository/common/OAuth2AuthorizationRequestBasedOnCookieRepository.kt @@ -18,8 +18,7 @@ private const val COOKIE_EXPIRE_SECONDS = 180L class OAuth2AuthorizationRequestBasedOnCookieRepository : AuthorizationRequestRepository { override fun loadAuthorizationRequest(request: HttpServletRequest): OAuth2AuthorizationRequest? { val cookie = getCookie(request, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME) ?: return null - - return deserialize(cookie, OAuth2AuthorizationRequest::class.java) + return cookie.deserialize() } override fun saveAuthorizationRequest( diff --git a/src/test/kotlin/io/csbroker/apiserver/controller/v1/post/PostControllerTest.kt b/src/test/kotlin/io/csbroker/apiserver/controller/v1/post/PostControllerTest.kt index fd83f36f..cfc687de 100644 --- a/src/test/kotlin/io/csbroker/apiserver/controller/v1/post/PostControllerTest.kt +++ b/src/test/kotlin/io/csbroker/apiserver/controller/v1/post/PostControllerTest.kt @@ -18,6 +18,7 @@ import org.springframework.restdocs.payload.JsonFieldType import org.springframework.restdocs.payload.PayloadDocumentation import org.springframework.restdocs.request.RequestDocumentation import java.time.LocalDateTime +import java.util.UUID class PostControllerTest : RestDocsTest() { private lateinit var postService: PostService @@ -101,6 +102,7 @@ class PostControllerTest : RestDocsTest() { 1L, "CONTENT", "USER", + UUID.randomUUID(), 1, true, listOf( @@ -108,6 +110,7 @@ class PostControllerTest : RestDocsTest() { 1L, "CONTENT", "USER", + UUID.randomUUID(), 1, true, LocalDateTime.now(), @@ -138,6 +141,8 @@ class PostControllerTest : RestDocsTest() { .type(JsonFieldType.STRING).description("글 내용"), PayloadDocumentation.fieldWithPath("data[].username") .type(JsonFieldType.STRING).description("작성자"), + PayloadDocumentation.fieldWithPath("data[].userId") + .type(JsonFieldType.STRING).description("작성자 ID"), PayloadDocumentation.fieldWithPath("data[].likeCount") .type(JsonFieldType.NUMBER).description("좋아요 수"), PayloadDocumentation.fieldWithPath("data[].isLiked") @@ -148,6 +153,8 @@ class PostControllerTest : RestDocsTest() { .type(JsonFieldType.STRING).description("댓글 내용"), PayloadDocumentation.fieldWithPath("data[].comments[].username") .type(JsonFieldType.STRING).description("댓글 작성자"), + PayloadDocumentation.fieldWithPath("data[].comments[].userId") + .type(JsonFieldType.STRING).description("댓글 작성자 ID"), PayloadDocumentation.fieldWithPath("data[].comments[].likeCount") .type(JsonFieldType.NUMBER).description("좋아요 수"), PayloadDocumentation.fieldWithPath("data[].comments[].isLiked")