From 37b229a8b2fdca1b91e5372a685b33f578e5f41a Mon Sep 17 00:00:00 2001 From: ChungPlusPlus Date: Sun, 2 Feb 2025 02:17:08 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20Cascade=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/PerformanceEntity.kt | 8 ++++++++ .../persistence/PerformanceEventEntity.kt | 6 ++++++ .../persistence/PerformanceHallEntity.kt | 8 ++++++++ .../review/persistence/ReviewEntity.kt | 3 +++ .../interpark/seat/persistence/SeatEntity.kt | 4 ++++ .../interpark/user/persistence/UserEntity.kt | 18 ++++++++++++++++++ .../user/persistence/UserIdentityEntity.kt | 4 ++++ 7 files changed, 51 insertions(+) diff --git a/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceEntity.kt index 37321e6..c4625ff 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceEntity.kt @@ -1,5 +1,7 @@ package com.wafflestudio.interpark.performance.persistence +import com.wafflestudio.interpark.review.persistence.ReplyEntity +import com.wafflestudio.interpark.review.persistence.ReviewEntity import jakarta.persistence.* import java.time.Instant import java.time.LocalDate @@ -26,6 +28,12 @@ class PerformanceEntity( @Column(name = "backdrop_image_uri", nullable = false) val backdropImageUri: String, + + @OneToMany(mappedBy = "performance", cascade = [CascadeType.ALL], orphanRemoval = true) + var reviews: MutableSet = mutableSetOf(), + + @OneToMany(mappedBy = "performance", cascade = [CascadeType.ALL], orphanRemoval = true) + var performanceEvents: MutableSet = mutableSetOf(), ) enum class PerformanceCategory { diff --git a/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceEventEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceEventEntity.kt index fae2427..fab7a35 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceEventEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceEventEntity.kt @@ -1,5 +1,8 @@ package com.wafflestudio.interpark.performance.persistence +import com.wafflestudio.interpark.review.persistence.ReplyEntity +import com.wafflestudio.interpark.review.persistence.ReviewEntity +import com.wafflestudio.interpark.seat.persistence.ReservationEntity import jakarta.persistence.* import java.time.Instant @@ -23,4 +26,7 @@ data class PerformanceEventEntity( @Column(name = "end_at", nullable = false) val endAt: Instant, + + @OneToMany(mappedBy = "performanceEvent", cascade = [CascadeType.ALL], orphanRemoval = true) + var reservations: MutableSet = mutableSetOf(), ) diff --git a/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceHallEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceHallEntity.kt index a0c73df..65aa180 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceHallEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/performance/persistence/PerformanceHallEntity.kt @@ -1,5 +1,7 @@ package com.wafflestudio.interpark.performance.persistence +import com.wafflestudio.interpark.review.persistence.ReviewEntity +import com.wafflestudio.interpark.seat.persistence.SeatEntity import jakarta.persistence.* import java.time.Instant @@ -18,4 +20,10 @@ class PerformanceHallEntity( @Column(name = "max_audience", nullable = false) val maxAudience: Int, + + @OneToMany(mappedBy = "performanceHall", cascade = [CascadeType.ALL], orphanRemoval = true) + var performanceEvents: MutableSet = mutableSetOf(), + + @OneToMany(mappedBy = "performanceHall", cascade = [CascadeType.ALL], orphanRemoval = true) + var seats: MutableSet = mutableSetOf(), ) diff --git a/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt index bf42588..d494126 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt @@ -37,4 +37,7 @@ class ReviewEntity( @OneToMany(mappedBy = "review") var reviewLikes: List = emptyList(), + + @OneToMany(mappedBy = "review", cascade = [CascadeType.ALL], orphanRemoval = true) + var replies: MutableSet = mutableSetOf(), ) diff --git a/src/main/kotlin/com/wafflestudio/interpark/seat/persistence/SeatEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/seat/persistence/SeatEntity.kt index 7cfe9df..a1f3478 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/seat/persistence/SeatEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/seat/persistence/SeatEntity.kt @@ -1,6 +1,7 @@ package com.wafflestudio.interpark.seat.persistence import com.wafflestudio.interpark.performance.persistence.PerformanceHallEntity +import com.wafflestudio.interpark.review.persistence.ReviewEntity import jakarta.persistence.* @Entity @@ -16,4 +17,7 @@ class SeatEntity( val seatNumber: Pair, @Column(name = "price") var price: Int = 10000, + + @OneToMany(mappedBy = "seat", cascade = [CascadeType.ALL], orphanRemoval = true) + var reservations: MutableSet = mutableSetOf(), ) diff --git a/src/main/kotlin/com/wafflestudio/interpark/user/persistence/UserEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/user/persistence/UserEntity.kt index 9ddccb0..3f68fd3 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/user/persistence/UserEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/user/persistence/UserEntity.kt @@ -1,10 +1,16 @@ package com.wafflestudio.interpark.user.persistence +import com.wafflestudio.interpark.review.persistence.ReplyEntity +import com.wafflestudio.interpark.review.persistence.ReviewEntity +import com.wafflestudio.interpark.seat.persistence.ReservationEntity +import jakarta.persistence.CascadeType import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.GeneratedValue import jakarta.persistence.GenerationType import jakarta.persistence.Id +import jakarta.persistence.OneToMany +import jakarta.persistence.OneToOne @Entity class UserEntity( @@ -21,4 +27,16 @@ class UserEntity( val email: String, @Column(name = "address", nullable = true) val address: String? = null, + + @OneToMany(mappedBy = "author", cascade = [CascadeType.ALL], orphanRemoval = true) + var reviews: MutableSet = mutableSetOf(), + + @OneToMany(mappedBy = "author", cascade = [CascadeType.ALL], orphanRemoval = true) + var replies: MutableSet = mutableSetOf(), + + @OneToMany(mappedBy = "user", cascade = [CascadeType.ALL], orphanRemoval = true) + var reservations: MutableSet = mutableSetOf(), + + @OneToOne(mappedBy = "user", cascade = [CascadeType.ALL], orphanRemoval = true) + var userIdentity: UserIdentityEntity? = null, ) diff --git a/src/main/kotlin/com/wafflestudio/interpark/user/persistence/UserIdentityEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/user/persistence/UserIdentityEntity.kt index 5421ad4..68383de 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/user/persistence/UserIdentityEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/user/persistence/UserIdentityEntity.kt @@ -1,5 +1,6 @@ package com.wafflestudio.interpark.user.persistence +import com.wafflestudio.interpark.review.persistence.ReviewEntity import jakarta.persistence.CascadeType import jakarta.persistence.Column import jakarta.persistence.Entity @@ -24,8 +25,11 @@ class UserIdentityEntity( var role: UserRole = UserRole.USER, @Column(name = "hashed_password", nullable = false) val hashedPassword: String, + // @OneToMany(mappedBy = "userIdentity", cascade = [CascadeType.ALL], fetch = FetchType.LAZY) // val socialAccounts: MutableList = mutableListOf(), + @OneToMany(mappedBy = "userIdentity", cascade = [CascadeType.ALL], orphanRemoval = true) + var socialAccounts: MutableSet = mutableSetOf(), ) enum class UserRole : GrantedAuthority { From 85e45cb518437e6b6987ace15e7311ff33228ef4 Mon Sep 17 00:00:00 2001 From: ChungPlusPlus Date: Sun, 2 Feb 2025 13:17:54 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20index=20=EC=B6=94=EA=B0=80=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wafflestudio/interpark/review/persistence/ReviewEntity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt index d494126..73ea1c7 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt @@ -6,7 +6,7 @@ import jakarta.persistence.* import java.time.Instant @Entity -@Table(name = "reviews") +@Table(name = "reviews", indexes = @Index(name = "idx__createdAt", columnList = "created_at")) class ReviewEntity( @Id @GeneratedValue(strategy = GenerationType.UUID) From e6697303b7583f66e053bb992904c57ac2a893e2 Mon Sep 17 00:00:00 2001 From: ChungPlusPlus Date: Sun, 2 Feb 2025 13:44:30 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EC=A1=B0=ED=9A=8C=20=EC=84=B1?= =?UTF-8?q?=EB=8A=A5=20=ED=96=A5=EC=83=81=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?index=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wafflestudio/interpark/review/persistence/ReplyEntity.kt | 5 ++++- .../interpark/review/persistence/ReviewEntity.kt | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReplyEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReplyEntity.kt index 2790c8f..33db490 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReplyEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReplyEntity.kt @@ -5,7 +5,10 @@ import jakarta.persistence.* import java.time.Instant @Entity -@Table(name = "reply") +@Table( + name = "reply", + indexes = [jakarta.persistence.Index(name = "idx__createdAt", columnList = "created_at")] +) data class ReplyEntity( @Id @GeneratedValue(strategy = GenerationType.UUID) diff --git a/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt b/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt index 73ea1c7..32c2eda 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/review/persistence/ReviewEntity.kt @@ -6,7 +6,10 @@ import jakarta.persistence.* import java.time.Instant @Entity -@Table(name = "reviews", indexes = @Index(name = "idx__createdAt", columnList = "created_at")) +@Table( + name = "reviews", + indexes = [Index(name = "idx__createdAt", columnList = "created_at")] +) class ReviewEntity( @Id @GeneratedValue(strategy = GenerationType.UUID) From 75385ba37a52e17f823d466a53ae674a334451ff Mon Sep 17 00:00:00 2001 From: ChungPlusPlus Date: Sun, 2 Feb 2025 14:38:49 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20token=20algorithm=20=EC=A7=80?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interpark/user/UserAccessTokenUtil.kt | 12 +++++++----- .../com/wafflestudio/interpark/user/UserException.kt | 6 ++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/com/wafflestudio/interpark/user/UserAccessTokenUtil.kt b/src/main/kotlin/com/wafflestudio/interpark/user/UserAccessTokenUtil.kt index adc8282..88aaa99 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/user/UserAccessTokenUtil.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/user/UserAccessTokenUtil.kt @@ -3,6 +3,7 @@ package com.wafflestudio.interpark.user import com.wafflestudio.interpark.user.persistence.RefreshTokenEntity import com.wafflestudio.interpark.user.persistence.RefreshTokenRepository import io.jsonwebtoken.Jwts +import io.jsonwebtoken.SignatureAlgorithm import io.jsonwebtoken.security.Keys import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Component @@ -19,7 +20,7 @@ class UserAccessTokenUtil( val now = Date() val expiryDate = Date(now.time + ACCESS_EXPIRATION_TIME) return Jwts.builder() - .signWith(secretKey) + .signWith(secretKey, SignatureAlgorithm.HS256) .setSubject(username) .setIssuedAt(now) .setExpiration(expiryDate) @@ -33,6 +34,11 @@ class UserAccessTokenUtil( .setSigningKey(secretKey) .build() .parseClaimsJws(accessToken) + .also { jws -> + if (jws.header.algorithm != SignatureAlgorithm.HS256.value) { + throw InvalidTokenException() + } + } .body if (claims.expiration < Date()) { throw TokenExpiredException() @@ -83,9 +89,5 @@ class UserAccessTokenUtil( companion object { private const val ACCESS_EXPIRATION_TIME = 1000 * 60 * 15 // 15 minutes private const val REFRESH_EXPIRATION_TIME = 1000 * 60 * 60 * 24 // 1 day -// @Value("\${jwt.secret}") -// lateinit var secretKey: String -// private val SECRET_KEY = Keys.hmacShaKeyFor(secretKey.toByteArray(StandardCharsets.UTF_8)) - // TODO("비밀키 숨겨야 한다") } } diff --git a/src/main/kotlin/com/wafflestudio/interpark/user/UserException.kt b/src/main/kotlin/com/wafflestudio/interpark/user/UserException.kt index a5153cc..a77cb5f 100644 --- a/src/main/kotlin/com/wafflestudio/interpark/user/UserException.kt +++ b/src/main/kotlin/com/wafflestudio/interpark/user/UserException.kt @@ -60,6 +60,12 @@ class TokenExpiredException : UserException( msg = "Token Expired", ) +class InvalidTokenException : UserException( + errorCode = 0, + httpStatusCode = HttpStatus.UNAUTHORIZED, + msg = "Invalid Token(Wrong Signing Algorithm)", +) + class NoRefreshTokenException : UserException( errorCode = 0, httpStatusCode = HttpStatus.UNAUTHORIZED,