Skip to content

Commit

Permalink
πŸš€ :: Api-v0.0.3
Browse files Browse the repository at this point in the history
πŸš€ :: Api-v0.0.3
  • Loading branch information
ImNM authored Jan 13, 2023
2 parents 3524353 + 6f9d825 commit 3caeb41
Show file tree
Hide file tree
Showing 74 changed files with 1,362 additions and 313 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@
import band.gosrock.api.auth.service.RefreshUseCase;
import band.gosrock.api.auth.service.RegisterUseCase;
import band.gosrock.api.auth.service.WithDrawUseCase;
import band.gosrock.api.auth.service.helper.CookieGenerateHelper;
import band.gosrock.common.annotation.DevelopOnlyApi;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import javax.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
Expand All @@ -46,6 +49,8 @@ public class AuthController {
private final WithDrawUseCase withDrawUseCase;
private final LogoutUseCase logoutUseCase;

private final CookieGenerateHelper cookieGenerateHelper;

@Operation(summary = "kakao oauth λ§ν¬λ°œκΈ‰ (λ°±μ—”λ“œμš© )", description = "kakao 링크λ₯Ό λ°›μ•„λ³Όμˆ˜ μžˆμŠ΅λ‹ˆλ‹€.")
@Tag(name = "카카였 oauth")
@GetMapping("/oauth/kakao/link/test")
Expand Down Expand Up @@ -90,8 +95,11 @@ public OauthTokenResponse getCredentialFromKaKao(
@Tag(name = "카카였 oauth")
@DevelopOnlyApi
@GetMapping("/oauth/kakao/develop")
public TokenAndUserResponse developUserSign(@RequestParam("code") String code) {
return registerUseCase.upsertKakaoOauthUser(code);
public ResponseEntity<TokenAndUserResponse> developUserSign(@RequestParam("code") String code) {
TokenAndUserResponse tokenAndUserResponse = registerUseCase.upsertKakaoOauthUser(code);
return ResponseEntity.ok()
.headers(cookieGenerateHelper.getTokenCookies(tokenAndUserResponse))
.body(tokenAndUserResponse);
}

@Operation(summary = "νšŒμ›κ°€μž…μ΄ κ°€λŠ₯ν•œμ§€ id token 으둜 ν™•μΈν•©λ‹ˆλ‹€.")
Expand All @@ -105,17 +113,26 @@ public AvailableRegisterResponse kakaoAuthCheckRegisterValid(
@Operation(summary = "id_token 으둜 νšŒμ›κ°€μž…μ„ ν•©λ‹ˆλ‹€.")
@Tag(name = "카카였 oauth")
@PostMapping("/oauth/kakao/register")
public TokenAndUserResponse kakaoAuthCheckRegisterValid(
public ResponseEntity<TokenAndUserResponse> kakaoAuthCheckRegisterValid(
@RequestParam("id_token") String token,
@Valid @RequestBody RegisterRequest registerRequest) {
return registerUseCase.registerUserByOCIDToken(token, registerRequest);
TokenAndUserResponse tokenAndUserResponse =
registerUseCase.registerUserByOCIDToken(token, registerRequest);
return ResponseEntity.ok()
.headers(cookieGenerateHelper.getTokenCookies(tokenAndUserResponse))
.body(tokenAndUserResponse);
}

@NotNull
@Operation(summary = "id_token 으둜 λ‘œκ·ΈμΈμ„ ν•©λ‹ˆλ‹€.")
@Tag(name = "카카였 oauth")
@PostMapping("/oauth/kakao/login")
public TokenAndUserResponse kakaoOauthUserLogin(@RequestParam("id_token") String token) {
return loginUseCase.execute(token);
public ResponseEntity<TokenAndUserResponse> kakaoOauthUserLogin(
@RequestParam("id_token") String token) {
TokenAndUserResponse tokenAndUserResponse = loginUseCase.execute(token);
return ResponseEntity.ok()
.headers(cookieGenerateHelper.getTokenCookies(tokenAndUserResponse))
.body(tokenAndUserResponse);
}

@Operation(summary = "accessToken 으둜 oauth user 정보λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ public class TokenAndUserResponse {
@Schema(description = "μ–΄μ„ΈμŠ€ 토큰")
private final String accessToken;

private final Long accessTokenAge;

@Schema(description = "λ¦¬ν”„λ ˆμ‰¬ 토큰")
private final String refreshToken;

private final Long refreshTokenAge;

private final ProfileViewDto userProfile;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package band.gosrock.api.auth.service.helper;


import band.gosrock.api.auth.model.dto.response.TokenAndUserResponse;
import band.gosrock.common.annotation.Helper;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseCookie;

@Helper
@RequiredArgsConstructor
public class CookieGenerateHelper {
private final Environment env;

public HttpHeaders getTokenCookies(TokenAndUserResponse tokenAndUserResponse) {
String[] activeProfiles = env.getActiveProfiles();
String sameSite = "None";

if (Arrays.stream(activeProfiles).toList().contains("prod")) {
sameSite = "Strict";
}
ResponseCookie accessToken =
ResponseCookie.from("accessToken", tokenAndUserResponse.getAccessToken())
.path("/")
.maxAge(tokenAndUserResponse.getAccessTokenAge())
.sameSite(sameSite)
.httpOnly(true)
.secure(true)
.build();
ResponseCookie refreshToken =
ResponseCookie.from("refreshToken", tokenAndUserResponse.getRefreshToken())
.path("/")
.maxAge(tokenAndUserResponse.getRefreshTokenAge())
.sameSite(sameSite)
.httpOnly(true)
.secure(true)
.build();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(HttpHeaders.SET_COOKIE, accessToken.toString());
httpHeaders.add(HttpHeaders.SET_COOKIE, refreshToken.toString());
return httpHeaders;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public TokenAndUserResponse execute(User user) {
return TokenAndUserResponse.builder()
.userProfile(ProfileViewDto.from(user))
.accessToken(newAccessToken)
.accessTokenAge(jwtTokenProvider.getAccessTokenTTlSecond())
.refreshTokenAge(jwtTokenProvider.getRefreshTokenTTlSecond())
.refreshToken(newRefreshToken)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package band.gosrock.api.cart.model.dto.response;


import band.gosrock.domain.common.vo.Money;
import band.gosrock.domain.common.vo.OptionAnswerVo;
import band.gosrock.domain.domains.cart.domain.CartLineItem;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -15,7 +17,15 @@ public class CartItemResponse {
// 응닡 λͺ©λ‘
private List<OptionAnswerVo> answers;

public static CartItemResponse of(String name, List<OptionAnswerVo> optionAnswerVos) {
return CartItemResponse.builder().answers(optionAnswerVos).name(name).build();
private Money itemPrice;
private Money cartLinePrice;

public static CartItemResponse of(String name, CartLineItem cartLineItem) {
return CartItemResponse.builder()
.answers(cartLineItem.getOptionAnswerVos())
.name(name)
.cartLinePrice(cartLineItem.getTotalCartLinePrice())
.itemPrice(cartLineItem.getItemPrice())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package band.gosrock.api.cart.model.dto.response;


import band.gosrock.domain.common.vo.Money;
import band.gosrock.domain.domains.cart.domain.Cart;
import java.util.List;
import lombok.Builder;
Expand All @@ -15,16 +16,19 @@ public class CreateCartResponse {
private final List<CartItemResponse> items;

// κΈˆμ•‘
private final String totalPrice;
private final Money totalPrice;

private final Long cartId;

private final Long totalQuantity;

public static CreateCartResponse of(List<CartItemResponse> cartItemResponses, Cart cart) {
return CreateCartResponse.builder()
.items(cartItemResponses)
.totalPrice(cart.getTotalPrice().toString())
.totalPrice(cart.getTotalPrice())
.cartId(cart.getId())
.title(cart.getCartName())
.totalQuantity(cart.getTotalQuantity())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public CreateCartResponse execute(AddCartRequest addCartRequest) {
cartItemResponses.add(
CartItemResponse.of(
generateCartLineName(cartLineItem, startNum, totalQuantity),
cartLineItem.getOptionAnswerVos()));
cartLineItem));
startNum += cartLineItem.getQuantity();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package band.gosrock.api.config;


import io.swagger.v3.oas.models.examples.Example;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class ExampleHolder {
private Example holder;
private String name;
private int code;
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,37 @@
package band.gosrock.api.config;

import static java.util.stream.Collectors.groupingBy;

import band.gosrock.common.annotation.ApiErrorExample;
import band.gosrock.common.annotation.DisableSwaggerSecurity;
import band.gosrock.common.annotation.ExplainError;
import band.gosrock.common.dto.ErrorReason;
import band.gosrock.common.dto.ErrorResponse;
import band.gosrock.common.exception.DuDoongCodeException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.core.jackson.ModelResolver;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.examples.Example;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.media.Content;
import io.swagger.v3.oas.models.media.MediaType;
import io.swagger.v3.oas.models.responses.ApiResponse;
import io.swagger.v3.oas.models.responses.ApiResponses;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.security.SecurityScheme.In;
import io.swagger.v3.oas.models.security.SecurityScheme.Type;
import io.swagger.v3.oas.models.servers.Server;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.ServletContext;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.customizers.OperationCustomizer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.HandlerMethod;
Expand All @@ -26,8 +40,11 @@
// @OpenAPIDefinition(servers = {@io.swagger.v3.oas.annotations.servers.Server(url = "/",
// description = "Default Server URL")})
@Configuration
@RequiredArgsConstructor
public class SwaggerConfig {

private final ApplicationContext applicationContext;

@Bean
public OpenAPI openAPI(ServletContext servletContext) {
String contextPath = servletContext.getContextPath();
Expand Down Expand Up @@ -69,6 +86,8 @@ public OperationCustomizer customize() {
return (Operation operation, HandlerMethod handlerMethod) -> {
DisableSwaggerSecurity methodAnnotation =
handlerMethod.getMethodAnnotation(DisableSwaggerSecurity.class);
ApiErrorExample apiErrorExample =
handlerMethod.getMethodAnnotation(ApiErrorExample.class);
List<String> tags = getTags(handlerMethod);
// DisableSecurity μ–΄λ…Έν…Œμ΄μ…˜μžˆμ„μ‹œ μŠ€μ›¨κ±° μ‹œνλ¦¬ν‹° μ„€μ • μ‚­μ œ
if (methodAnnotation != null) {
Expand All @@ -78,10 +97,65 @@ public OperationCustomizer customize() {
if (!tags.isEmpty()) {
operation.setTags(Collections.singletonList(tags.get(0)));
}
// ApiErrorExample μ–΄λ…Έν…Œμ΄μ…˜ 단 ν΄λž˜μŠ€μ— 적용
if (apiErrorExample != null) {
generateErrorResponseExample(operation, apiErrorExample.value());
}
return operation;
};
}

/** ExplainError μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ λΆ€κ°€μ„€λͺ…을 λΆ™μΌμˆ˜μžˆμŠ΅λ‹ˆλ‹€. ν•„λ“œλ“€μ„ κ°€μ Έμ™€μ„œ μ˜ˆμ‹œ μ—λŸ¬ 객체λ₯Ό λ™μ μœΌλ‘œ μƒμ„±ν•΄μ„œ μ˜ˆμ‹œκ°’μœΌλ‘œ λΆ™μž…λ‹ˆλ‹€. */
private void generateErrorResponseExample(Operation operation, Class<?> type) {
ApiResponses responses = operation.getResponses();

// ----------------생성
Object bean = applicationContext.getBean(type);
Field[] declaredFields = bean.getClass().getDeclaredFields();
Map<Integer, List<ExampleHolder>> stringListMap =
Arrays.stream(declaredFields)
.filter(field -> field.getAnnotation(ExplainError.class) != null)
.filter(field -> field.getType() == DuDoongCodeException.class)
.map(
field -> {
try {
DuDoongCodeException exception =
(DuDoongCodeException) field.get(bean);
ExplainError annotation =
field.getAnnotation(ExplainError.class);
String value = annotation.value();
ErrorReason errorReason =
exception.getErrorCode().getErrorReason();
ErrorResponse errorResponse =
new ErrorResponse(errorReason, "μš”μ²­μ‹œ νŒ¨μŠ€μ •λ³΄μž…λ‹ˆλ‹€.");
Example example = new Example();
example.description(value);
example.setValue(errorResponse);
return new ExampleHolder(
example, field.getName(), errorReason.getStatus());
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
})
.collect(groupingBy(ExampleHolder::getCode));

// -------------------------- μ½˜ν…μΈ  μ„ΈνŒ… μ½”λ“œλ³„λ‘œ 진행
stringListMap.forEach(
(status, v) -> {
Content content = new Content();
MediaType mediaType = new MediaType();
ApiResponse apiResponse = new ApiResponse();
v.forEach(
exampleHolder -> {
mediaType.addExamples(
exampleHolder.getName(), exampleHolder.getHolder());
});
content.addMediaType("application/json", mediaType);
apiResponse.setContent(content);
responses.addApiResponse(status.toString(), apiResponse);
});
}

private static List<String> getTags(HandlerMethod handlerMethod) {
List<String> tags = new ArrayList<>();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package band.gosrock.api.example.controller;


import band.gosrock.api.example.docs.ExampleException2Docs;
import band.gosrock.api.example.docs.ExampleExceptionDocs;
import band.gosrock.api.example.dto.ExampleResponse;
import band.gosrock.api.example.service.ExampleApiService;
import band.gosrock.common.annotation.ApiErrorExample;
import band.gosrock.common.annotation.DevelopOnlyApi;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import lombok.RequiredArgsConstructor;
Expand All @@ -21,11 +24,13 @@ public class ExampleController {

@GetMapping
@DevelopOnlyApi
@ApiErrorExample(ExampleExceptionDocs.class)
public ExampleResponse get() {
return exampleApiService.getExample();
}

@PostMapping
@ApiErrorExample(ExampleException2Docs.class)
public ExampleResponse create() {
return exampleApiService.createExample();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package band.gosrock.api.example.docs;


import band.gosrock.common.annotation.ExceptionDoc;
import band.gosrock.common.annotation.ExplainError;
import band.gosrock.common.exception.DuDoongCodeException;
import band.gosrock.common.exception.InvalidTokenException;
import band.gosrock.domain.domains.order.exception.InvalidOrderException;
import band.gosrock.domain.domains.order.exception.OrderNotFoundException;

@ExceptionDoc
public class ExampleException2Docs {

@ExplainError("μ–΄μ©Œκ΅¬ μ €μ©Œκ΅¬")
public DuDoongCodeException μœ μ €μ—†μ„λ•Œ = InvalidTokenException.EXCEPTION;

@ExplainError("μ˜€λ” λ‚«νŒŒμš΄λ“œ")
public DuDoongCodeException ν•œκΈ€λ„λœλ‹€ = OrderNotFoundException.EXCEPTION;

@ExplainError("μΈλ°Έλ¦¬λ“œ μ˜€λ”")
public DuDoongCodeException 였λ₯˜κ°€λ‚¬μ„λ•Œ = InvalidOrderException.EXCEPTION;
}
Loading

0 comments on commit 3caeb41

Please sign in to comment.