[#34] 회원 / 인증 도메인 재정의 #43

Merged
pricelees merged 73 commits from refactor/#34 into main 2025-09-13 10:13:45 +00:00
3 changed files with 74 additions and 0 deletions
Showing only changes of commit 0bcb90f812 - Show all commits

View File

@ -7,8 +7,12 @@ import io.swagger.v3.oas.annotations.tags.Tag
import jakarta.validation.Valid import jakarta.validation.Valid
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import roomescape.auth.web.support.CurrentUser
import roomescape.auth.web.support.Public import roomescape.auth.web.support.Public
import roomescape.auth.web.support.UserOnly
import roomescape.common.dto.CurrentUserContext
import roomescape.common.dto.response.CommonApiResponse import roomescape.common.dto.response.CommonApiResponse
import roomescape.member.web.UserContactRetrieveResponse
import roomescape.member.web.UserCreateRequest import roomescape.member.web.UserCreateRequest
import roomescape.member.web.UserCreateResponse import roomescape.member.web.UserCreateResponse
@ -27,4 +31,18 @@ interface UserAPI {
fun signup( fun signup(
@Valid @RequestBody request: UserCreateRequest @Valid @RequestBody request: UserCreateRequest
): ResponseEntity<CommonApiResponse<UserCreateResponse>> ): ResponseEntity<CommonApiResponse<UserCreateResponse>>
@UserOnly
@Operation(summary = "회원 가입")
@ApiResponses(
ApiResponse(
responseCode = "200",
description = "성공",
useReturnTypeSchema = true
)
)
fun findContact(
@CurrentUser user: CurrentUserContext
): ResponseEntity<CommonApiResponse<UserContactRetrieveResponse>>
} }

View File

@ -2,9 +2,12 @@ package roomescape.member.web
import jakarta.validation.Valid import jakarta.validation.Valid
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import roomescape.auth.web.support.CurrentUser
import roomescape.common.dto.CurrentUserContext
import roomescape.common.dto.response.CommonApiResponse import roomescape.common.dto.response.CommonApiResponse
import roomescape.member.business.UserService import roomescape.member.business.UserService
import roomescape.member.docs.UserAPI import roomescape.member.docs.UserAPI
@ -22,4 +25,13 @@ class UserController(
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))
} }
@GetMapping("/users/contact")
override fun findContact(
@CurrentUser user: CurrentUserContext
): ResponseEntity<CommonApiResponse<UserContactRetrieveResponse>> {
val response = userService.findContactById(user.id)
return ResponseEntity.ok(CommonApiResponse(response))
}
} }

View File

@ -8,8 +8,10 @@ import io.restassured.module.kotlin.extensions.Then
import io.restassured.module.kotlin.extensions.When import io.restassured.module.kotlin.extensions.When
import org.hamcrest.CoreMatchers.equalTo import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
import org.springframework.http.MediaType import org.springframework.http.MediaType
import roomescape.auth.exception.AuthErrorCode
import roomescape.common.exception.CommonErrorCode import roomescape.common.exception.CommonErrorCode
import roomescape.member.business.SIGNUP import roomescape.member.business.SIGNUP
import roomescape.member.exception.UserErrorCode import roomescape.member.exception.UserErrorCode
@ -18,6 +20,7 @@ import roomescape.member.web.MIN_PASSWORD_LENGTH
import roomescape.member.web.UserCreateRequest import roomescape.member.web.UserCreateRequest
import roomescape.supports.FunSpecSpringbootTest import roomescape.supports.FunSpecSpringbootTest
import roomescape.supports.UserFixture import roomescape.supports.UserFixture
import roomescape.supports.runExceptionTest
import roomescape.supports.runTest import roomescape.supports.runTest
class UserApiTest( class UserApiTest(
@ -127,6 +130,47 @@ class UserApiTest(
test("빈 전화번호") { runCommonTest(commonRequest.copy(phone = "")) } test("빈 전화번호") { runCommonTest(commonRequest.copy(phone = "")) }
} }
} }
context("회원의 연락처 정보를 조회한다.") {
val endpoint = "/users/contact"
context("권한이 없으면 접근할 수 없다.") {
test("비회원") {
runExceptionTest(
method = HttpMethod.GET,
endpoint = endpoint,
expectedErrorCode = AuthErrorCode.TOKEN_NOT_FOUND
)
}
test("관리자") {
runExceptionTest(
token = authUtil.defaultAdminLogin(),
method = HttpMethod.GET,
endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED
)
}
}
test("정상 응답") {
val user = authUtil.defaultUser()
val token = authUtil.userLogin(user)
runTest(
token = token,
on = {
get(endpoint)
},
expect = {
statusCode(HttpStatus.OK.value())
body("data.id", equalTo(user.id))
body("data.name", equalTo(user.name))
body("data.phone", equalTo(user.phone))
}
)
}
}
} }
private fun signup(request: UserCreateRequest): UserEntity { private fun signup(request: UserCreateRequest): UserEntity {