Skip to content

Commit 13c70b3

Browse files
authored
Fix: Swagger 문서화
Fix: swagger 문서화 정리
2 parents dd472e4 + 78626b0 commit 13c70b3

11 files changed

Lines changed: 93 additions & 43 deletions

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,6 @@ src/main/resources/application-*.yaml
4949
application-jwt.yml
5050
application-oauth.yml
5151

52-
.env
52+
.env
53+
54+
CLAUDE.md

src/main/java/com/tave/PromptMate/ai/controller/GeminiJudgeController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.tave.PromptMate.ai.dto.GeminiJudgeResponse;
55
import com.tave.PromptMate.ai.service.GeminiJudgeService;
66
import com.tave.PromptMate.auth.dto.request.CustomUserDetails;
7+
import io.swagger.v3.oas.annotations.Operation;
78
import io.swagger.v3.oas.annotations.tags.Tag;
89
import lombok.RequiredArgsConstructor;
910
import lombok.extern.slf4j.Slf4j;
@@ -25,6 +26,7 @@ public class GeminiJudgeController {
2526
private final GeminiJudgeService geminiJudgeService;
2627

2728
@PostMapping
29+
@Operation(summary = "프롬프트 평가/피드백", description = "Gemini api를 통해 리라이팅 되기 전의 프롬프트에 대한 평가와 피드백을 받습니다.")
2830
public ResponseEntity<GeminiJudgeResponse> judge(@AuthenticationPrincipal CustomUserDetails principal,
2931
@RequestBody GeminiJudgeRequest request){
3032

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,32 @@
11
package com.tave.PromptMate.auth.controller;
22

3+
import com.tave.PromptMate.auth.dto.request.CustomUserDetails;
34
import com.tave.PromptMate.auth.dto.request.LoginRequest;
45
import com.tave.PromptMate.auth.dto.request.SignUpRequest;
56
import com.tave.PromptMate.auth.dto.response.JwtLoginResponse;
67
import com.tave.PromptMate.auth.dto.response.TokenResponse;
78
import com.tave.PromptMate.auth.dto.response.LoginResponse;
89
import com.tave.PromptMate.auth.service.AuthService;
10+
import com.tave.PromptMate.service.UserService;
911
import io.swagger.v3.oas.annotations.Operation;
1012
import io.swagger.v3.oas.annotations.tags.Tag;
1113
import lombok.RequiredArgsConstructor;
1214
import org.springframework.http.HttpHeaders;
1315
import org.springframework.http.HttpStatus;
1416
import org.springframework.http.ResponseEntity;
15-
import org.springframework.web.bind.annotation.PostMapping;
16-
import org.springframework.web.bind.annotation.RequestBody;
17-
import org.springframework.web.bind.annotation.RequestParam;
18-
import org.springframework.web.bind.annotation.RestController;
17+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
18+
import org.springframework.web.bind.annotation.*;
1919

2020
@RestController
2121
@RequiredArgsConstructor
22-
@Tag(name="카카오로그인 API")
22+
@RequestMapping("/api/auth")
23+
@Tag(name = "Auth API", description = "로그인 및 인증 관련 API")
2324
public class AuthController {
2425
private final AuthService authService;
26+
private final UserService userService;
2527

26-
@PostMapping("/api/auth/login/kakao")
27-
@Operation(summary = "카카오로그인")
28+
@PostMapping("/login/kakao")
29+
@Operation(summary = "카카오로그인", description = "카카오로그인을 합니다.")
2830
public ResponseEntity<JwtLoginResponse> kakaoLogin(@RequestParam String code){
2931
JwtLoginResponse jwtLoginResponse= authService.loginOrRegister(code);
3032

@@ -34,6 +36,31 @@ public ResponseEntity<JwtLoginResponse> kakaoLogin(@RequestParam String code){
3436
}
3537

3638

39+
@PostMapping("/signup")
40+
@Operation(summary = "회원가입", description = "이메일을 통해 회원가입합니다.")
41+
public ResponseEntity<String> signUp(@RequestBody SignUpRequest request){
42+
authService.signUp(request);
43+
44+
return ResponseEntity.status(HttpStatus.OK).body("회원가입 완료");
45+
}
46+
47+
@PostMapping("/login")
48+
@Operation(summary = "로그인", description = "회원가입한 이메일을 통해 로그인합니다.")
49+
public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request){
50+
LoginResponse response =authService.login(request);
51+
52+
return ResponseEntity.status(HttpStatus.OK).body(response);
53+
}
54+
55+
@PostMapping("/logout")
56+
@Operation(summary = "로그아웃" ,description = "사용자를 로그아웃합니다.")
57+
public ResponseEntity<String> logout(@AuthenticationPrincipal CustomUserDetails principal){
58+
Long userId=principal.getUserId();
59+
String message=userService.logout(userId);
60+
return ResponseEntity.ok(message);
61+
}
62+
63+
3764
//백엔드 확인용
3865
@PostMapping("/api/auth/token/reissue")
3966
@Operation(summary = "백엔드 개발용 API")
@@ -47,21 +74,4 @@ public ResponseEntity<TokenResponse> reissueAccessToken(@RequestParam String ref
4774
return ResponseEntity.ok(response);
4875
}
4976

50-
51-
@PostMapping("/api/auth/signup")
52-
@Operation(summary = "회원가입")
53-
public ResponseEntity<String> signUp(@RequestBody SignUpRequest request){
54-
authService.signUp(request);
55-
56-
return ResponseEntity.status(HttpStatus.OK).body("회원가입 완료");
57-
}
58-
59-
@PostMapping("/api/auth/login")
60-
@Operation(summary = "로그인")
61-
public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request){
62-
LoginResponse response =authService.login(request);
63-
64-
return ResponseEntity.status(HttpStatus.OK).body(response);
65-
}
66-
6777
}

src/main/java/com/tave/PromptMate/auth/dto/response/KakaoTokenResponse.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.tave.PromptMate.auth.dto.response;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
34
import com.fasterxml.jackson.annotation.JsonProperty;
45
import lombok.Getter;
56

67
@Getter
8+
@JsonIgnoreProperties(ignoreUnknown = true) // 알 수 없는 필드 무시 (id_token 등)
79
public class KakaoTokenResponse {
810

911
@JsonProperty("access_token")
@@ -20,4 +22,7 @@ public class KakaoTokenResponse {
2022

2123
@JsonProperty("refresh_token_expires_in")
2224
private Integer refreshTokenExpiresIn;
25+
26+
@JsonProperty("id_token")
27+
private String idToken; // 카카오 API 응답에 포함될 수 있는 필드 (선택적)
2328
}

src/main/java/com/tave/PromptMate/auth/dto/response/KakaoUserInfo.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.tave.PromptMate.auth.dto.response;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
34
import com.fasterxml.jackson.annotation.JsonProperty;
45
import lombok.Data;
56

67
@Data
8+
@JsonIgnoreProperties(ignoreUnknown = true) // 알 수 없는 필드 무시
79
public class KakaoUserInfo {
810

911
private Long id;
@@ -12,13 +14,15 @@ public class KakaoUserInfo {
1214
private KakaoAccount kakaoAccount;
1315

1416
@Data
17+
@JsonIgnoreProperties(ignoreUnknown = true)
1518
public static class KakaoAccount {
1619
private String email;
1720

1821
@JsonProperty("profile")
1922
private Profile profile;
2023

2124
@Data
25+
@JsonIgnoreProperties(ignoreUnknown = true)
2226
public static class Profile {
2327
private String nickname;
2428

src/main/java/com/tave/PromptMate/controller/CommentController.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.tave.PromptMate.dto.comment.CreateReplyRequest;
88
import com.tave.PromptMate.dto.comment.UpdateCommentRequest;
99
import com.tave.PromptMate.service.CommentService;
10+
import io.swagger.v3.oas.annotations.Operation;
11+
import io.swagger.v3.oas.annotations.tags.Tag;
1012
import jakarta.validation.Valid;
1113
import lombok.RequiredArgsConstructor;
1214
import org.springframework.http.ResponseEntity;
@@ -18,12 +20,14 @@
1820
@RestController
1921
@RequiredArgsConstructor
2022
@RequestMapping("/api/community/posts/{postId}")
23+
@Tag(name="커뮤니티 댓글 API")
2124
public class CommentController {
2225

2326
private final CommentService commentService;
2427

2528
// 댓글/답글 등록
2629
@PostMapping("/comments")
30+
@Operation(summary = "댓글 작성", description = "해당 게시글에 댓글을 작성합니다.")
2731
public ResponseEntity<CommentResponse> createCommentOrReply(
2832
@PathVariable Long postId,
2933
@Valid @RequestBody CreateCommentRequest req,
@@ -35,12 +39,14 @@ public ResponseEntity<CommentResponse> createCommentOrReply(
3539

3640
// 게시글 기준 댓글/답글 조회
3741
@GetMapping("/comments")
42+
@Operation(summary = "댓글/답글 조회", description = "해당 게시글의 댓글/답글을 조회합니다.")
3843
public ResponseEntity<List<CommentResponse>> getCommentsByPost(@PathVariable Long postId){
3944
return ResponseEntity.ok(commentService.getCommentsByPost(postId));
4045
}
4146

4247
// 댓글 수정
4348
@PatchMapping("/comments/{commentId}")
49+
@Operation(summary = "댓글 수정", description = "해당 댓글을 수정합니다.")
4450
public ResponseEntity<CommentResponse> updateComment(
4551
@PathVariable Long commentId,
4652
@Valid @RequestBody UpdateCommentRequest req,
@@ -52,6 +58,7 @@ public ResponseEntity<CommentResponse> updateComment(
5258

5359
// 댓글 삭제
5460
@DeleteMapping("/comments/{commentId}")
61+
@Operation(summary = "댓글 삭제", description = "해당 댓글을 삭제합니다.")
5562
public ResponseEntity<Void> deleteComment(
5663
@PathVariable Long commentId,
5764
@AuthenticationPrincipal CustomUserDetails userDetails

src/main/java/com/tave/PromptMate/controller/CommunityController.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.tave.PromptMate.dto.community.*;
99
import com.tave.PromptMate.service.CommunityRecentService;
1010
import com.tave.PromptMate.service.CommunityService;
11+
import io.swagger.v3.oas.annotations.Operation;
12+
import io.swagger.v3.oas.annotations.tags.Tag;
1113
import jakarta.validation.Valid;
1214
import lombok.RequiredArgsConstructor;
1315
import org.springframework.http.MediaType;
@@ -23,6 +25,7 @@
2325
@RestController
2426
@RequiredArgsConstructor
2527
@RequestMapping("/api/community")
28+
@Tag(name="커뮤니티 게시글 API")
2629
public class CommunityController {
2730

2831
private final CommunityService communityService;
@@ -31,6 +34,7 @@ public class CommunityController {
3134

3235
// 커뮤니티 글 작성
3336
@PostMapping(value="/posts", consumes= MediaType.MULTIPART_FORM_DATA_VALUE)
37+
@Operation(summary = "게시글 작성", description = "게시글 작성 입니다.")
3438
public ResponseEntity<CommunityPostResponse> createPost(
3539
@AuthenticationPrincipal CustomUserDetails principal,
3640
@RequestParam("rewriteResultId") Long rewriteResultId,
@@ -59,6 +63,7 @@ public ResponseEntity<CommunityPostResponse> createPost(
5963

6064
//커뮤니티 글 수정
6165
@PatchMapping("/posts/{postId}")
66+
@Operation(summary = "게시글 수정", description = "해당 게시글을 수정합니다.")
6267
public ResponseEntity<CommunityPostResponse> updatePost(
6368
@AuthenticationPrincipal CustomUserDetails principal,
6469
@PathVariable Long postId,
@@ -71,6 +76,7 @@ public ResponseEntity<CommunityPostResponse> updatePost(
7176

7277
//커뮤니티 글 삭제
7378
@DeleteMapping("/posts/{postId}")
79+
@Operation(summary = "게시글 삭제", description = "해당 게시글을 삭제합니다.")
7480
public ResponseEntity<Void> deletePost(
7581
@AuthenticationPrincipal CustomUserDetails principal,
7682
@PathVariable Long postId
@@ -82,6 +88,7 @@ public ResponseEntity<Void> deletePost(
8288

8389
// 커뮤니티 글 목록 조회(최신순/조회순/좋아요순), 검색 포함
8490
@GetMapping("/posts")
91+
@Operation(summary = "게시글 조회", description = "해당 게시글을 (최신순/조회순/좋아요) 순으로 조회합니다. 검색 포함")
8592
public ResponseEntity<List<CommunityPostResponse>> getPosts(
8693
@RequestParam(required = false) String search,
8794
@RequestParam(defaultValue = "latest") String sort,
@@ -99,15 +106,21 @@ public ResponseEntity<List<CommunityPostResponse>> getPosts(
99106

100107
// 커뮤니티 글 단건 조회
101108
@GetMapping("/posts/{postId}")
109+
@Operation(summary = "게시글 상세조회", description = "해당 게시글의 내용,댓글 등을 조회합니다.")
102110
public ResponseEntity<CommunityPostResponse> getPost(
103111
@PathVariable Long postId,
104112
@AuthenticationPrincipal CustomUserDetails principal
105113
) {
106114
Long userId = (principal == null) ? null : principal.getUserId();
107115
return ResponseEntity.ok(communityService.getPost(postId, userId));
108116
}
117+
109118
// 최근 본 프롬프트
110119
@GetMapping("/recent")
120+
@Operation(
121+
summary = "최근 본 프롬프트 조회",
122+
description = "사용자가 최근에 조회한 프롬프트 목록을 최신순으로 조회합니다."
123+
)
111124
public ResponseEntity<List<CommunityRecentRow>> getRecentCommunities(
112125
@AuthenticationPrincipal CustomUserDetails principal,
113126
@RequestParam(defaultValue = "20") int limit

src/main/java/com/tave/PromptMate/controller/CommunityLikeController.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.tave.PromptMate.auth.dto.request.CustomUserDetails;
44
import com.tave.PromptMate.dto.community.CommunityLikeToggleResponse;
55
import com.tave.PromptMate.service.CommunityLikeService;
6+
import io.swagger.v3.oas.annotations.Operation;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
68
import lombok.RequiredArgsConstructor;
79
import org.springframework.http.ResponseEntity;
810
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -11,11 +13,13 @@
1113
@RestController
1214
@RequiredArgsConstructor
1315
@RequestMapping("/api/community/posts")
16+
@Tag(name="커뮤니티 좋아요 API")
1417
public class CommunityLikeController {
1518

1619
private final CommunityLikeService communityLikeService;
1720

1821
@PostMapping("/{postId}/likes")
22+
@Operation(summary = "게시글 좋아요", description = "해당 게시글에 좋아요를 합니다.")
1923
public ResponseEntity<CommunityLikeToggleResponse> toggleLike(
2024
@PathVariable Long postId,
2125
@AuthenticationPrincipal CustomUserDetails userDetails

src/main/java/com/tave/PromptMate/controller/LibraryController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.tave.PromptMate.dto.library.CreateLibraryRequest;
66
import com.tave.PromptMate.dto.library.LibraryResponse;
77
import com.tave.PromptMate.service.LibraryService;
8+
import io.swagger.v3.oas.annotations.Operation;
9+
import io.swagger.v3.oas.annotations.tags.Tag;
810
import jakarta.validation.Valid;
911
import lombok.RequiredArgsConstructor;
1012
import org.springframework.data.domain.Page;
@@ -18,12 +20,14 @@
1820
@RestController
1921
@RequiredArgsConstructor
2022
@RequestMapping("/api/libraries")
23+
@Tag(name="라이브러리 API")
2124
public class LibraryController {
2225

2326
private final LibraryService libraryService;
2427

2528
// 라이브러리에 리라이팅 결과 저장하기
2629
@PostMapping
30+
@Operation(summary = "리라이팅 결과 저장", description = "리라이팅된 결과를 라이브러리에 저장합니다.")
2731
public ResponseEntity<LibraryResponse> save(
2832
@AuthenticationPrincipal CustomUserDetails principal,
2933
@Valid @RequestBody CreateLibraryRequest req){
@@ -36,6 +40,7 @@ public ResponseEntity<LibraryResponse> save(
3640

3741
// 내 라이브러리 목록 조회
3842
@GetMapping("/my")
43+
@Operation(summary = "라이브러리 목록 조회", description = "라이브러리 목록을 조회합니다.")
3944
public ResponseEntity<Page<LibraryResponse>> myList(
4045
@AuthenticationPrincipal CustomUserDetails principal,
4146
@RequestParam(defaultValue = "0") int page,
@@ -57,6 +62,7 @@ public ResponseEntity<LibraryResponse> getOne(
5762

5863
// 삭제
5964
@DeleteMapping("/{id}")
65+
@Operation(summary = "저장된 프롬프트 삭제", description = "저장한 리라이팅된 프롬프트를 삭제합니다.")
6066
public ResponseEntity<Void> delete(
6167
@PathVariable Long id,
6268
@AuthenticationPrincipal CustomUserDetails principal) {
@@ -68,6 +74,7 @@ public ResponseEntity<Void> delete(
6874

6975
//내가 작성한 게시글 삭제
7076
@DeleteMapping("/my-posts/{postId}")
77+
@Operation(summary = "게시글 삭제", description = "해당 게시글을 삭제합니다.")
7178
public ResponseEntity<Void> deletePost(
7279
@PathVariable Long postId,
7380
@AuthenticationPrincipal CustomUserDetails principal){
@@ -79,6 +86,7 @@ public ResponseEntity<Void> deletePost(
7986

8087
//내가 작성한 게시글 조회
8188
@GetMapping("/my-posts")
89+
@Operation(summary = "작성한 게시글 조회", description = "내가 작성한 게시글들을 조회합니다.")
8290
public ResponseEntity<List<CommunityPostResponse>> getMyPosts(
8391
@AuthenticationPrincipal CustomUserDetails principal){
8492

@@ -88,6 +96,7 @@ public ResponseEntity<List<CommunityPostResponse>> getMyPosts(
8896

8997
//좋아요한 프롬프트 조회
9098
@GetMapping("/liked")
99+
@Operation(summary = "좋아요한 프롬프트 조회", description = "좋아요 누른 프롬프트들(게시글들)을 조회합니다.")
91100
public ResponseEntity<Page<CommunityPostResponse>> likedList(
92101
@AuthenticationPrincipal CustomUserDetails principal,
93102
@RequestParam(defaultValue = "0") int page,
@@ -99,6 +108,7 @@ public ResponseEntity<Page<CommunityPostResponse>> likedList(
99108

100109
//검색(태그, 키워드 기반)
101110
@GetMapping("/search")
111+
@Operation(summary = "라이브러리 검색", description = "태그, 키워드 기반으로 프롬프트들을 검색합니다.")
102112
public ResponseEntity<Page<LibraryResponse>> search(
103113
@AuthenticationPrincipal CustomUserDetails principal,
104114
@RequestParam(required = false) String keyword,

0 commit comments

Comments
 (0)