Skip to content

Commit 5e1d013

Browse files
authored
Merge pull request #313 from wafflestudio/develop
Release
2 parents a196daf + eb7cfca commit 5e1d013

25 files changed

+293
-108
lines changed

api/src/main/kotlin/filter/ErrorWebFilter.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,14 @@ class ErrorWebFilter(
6060
}
6161

6262
private fun makeErrorBody(exception: Snu4tException): ErrorBody {
63-
return ErrorBody(exception.error.errorCode, exception.errorMessage, exception.displayMessage, exception.detail, exception.ext)
63+
return ErrorBody(exception.error.errorCode, exception.errorMessage, exception.displayMessage, exception.ext)
6464
}
6565
}
6666

6767
private data class ErrorBody(
6868
val errcode: Long,
6969
val message: String,
7070
val displayMessage: String,
71-
val detail: Any? = null,
7271
// TODO: 구버전 대응용 ext 필드. 추후 삭제
7372
val ext: Map<String, String> = mapOf(),
7473
)

api/src/main/kotlin/handler/AuthHandler.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ class AuthHandler(
6161
userService.loginKakao(socialLoginRequest)
6262
}
6363

64+
suspend fun loginApple(req: ServerRequest): ServerResponse =
65+
handle(req) {
66+
val socialLoginRequest: SocialLoginRequest = req.awaitBodyOrNull() ?: throw ServerWebInputException("Invalid body")
67+
userService.loginApple(socialLoginRequest)
68+
}
69+
6470
suspend fun logout(req: ServerRequest): ServerResponse =
6571
handle(req) {
6672
val userId = req.userId

api/src/main/kotlin/handler/TimetableThemeHandler.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ class TimetableThemeHandler(
4545
ListResponse(result)
4646
}
4747

48+
suspend fun getTheme(req: ServerRequest) =
49+
handle(req) {
50+
val userId = req.userId
51+
val themeId = req.pathVariable("themeId")
52+
53+
TimetableThemeDto(timetableThemeService.getTheme(userId, themeId))
54+
}
55+
4856
suspend fun addTheme(req: ServerRequest) =
4957
handle(req) {
5058
val userId = req.userId

api/src/main/kotlin/handler/UserHandler.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package com.wafflestudio.snu4t.handler
22

3-
import com.wafflestudio.snu4t.auth.SocialProvider
3+
import com.wafflestudio.snu4t.auth.AuthProvider
44
import com.wafflestudio.snu4t.common.dto.OkResponse
55
import com.wafflestudio.snu4t.common.extension.toZonedDateTime
66
import com.wafflestudio.snu4t.middleware.SnuttRestApiDefaultMiddleware
77
import com.wafflestudio.snu4t.users.data.User
8+
import com.wafflestudio.snu4t.users.dto.AuthProvidersCheckDto
89
import com.wafflestudio.snu4t.users.dto.EmailVerificationResultDto
910
import com.wafflestudio.snu4t.users.dto.LocalLoginRequest
1011
import com.wafflestudio.snu4t.users.dto.PasswordChangeRequest
1112
import com.wafflestudio.snu4t.users.dto.SendEmailRequest
1213
import com.wafflestudio.snu4t.users.dto.SocialLoginRequest
13-
import com.wafflestudio.snu4t.users.dto.SocialProvidersCheckDto
1414
import com.wafflestudio.snu4t.users.dto.UserDto
1515
import com.wafflestudio.snu4t.users.dto.UserLegacyDto
1616
import com.wafflestudio.snu4t.users.dto.UserPatchRequest
@@ -106,46 +106,46 @@ class UserHandler(
106106
handle(req) {
107107
val user = req.getContext().user!!
108108
val socialLoginRequest: SocialLoginRequest = req.awaitBody()
109-
userService.attachSocial(user, socialLoginRequest, SocialProvider.FACEBOOK)
109+
userService.attachSocial(user, socialLoginRequest, AuthProvider.FACEBOOK)
110110
}
111111

112112
suspend fun attachGoogle(req: ServerRequest): ServerResponse =
113113
handle(req) {
114114
val user = req.getContext().user!!
115115
val socialLoginRequest: SocialLoginRequest = req.awaitBody()
116-
userService.attachSocial(user, socialLoginRequest, SocialProvider.GOOGLE)
116+
userService.attachSocial(user, socialLoginRequest, AuthProvider.GOOGLE)
117117
}
118118

119119
suspend fun attachKakao(req: ServerRequest): ServerResponse =
120120
handle(req) {
121121
val user = req.getContext().user!!
122122
val socialLoginRequest: SocialLoginRequest = req.awaitBody()
123-
userService.attachSocial(user, socialLoginRequest, SocialProvider.KAKAO)
123+
userService.attachSocial(user, socialLoginRequest, AuthProvider.KAKAO)
124124
}
125125

126126
suspend fun detachFacebook(req: ServerRequest): ServerResponse =
127127
handle(req) {
128128
val user = req.getContext().user!!
129-
userService.detachSocial(user, SocialProvider.FACEBOOK)
129+
userService.detachSocial(user, AuthProvider.FACEBOOK)
130130
}
131131

132132
suspend fun detachGoogle(req: ServerRequest): ServerResponse =
133133
handle(req) {
134134
val user = req.getContext().user!!
135-
userService.detachSocial(user, SocialProvider.GOOGLE)
135+
userService.detachSocial(user, AuthProvider.GOOGLE)
136136
}
137137

138138
suspend fun detachKakao(req: ServerRequest): ServerResponse =
139139
handle(req) {
140140
val user = req.getContext().user!!
141-
userService.detachSocial(user, SocialProvider.KAKAO)
141+
userService.detachSocial(user, AuthProvider.KAKAO)
142142
}
143143

144-
suspend fun checkSocialProviders(req: ServerRequest): ServerResponse =
144+
suspend fun checkAuthProviders(req: ServerRequest): ServerResponse =
145145
handle(req) {
146146
val user = req.getContext().user!!
147147

148-
SocialProvidersCheckDto(
148+
AuthProvidersCheckDto(
149149
local = user.credential.localId != null,
150150
facebook = user.credential.fbName != null,
151151
google = user.credential.googleSub != null,

api/src/main/kotlin/router/MainRouter.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class MainRouter(
8686
POST("/login/facebook", authHandler::loginFacebook)
8787
POST("/login/google", authHandler::loginGoogle)
8888
POST("/login/kakao", authHandler::loginKakao)
89+
POST("/login/apple", authHandler::loginApple)
8990
POST("/logout", authHandler::logout)
9091
POST("/password/reset/email/check", authHandler::getMaskedEmail)
9192
POST("/password/reset/email/send", authHandler::sendResetPasswordCode)
@@ -120,7 +121,8 @@ class MainRouter(
120121
"/users".nest {
121122
GET("/me", userHandler::getUserMe)
122123
PATCH("/me", userHandler::patchUserInfo)
123-
GET("/me/social_providers", userHandler::checkSocialProviders)
124+
GET("/me/social_providers", userHandler::checkAuthProviders)
125+
GET("/me/auth-providers", userHandler::checkAuthProviders)
124126
}
125127
}
126128

@@ -263,6 +265,7 @@ class MainRouter(
263265
GET("/best", timetableThemeHandler::getBestThemes)
264266
GET("/friends", timetableThemeHandler::getFriendsThemes)
265267
POST("", timetableThemeHandler::addTheme)
268+
GET("/{themeId}", timetableThemeHandler::getTheme)
266269
PATCH("/{themeId}", timetableThemeHandler::modifyTheme)
267270
DELETE("/{themeId}", timetableThemeHandler::deleteTheme)
268271
POST("/{themeId}/copy", timetableThemeHandler::copyTheme)

api/src/main/kotlin/router/docs/ThemeDocs.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,17 @@ import org.springframework.web.bind.annotation.RequestMethod
9191
],
9292
),
9393
),
94+
RouterOperation(
95+
path = "/v1/themes/{themeId}",
96+
method = [RequestMethod.GET],
97+
produces = [MediaType.APPLICATION_JSON_VALUE],
98+
operation =
99+
Operation(
100+
operationId = "getTheme",
101+
parameters = [Parameter(`in` = ParameterIn.PATH, name = "themeId", required = true)],
102+
responses = [ApiResponse(responseCode = "200", content = [Content(schema = Schema())])],
103+
),
104+
),
94105
RouterOperation(
95106
path = "/v1/themes/{themeId}",
96107
method = [RequestMethod.PATCH],

api/src/main/kotlin/router/docs/UserDocs.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.wafflestudio.snu4t.router.docs
22

33
import com.wafflestudio.snu4t.common.dto.OkResponse
4+
import com.wafflestudio.snu4t.users.dto.AuthProvidersCheckDto
45
import com.wafflestudio.snu4t.users.dto.EmailVerificationResultDto
56
import com.wafflestudio.snu4t.users.dto.LocalLoginRequest
67
import com.wafflestudio.snu4t.users.dto.PasswordChangeRequest
78
import com.wafflestudio.snu4t.users.dto.SendEmailRequest
89
import com.wafflestudio.snu4t.users.dto.SocialLoginRequest
9-
import com.wafflestudio.snu4t.users.dto.SocialProvidersCheckDto
1010
import com.wafflestudio.snu4t.users.dto.TokenResponse
1111
import com.wafflestudio.snu4t.users.dto.UserDto
1212
import com.wafflestudio.snu4t.users.dto.UserLegacyDto
@@ -81,16 +81,16 @@ import org.springframework.web.bind.annotation.RequestMethod
8181
),
8282
),
8383
RouterOperation(
84-
path = "/v1/users/me/social_providers",
84+
path = "/v1/users/me/auth-providers",
8585
method = [RequestMethod.GET],
8686
produces = [MediaType.APPLICATION_JSON_VALUE],
8787
operation =
8888
Operation(
89-
operationId = "getSocialProviders",
89+
operationId = "getAuthProviders",
9090
responses = [
9191
ApiResponse(
9292
responseCode = "200",
93-
content = [Content(schema = Schema(implementation = SocialProvidersCheckDto::class))],
93+
content = [Content(schema = Schema(implementation = AuthProvidersCheckDto::class))],
9494
),
9595
],
9696
),

build.gradle.kts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
12
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
23
import java.io.ByteArrayOutputStream
34

@@ -12,6 +13,7 @@ plugins {
1213
group = "com.wafflestudio"
1314
version = "0.0.1-SNAPSHOT"
1415
java.sourceCompatibility = JavaVersion.VERSION_17
16+
java.targetCompatibility = JavaVersion.VERSION_17
1517

1618
allprojects {
1719
repositories {
@@ -64,9 +66,9 @@ subprojects {
6466
}
6567

6668
tasks.withType<KotlinCompile> {
67-
kotlinOptions {
68-
freeCompilerArgs = listOf("-Xjsr305=strict")
69-
jvmTarget = "17"
69+
compilerOptions {
70+
freeCompilerArgs.add("-Xjsr305=strict")
71+
jvmTarget.set(JvmTarget.JVM_17)
7072
}
7173
}
7274

core/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ dependencies {
99
implementation("software.amazon.awssdk:sts:2.25.15")
1010
implementation("software.amazon.awssdk:ses:2.25.15")
1111
implementation("com.google.firebase:firebase-admin:9.3.0")
12+
implementation("io.jsonwebtoken:jjwt:0.9.1")
1213

1314
testFixturesImplementation("org.testcontainers:mongodb:1.19.0")
1415
testFixturesImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")

core/src/main/kotlin/auth/SocialProvider.kt renamed to core/src/main/kotlin/auth/AuthProvider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.wafflestudio.snu4t.auth
22

3-
enum class SocialProvider(val value: String) {
3+
enum class AuthProvider(val value: String) {
44
LOCAL("local"),
55
FACEBOOK("facebook"),
66
APPLE("apple"),
@@ -11,6 +11,6 @@ enum class SocialProvider(val value: String) {
1111
companion object {
1212
private val mapping = entries.associateBy { e -> e.value }
1313

14-
fun from(value: String): SocialProvider? = mapping[value]
14+
fun from(value: String): AuthProvider? = mapping[value]
1515
}
1616
}

0 commit comments

Comments
 (0)