From 0bcb90f812943f43b7240af37f1dae9cea362675 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 13 Sep 2025 18:31:20 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=EC=97=B0=EB=9D=BD?= =?UTF-8?q?=EC=B2=98=20=EC=A1=B0=ED=9A=8C=20API=20=EB=B0=8F=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/roomescape/member/docs/UserAPI.kt | 18 ++++++++ .../roomescape/member/web/UserController.kt | 12 +++++ .../kotlin/roomescape/user/UserApiTest.kt | 44 +++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/src/main/kotlin/roomescape/member/docs/UserAPI.kt b/src/main/kotlin/roomescape/member/docs/UserAPI.kt index a8011f85..4a1d8571 100644 --- a/src/main/kotlin/roomescape/member/docs/UserAPI.kt +++ b/src/main/kotlin/roomescape/member/docs/UserAPI.kt @@ -7,8 +7,12 @@ import io.swagger.v3.oas.annotations.tags.Tag import jakarta.validation.Valid import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.RequestBody +import roomescape.auth.web.support.CurrentUser 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.member.web.UserContactRetrieveResponse import roomescape.member.web.UserCreateRequest import roomescape.member.web.UserCreateResponse @@ -27,4 +31,18 @@ interface UserAPI { fun signup( @Valid @RequestBody request: UserCreateRequest ): ResponseEntity> + + @UserOnly + @Operation(summary = "회원 가입") + @ApiResponses( + ApiResponse( + responseCode = "200", + description = "성공", + useReturnTypeSchema = true + ) + ) + fun findContact( + @CurrentUser user: CurrentUserContext + ): ResponseEntity> + } diff --git a/src/main/kotlin/roomescape/member/web/UserController.kt b/src/main/kotlin/roomescape/member/web/UserController.kt index 30c182c9..c20e6849 100644 --- a/src/main/kotlin/roomescape/member/web/UserController.kt +++ b/src/main/kotlin/roomescape/member/web/UserController.kt @@ -2,9 +2,12 @@ package roomescape.member.web import jakarta.validation.Valid 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.RequestBody 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.member.business.UserService import roomescape.member.docs.UserAPI @@ -22,4 +25,13 @@ class UserController( return ResponseEntity.ok(CommonApiResponse(response)) } + + @GetMapping("/users/contact") + override fun findContact( + @CurrentUser user: CurrentUserContext + ): ResponseEntity> { + val response = userService.findContactById(user.id) + + return ResponseEntity.ok(CommonApiResponse(response)) + } } diff --git a/src/test/kotlin/roomescape/user/UserApiTest.kt b/src/test/kotlin/roomescape/user/UserApiTest.kt index 1c2e0f85..07843050 100644 --- a/src/test/kotlin/roomescape/user/UserApiTest.kt +++ b/src/test/kotlin/roomescape/user/UserApiTest.kt @@ -8,8 +8,10 @@ import io.restassured.module.kotlin.extensions.Then import io.restassured.module.kotlin.extensions.When import org.hamcrest.CoreMatchers.equalTo import org.springframework.data.repository.findByIdOrNull +import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus import org.springframework.http.MediaType +import roomescape.auth.exception.AuthErrorCode import roomescape.common.exception.CommonErrorCode import roomescape.member.business.SIGNUP import roomescape.member.exception.UserErrorCode @@ -18,6 +20,7 @@ import roomescape.member.web.MIN_PASSWORD_LENGTH import roomescape.member.web.UserCreateRequest import roomescape.supports.FunSpecSpringbootTest import roomescape.supports.UserFixture +import roomescape.supports.runExceptionTest import roomescape.supports.runTest class UserApiTest( @@ -127,6 +130,47 @@ class UserApiTest( 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 {