From 3a2eac1443387fee6853c498d3f278f4591f81e0 Mon Sep 17 00:00:00 2001 From: ddongseop Date: Tue, 16 Jan 2024 23:35:28 +0900 Subject: [PATCH 1/8] =?UTF-8?q?=F0=9F=90=9B=20[FIX]=20CustomException=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=95=88=EC=B0=8D=ED=9E=88=EA=B2=8C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lequuServer/global/exception/GlobalExceptionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/lequuServer/global/exception/GlobalExceptionHandler.java b/src/main/java/org/sopt/lequuServer/global/exception/GlobalExceptionHandler.java index 170054c..5e14b27 100644 --- a/src/main/java/org/sopt/lequuServer/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/org/sopt/lequuServer/global/exception/GlobalExceptionHandler.java @@ -127,7 +127,7 @@ public ApiResponse handleRuntimeException(final RuntimeException e, f @ExceptionHandler(CustomException.class) protected ResponseEntity> handleCustomException(CustomException e) { - log.warn("CustomException Occured: {}", e.getMessage(), e); + log.warn("CustomException Occured: {}", e.getMessage()); return ResponseEntity.status(e.getHttpStatus()) .body(ApiResponse.error(e.getErrorType())); From 75c1224f7d51df7a2fe250f0c817137bea43fc34 Mon Sep 17 00:00:00 2001 From: ddongseop Date: Tue, 16 Jan 2024 23:36:33 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[REFACTOR]=20=EC=8A=A4?= =?UTF-8?q?=EC=9B=A8=EA=B1=B0=EB=A5=BC=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20#65?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/book/controller/BookApi.java | 45 +++++++++ .../book/controller/BookController.java | 31 +------ .../domain/common/controller/CommonApi.java | 36 +++++++ .../common/controller/CommonController.java | 23 +---- .../domain/member/controller/MemberApi.java | 93 +++++++++++++++++++ .../member/controller/MemberController.java | 58 +----------- .../domain/note/controller/NoteApi.java | 27 ++++++ .../note/controller/NoteController.java | 16 +--- .../domain/sticker/controller/StickerApi.java | 38 ++++++++ .../sticker/controller/StickerController.java | 24 +---- .../global/s3/controller/S3Api.java | 36 +++++++ .../global/s3/controller/S3Controller.java | 25 +---- 12 files changed, 284 insertions(+), 168 deletions(-) create mode 100644 src/main/java/org/sopt/lequuServer/domain/book/controller/BookApi.java create mode 100644 src/main/java/org/sopt/lequuServer/domain/common/controller/CommonApi.java create mode 100644 src/main/java/org/sopt/lequuServer/domain/member/controller/MemberApi.java create mode 100644 src/main/java/org/sopt/lequuServer/domain/note/controller/NoteApi.java create mode 100644 src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerApi.java create mode 100644 src/main/java/org/sopt/lequuServer/global/s3/controller/S3Api.java diff --git a/src/main/java/org/sopt/lequuServer/domain/book/controller/BookApi.java b/src/main/java/org/sopt/lequuServer/domain/book/controller/BookApi.java new file mode 100644 index 0000000..54746b4 --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/domain/book/controller/BookApi.java @@ -0,0 +1,45 @@ +package org.sopt.lequuServer.domain.book.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.sopt.lequuServer.domain.book.dto.request.BookCreateRequestDto; +import org.sopt.lequuServer.domain.book.dto.response.BookCreateResponseDto; +import org.sopt.lequuServer.domain.book.dto.response.BookDetailResponseDto; +import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; + +import java.security.Principal; + +@Tag(name = "Book", description = "레큐북 API") +public interface BookApi { + + @SecurityRequirement(name = "JWT Authorization") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "201", + description = "레큐북이 성공적으로 생성됐습니다.", + content = @Content(schema = @Schema(implementation = BookCreateResponseDto.class)) + ) + @Operation(summary = "레큐북 생성") + public ApiResponse createBook(@Valid @RequestBody BookCreateRequestDto request, Principal principal); + + @SecurityRequirement(name = "JWT Authorization") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "204", + description = "레큐북을 성공적으로 삭제했습니다." + ) + @Operation(summary = "레큐북 삭제") + public ApiResponse deleteBook(@Schema(example = "1") @PathVariable Long bookId); + + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "레큐북 상세 조회에 성공했습니다.", + content = @Content(schema = @Schema(implementation = BookDetailResponseDto.class)) + ) + @Operation(summary = "레큐북 상세 조회") + public ApiResponse getBookDetail(@Schema(example = "ee4f66f9-9cf4-4b28-90f4-f71d0ecba021") @PathVariable String bookUuid); +} diff --git a/src/main/java/org/sopt/lequuServer/domain/book/controller/BookController.java b/src/main/java/org/sopt/lequuServer/domain/book/controller/BookController.java index 757abce..230926f 100644 --- a/src/main/java/org/sopt/lequuServer/domain/book/controller/BookController.java +++ b/src/main/java/org/sopt/lequuServer/domain/book/controller/BookController.java @@ -1,10 +1,5 @@ package org.sopt.lequuServer.domain.book.controller; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.sopt.lequuServer.domain.book.dto.request.BookCreateRequestDto; @@ -22,45 +17,25 @@ @RestController @RequestMapping("/api/books") @RequiredArgsConstructor -@Tag(name = "Book", description = "레큐북 API") -public class BookController { +public class BookController implements BookApi { private final BookFacade bookFacade; @PostMapping - @SecurityRequirement(name = "JWT Authorization") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "201", - description = "레큐북이 성공적으로 생성됐습니다.", - content = @Content(schema = @Schema(implementation = BookCreateResponseDto.class)) - ) @ResponseStatus(HttpStatus.CREATED) - @Operation(summary = "레큐북 생성") public ApiResponse createBook(@Valid @RequestBody BookCreateRequestDto request, Principal principal) { return ApiResponse.success(SuccessType.CREATE_BOOK_SUCCESS, bookFacade.createBook(request, JwtProvider.getUserFromPrincial(principal))); } @DeleteMapping("/{bookId}") - @SecurityRequirement(name = "JWT Authorization") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "204", - description = "레큐북을 성공적으로 삭제했습니다." - ) - @Operation(summary = "레큐북 삭제") - public ApiResponse deleteBook(@Schema(example = "1") @PathVariable Long bookId) { + public ApiResponse deleteBook(@PathVariable Long bookId) { bookFacade.deleteBook(bookId); return ApiResponse.success(SuccessType.DELETE_BOOK_SUCCESS); } @GetMapping("/detail/{bookUuid}") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "레큐북 상세 조회에 성공했습니다.", - content = @Content(schema = @Schema(implementation = BookDetailResponseDto.class)) - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "레큐북 상세 조회") - public ApiResponse getBookDetail(@Schema(example = "ee4f66f9-9cf4-4b28-90f4-f71d0ecba021") @PathVariable String bookUuid) { + public ApiResponse getBookDetail(@PathVariable String bookUuid) { return ApiResponse.success(SuccessType.GET_BOOK_DETAIL_SUCCESS, bookFacade.getBookDetail(bookUuid)); } } \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonApi.java b/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonApi.java new file mode 100644 index 0000000..f7ba6d6 --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonApi.java @@ -0,0 +1,36 @@ +package org.sopt.lequuServer.domain.common.controller; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.sopt.lequuServer.domain.common.dto.response.PopularBookResponseDto; +import org.sopt.lequuServer.domain.common.dto.response.SplashDto; +import org.sopt.lequuServer.global.common.dto.ApiResponse; + +import java.util.List; + +@Tag(name = "Common", description = "홈 & 스플래시 API") +public interface CommonApi { + + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "스플래시 조회에 성공했습니다.", + content = @Content(schema = @Schema(implementation = SplashDto.class)) + ) + @Operation(summary = "스플래시 조회") + public ApiResponse getSplash(); + + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "홈 화면 조회에 성공했습니다.", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = PopularBookResponseDto.class))) + ) + @Operation(summary = "홈 조회") + public ApiResponse> getHome(); + + @Hidden + public ApiResponse test(); +} diff --git a/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonController.java b/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonController.java index baea74c..e54163c 100644 --- a/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonController.java +++ b/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonController.java @@ -1,12 +1,5 @@ package org.sopt.lequuServer.domain.common.controller; -import io.sentry.Sentry; -import io.swagger.v3.oas.annotations.Hidden; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.sopt.lequuServer.domain.common.dto.response.PopularBookResponseDto; import org.sopt.lequuServer.domain.common.dto.response.SplashDto; @@ -24,36 +17,22 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/common") -@Tag(name = "Common", description = "홈 & 스플래시 API") -public class CommonController { +public class CommonController implements CommonApi { private final CommonFacade commonFacade; @GetMapping("/splash") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "스플래시 조회에 성공했습니다.", - content = @Content(schema = @Schema(implementation = SplashDto.class)) - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "스플래시 조회") public ApiResponse getSplash() { return ApiResponse.success(SuccessType.GET_SPLASH_SUCCESS, commonFacade.getSplash()); } @GetMapping("/home") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "홈 화면 조회에 성공했습니다.", - content = @Content(array = @ArraySchema(schema = @Schema(implementation = PopularBookResponseDto.class))) - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "홈 조회") public ApiResponse> getHome() { return ApiResponse.success(SuccessType.GET_HOME_SUCCESS, commonFacade.getHome()); } - @Hidden @GetMapping("/test") @ResponseStatus(HttpStatus.OK) public ApiResponse test() { diff --git a/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberApi.java b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberApi.java new file mode 100644 index 0000000..9975fbd --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberApi.java @@ -0,0 +1,93 @@ +package org.sopt.lequuServer.domain.member.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.sopt.lequuServer.domain.member.dto.request.MemberNicknameRequestDto; +import org.sopt.lequuServer.domain.member.dto.request.SocialLoginRequestDto; +import org.sopt.lequuServer.domain.member.dto.response.MemberLoginResponseDto; +import org.sopt.lequuServer.domain.member.dto.response.MemberNicknameResponseDto; +import org.sopt.lequuServer.domain.member.dto.response.MypageBookResponseDto; +import org.sopt.lequuServer.domain.member.dto.response.MypageNoteResponseDto; +import org.sopt.lequuServer.global.auth.jwt.TokenDto; +import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.security.Principal; + +@Tag(name = "Member", description = "마이페이지 & 로그인 관련 API") +public interface MemberApi { + + @SecurityRequirement(name = "KAKAO Token") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "로그인에 성공했습니다.", + content = @Content(schema = @Schema(implementation = MemberLoginResponseDto.class)) + ) + @Operation(summary = "로그인 + 회원가입") + public ApiResponse login( + @Schema(description = "카카오 Access 토큰 (아래 박스에는 아무거나 입력)", example = "ZC57anP1qo58PNNJhKG1MBz9BImWMWih65gKPXKYAAABjQkwKSIh5oEAb4_jFQ") + @RequestHeader("Authorization") String socialAccessToken, + @RequestBody SocialLoginRequestDto request); + + + @SecurityRequirement(name = "JWT Authorization") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "Access 토큰 재발급에 성공했습니다.", + content = @Content(schema = @Schema(implementation = TokenDto.class)) + ) + @Operation(summary = "엑세스 토큰 재발급") + public ApiResponse reissue( + @Schema(description = "Refresh 토큰 (아래 박스에는 아무거나 입력)", example = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3MDUyNTc0MDMsImV4cCI6MTc2ODMyOTQwMywibWVtYmVySWQiOjF9.qKP6AZc9EnA_6DLXJGHzURcJXlER8-mvUnPppEVCGfW4iyQGMS0ZT3f09K0khZBtEXHgMuyKy1m4K-GtSKtRAg") + @RequestHeader("Authorization") String refreshToken); + + @SecurityRequirement(name = "JWT Authorization") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "로그아웃에 성공했습니다." + ) + @Operation(summary = "로그아웃") + public ApiResponse logout(Principal principal); + + @SecurityRequirement(name = "KAKAO Token") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "카카오 엑세스 토큰을 가져오는데 성공했습니다." + ) + @Operation(summary = "카카오 엑세스 토큰 발급") + public ApiResponse kakaoAccessToken( + @Schema(description = "카카오 Authorization 코드 (아래 박스에는 아무거나 입력)", example = "u13t6n_uzDy3VbtRhvmtiOHIVioVMvFPTrrEK_lDgmd7-bY0GMD8FAi8TzUKPXNNAAABjQkwFpiSBpCp5rpDbg") + @RequestHeader("Authorization") String code); + + @SecurityRequirement(name = "JWT Authorization") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "유저 닉네임을 설정하여 회원가입에 성공했습니다.", + content = @Content(schema = @Schema(implementation = MemberNicknameResponseDto.class)) + ) + @Operation(summary = "유저 닉네임 설정") + public ApiResponse setMemberNickname(Principal principal, @Valid @RequestBody MemberNicknameRequestDto request); + + @SecurityRequirement(name = "JWT Authorization") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "마이페이지의 유저 닉네임과 내 레큐북 조회에 성공했습니다.", + content = @Content(schema = @Schema(implementation = MypageBookResponseDto.class)) + ) + @Operation(summary = "마이페이지 레큐북 조회") + public ApiResponse getMypageBook(Principal principal); + + @SecurityRequirement(name = "JWT Authorization") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "마이페이지의 유저 닉네임과 내 레큐노트 조회에 성공했습니다.", + content = @Content(schema = @Schema(implementation = MypageNoteResponseDto.class)) + ) + @Operation(summary = "마이페이지 레큐노트 조회") + public ApiResponse getMypageNote(Principal principal); +} diff --git a/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java index 48904d3..f389ae5 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java @@ -1,10 +1,5 @@ package org.sopt.lequuServer.domain.member.controller; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.sopt.lequuServer.domain.member.dto.request.MemberNicknameRequestDto; @@ -29,23 +24,14 @@ @RestController @RequestMapping("/api") @RequiredArgsConstructor -@Tag(name = "Member", description = "마이페이지 & 로그인 관련 API") -public class MemberController { +public class MemberController implements MemberApi { private final MemberService memberService; private final KakaoLoginService kakaoLoginService; @PostMapping("/login") - @SecurityRequirement(name = "KAKAO Token") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "로그인에 성공했습니다.", - content = @Content(schema = @Schema(implementation = MemberLoginResponseDto.class)) - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "로그인 + 회원가입") public ApiResponse login( - @Schema(description = "카카오 Access 토큰 (아래 박스에는 아무거나 입력)", example = "ZC57anP1qo58PNNJhKG1MBz9BImWMWih65gKPXKYAAABjQkwKSIh5oEAb4_jFQ") @RequestHeader("Authorization") String socialAccessToken, @RequestBody SocialLoginRequestDto request) { @@ -53,29 +39,15 @@ public ApiResponse login( } @GetMapping("/reissue") - @SecurityRequirement(name = "JWT Authorization") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "Access 토큰 재발급에 성공했습니다.", - content = @Content(schema = @Schema(implementation = TokenDto.class)) - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "엑세스 토큰 재발급") public ApiResponse reissue( - @Schema(description = "Refresh 토큰 (아래 박스에는 아무거나 입력)", example = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3MDUyNTc0MDMsImV4cCI6MTc2ODMyOTQwMywibWVtYmVySWQiOjF9.qKP6AZc9EnA_6DLXJGHzURcJXlER8-mvUnPppEVCGfW4iyQGMS0ZT3f09K0khZBtEXHgMuyKy1m4K-GtSKtRAg") @RequestHeader("Authorization") String refreshToken) { return ApiResponse.success(SuccessType.REISSUE_SUCCESS, memberService.reissueToken(refreshToken)); } @PatchMapping("/log-out") // Spring Security 자체의 logout과 겹치지 않기 위해 이렇게 설정 - @SecurityRequirement(name = "JWT Authorization") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "로그아웃에 성공했습니다." - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "로그아웃") public ApiResponse logout(Principal principal) { memberService.logout(JwtProvider.getUserFromPrincial(principal)); @@ -83,55 +55,27 @@ public ApiResponse logout(Principal principal) { } @GetMapping("/kakao") - @SecurityRequirement(name = "KAKAO Token") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "카카오 엑세스 토큰을 가져오는데 성공했습니다." - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "카카오 엑세스 토큰 발급") public ApiResponse kakaoAccessToken( - @Schema(description = "카카오 Authorization 코드 (아래 박스에는 아무거나 입력)", example = "u13t6n_uzDy3VbtRhvmtiOHIVioVMvFPTrrEK_lDgmd7-bY0GMD8FAi8TzUKPXNNAAABjQkwFpiSBpCp5rpDbg") @RequestHeader("Authorization") String code) { return ApiResponse.success(SuccessType.KAKAO_ACCESS_TOKEN_SUCCESS, kakaoLoginService.getKakaoAccessToken(code)); } @PatchMapping("/nickname") - @SecurityRequirement(name = "JWT Authorization") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "유저 닉네임을 설정하여 회원가입에 성공했습니다.", - content = @Content(schema = @Schema(implementation = MemberNicknameResponseDto.class)) - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "유저 닉네임 설정") public ApiResponse setMemberNickname(Principal principal, @Valid @RequestBody MemberNicknameRequestDto request) { return ApiResponse.success(SET_MEMBER_NICKNAME_SUCCESS, memberService.setMemberNickname(JwtProvider.getUserFromPrincial(principal), request)); } @GetMapping("/mypage/book") - @SecurityRequirement(name = "JWT Authorization") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "마이페이지의 유저 닉네임과 내 레큐북 조회에 성공했습니다.", - content = @Content(schema = @Schema(implementation = MypageBookResponseDto.class)) - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "마이페이지 레큐북 조회") public ApiResponse getMypageBook(Principal principal) { return ApiResponse.success(GET_MYPAGE_BOOK_SUCCESS, memberService.getMypageBook(JwtProvider.getUserFromPrincial(principal))); } @GetMapping("/mypage/note") - @SecurityRequirement(name = "JWT Authorization") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "마이페이지의 유저 닉네임과 내 레큐노트 조회에 성공했습니다.", - content = @Content(schema = @Schema(implementation = MypageNoteResponseDto.class)) - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "마이페이지 레큐노트 조회") public ApiResponse getMypageNote(Principal principal) { return ApiResponse.success(GET_MYPAGE_NOTE_SUCCESS, memberService.getMypageNote(JwtProvider.getUserFromPrincial(principal))); } diff --git a/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteApi.java b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteApi.java new file mode 100644 index 0000000..e92c6cb --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteApi.java @@ -0,0 +1,27 @@ +package org.sopt.lequuServer.domain.note.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.sopt.lequuServer.domain.note.dto.request.NoteCreateDto; +import org.sopt.lequuServer.domain.note.dto.response.NoteCreateResponseDto; +import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.springframework.web.bind.annotation.RequestBody; + +import java.security.Principal; + +@Tag(name = "Note", description = "레큐 노트 API") +@SecurityRequirement(name = "JWT Authorization") +public interface NoteApi { + + @Operation(summary = "레큐노트 생성") + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "201", + description = "레큐노트를 성공적으로 생성했습니다.", + content = @Content(schema = @Schema(implementation = NoteCreateResponseDto.class)) + ) + public ApiResponse createNote(Principal principal, @RequestBody @Valid NoteCreateDto noteCreateDto); +} diff --git a/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java index c72af53..df2060a 100644 --- a/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java +++ b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java @@ -1,14 +1,8 @@ package org.sopt.lequuServer.domain.note.controller; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.sopt.lequuServer.domain.note.dto.request.NoteCreateDto; -import org.sopt.lequuServer.domain.note.dto.response.NoteCreateResponseDto; import org.sopt.lequuServer.domain.note.facade.NoteFacade; import org.sopt.lequuServer.global.auth.jwt.JwtProvider; import org.sopt.lequuServer.global.common.dto.ApiResponse; @@ -21,19 +15,11 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/notes") -@Tag(name = "Note", description = "레큐 노트 API") -@SecurityRequirement(name = "JWT Authorization") -public class NoteController { +public class NoteController implements NoteApi { private final NoteFacade noteFacade; - @Operation(summary = "레큐노트 생성") @PostMapping - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "201", - description = "레큐노트를 성공적으로 생성했습니다.", - content = @Content(schema = @Schema(implementation = NoteCreateResponseDto.class)) - ) @ResponseStatus(HttpStatus.CREATED) public ApiResponse createNote(Principal principal, @RequestBody @Valid NoteCreateDto noteCreateDto) { return ApiResponse.success(SuccessType.CREATE_NOTE_SUCCESS, noteFacade.createNote(JwtProvider.getUserFromPrincial(principal), noteCreateDto)); diff --git a/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerApi.java b/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerApi.java new file mode 100644 index 0000000..1b902be --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerApi.java @@ -0,0 +1,38 @@ +package org.sopt.lequuServer.domain.sticker.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.sopt.lequuServer.domain.sticker.dto.request.StickerPostRequestDto; +import org.sopt.lequuServer.domain.sticker.dto.response.StickerPackResponseDto; +import org.sopt.lequuServer.domain.sticker.dto.response.StickerPostResponseDto; +import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; + +import java.security.Principal; +import java.util.List; + +@Tag(name = "Sticker", description = "스티커 API") +@SecurityRequirement(name = "JWT Authorization") +public interface StickerApi { + + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "스티커팩 목록 조회에 성공했습니다.", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = StickerPackResponseDto.class))) + ) + @Operation(summary = "스티커팩 목록 불러오기") + public ApiResponse> getStickerPackList(@Schema(example = "1") @PathVariable Long bookId); + + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "201", + description = "스티커 부착에 성공했습니다.", + content = @Content(schema = @Schema(implementation = StickerPostResponseDto.class)) + ) + @Operation(summary = "스티커 부착하기") + public ApiResponse postSticker(Principal principal, @RequestBody StickerPostRequestDto request); +} diff --git a/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerController.java b/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerController.java index 6503f0a..a50092a 100644 --- a/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerController.java +++ b/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerController.java @@ -1,11 +1,5 @@ package org.sopt.lequuServer.domain.sticker.controller; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.sopt.lequuServer.domain.sticker.dto.request.StickerPostRequestDto; import org.sopt.lequuServer.domain.sticker.dto.response.StickerPackResponseDto; @@ -26,33 +20,19 @@ @RestController @RequestMapping("/api/stickers") @RequiredArgsConstructor -@Tag(name = "Sticker", description = "스티커 API") -@SecurityRequirement(name = "JWT Authorization") -public class StickerController { +public class StickerController implements StickerApi { private final StickerService stickerService; private final StickerFacade stickerFacade; @GetMapping("/{bookId}") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "스티커팩 목록 조회에 성공했습니다.", - content = @Content(array = @ArraySchema(schema = @Schema(implementation = StickerPackResponseDto.class))) - ) @ResponseStatus(HttpStatus.OK) - @Operation(summary = "스티커팩 목록 불러오기") - public ApiResponse> getStickerPackList(@Schema(example = "1") @PathVariable Long bookId) { + public ApiResponse> getStickerPackList(@PathVariable Long bookId) { return ApiResponse.success(GET_STICKER_PACK_SUCCESS, stickerService.getStickerPackList(bookId)); } @PostMapping - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "201", - description = "스티커 부착에 성공했습니다.", - content = @Content(schema = @Schema(implementation = StickerPostResponseDto.class)) - ) @ResponseStatus(HttpStatus.CREATED) - @Operation(summary = "스티커 부착하기") public ApiResponse postSticker(Principal principal, @RequestBody StickerPostRequestDto request) { return ApiResponse.success(POST_STICKER_SUCCESS, stickerFacade.postSticker(JwtProvider.getUserFromPrincial(principal), request)); } diff --git a/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Api.java b/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Api.java new file mode 100644 index 0000000..e338718 --- /dev/null +++ b/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Api.java @@ -0,0 +1,36 @@ +package org.sopt.lequuServer.global.s3.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.sopt.lequuServer.global.s3.dto.PreSignedUrlResponse; + +@Tag(name = "S3", description = "S3관련 API") +public interface S3Api { + + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "Presigned Url이 생성되어 성공적으로 반환되었습니다.", + content = @Content(schema = @Schema(implementation = PreSignedUrlResponse.class)) + ) + @Operation(summary = "레큐북 PreSignedUrl 가져오기") + public ApiResponse getPreSignedUrlBook(); + + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "Presigned Url이 생성되어 성공적으로 반환되었습니다.", + content = @Content(schema = @Schema(implementation = PreSignedUrlResponse.class)) + ) + @Operation(summary = "레큐노트 PreSignedUrl 가져오기") + public ApiResponse getPreSignedUrlNote(); + + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "Presigned Url이 생성되어 성공적으로 반환되었습니다.", + content = @Content(schema = @Schema(implementation = PreSignedUrlResponse.class)) + ) + @Operation(summary = "스티커 PreSignedUrl 가져오기") + public ApiResponse getPreSignedUrlSticker(); +} diff --git a/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Controller.java b/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Controller.java index 40137a2..38e90d0 100644 --- a/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Controller.java +++ b/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Controller.java @@ -1,9 +1,5 @@ package org.sopt.lequuServer.global.s3.controller; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.sopt.lequuServer.global.common.dto.ApiResponse; import org.sopt.lequuServer.global.s3.dto.PreSignedUrlResponse; @@ -23,40 +19,21 @@ @RestController @RequestMapping("/api/images") @RequiredArgsConstructor -@Tag(name = "S3", description = "S3관련 API") -public class S3Controller { +public class S3Controller implements S3Api { private final S3Service s3Service; @GetMapping("/book") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "Presigned Url이 생성되어 성공적으로 반환되었습니다.", - content = @Content(schema = @Schema(implementation = PreSignedUrlResponse.class)) - ) - @Operation(summary = "레큐북 PreSignedUrl 가져오기") public ApiResponse getPreSignedUrlBook() { return ApiResponse.success(PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(BOOK_FAVORITE_IMAGE_FOLDER_NAME.getValue())); } @GetMapping("/note") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "Presigned Url이 생성되어 성공적으로 반환되었습니다.", - content = @Content(schema = @Schema(implementation = PreSignedUrlResponse.class)) - ) - @Operation(summary = "레큐노트 PreSignedUrl 가져오기") public ApiResponse getPreSignedUrlNote() { return ApiResponse.success(PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(NOTE_BACKGROUND_IMAGE_FOLDER_NAME.getValue())); } @GetMapping("/sticker") - @io.swagger.v3.oas.annotations.responses.ApiResponse( - responseCode = "200", - description = "Presigned Url이 생성되어 성공적으로 반환되었습니다.", - content = @Content(schema = @Schema(implementation = PreSignedUrlResponse.class)) - ) - @Operation(summary = "스티커 PreSignedUrl 가져오기") public ApiResponse getPreSignedUrlSticker() { return ApiResponse.success(PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(STICKER_IMAGE_FOLDER_NAME.getValue())); } From b97c661e5acedc644d2b347bc49579c223456dd0 Mon Sep 17 00:00:00 2001 From: ddongseop Date: Tue, 16 Jan 2024 23:56:37 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[REFACTOR]=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EB=AA=85=EC=97=90=EC=84=9C=20List=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20#65?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/dto/response/BookDetailResponseDto.java | 14 +++++++------- .../member/dto/response/MypageBookResponseDto.java | 8 ++++---- ...esponseDto.java => MypageBooksResponseDto.java} | 6 +++--- .../member/dto/response/MypageNoteResponseDto.java | 8 ++++---- ...esponseDto.java => MypageNotesResponseDto.java} | 6 +++--- .../dto/response/StickerPackResponseDto.java | 2 +- 6 files changed, 22 insertions(+), 22 deletions(-) rename src/main/java/org/sopt/lequuServer/domain/member/dto/response/{MypageBookListResponseDto.java => MypageBooksResponseDto.java} (88%) rename src/main/java/org/sopt/lequuServer/domain/member/dto/response/{MypageNoteListResponseDto.java => MypageNotesResponseDto.java} (86%) diff --git a/src/main/java/org/sopt/lequuServer/domain/book/dto/response/BookDetailResponseDto.java b/src/main/java/org/sopt/lequuServer/domain/book/dto/response/BookDetailResponseDto.java index 4a3aada..cdb3064 100644 --- a/src/main/java/org/sopt/lequuServer/domain/book/dto/response/BookDetailResponseDto.java +++ b/src/main/java/org/sopt/lequuServer/domain/book/dto/response/BookDetailResponseDto.java @@ -43,9 +43,9 @@ public record BookDetailResponseDto( @Schema(description = "레큐 노트 개수", example = "100") int noteNum, - List noteList, + List noteDetailDtos, - List postedStickerList + List postedStickerDetailDtos ) { public static BookDetailResponseDto of(Book book) { String bookDate = formatLocalDate(book); @@ -57,22 +57,22 @@ public static BookDetailResponseDto of(Book book) { // 레큐노트 리스트 가공 int renderTypeCounter = 1; - List noteList = new ArrayList<>(); + List noteDetailDtos = new ArrayList<>(); for (Note note : sortedNotes) { - noteList.add(NoteDetailResponseDto.of(note, renderTypeCounter)); + noteDetailDtos.add(NoteDetailResponseDto.of(note, renderTypeCounter)); renderTypeCounter = (renderTypeCounter % 6 == 0) ? 1 : renderTypeCounter + 1; } // 부착된 스티커 리스트 가공 List postedStickers = book.getPostedStickers(); - List postedStickerList = new ArrayList<>(); + List postedStickerDetailDtos = new ArrayList<>(); for (PostedSticker postedSticker : postedStickers) { - postedStickerList.add(PostedStickerDetailResponseDto.of(postedSticker)); + postedStickerDetailDtos.add(PostedStickerDetailResponseDto.of(postedSticker)); } return new BookDetailResponseDto(book.getId(), book.getFavoriteImage(), book.getFavoriteName(), book.getTitle(), book.getDescription(), bookDate, book.getMember().getNickname(), - book.getBackgroundColor(), book.getNotes().size(), noteList, postedStickerList + book.getBackgroundColor(), book.getNotes().size(), noteDetailDtos, postedStickerDetailDtos ); } diff --git a/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBookResponseDto.java b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBookResponseDto.java index 5dd2fad..64f9793 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBookResponseDto.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBookResponseDto.java @@ -12,15 +12,15 @@ public record MypageBookResponseDto( @Schema(description = "유저 닉네임", example = "레큐") String memberNickname, - List bookList + List bookDtos ) { public static MypageBookResponseDto of(String nickName, List books) { - List bookList = books.stream() + List bookDtos = books.stream() .sorted(comparing(Book::getCreatedAt).reversed()) - .map(MypageBookListResponseDto::of) + .map(MypageBooksResponseDto::of) .toList(); - return new MypageBookResponseDto(nickName, bookList); + return new MypageBookResponseDto(nickName, bookDtos); } } diff --git a/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBookListResponseDto.java b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBooksResponseDto.java similarity index 88% rename from src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBookListResponseDto.java rename to src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBooksResponseDto.java index 4f5d13d..3aaf236 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBookListResponseDto.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageBooksResponseDto.java @@ -5,7 +5,7 @@ import java.time.format.DateTimeFormatter; -public record MypageBookListResponseDto( +public record MypageBooksResponseDto( @Schema(description = "레큐북 고유 id", example = "1") Long bookId, @@ -25,11 +25,11 @@ public record MypageBookListResponseDto( @Schema(description = "레큐노트 개수", example = "1974") int noteNum ) { - public static MypageBookListResponseDto of(Book book) { + public static MypageBooksResponseDto of(Book book) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); String bookDate = book.getCreatedAt().format(formatter); - return new MypageBookListResponseDto( + return new MypageBooksResponseDto( book.getId(), book.getUuid(), book.getFavoriteName(), diff --git a/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNoteResponseDto.java b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNoteResponseDto.java index 9cc50e0..10ae246 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNoteResponseDto.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNoteResponseDto.java @@ -12,15 +12,15 @@ public record MypageNoteResponseDto( @Schema(description = "유저 닉네임", example = "레큐") String memberNickname, - List noteList + List noteDtos ) { public static MypageNoteResponseDto of(String nickName, List notes) { - List noteList = notes.stream() + List noteDtos = notes.stream() .sorted(comparing(Note::getCreatedAt).reversed()) - .map(MypageNoteListResponseDto::of) + .map(MypageNotesResponseDto::of) .toList(); - return new MypageNoteResponseDto(nickName, noteList); + return new MypageNoteResponseDto(nickName, noteDtos); } } diff --git a/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNoteListResponseDto.java b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNotesResponseDto.java similarity index 86% rename from src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNoteListResponseDto.java rename to src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNotesResponseDto.java index 0b4ccf6..d1373ec 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNoteListResponseDto.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/dto/response/MypageNotesResponseDto.java @@ -5,7 +5,7 @@ import java.time.format.DateTimeFormatter; -public record MypageNoteListResponseDto( +public record MypageNotesResponseDto( @Schema(description = "레큐북 UUID", example = "ee4f66f9-9cf4-4b28-90f4-f71d0ecba021") String bookUuid, @@ -31,11 +31,11 @@ public record MypageNoteListResponseDto( @Schema(description = "레큐노트 배경 (#929DD9 or 이미지 URL(*.jpg))", example = "https://dzfv99wxq6tx0.cloudfront.net/notes/background_image/676c2ca3-f868-423f-8000-a0bcb67dc797.jpg") String noteBackground ) { - public static MypageNoteListResponseDto of(Note note) { + public static MypageNotesResponseDto of(Note note) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); String noteDate = note.getCreatedAt().format(formatter); - return new MypageNoteListResponseDto(note.getBook().getUuid(), note.getBook().getFavoriteName(), note.getBook().getTitle(), + return new MypageNotesResponseDto(note.getBook().getUuid(), note.getBook().getFavoriteName(), note.getBook().getTitle(), note.getId(), note.getContent(), noteDate, note.getTextColor(), note.getBackground()); } } diff --git a/src/main/java/org/sopt/lequuServer/domain/sticker/dto/response/StickerPackResponseDto.java b/src/main/java/org/sopt/lequuServer/domain/sticker/dto/response/StickerPackResponseDto.java index 452a9e7..4603ac4 100644 --- a/src/main/java/org/sopt/lequuServer/domain/sticker/dto/response/StickerPackResponseDto.java +++ b/src/main/java/org/sopt/lequuServer/domain/sticker/dto/response/StickerPackResponseDto.java @@ -14,7 +14,7 @@ public record StickerPackResponseDto( @Schema(description = "스티커 카테코리", example = "생일") String stickerCategory, - List stickerList + List stickerDtos ) { // 스티커의 카테고리를 기준으로 분류해 List 생성 From 5fd1ee456e1385aeb59fe7b4a5fda1447435bec5 Mon Sep 17 00:00:00 2001 From: ddongseop Date: Wed, 17 Jan 2024 00:30:39 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[REFACTOR]=20ResponseE?= =?UTF-8?q?ntity=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20#65?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/book/controller/BookApi.java | 7 ++-- .../book/controller/BookController.java | 15 ++++---- .../domain/common/controller/CommonApi.java | 7 ++-- .../common/controller/CommonController.java | 16 +++----- .../domain/member/controller/MemberApi.java | 15 ++++---- .../member/controller/MemberController.java | 37 ++++++++----------- .../domain/note/controller/NoteApi.java | 3 +- .../note/controller/NoteController.java | 6 +-- .../domain/sticker/controller/StickerApi.java | 5 ++- .../sticker/controller/StickerController.java | 11 +++--- .../global/exception/enums/SuccessType.java | 4 +- .../global/s3/controller/S3Api.java | 7 ++-- .../global/s3/controller/S3Controller.java | 13 ++++--- 13 files changed, 70 insertions(+), 76 deletions(-) diff --git a/src/main/java/org/sopt/lequuServer/domain/book/controller/BookApi.java b/src/main/java/org/sopt/lequuServer/domain/book/controller/BookApi.java index 54746b4..7c53dee 100644 --- a/src/main/java/org/sopt/lequuServer/domain/book/controller/BookApi.java +++ b/src/main/java/org/sopt/lequuServer/domain/book/controller/BookApi.java @@ -10,6 +10,7 @@ import org.sopt.lequuServer.domain.book.dto.response.BookCreateResponseDto; import org.sopt.lequuServer.domain.book.dto.response.BookDetailResponseDto; import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -25,7 +26,7 @@ public interface BookApi { content = @Content(schema = @Schema(implementation = BookCreateResponseDto.class)) ) @Operation(summary = "레큐북 생성") - public ApiResponse createBook(@Valid @RequestBody BookCreateRequestDto request, Principal principal); + public ResponseEntity> createBook(@Valid @RequestBody BookCreateRequestDto request, Principal principal); @SecurityRequirement(name = "JWT Authorization") @io.swagger.v3.oas.annotations.responses.ApiResponse( @@ -33,7 +34,7 @@ public interface BookApi { description = "레큐북을 성공적으로 삭제했습니다." ) @Operation(summary = "레큐북 삭제") - public ApiResponse deleteBook(@Schema(example = "1") @PathVariable Long bookId); + public ResponseEntity deleteBook(@Schema(example = "1") @PathVariable Long bookId); @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "200", @@ -41,5 +42,5 @@ public interface BookApi { content = @Content(schema = @Schema(implementation = BookDetailResponseDto.class)) ) @Operation(summary = "레큐북 상세 조회") - public ApiResponse getBookDetail(@Schema(example = "ee4f66f9-9cf4-4b28-90f4-f71d0ecba021") @PathVariable String bookUuid); + public ResponseEntity> getBookDetail(@Schema(example = "ee4f66f9-9cf4-4b28-90f4-f71d0ecba021") @PathVariable String bookUuid); } diff --git a/src/main/java/org/sopt/lequuServer/domain/book/controller/BookController.java b/src/main/java/org/sopt/lequuServer/domain/book/controller/BookController.java index 230926f..81c4db9 100644 --- a/src/main/java/org/sopt/lequuServer/domain/book/controller/BookController.java +++ b/src/main/java/org/sopt/lequuServer/domain/book/controller/BookController.java @@ -10,6 +10,7 @@ import org.sopt.lequuServer.global.common.dto.ApiResponse; import org.sopt.lequuServer.global.exception.enums.SuccessType; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.security.Principal; @@ -22,20 +23,18 @@ public class BookController implements BookApi { private final BookFacade bookFacade; @PostMapping - @ResponseStatus(HttpStatus.CREATED) - public ApiResponse createBook(@Valid @RequestBody BookCreateRequestDto request, Principal principal) { - return ApiResponse.success(SuccessType.CREATE_BOOK_SUCCESS, bookFacade.createBook(request, JwtProvider.getUserFromPrincial(principal))); + public ResponseEntity> createBook(@Valid @RequestBody BookCreateRequestDto request, Principal principal) { + return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(SuccessType.CREATE_BOOK_SUCCESS, bookFacade.createBook(request, JwtProvider.getUserFromPrincial(principal)))); } @DeleteMapping("/{bookId}") - public ApiResponse deleteBook(@PathVariable Long bookId) { + public ResponseEntity deleteBook(@PathVariable Long bookId) { bookFacade.deleteBook(bookId); - return ApiResponse.success(SuccessType.DELETE_BOOK_SUCCESS); + return ResponseEntity.noContent().build(); } @GetMapping("/detail/{bookUuid}") - @ResponseStatus(HttpStatus.OK) - public ApiResponse getBookDetail(@PathVariable String bookUuid) { - return ApiResponse.success(SuccessType.GET_BOOK_DETAIL_SUCCESS, bookFacade.getBookDetail(bookUuid)); + public ResponseEntity> getBookDetail(@PathVariable String bookUuid) { + return ResponseEntity.ok(ApiResponse.success(SuccessType.GET_BOOK_DETAIL_SUCCESS, bookFacade.getBookDetail(bookUuid))); } } \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonApi.java b/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonApi.java index f7ba6d6..cd4ce7a 100644 --- a/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonApi.java +++ b/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonApi.java @@ -9,6 +9,7 @@ import org.sopt.lequuServer.domain.common.dto.response.PopularBookResponseDto; import org.sopt.lequuServer.domain.common.dto.response.SplashDto; import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.springframework.http.ResponseEntity; import java.util.List; @@ -21,7 +22,7 @@ public interface CommonApi { content = @Content(schema = @Schema(implementation = SplashDto.class)) ) @Operation(summary = "스플래시 조회") - public ApiResponse getSplash(); + public ResponseEntity> getSplash(); @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "200", @@ -29,8 +30,8 @@ public interface CommonApi { content = @Content(array = @ArraySchema(schema = @Schema(implementation = PopularBookResponseDto.class))) ) @Operation(summary = "홈 조회") - public ApiResponse> getHome(); + public ResponseEntity>> getHome(); @Hidden - public ApiResponse test(); + public ResponseEntity> test(); } diff --git a/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonController.java b/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonController.java index e54163c..c88ab8a 100644 --- a/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonController.java +++ b/src/main/java/org/sopt/lequuServer/domain/common/controller/CommonController.java @@ -6,10 +6,9 @@ import org.sopt.lequuServer.domain.common.facade.CommonFacade; import org.sopt.lequuServer.global.common.dto.ApiResponse; import org.sopt.lequuServer.global.exception.enums.SuccessType; -import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -22,20 +21,17 @@ public class CommonController implements CommonApi { private final CommonFacade commonFacade; @GetMapping("/splash") - @ResponseStatus(HttpStatus.OK) - public ApiResponse getSplash() { - return ApiResponse.success(SuccessType.GET_SPLASH_SUCCESS, commonFacade.getSplash()); + public ResponseEntity> getSplash() { + return ResponseEntity.ok(ApiResponse.success(SuccessType.GET_SPLASH_SUCCESS, commonFacade.getSplash())); } @GetMapping("/home") - @ResponseStatus(HttpStatus.OK) - public ApiResponse> getHome() { - return ApiResponse.success(SuccessType.GET_HOME_SUCCESS, commonFacade.getHome()); + public ResponseEntity>> getHome() { + return ResponseEntity.ok(ApiResponse.success(SuccessType.GET_HOME_SUCCESS, commonFacade.getHome())); } @GetMapping("/test") - @ResponseStatus(HttpStatus.OK) - public ApiResponse test() { + public ResponseEntity> test() { throw new RuntimeException("테스트용 에러 발생"); } } diff --git a/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberApi.java b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberApi.java index 9975fbd..f229b81 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberApi.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberApi.java @@ -14,6 +14,7 @@ import org.sopt.lequuServer.domain.member.dto.response.MypageNoteResponseDto; import org.sopt.lequuServer.global.auth.jwt.TokenDto; import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; @@ -29,7 +30,7 @@ public interface MemberApi { content = @Content(schema = @Schema(implementation = MemberLoginResponseDto.class)) ) @Operation(summary = "로그인 + 회원가입") - public ApiResponse login( + public ResponseEntity> login( @Schema(description = "카카오 Access 토큰 (아래 박스에는 아무거나 입력)", example = "ZC57anP1qo58PNNJhKG1MBz9BImWMWih65gKPXKYAAABjQkwKSIh5oEAb4_jFQ") @RequestHeader("Authorization") String socialAccessToken, @RequestBody SocialLoginRequestDto request); @@ -42,7 +43,7 @@ public ApiResponse login( content = @Content(schema = @Schema(implementation = TokenDto.class)) ) @Operation(summary = "엑세스 토큰 재발급") - public ApiResponse reissue( + public ResponseEntity> reissue( @Schema(description = "Refresh 토큰 (아래 박스에는 아무거나 입력)", example = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3MDUyNTc0MDMsImV4cCI6MTc2ODMyOTQwMywibWVtYmVySWQiOjF9.qKP6AZc9EnA_6DLXJGHzURcJXlER8-mvUnPppEVCGfW4iyQGMS0ZT3f09K0khZBtEXHgMuyKy1m4K-GtSKtRAg") @RequestHeader("Authorization") String refreshToken); @@ -52,7 +53,7 @@ public ApiResponse reissue( description = "로그아웃에 성공했습니다." ) @Operation(summary = "로그아웃") - public ApiResponse logout(Principal principal); + public ResponseEntity> logout(Principal principal); @SecurityRequirement(name = "KAKAO Token") @io.swagger.v3.oas.annotations.responses.ApiResponse( @@ -60,7 +61,7 @@ public ApiResponse reissue( description = "카카오 엑세스 토큰을 가져오는데 성공했습니다." ) @Operation(summary = "카카오 엑세스 토큰 발급") - public ApiResponse kakaoAccessToken( + public ResponseEntity> kakaoAccessToken( @Schema(description = "카카오 Authorization 코드 (아래 박스에는 아무거나 입력)", example = "u13t6n_uzDy3VbtRhvmtiOHIVioVMvFPTrrEK_lDgmd7-bY0GMD8FAi8TzUKPXNNAAABjQkwFpiSBpCp5rpDbg") @RequestHeader("Authorization") String code); @@ -71,7 +72,7 @@ public ApiResponse kakaoAccessToken( content = @Content(schema = @Schema(implementation = MemberNicknameResponseDto.class)) ) @Operation(summary = "유저 닉네임 설정") - public ApiResponse setMemberNickname(Principal principal, @Valid @RequestBody MemberNicknameRequestDto request); + public ResponseEntity> setMemberNickname(Principal principal, @Valid @RequestBody MemberNicknameRequestDto request); @SecurityRequirement(name = "JWT Authorization") @io.swagger.v3.oas.annotations.responses.ApiResponse( @@ -80,7 +81,7 @@ public ApiResponse kakaoAccessToken( content = @Content(schema = @Schema(implementation = MypageBookResponseDto.class)) ) @Operation(summary = "마이페이지 레큐북 조회") - public ApiResponse getMypageBook(Principal principal); + public ResponseEntity> getMypageBook(Principal principal); @SecurityRequirement(name = "JWT Authorization") @io.swagger.v3.oas.annotations.responses.ApiResponse( @@ -89,5 +90,5 @@ public ApiResponse kakaoAccessToken( content = @Content(schema = @Schema(implementation = MypageNoteResponseDto.class)) ) @Operation(summary = "마이페이지 레큐노트 조회") - public ApiResponse getMypageNote(Principal principal); + public ResponseEntity> getMypageNote(Principal principal); } diff --git a/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java index f389ae5..dd73bec 100644 --- a/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java +++ b/src/main/java/org/sopt/lequuServer/domain/member/controller/MemberController.java @@ -14,7 +14,7 @@ import org.sopt.lequuServer.global.auth.jwt.TokenDto; import org.sopt.lequuServer.global.common.dto.ApiResponse; import org.sopt.lequuServer.global.exception.enums.SuccessType; -import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.security.Principal; @@ -30,53 +30,46 @@ public class MemberController implements MemberApi { private final KakaoLoginService kakaoLoginService; @PostMapping("/login") - @ResponseStatus(HttpStatus.OK) - public ApiResponse login( + public ResponseEntity> login( @RequestHeader("Authorization") String socialAccessToken, @RequestBody SocialLoginRequestDto request) { - return ApiResponse.success(SuccessType.LOGIN_SUCCESS, memberService.login(socialAccessToken, request)); + return ResponseEntity.ok(ApiResponse.success(SuccessType.LOGIN_SUCCESS, memberService.login(socialAccessToken, request))); } @GetMapping("/reissue") - @ResponseStatus(HttpStatus.OK) - public ApiResponse reissue( + public ResponseEntity> reissue( @RequestHeader("Authorization") String refreshToken) { - return ApiResponse.success(SuccessType.REISSUE_SUCCESS, memberService.reissueToken(refreshToken)); + return ResponseEntity.ok(ApiResponse.success(SuccessType.REISSUE_SUCCESS, memberService.reissueToken(refreshToken))); } @PatchMapping("/log-out") // Spring Security 자체의 logout과 겹치지 않기 위해 이렇게 설정 - @ResponseStatus(HttpStatus.OK) - public ApiResponse logout(Principal principal) { + public ResponseEntity> logout(Principal principal) { memberService.logout(JwtProvider.getUserFromPrincial(principal)); - return ApiResponse.success(SuccessType.LOGOUT_SUCCESS); + return ResponseEntity.ok(ApiResponse.success(SuccessType.LOGOUT_SUCCESS)); } @GetMapping("/kakao") - @ResponseStatus(HttpStatus.OK) - public ApiResponse kakaoAccessToken( + public ResponseEntity> kakaoAccessToken( @RequestHeader("Authorization") String code) { - return ApiResponse.success(SuccessType.KAKAO_ACCESS_TOKEN_SUCCESS, kakaoLoginService.getKakaoAccessToken(code)); + return ResponseEntity.ok(ApiResponse.success(SuccessType.KAKAO_ACCESS_TOKEN_SUCCESS, kakaoLoginService.getKakaoAccessToken(code))); } @PatchMapping("/nickname") - @ResponseStatus(HttpStatus.OK) - public ApiResponse setMemberNickname(Principal principal, @Valid @RequestBody MemberNicknameRequestDto request) { + public ResponseEntity> setMemberNickname(Principal principal, @Valid @RequestBody MemberNicknameRequestDto request) { - return ApiResponse.success(SET_MEMBER_NICKNAME_SUCCESS, memberService.setMemberNickname(JwtProvider.getUserFromPrincial(principal), request)); + return ResponseEntity.ok(ApiResponse.success(SET_MEMBER_NICKNAME_SUCCESS, memberService.setMemberNickname(JwtProvider.getUserFromPrincial(principal), request))); } @GetMapping("/mypage/book") - @ResponseStatus(HttpStatus.OK) - public ApiResponse getMypageBook(Principal principal) { - return ApiResponse.success(GET_MYPAGE_BOOK_SUCCESS, memberService.getMypageBook(JwtProvider.getUserFromPrincial(principal))); + public ResponseEntity> getMypageBook(Principal principal) { + return ResponseEntity.ok(ApiResponse.success(GET_MYPAGE_BOOK_SUCCESS, memberService.getMypageBook(JwtProvider.getUserFromPrincial(principal)))); } @GetMapping("/mypage/note") - @ResponseStatus(HttpStatus.OK) - public ApiResponse getMypageNote(Principal principal) { - return ApiResponse.success(GET_MYPAGE_NOTE_SUCCESS, memberService.getMypageNote(JwtProvider.getUserFromPrincial(principal))); + public ResponseEntity> getMypageNote(Principal principal) { + return ResponseEntity.ok(ApiResponse.success(GET_MYPAGE_NOTE_SUCCESS, memberService.getMypageNote(JwtProvider.getUserFromPrincial(principal)))); } } \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteApi.java b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteApi.java index e92c6cb..44b2348 100644 --- a/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteApi.java +++ b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteApi.java @@ -9,6 +9,7 @@ import org.sopt.lequuServer.domain.note.dto.request.NoteCreateDto; import org.sopt.lequuServer.domain.note.dto.response.NoteCreateResponseDto; import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestBody; import java.security.Principal; @@ -23,5 +24,5 @@ public interface NoteApi { description = "레큐노트를 성공적으로 생성했습니다.", content = @Content(schema = @Schema(implementation = NoteCreateResponseDto.class)) ) - public ApiResponse createNote(Principal principal, @RequestBody @Valid NoteCreateDto noteCreateDto); + public ResponseEntity> createNote(Principal principal, @RequestBody @Valid NoteCreateDto noteCreateDto); } diff --git a/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java index df2060a..addc5d3 100644 --- a/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java +++ b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java @@ -8,6 +8,7 @@ import org.sopt.lequuServer.global.common.dto.ApiResponse; import org.sopt.lequuServer.global.exception.enums.SuccessType; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.security.Principal; @@ -20,8 +21,7 @@ public class NoteController implements NoteApi { private final NoteFacade noteFacade; @PostMapping - @ResponseStatus(HttpStatus.CREATED) - public ApiResponse createNote(Principal principal, @RequestBody @Valid NoteCreateDto noteCreateDto) { - return ApiResponse.success(SuccessType.CREATE_NOTE_SUCCESS, noteFacade.createNote(JwtProvider.getUserFromPrincial(principal), noteCreateDto)); + public ResponseEntity> createNote(Principal principal, @RequestBody @Valid NoteCreateDto noteCreateDto) { + return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(SuccessType.CREATE_NOTE_SUCCESS, noteFacade.createNote(JwtProvider.getUserFromPrincial(principal), noteCreateDto))); } } diff --git a/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerApi.java b/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerApi.java index 1b902be..affbce2 100644 --- a/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerApi.java +++ b/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerApi.java @@ -10,6 +10,7 @@ import org.sopt.lequuServer.domain.sticker.dto.response.StickerPackResponseDto; import org.sopt.lequuServer.domain.sticker.dto.response.StickerPostResponseDto; import org.sopt.lequuServer.global.common.dto.ApiResponse; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -26,7 +27,7 @@ public interface StickerApi { content = @Content(array = @ArraySchema(schema = @Schema(implementation = StickerPackResponseDto.class))) ) @Operation(summary = "스티커팩 목록 불러오기") - public ApiResponse> getStickerPackList(@Schema(example = "1") @PathVariable Long bookId); + public ResponseEntity>> getStickerPackList(@Schema(example = "1") @PathVariable Long bookId); @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "201", @@ -34,5 +35,5 @@ public interface StickerApi { content = @Content(schema = @Schema(implementation = StickerPostResponseDto.class)) ) @Operation(summary = "스티커 부착하기") - public ApiResponse postSticker(Principal principal, @RequestBody StickerPostRequestDto request); + public ResponseEntity> postSticker(Principal principal, @RequestBody StickerPostRequestDto request); } diff --git a/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerController.java b/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerController.java index a50092a..722e34a 100644 --- a/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerController.java +++ b/src/main/java/org/sopt/lequuServer/domain/sticker/controller/StickerController.java @@ -9,6 +9,7 @@ import org.sopt.lequuServer.global.auth.jwt.JwtProvider; import org.sopt.lequuServer.global.common.dto.ApiResponse; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.security.Principal; @@ -26,14 +27,12 @@ public class StickerController implements StickerApi { private final StickerFacade stickerFacade; @GetMapping("/{bookId}") - @ResponseStatus(HttpStatus.OK) - public ApiResponse> getStickerPackList(@PathVariable Long bookId) { - return ApiResponse.success(GET_STICKER_PACK_SUCCESS, stickerService.getStickerPackList(bookId)); + public ResponseEntity>> getStickerPackList(@PathVariable Long bookId) { + return ResponseEntity.ok(ApiResponse.success(GET_STICKER_PACK_SUCCESS, stickerService.getStickerPackList(bookId))); } @PostMapping - @ResponseStatus(HttpStatus.CREATED) - public ApiResponse postSticker(Principal principal, @RequestBody StickerPostRequestDto request) { - return ApiResponse.success(POST_STICKER_SUCCESS, stickerFacade.postSticker(JwtProvider.getUserFromPrincial(principal), request)); + public ResponseEntity> postSticker(Principal principal, @RequestBody StickerPostRequestDto request) { + return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(POST_STICKER_SUCCESS, stickerFacade.postSticker(JwtProvider.getUserFromPrincial(principal), request))); } } \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/global/exception/enums/SuccessType.java b/src/main/java/org/sopt/lequuServer/global/exception/enums/SuccessType.java index 4739066..c77249b 100644 --- a/src/main/java/org/sopt/lequuServer/global/exception/enums/SuccessType.java +++ b/src/main/java/org/sopt/lequuServer/global/exception/enums/SuccessType.java @@ -33,12 +33,12 @@ public enum SuccessType { */ CREATE_BOOK_SUCCESS(HttpStatus.CREATED, "레큐북이 성공적으로 생성됐습니다."), POST_STICKER_SUCCESS(HttpStatus.CREATED, "스티커 부착에 성공했습니다."), - CREATE_NOTE_SUCCESS(HttpStatus.CREATED, "레큐노트를 성공적으로 생성했습니다."), + CREATE_NOTE_SUCCESS(HttpStatus.CREATED, "레큐노트를 성공적으로 생성했습니다.") /** * 204 NO CONTENT */ - DELETE_BOOK_SUCCESS(HttpStatus.NO_CONTENT, "레큐북을 성공적으로 삭제했습니다."); + ; private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Api.java b/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Api.java index e338718..c9c0542 100644 --- a/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Api.java +++ b/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Api.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import org.sopt.lequuServer.global.common.dto.ApiResponse; import org.sopt.lequuServer.global.s3.dto.PreSignedUrlResponse; +import org.springframework.http.ResponseEntity; @Tag(name = "S3", description = "S3관련 API") public interface S3Api { @@ -16,7 +17,7 @@ public interface S3Api { content = @Content(schema = @Schema(implementation = PreSignedUrlResponse.class)) ) @Operation(summary = "레큐북 PreSignedUrl 가져오기") - public ApiResponse getPreSignedUrlBook(); + public ResponseEntity> getPreSignedUrlBook(); @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "200", @@ -24,7 +25,7 @@ public interface S3Api { content = @Content(schema = @Schema(implementation = PreSignedUrlResponse.class)) ) @Operation(summary = "레큐노트 PreSignedUrl 가져오기") - public ApiResponse getPreSignedUrlNote(); + public ResponseEntity> getPreSignedUrlNote(); @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "200", @@ -32,5 +33,5 @@ public interface S3Api { content = @Content(schema = @Schema(implementation = PreSignedUrlResponse.class)) ) @Operation(summary = "스티커 PreSignedUrl 가져오기") - public ApiResponse getPreSignedUrlSticker(); + public ResponseEntity> getPreSignedUrlSticker(); } diff --git a/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Controller.java b/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Controller.java index 38e90d0..eb5412c 100644 --- a/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Controller.java +++ b/src/main/java/org/sopt/lequuServer/global/s3/controller/S3Controller.java @@ -4,6 +4,7 @@ import org.sopt.lequuServer.global.common.dto.ApiResponse; import org.sopt.lequuServer.global.s3.dto.PreSignedUrlResponse; import org.sopt.lequuServer.global.s3.service.S3Service; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -24,17 +25,17 @@ public class S3Controller implements S3Api { private final S3Service s3Service; @GetMapping("/book") - public ApiResponse getPreSignedUrlBook() { - return ApiResponse.success(PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(BOOK_FAVORITE_IMAGE_FOLDER_NAME.getValue())); + public ResponseEntity> getPreSignedUrlBook() { + return ResponseEntity.ok(ApiResponse.success(PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(BOOK_FAVORITE_IMAGE_FOLDER_NAME.getValue()))); } @GetMapping("/note") - public ApiResponse getPreSignedUrlNote() { - return ApiResponse.success(PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(NOTE_BACKGROUND_IMAGE_FOLDER_NAME.getValue())); + public ResponseEntity> getPreSignedUrlNote() { + return ResponseEntity.ok(ApiResponse.success(PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(NOTE_BACKGROUND_IMAGE_FOLDER_NAME.getValue()))); } @GetMapping("/sticker") - public ApiResponse getPreSignedUrlSticker() { - return ApiResponse.success(PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(STICKER_IMAGE_FOLDER_NAME.getValue())); + public ResponseEntity> getPreSignedUrlSticker() { + return ResponseEntity.ok(ApiResponse.success(PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(STICKER_IMAGE_FOLDER_NAME.getValue()))); } } From 82b2c10cee4677637fcd997e1db010816930ecf8 Mon Sep 17 00:00:00 2001 From: ddongseop Date: Wed, 17 Jan 2024 00:52:14 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[REFACTOR]=20TestContr?= =?UTF-8?q?oller=20=EC=82=AD=EC=A0=9C=20#65?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lequuServer/domain/book/model/Book.java | 15 ---- .../global/s3/test/TestController.java | 39 ---------- .../s3/test/TestCreateImageRequest.java | 7 -- .../global/s3/test/TestCreateRequest.java | 6 -- .../global/s3/test/TestJpaRepository.java | 8 -- .../global/s3/test/TestService.java | 73 ------------------- 6 files changed, 148 deletions(-) delete mode 100644 src/main/java/org/sopt/lequuServer/global/s3/test/TestController.java delete mode 100644 src/main/java/org/sopt/lequuServer/global/s3/test/TestCreateImageRequest.java delete mode 100644 src/main/java/org/sopt/lequuServer/global/s3/test/TestCreateRequest.java delete mode 100644 src/main/java/org/sopt/lequuServer/global/s3/test/TestJpaRepository.java delete mode 100644 src/main/java/org/sopt/lequuServer/global/s3/test/TestService.java diff --git a/src/main/java/org/sopt/lequuServer/domain/book/model/Book.java b/src/main/java/org/sopt/lequuServer/domain/book/model/Book.java index 446c295..0cdb580 100644 --- a/src/main/java/org/sopt/lequuServer/domain/book/model/Book.java +++ b/src/main/java/org/sopt/lequuServer/domain/book/model/Book.java @@ -73,19 +73,4 @@ public Book(String uuid, String favoriteName, String favoriteImage, String title public static Book of(String uuid, String favoriteName, String favoriteImage, String title, String description, String backgroundColor, Member member, int popularRate) { return new Book(uuid, favoriteName, favoriteImage, title, description, backgroundColor, member, popularRate); } - - // TODO S3 테스트용, 추후 삭제 - public Book(String uuid, String favoriteName, String favoriteImage, String title, String description, String backgroundColor) { - this.uuid = uuid; - this.favoriteName = favoriteName; - this.favoriteImage = favoriteImage; - this.title = title; - this.description = description; - this.backgroundColor = backgroundColor; - } - - // TODO S3 테스트용, 추후 삭제 - public static Book test(String favoriteImage, String title) { - return new Book("test", "test", favoriteImage, title, "test", "#F5F5F5"); - } } diff --git a/src/main/java/org/sopt/lequuServer/global/s3/test/TestController.java b/src/main/java/org/sopt/lequuServer/global/s3/test/TestController.java deleted file mode 100644 index 0337ece..0000000 --- a/src/main/java/org/sopt/lequuServer/global/s3/test/TestController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.sopt.lequuServer.global.s3.test; - -import io.swagger.v3.oas.annotations.Hidden; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.net.URI; - -@Hidden -@RestController -@RequestMapping("/api/test/s3") -@RequiredArgsConstructor -public class TestController { - - private final TestService bookService; - - // MultipartFile 기반 이미지 업로드 (서버에 직접 이미지를 전송하는 경우 사용) - @PostMapping - public ResponseEntity createPost(@RequestPart MultipartFile image, TestCreateRequest request) { - URI location = URI.create("/test/s3" + bookService.create(request, image)); - return ResponseEntity.created(location).build(); - } - - // Presigned URL 기반 이미지 업로드 (서버에는 이미지명 String만 넘어옴) - @PostMapping("/pre_signed") - public ResponseEntity createPostWithPreSignedUrl(@RequestBody TestCreateImageRequest request) { - URI location = URI.create("/test/s3/pre_signed" + bookService.createV2(request)); - return ResponseEntity.created(location).build(); - } - - // 롤링페이퍼 삭제시 업로드된 이미지도 함께 삭제 - @DeleteMapping("/{book_id}") - public ResponseEntity deletePost(@PathVariable Long book_id) { - bookService.deleteById(book_id); - return ResponseEntity.noContent().build(); - } -} diff --git a/src/main/java/org/sopt/lequuServer/global/s3/test/TestCreateImageRequest.java b/src/main/java/org/sopt/lequuServer/global/s3/test/TestCreateImageRequest.java deleted file mode 100644 index 44bde56..0000000 --- a/src/main/java/org/sopt/lequuServer/global/s3/test/TestCreateImageRequest.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.sopt.lequuServer.global.s3.test; - -public record TestCreateImageRequest( - String title, - String fileName -) { -} diff --git a/src/main/java/org/sopt/lequuServer/global/s3/test/TestCreateRequest.java b/src/main/java/org/sopt/lequuServer/global/s3/test/TestCreateRequest.java deleted file mode 100644 index 969ebd4..0000000 --- a/src/main/java/org/sopt/lequuServer/global/s3/test/TestCreateRequest.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.sopt.lequuServer.global.s3.test; - -public record TestCreateRequest( - String title -){ -} diff --git a/src/main/java/org/sopt/lequuServer/global/s3/test/TestJpaRepository.java b/src/main/java/org/sopt/lequuServer/global/s3/test/TestJpaRepository.java deleted file mode 100644 index c0cdee2..0000000 --- a/src/main/java/org/sopt/lequuServer/global/s3/test/TestJpaRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.sopt.lequuServer.global.s3.test; - -import org.sopt.lequuServer.domain.book.model.Book; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface TestJpaRepository extends JpaRepository { - -} \ No newline at end of file diff --git a/src/main/java/org/sopt/lequuServer/global/s3/test/TestService.java b/src/main/java/org/sopt/lequuServer/global/s3/test/TestService.java deleted file mode 100644 index 9b174e9..0000000 --- a/src/main/java/org/sopt/lequuServer/global/s3/test/TestService.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.sopt.lequuServer.global.s3.test; - -import lombok.RequiredArgsConstructor; -import org.sopt.lequuServer.domain.book.model.Book; -import org.sopt.lequuServer.global.s3.service.S3Service; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; - -import static org.sopt.lequuServer.global.s3.enums.ImageFolderName.*; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class TestService { - - private final TestJpaRepository bookJpaRepository; - private final S3Service s3Service; - - // MultipartFile 기반 이미지 업로드 (서버에 직접 이미지를 전송하는 경우 사용) - @Transactional - public String create(TestCreateRequest request, MultipartFile image) { - try { - final String imageUrl = s3Service.uploadImage(BOOK_FAVORITE_IMAGE_FOLDER_NAME.getValue(), image); - - Book book = bookJpaRepository.save(Book.test(imageUrl, request.title())); - - return book.getId().toString(); - - } catch (RuntimeException | IOException e) { - throw new RuntimeException(e.getMessage()); - } - } - - // Presigned URL 기반 이미지 업로드 (서버에는 이미지명 String만 넘어옴) - @Transactional - public String createV2(TestCreateImageRequest request) { - try { - String imageUrl = s3Service.getURL(BOOK_FAVORITE_IMAGE_FOLDER_NAME.getValue() + request.fileName()); - - Book book = bookJpaRepository.save(Book.test(imageUrl, request.title())); - - return book.getId().toString(); - - } catch (RuntimeException e) { - // 게시글 저장에 실패 할 시 S3에 미리 업로드 되어 있던 이미지를 삭제 - try { - s3Service.deleteImage(BOOK_FAVORITE_IMAGE_FOLDER_NAME.getValue() + "/" + request.fileName()); - } catch (IOException io) { - // 이미지 삭제 과정에서 에러가 발생할 경우 - throw new RuntimeException("S3에서 이미지를 삭제하는 데에 실패했습니다: " + io.getMessage()); - } - throw e; - } - } - - // 롤링페이퍼 삭제시 업로드된 이미지도 함께 삭제 - @Transactional - public void deleteById(Long book_id) { - try { - Book book = bookJpaRepository.findById(book_id) - .orElseThrow(() -> new RuntimeException("해당하는 롤링페이퍼가 없습니다.")); - - s3Service.deleteImage(book.getFavoriteImage()); - bookJpaRepository.deleteById(book_id); - - } catch (IOException | RuntimeException e) { - throw new RuntimeException(e.getMessage()); - } - } -} From 57b1fc00619128001205356ff00c147ccb813616 Mon Sep 17 00:00:00 2001 From: ddongseop Date: Wed, 17 Jan 2024 00:53:20 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[REFACTOR]=20dto?= =?UTF-8?q?=EB=AA=85=20request=EB=A1=9C=20=ED=86=B5=EC=9D=BC=20#65?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lequuServer/domain/book/facade/BookFacade.java | 12 ++++++------ .../domain/note/controller/NoteController.java | 4 ++-- .../lequuServer/domain/note/facade/NoteFacade.java | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/sopt/lequuServer/domain/book/facade/BookFacade.java b/src/main/java/org/sopt/lequuServer/domain/book/facade/BookFacade.java index d70b355..4701a2c 100644 --- a/src/main/java/org/sopt/lequuServer/domain/book/facade/BookFacade.java +++ b/src/main/java/org/sopt/lequuServer/domain/book/facade/BookFacade.java @@ -1,9 +1,5 @@ package org.sopt.lequuServer.domain.book.facade; -import static org.sopt.lequuServer.global.s3.enums.ImageFolderName.BOOK_FAVORITE_IMAGE_FOLDER_NAME; - -import java.util.List; -import java.util.UUID; import lombok.RequiredArgsConstructor; import org.sopt.lequuServer.domain.book.dto.request.BookCreateRequestDto; import org.sopt.lequuServer.domain.book.dto.response.BookCreateResponseDto; @@ -22,6 +18,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.UUID; + +import static org.sopt.lequuServer.global.s3.enums.ImageFolderName.BOOK_FAVORITE_IMAGE_FOLDER_NAME; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -52,8 +53,7 @@ public BookCreateResponseDto createBook(BookCreateRequestDto request, Long membe String bookUuid = UUID.randomUUID().toString(); // Presigned URL 이미지 업로드하기 위한 이미지 파일명 가져오기 // String imageUrl = s3Service.getURL(BOOK_FAVORITE_IMAGE_FOLDER_NAME.getValue() + request.favoriteImage()); - String imageUrl = s3Service.getCloudFrontURL( - BOOK_FAVORITE_IMAGE_FOLDER_NAME.getValue() + request.favoriteImage()); + String imageUrl = s3Service.getCloudFrontURL(BOOK_FAVORITE_IMAGE_FOLDER_NAME.getValue() + request.favoriteImage()); Book book = Book.builder() .uuid(bookUuid) diff --git a/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java index addc5d3..e9e1c4b 100644 --- a/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java +++ b/src/main/java/org/sopt/lequuServer/domain/note/controller/NoteController.java @@ -21,7 +21,7 @@ public class NoteController implements NoteApi { private final NoteFacade noteFacade; @PostMapping - public ResponseEntity> createNote(Principal principal, @RequestBody @Valid NoteCreateDto noteCreateDto) { - return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(SuccessType.CREATE_NOTE_SUCCESS, noteFacade.createNote(JwtProvider.getUserFromPrincial(principal), noteCreateDto))); + public ResponseEntity> createNote(Principal principal, @RequestBody @Valid NoteCreateDto request) { + return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(SuccessType.CREATE_NOTE_SUCCESS, noteFacade.createNote(JwtProvider.getUserFromPrincial(principal), request))); } } diff --git a/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java b/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java index 36fb17d..7cd6a24 100644 --- a/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java +++ b/src/main/java/org/sopt/lequuServer/domain/note/facade/NoteFacade.java @@ -1,7 +1,5 @@ package org.sopt.lequuServer.domain.note.facade; -import static org.sopt.lequuServer.global.s3.enums.ImageFolderName.NOTE_BACKGROUND_IMAGE_FOLDER_NAME; - import lombok.RequiredArgsConstructor; import org.sopt.lequuServer.domain.book.model.Book; import org.sopt.lequuServer.domain.book.repository.BookRepository; @@ -15,6 +13,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import static org.sopt.lequuServer.global.s3.enums.ImageFolderName.NOTE_BACKGROUND_IMAGE_FOLDER_NAME; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -26,16 +26,16 @@ public class NoteFacade { private final S3Service s3Service; @Transactional - public NoteCreateResponseDto createNote(Long userId, NoteCreateDto noteCreateDto) { + public NoteCreateResponseDto createNote(Long userId, NoteCreateDto request) { Member member = memberRepository.findByIdOrThrow(userId); - Book book = bookRepository.findByIdOrThrow(noteCreateDto.bookId()); + Book book = bookRepository.findByIdOrThrow(request.bookId()); - String background = noteCreateDto.background(); + String background = request.background(); if (background.endsWith(".jpg")) { // background = s3Service.getURL(NOTE_BACKGROUND_IMAGE_FOLDER_NAME.getValue() + noteCreateDto.background()); - background = s3Service.getCloudFrontURL(NOTE_BACKGROUND_IMAGE_FOLDER_NAME.getValue() + noteCreateDto.background()); + background = s3Service.getCloudFrontURL(NOTE_BACKGROUND_IMAGE_FOLDER_NAME.getValue() + request.background()); } - return noteService.saveNote(Note.of(noteCreateDto.content(), background, noteCreateDto.textColor(), member, book), member, book); + return noteService.saveNote(Note.of(request.content(), background, request.textColor(), member, book), member, book); } } From 323a88b0b719825c37dcec4a3b260c07a53481df Mon Sep 17 00:00:00 2001 From: ddongseop Date: Wed, 17 Jan 2024 04:28:05 +0900 Subject: [PATCH 7/8] :rocket: [DEPLOY] test --- .github/workflows/CD.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 784aa3b..17fa097 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -3,6 +3,8 @@ name: CD on: push: branches: [ "develop" ] + pull_request: + branches: [ "develop" ] jobs: deploy-ci: From 9576c59bac1c9e21f4208db040343ea52a4365bc Mon Sep 17 00:00:00 2001 From: ddongseop Date: Wed, 17 Jan 2024 04:40:07 +0900 Subject: [PATCH 8/8] :rocket: [DEPLOY] test --- .github/workflows/CD.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 17fa097..784aa3b 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -3,8 +3,6 @@ name: CD on: push: branches: [ "develop" ] - pull_request: - branches: [ "develop" ] jobs: deploy-ci: