diff --git a/src/docs/asciidoc/apis/auth-api.adoc b/src/docs/asciidoc/apis/auth-api.adoc index 0c37c6de..fc5e482f 100644 --- a/src/docs/asciidoc/apis/auth-api.adoc +++ b/src/docs/asciidoc/apis/auth-api.adoc @@ -65,69 +65,3 @@ operation::auth-update-refresh-token[snippets='http-response,response-fields'] // operation::auth-update-refresh-token-error[snippets='http-response,response-fields'] ''' - -=== 이메일 인증 코드 발송 (회원 가입) - -`POST /members/emails/codes/signup` - -회원가입에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다. - -==== 요청 헤더 - -operation::member-email-auth-code-create[snippets='request-headers'] - -==== 요청 본문 (JSON) - -operation::member-email-auth-code-create[snippets='http-request,request-fields'] - -==== 성공 응답 - -성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다. - -==== 에러 응답 (이미 가입된 이메일) - -operation::member-email-auth-code-create-error[snippets='http-response,response-fields'] - -''' - -=== 이메일 인증 코드 발송 (비밀번호 변경 시) - -`POST /members/passwords/reset` - -비밀번호 찾기에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다. - -==== 요청 헤더 - -operation::member-password-auth-code-create[snippets='request-headers'] - -==== 요청 본문 (JSON) - -operation::member-password-auth-code-create[snippets='http-request,request-fields'] - -==== 성공 응답 - -성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다. - -==== 에러 응답 (이미 가입된 이메일) - -operation::member-password-auth-code-create-error[snippets='http-response,response-fields'] - -''' - -=== 이메일 인증 코드 검증 - -`GET /members/emails/codes/verify` - -이메일로 발송된 인증 코드가 올바른지 검증합니다. - -==== 쿼리 파라미터 - -operation::member-email-auth-code-verify[snippets='query-parameters'] - -==== 성공 응답 - -인증 성공 시, `200 OK` 상태 코드와 함께 빈 응답 본문을 반환합니다. - -==== 에러 응답 (잘못된 인증 코드) - -operation::member-email-auth-code-verify-error[snippets='http-response,response-fields'] diff --git a/src/docs/asciidoc/apis/member-api.adoc b/src/docs/asciidoc/apis/member-api.adoc index 77c6b3c4..6fe67a39 100644 --- a/src/docs/asciidoc/apis/member-api.adoc +++ b/src/docs/asciidoc/apis/member-api.adoc @@ -183,9 +183,9 @@ operation::member-quest-property-read[snippets='request-headers'] operation::member-quest-property-read[snippets='http-response,response-fields'] -==== 에러 응답 - -operation::member-quest-property-read-error[snippets='http-response,response-fields'] +// ==== 에러 응답 +// +// operation::member-quest-property-read-error[snippets='http-response,response-fields'] ''' @@ -207,9 +207,9 @@ operation::member-password-reset[snippets='http-request,request-fields'] 성공 시 `204 No Content` 상태 코드와 함께 빈 응답 본문을 반환합니다. -==== 에러 응답 - -operation::member-password-reset-error[snippets='http-response,response-fields'] +// ==== 에러 응답 +// +// operation::member-password-reset-error[snippets='http-response,response-fields'] ''' @@ -328,3 +328,69 @@ operation::member-widget-update[snippets='http-request,request-fields'] // ==== 에러 응답 // // operation::member-quest-property-update-error[snippets='http-response,response-fields'] + +=== 이메일 인증 코드 발송 (회원 가입) + +`POST /members/emails/codes/signup` + +회원가입에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다. + +==== 요청 헤더 + +operation::member-email-auth-code-create[snippets='request-headers'] + +==== 요청 본문 (JSON) + +operation::member-email-auth-code-create[snippets='http-request,request-fields'] + +==== 성공 응답 + +성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다. + +==== 에러 응답 (이미 가입된 이메일) + +operation::member-email-auth-code-create-error[snippets='http-response,response-fields'] + +''' + +=== 이메일 인증 코드 발송 (비밀번호 변경 시) + +`POST /members/emails/codes/passwords/reset` + +비밀번호 찾기에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다. + +==== 요청 헤더 + +operation::member-password-auth-code-create[snippets='request-headers'] + +==== 요청 본문 (JSON) + +operation::member-password-auth-code-create[snippets='http-request,request-fields'] + +==== 성공 응답 + +성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다. + +==== 에러 응답 (이미 가입된 이메일) + +operation::member-password-auth-code-create-error[snippets='http-response,response-fields'] + +''' + +=== 이메일 인증 코드 검증 + +`GET /members/emails/codes/verify` + +이메일로 발송된 인증 코드가 올바른지 검증합니다. + +==== 쿼리 파라미터 + +operation::member-email-auth-code-verify[snippets='query-parameters'] + +==== 성공 응답 + +operation::member-email-auth-code-verify[snippets='http-response,response-fields'] + +==== 에러 응답 (잘못된 인증 코드) + +operation::member-email-auth-code-verify-error[snippets='http-response,response-fields'] diff --git a/src/main/java/com/gomo/app/core/member/presentation/EmailCodeApi.java b/src/main/java/com/gomo/app/core/member/presentation/EmailCodeApi.java index a2339140..859ff50f 100644 --- a/src/main/java/com/gomo/app/core/member/presentation/EmailCodeApi.java +++ b/src/main/java/com/gomo/app/core/member/presentation/EmailCodeApi.java @@ -2,8 +2,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -38,8 +36,8 @@ public ResponseEntity createForPassword(@RequestBody Cr return ResponseEntity.status(HttpStatus.CREATED).body(CreateEmailCodeResponse.of(emailCode)); } - @GetMapping("/verify") - public ResponseEntity verify(@ModelAttribute VerifyEmailCodeRequest request) { + @PostMapping("/verify") + public ResponseEntity verify(@RequestBody VerifyEmailCodeRequest request) { String temporaryToken = verifyEmailCodeUseCase.verify(request.getEmail(), request.getCode()); return ResponseEntity.status(HttpStatus.OK).body(VerifyEmailCodeResponse.of(temporaryToken)); } diff --git a/src/main/java/com/gomo/app/core/member/presentation/request/ResetPasswordRequest.java b/src/main/java/com/gomo/app/core/member/presentation/request/ResetPasswordRequest.java index c565638f..7b8a069f 100644 --- a/src/main/java/com/gomo/app/core/member/presentation/request/ResetPasswordRequest.java +++ b/src/main/java/com/gomo/app/core/member/presentation/request/ResetPasswordRequest.java @@ -5,9 +5,9 @@ @Getter public class ResetPasswordRequest { - private String email; - private String newPassword; - private String temporaryToken; + private final String email; + private final String newPassword; + private final String temporaryToken; private ResetPasswordRequest(String email, String newPassword, String temporaryToken) { this.email = email; diff --git a/src/test/java/com/gomo/app/core/member/documentation/VerifyEmailAuthCodeDocumentationTest.java b/src/test/java/com/gomo/app/core/member/documentation/VerifyEmailAuthCodeDocumentationTest.java index 697aaf69..63b9d056 100644 --- a/src/test/java/com/gomo/app/core/member/documentation/VerifyEmailAuthCodeDocumentationTest.java +++ b/src/test/java/com/gomo/app/core/member/documentation/VerifyEmailAuthCodeDocumentationTest.java @@ -13,6 +13,7 @@ import org.springframework.restdocs.restassured.RestDocumentationFilter; import com.gomo.app.core.member.documentation.snippet.VerifyEmailAuthCodeSnippet; +import com.gomo.app.core.member.presentation.request.VerifyEmailCodeRequest; import com.gomo.app.support.auth.application.port.CreateAuthCodePortIn; import com.gomo.app.support.auth.domain.repository.AuthCodeRepository; import com.gomo.app.support.auth.exception.AuthErrorCode; @@ -44,10 +45,9 @@ void verify_email_auth_code_with_correct_code() { String authCode = authCodeRepository.findByEmail(sessionEmail).get(); given(this.specification).filter(filter) .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) - .param("email", sessionEmail) - .param("code", authCode) + .body(VerifyEmailCodeRequest.of(sessionEmail, authCode)) .when() - .get(URL) + .post(URL) .then() .statusCode(OK.value()); } @@ -57,10 +57,9 @@ void verify_email_auth_code_with_correct_code() { void verify_email_auth_code_with_incorrect_code() { given(this.specification).filter(errorFilter) .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) - .param("email", sessionEmail) - .param("code", "00000") + .body(VerifyEmailCodeRequest.of(sessionEmail, "000000")) .when() - .get(URL) + .post(URL) .then() .statusCode(AuthErrorCode.INVALID_AUTH_CODE.getHttpStatus()) .body("timestamp", instanceOf(String.class)) diff --git a/src/test/java/com/gomo/app/core/member/documentation/snippet/VerifyEmailAuthCodeSnippet.java b/src/test/java/com/gomo/app/core/member/documentation/snippet/VerifyEmailAuthCodeSnippet.java index 543cb9d9..40f25e77 100644 --- a/src/test/java/com/gomo/app/core/member/documentation/snippet/VerifyEmailAuthCodeSnippet.java +++ b/src/test/java/com/gomo/app/core/member/documentation/snippet/VerifyEmailAuthCodeSnippet.java @@ -2,7 +2,6 @@ import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.restdocs.request.RequestDocumentation.*; import static org.springframework.restdocs.restassured.RestAssuredRestDocumentation.*; import org.springframework.restdocs.payload.JsonFieldType; @@ -14,9 +13,9 @@ public class VerifyEmailAuthCodeSnippet { private static final String IDENTIFIER = "member-email-auth-code-verify"; - private static final Snippet QUERY_PARAMETERS = queryParameters( - parameterWithName("email").description("인증 코드를 받은 이메일 주소"), - parameterWithName("code").description("이메일로 발송된 인증 코드") + private static final Snippet REQUEST_FIELDS = requestFields( + fieldWithPath("email").description("인증 코드를 받은 이메일 주소"), + fieldWithPath("code").description("이메일로 발송된 인증 코드") ); private static final Snippet RESPONSE_FIELDS = responseFields( @@ -28,7 +27,7 @@ public static RestDocumentationFilter create() { IDENTIFIER, preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), - QUERY_PARAMETERS, + REQUEST_FIELDS, RESPONSE_FIELDS ); } @@ -38,7 +37,7 @@ public static RestDocumentationFilter createError() { IDENTIFIER + "-error", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), - QUERY_PARAMETERS, + REQUEST_FIELDS, ErrorResponseFields.RESPONSE_FIELDS ); } diff --git a/src/test/java/com/gomo/app/support/messagebroker/infrastructure/adapter/RabbitMQClientTest.java b/src/test/java/com/gomo/app/support/messagebroker/infrastructure/adapter/RabbitMQClientTest.java index 73d5377d..ba3f97c7 100644 --- a/src/test/java/com/gomo/app/support/messagebroker/infrastructure/adapter/RabbitMQClientTest.java +++ b/src/test/java/com/gomo/app/support/messagebroker/infrastructure/adapter/RabbitMQClientTest.java @@ -13,7 +13,7 @@ import com.gomo.app.test.WithRabbitMQ; import com.rabbitmq.client.ShutdownSignalException; -@DisplayName("[Infrastructure Integration]: RabbitMQ 접근 테스트") +@DisplayName("[Infrastructure Integration]: RabbitMQ 접근 테스트 (Flaky Test)") @IntegrationTest @WithRabbitMQ class RabbitMQClientTest {