Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ADD] Swagger 세부 정보 추가 #78

Merged
merged 8 commits into from
Apr 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 115 additions & 0 deletions src/main/java/com/samtilee/drawdraw/auth/controller/AuthApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package com.samtilee.drawdraw.auth.controller;

import com.samtilee.drawdraw.auth.dto.response.SignInResponse;
import com.samtilee.drawdraw.auth.dto.response.TokenResponse;
import com.samtilee.drawdraw.common.dto.BaseResponse;
import com.samtilee.drawdraw.common.dto.ErrorResponse;
import com.samtilee.drawdraw.common.dto.SuccessResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestHeader;

import java.security.Principal;

@Tag(name = "auth", description = "계정 API")
public interface AuthApi {

@Operation(
summary = "카카오 로그인",
description = "카카오 로그인을 진행한다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공",
content = @Content(schema = @Schema(implementation = SuccessResponse.class))
),
@ApiResponse(
responseCode = "4xx",
description = "클라이언트(요청) 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
ResponseEntity<SuccessResponse<SignInResponse>> signIn(@RequestHeader("Authorization") String code);

@Operation(
summary = "로그 아웃",
description = "로그 아웃을 한다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공",
content = @Content(schema = @Schema(implementation = BaseResponse.class))
),
@ApiResponse(
responseCode = "404",
description = "유효하지 않은 회원",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "4xx",
description = "클라이언트(요청) 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
ResponseEntity<BaseResponse> signOut(@Parameter(hidden = true) Principal principal);

@Operation(
summary = "토큰 재발급",
description = "리프레시 토큰을 이용해 액세스 토큰을 재발급 받는다.",
responses = {
@ApiResponse(responseCode = "200", description = "성공"),
@ApiResponse(
responseCode = "404",
description = "유효하지 않은 회원",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "4xx",
description = "클라이언트(요청) 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
ResponseEntity<SuccessResponse<TokenResponse>> reissueToken(@RequestHeader("Authorization") String refreshToken);

@Operation(
summary = "토큰 발급",
description = "테스트용 계정의 액세스 토큰을 발급 받는다.",
responses = {
@ApiResponse(responseCode = "200", description = "성공"),
@ApiResponse(
responseCode = "4xx",
description = "클라이언트(요청) 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
ResponseEntity<SuccessResponse<TokenResponse>> getToken();
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.samtilee.drawdraw.auth.controller;

import com.samtilee.drawdraw.auth.dto.response.SignInResponse;
import com.samtilee.drawdraw.auth.dto.response.TokenResponse;
import com.samtilee.drawdraw.auth.service.AuthService;
import com.samtilee.drawdraw.common.dto.Response;
import com.samtilee.drawdraw.common.dto.BaseResponse;
import com.samtilee.drawdraw.common.dto.SuccessResponse;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.http.ResponseEntity;
Expand All @@ -10,37 +13,37 @@
import java.security.Principal;

import static com.samtilee.drawdraw.auth.message.SuccessMessage.*;
import static com.samtilee.drawdraw.common.dto.Response.success;
import static com.samtilee.drawdraw.common.dto.SuccessResponse.of;

@RestController
@RequiredArgsConstructor
@RequestMapping("api/v1/auth")
public class AuthController {
public class AuthController implements AuthApi {

private final AuthService authService;

@PostMapping
public ResponseEntity<Response> signIn(@RequestHeader("Authorization") String code) {
public ResponseEntity<SuccessResponse<SignInResponse>> signIn(@RequestHeader("Authorization") String code) {
val response = authService.signIn(code);
return ResponseEntity.ok(success(SUCCESS_SIGN_IN.getMessage(), response));
return ResponseEntity.ok(of(SUCCESS_SIGN_IN.getMessage(), response));
}

@PostMapping("/logout")
public ResponseEntity<Response> signOut(Principal principal) {
public ResponseEntity<BaseResponse> signOut(Principal principal) {
val memberId = Long.parseLong(principal.getName());
authService.signOut(memberId);
return ResponseEntity.ok(success(SUCCESS_SIGN_OUT.getMessage()));
return ResponseEntity.ok(of(SUCCESS_SIGN_OUT.getMessage()));
}

@PostMapping("/token")
public ResponseEntity<Response> reissueToken(@RequestHeader("Authorization") String refreshToken) {
public ResponseEntity<SuccessResponse<TokenResponse>> reissueToken(@RequestHeader("Authorization") String refreshToken) {
val response = authService.reissueToken(refreshToken);
return ResponseEntity.ok(success(SUCCESS_RECREATE_TOKEN.getMessage(), response));
return ResponseEntity.ok(of(SUCCESS_RECREATE_TOKEN.getMessage(), response));
}

@GetMapping
public ResponseEntity<Response> getToken() {
public ResponseEntity<SuccessResponse<TokenResponse>> getToken() {
val response = authService.getToken();
return ResponseEntity.ok(success(SUCCESS_GET_TOKEN.getMessage(), response));
return ResponseEntity.ok(of(SUCCESS_GET_TOKEN.getMessage(), response));
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.samtilee.drawdraw.auth.jwt;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.samtilee.drawdraw.common.dto.Response;
import jakarta.servlet.ServletException;
import com.samtilee.drawdraw.common.dto.ErrorResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -31,6 +30,6 @@ private void setResponse(HttpServletResponse response) throws IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType(APPLICATION_JSON_VALUE);
response.setStatus(SC_UNAUTHORIZED);
response.getWriter().println(objectMapper.writeValueAsString(Response.fail(INVALID_TOKEN.getMessage())));
response.getWriter().println(objectMapper.writeValueAsString(ErrorResponse.of(INVALID_TOKEN.getMessage())));
}
}
101 changes: 101 additions & 0 deletions src/main/java/com/samtilee/drawdraw/comment/controller/CommentApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package com.samtilee.drawdraw.comment.controller;

import com.samtilee.drawdraw.comment.dto.request.CommentCreationRequest;
import com.samtilee.drawdraw.comment.dto.response.CommentsViewResponse;
import com.samtilee.drawdraw.common.dto.ErrorResponse;
import com.samtilee.drawdraw.common.dto.SuccessResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;

import java.security.Principal;

@Tag(name = "comment", description = "코멘트 API")
public interface CommentApi {

@Operation(
summary = "코멘트 생성",
description = "일기에 코멘트를 작성한다.",
responses = {
@ApiResponse(responseCode = "201", description = "코멘트 생성 성공"),
@ApiResponse(
responseCode = "401",
description = "유효하지 않은 토큰",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "404",
description = "유효하지 않은 회원 / 유효하지 않은 일기",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "4xx",
description = "클라이언트(요청) 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
ResponseEntity<SuccessResponse> createComment(
@Parameter(hidden = true) Principal principal,
@Parameter(
name = "diaryId",
description = "코멘트를 작성할 일기의 id",
in = ParameterIn.PATH,
example = "1"
) @PathVariable Long diaryId,
@RequestBody CommentCreationRequest request
);

@Operation(
summary = "코멘트 보기",
description = "일기의 코멘트 목록을 조회한다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "코멘트 불러오기 성공",
content = @Content(schema = @Schema(implementation = SuccessResponse.class))
),
@ApiResponse(
responseCode = "401",
description = "유효하지 않은 토큰",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "404",
description = "유효하지 않은 일기",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "4xx",
description = "클라이언트(요청) 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
ResponseEntity<SuccessResponse<CommentsViewResponse>> viewComment(
@Parameter(hidden = true) Principal principal,
@Parameter(
name = "diaryId",
description = "코멘트를 볼 일기의 id",
in = ParameterIn.PATH,
example = "1"
) @PathVariable Long diaryId
);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.samtilee.drawdraw.comment.controller;

import com.samtilee.drawdraw.comment.dto.response.CommentsViewResponse;
import com.samtilee.drawdraw.comment.service.CommentService;
import com.samtilee.drawdraw.common.dto.Response;
import com.samtilee.drawdraw.common.dto.BaseResponse;
import com.samtilee.drawdraw.comment.dto.request.CommentCreationRequest;
import com.samtilee.drawdraw.common.dto.SuccessResponse;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.http.ResponseEntity;
Expand All @@ -12,30 +14,29 @@
import java.net.URI;
import java.security.Principal;

import static com.samtilee.drawdraw.common.dto.SuccessResponse.*;
import static com.samtilee.drawdraw.comment.message.SuccessMessage.SUCCESS_GET_COMMENT;
import static com.samtilee.drawdraw.common.dto.Response.success;
import static com.samtilee.drawdraw.comment.message.SuccessMessage.SUCCESS_CREATE_COMMENT;

@RestController
@RequiredArgsConstructor
@RequestMapping("api/v1/comments")
public class CommentController {
public class CommentController implements CommentApi {

private final CommentService commentService;

@PostMapping("/diaries/{diaryId}")
public ResponseEntity<Response> createComment(Principal principal, @PathVariable Long diaryId, @RequestBody CommentCreationRequest request) {
public ResponseEntity<SuccessResponse> createComment(Principal principal, @PathVariable Long diaryId, @RequestBody CommentCreationRequest request) {
val memberId = Long.parseLong(principal.getName());
val response = commentService.saveComment(memberId, diaryId, request);
return ResponseEntity.created(getURI())
.body(success(SUCCESS_CREATE_COMMENT.getMessage(), response));
.body(of(SUCCESS_CREATE_COMMENT.getMessage(), response));
}

@GetMapping("/diaries/{diaryId}")
public ResponseEntity<Response> viewComment(Principal principal, @PathVariable Long diaryId) {
val memberId = Long.parseLong(principal.getName());
public ResponseEntity<SuccessResponse<CommentsViewResponse>> viewComment(Principal principal, @PathVariable Long diaryId) {
val response = commentService.viewComment(diaryId);
return ResponseEntity.ok(success(SUCCESS_GET_COMMENT.getMessage(), response));
return ResponseEntity.ok(of(SUCCESS_GET_COMMENT.getMessage(), response));
}

private URI getURI() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.samtilee.drawdraw.common.controller;

import com.samtilee.drawdraw.common.dto.ErrorResponse;
import com.samtilee.drawdraw.common.dto.SuccessResponse;
import com.samtilee.drawdraw.diary.dto.response.DiariesViewResponse;
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.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;

@Tag(name = "board", description = "메인 화면 API")
public interface BoardApi {

@Operation(
summary = "메인 화면",
description = "메인 화면을 불러온다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공",
content = @Content(schema = @Schema(implementation = SuccessResponse.class))
),
@ApiResponse(
responseCode = "4xx",
description = "클라이언트(요청) 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "500",
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
ResponseEntity<SuccessResponse<DiariesViewResponse>> viewMainBoard();
}
Loading
Loading