Skip to content

Commit 2493015

Browse files
authored
Merge pull request #150 from Boggle-Boggle/refactor/#145
- 회원 API URI 수정 - 약관 조회 api 리팩토링 - 회원탈퇴 API 리팩토링 - 변경사항에 대한 Test 작성 및 Rest docs 작성
2 parents cdbc982 + 3a29bd4 commit 2493015

23 files changed

+492
-273
lines changed

src/docs/asciidoc/index.adoc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,14 @@ include::info.adoc[]
1717
//소셜 로그인
1818
include::oauth2-api.adoc[]
1919

20+
//약관
21+
include::terms.adoc[]
22+
23+
//유저
24+
include::user.adoc[]
25+
2026
//책
2127
include::book-api.adoc[]
2228

2329
//독서기록
24-
include::record-api.adoc[]
30+
include::record-api.adoc[]

src/docs/asciidoc/oauth2-api.adoc

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ include::{snippets}/auth/oauth2-authorize/query-parameters.adoc[]
1616
[discrete]
1717
==== 응답
1818
include::{snippets}/auth/oauth2-authorize/http-response.adoc[]
19-
include::{snippets}/auth/oauth2-authorize/response-fields.adoc[]
19+
include::{snippets}/auth/oauth2-authorize/response-fields-data.adoc[]
2020

2121

22-
=== 소셜 로그인 콜백 처리
22+
=== 소셜 로그인 콜백
2323

2424
[discrete]
2525
==== 응답 예시
@@ -48,4 +48,22 @@ include::{snippets}/auth/oauth2-authorize/response-fields.adoc[]
4848
==== 실제 응답
4949

5050
include::{snippets}/auth/oauth2-callback/http-response.adoc[]
51-
include::{snippets}/auth/oauth2-callback/response-fields-data.adoc[]
51+
include::{snippets}/auth/oauth2-callback/response-fields-data.adoc[]
52+
53+
54+
=== 회원가입 요청
55+
56+
소셜 로그인 후 `SIGNUP_REQUIRED` 상태로 받은 `preSignupId`를 활용해 회원가입을 진행합니다.
57+
58+
[discrete]
59+
==== 요청
60+
include::{snippets}/auth/oauth2-signup/http-request.adoc[]
61+
include::{snippets}/auth/oauth2-signup/request-fields.adoc[]
62+
63+
[discrete]
64+
==== 응답
65+
---
66+
쿠키에 DEVICE_CODE 및 REFRESH_TOKEN이 셋팅됨(30 Days 영구쿠키)
67+
68+
include::{snippets}/auth/oauth2-signup/http-response.adoc[]
69+
include::{snippets}/auth/oauth2-signup/response-fields-data.adoc[]

src/docs/asciidoc/terms.adoc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[[terms-api]]
2+
== 📃 약관 API
3+
4+
앱 회원가입 시 약관 목록을 조회할 수 있습니다.
5+
항상 최신 버전의 약관이 반환됩니다.
6+
7+
=== 약관 목록 조회
8+
9+
현재 유효한 약관 리스트를 반환합니다.
10+
회원가입 시 사용자에게 보여줘야 할 약관들입니다.
11+
12+
[discrete]
13+
==== 요청
14+
include::{snippets}/terms/get-latest-terms/http-request.adoc[]
15+
16+
[discrete]
17+
==== 응답
18+
19+
include::{snippets}/terms/get-latest-terms/http-response.adoc[]
20+
include::{snippets}/terms/get-latest-terms/response-fields-terms.adoc[]

src/docs/asciidoc/user.adoc

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
[[user-api]]
2+
== 👤 사용자 API
3+
4+
회원 정보 관련 기능을 제공합니다.
5+
6+
=== 회원 탈퇴
7+
8+
회원 탈퇴를 수행하고, 관련 쿠키를 삭제합니다.
9+
10+
[discrete]
11+
==== 요청
12+
13+
include::{snippets}/user/delete-user/http-request.adoc[]
14+
include::{snippets}/user/delete-user/request-fields.adoc[]
15+
16+
[discrete]
17+
==== 탈퇴 사유 코드 (WithdrawType)
18+
19+
|===
20+
|코드 |설명
21+
22+
|PRIVACY_CONCERN |개인정보 및 보안이 우려돼요
23+
|REJOIN_AFTER_WITHDRAWAL |탈퇴 후 신규가입할 거예요
24+
|SERVICE_ERROR |서비스 장애와 오류가 있어요
25+
|LACK_OF_FEATURES |원하는 기능이 부족해요
26+
|TOO_TEDIOUS |기록하기가 번거롭고 귀찮아요
27+
|BAD_UI_UX |인터페이스가 불편하거나 직관적이지 않아요
28+
|NO_LONGER_NEEDED |더 이상 독서기록이 필요하지 않아요
29+
|ETC |기타
30+
|===
31+
32+
[discrete]
33+
==== 응답
34+
35+
include::{snippets}/user/delete-user/http-response.adoc[]
36+
include::{snippets}/user/delete-user/response-fields.adoc[]

src/main/java/com/boggle_boggle/bbegok/config/properties/OAuthProperties.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,22 @@
11
package com.boggle_boggle.bbegok.config.properties;
22

3+
import io.jsonwebtoken.Jwts;
4+
import io.jsonwebtoken.SignatureAlgorithm;
35
import lombok.Getter;
46
import lombok.Setter;
7+
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
8+
import org.bouncycastle.openssl.PEMParser;
9+
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
510
import org.springframework.boot.context.properties.ConfigurationProperties;
11+
import org.springframework.core.io.ClassPathResource;
12+
13+
import java.io.IOException;
14+
import java.io.Reader;
15+
import java.io.StringReader;
16+
import java.security.PrivateKey;
17+
import java.util.Date;
18+
import java.util.HashMap;
19+
import java.util.Map;
620

721
@ConfigurationProperties(prefix = "oauth")
822
@Getter

src/main/java/com/boggle_boggle/bbegok/config/security/AppleKeyConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.security.interfaces.ECPrivateKey;
1414
import java.security.spec.PKCS8EncodedKeySpec;
1515

16+
//p8 key 읽어서 ECPrivateKey를 Bean으로 등록
1617
@Configuration
1718
@RequiredArgsConstructor
1819
public class AppleKeyConfig {

src/main/java/com/boggle_boggle/bbegok/config/security/SecurityConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
5454
.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
5555
.requestMatchers("/actuator/**").permitAll()
5656
.requestMatchers("/auth/**").permitAll()
57-
.requestMatchers("/user/**").permitAll()
57+
.requestMatchers("/terms/**").permitAll()
5858
.anyRequest().hasAuthority(RoleType.USER.getCode()))
5959

6060
//토큰 검증 필터

src/main/java/com/boggle_boggle/bbegok/controller/OAuth2AuthController.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33
import com.boggle_boggle.bbegok.config.properties.AppProperties;
44
import com.boggle_boggle.bbegok.dto.OAuthLoginResponse;
55
import com.boggle_boggle.bbegok.dto.base.DataResponseDto;
6+
import com.boggle_boggle.bbegok.dto.request.SignupRequest;
67
import com.boggle_boggle.bbegok.enums.SignStatus;
78
import com.boggle_boggle.bbegok.oauth.client.OAuth2RedirectUriBuilder;
89
import com.boggle_boggle.bbegok.oauth.entity.ProviderType;
910
import com.boggle_boggle.bbegok.service.OAuth2LoginService;
1011
import com.boggle_boggle.bbegok.service.QueryService;
12+
import com.boggle_boggle.bbegok.service.UserService;
1113
import com.boggle_boggle.bbegok.utils.CookieUtil;
1214
import com.boggle_boggle.bbegok.utils.OauthValidateUtil;
1315
import jakarta.servlet.http.HttpServletRequest;
1416
import jakarta.servlet.http.HttpServletResponse;
1517
import jakarta.servlet.http.HttpSession;
18+
import jakarta.validation.Valid;
1619
import lombok.RequiredArgsConstructor;
1720
import org.springframework.web.bind.annotation.*;
1821
import org.springframework.beans.factory.annotation.Value;
@@ -24,15 +27,30 @@
2427
import static org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames.DEVICE_CODE;
2528

2629
@RestController
27-
@RequestMapping("/auth/oauth2")
30+
@RequestMapping("/auth")
2831
@RequiredArgsConstructor
2932
public class OAuth2AuthController {
3033

3134
private final OAuth2LoginService oauth2LoginService;
3235
private final QueryService queryService;
36+
private final UserService userService;
3337
private final OAuth2RedirectUriBuilder oAuth2RedirectUriBuilder;
3438

35-
@GetMapping("/authorize")
39+
//회원가입
40+
@PostMapping("/signup")
41+
public DataResponseDto<OAuthLoginResponse> signup(@Valid @RequestBody SignupRequest signupRequest,
42+
HttpServletRequest request,
43+
HttpServletResponse response) {
44+
OAuthLoginResponse oauthLoginResponse = userService.signup(signupRequest.getPreSignupId(), signupRequest.getNickname(), signupRequest.getAgreements());
45+
if(oauthLoginResponse.getStatus() == SignStatus.EXISTING_USER) {
46+
queryService.setLoginCookie(request, response, oauthLoginResponse);
47+
oauthLoginResponse.clearLoginData();
48+
}
49+
return DataResponseDto.of(oauthLoginResponse);
50+
}
51+
52+
//리다이렉트할 인증서버URI를 리턴
53+
@GetMapping("/oauth2/authorize")
3654
public DataResponseDto<Map<String, String>> authorize(@RequestParam("provider") ProviderType providerType, HttpSession session) {
3755
String state = UUID.randomUUID().toString();
3856
session.setAttribute("oauth2_state", state);
@@ -42,7 +60,7 @@ public DataResponseDto<Map<String, String>> authorize(@RequestParam("provider")
4260
}
4361

4462
//oauth 인증서버에서 인가코드를 리다이렉트(302)하는 콜백 API
45-
@GetMapping("/callback/{provider}")
63+
@GetMapping("/oauth2/callback/{provider}")
4664
public DataResponseDto<OAuthLoginResponse> oauth2Callback(
4765
@PathVariable("provider") ProviderType providerType,
4866
@RequestParam("code") String code,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.boggle_boggle.bbegok.controller;
2+
3+
import com.boggle_boggle.bbegok.dto.TermsAgreement;
4+
import com.boggle_boggle.bbegok.dto.base.DataResponseDto;
5+
import com.boggle_boggle.bbegok.dto.response.TermsResponse;
6+
import com.boggle_boggle.bbegok.service.TermsService;
7+
import com.boggle_boggle.bbegok.service.UserService;
8+
import jakarta.validation.Valid;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
11+
import org.springframework.security.core.userdetails.UserDetails;
12+
import org.springframework.web.bind.annotation.*;
13+
14+
@RestController
15+
@RequestMapping("/terms")
16+
@RequiredArgsConstructor
17+
public class TermsController {
18+
private final UserService userService;
19+
private final TermsService termsService;
20+
21+
//약관조회
22+
@GetMapping
23+
public DataResponseDto<TermsResponse> getLatestTerms() {
24+
return DataResponseDto.of(termsService.getLatestTerms());
25+
}
26+
27+
/** 약관동의
28+
@PutMapping
29+
public DataResponseDto<Void> agreeToTerms(@RequestBody @Valid List<TermsAgreement> request,
30+
@AuthenticationPrincipal UserDetails userDetails) {
31+
userService.agreeToTerms(request,userDetails.getUsername());
32+
return DataResponseDto.empty();
33+
}
34+
**/
35+
}

src/main/java/com/boggle_boggle/bbegok/controller/UserController.java

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -35,28 +35,18 @@ public class UserController {
3535
private final QueryService queryService;
3636
private final UserService userService;
3737

38-
@PostMapping()
39-
public DataResponseDto<OAuthLoginResponse> signup(@Valid @RequestBody SignupRequest signupRequest,
40-
HttpServletRequest request,
41-
HttpServletResponse response) {
42-
OAuthLoginResponse oauthLoginResponse = userService.signup(signupRequest.getPreSignupId(), signupRequest.getNickname(), signupRequest.getAgreements());
43-
if(oauthLoginResponse.getStatus() == SignStatus.EXISTING_USER) {
44-
queryService.setLoginCookie(request, response, oauthLoginResponse);
45-
oauthLoginResponse.clearLoginData();
46-
}
47-
return DataResponseDto.of(oauthLoginResponse);
48-
}
49-
/*
38+
5039
@DeleteMapping
5140
public DataResponseDto<Void> deleteUser(HttpServletRequest request, HttpServletResponse response,
5241
@Valid @RequestBody WithdrawReasonRequest withdrawReasonRequest,
5342
@AuthenticationPrincipal UserDetails userDetails) throws IOException {
43+
//계정 삭제 및 revoke 처리
5444
revokeService.deleteAccount(userDetails.getUsername(), withdrawReasonRequest);
55-
CookieUtil.deleteCookie(request, response, REFRESH_TOKEN,domain);
56-
CookieUtil.deleteCookie(request, response, DEVICE_CODE,domain);
45+
//쿠키삭제
46+
queryService.clearAllCookie(request, response);
5747
return DataResponseDto.empty();
5848
}
59-
49+
/*
6050
//닉네임 수정
6151
@PatchMapping("/nickname")
6252
public DataResponseDto<Void> updateNickname(@AuthenticationPrincipal UserDetails userDetails,
@@ -78,18 +68,5 @@ public DataResponseDto<String> getAuthorization(@AuthenticationPrincipal UserDet
7868
return DataResponseDto.of(userService.getAuthorization(userDetails.getUsername()));
7969
}
8070
81-
//약관조회
82-
@GetMapping("/terms")
83-
public DataResponseDto<TermsResponse> getLatestTerms(@AuthenticationPrincipal UserDetails userDetails) {
84-
return DataResponseDto.of(userService.getLatestTerms(userDetails.getUsername()));
85-
}
86-
87-
//약관동의
88-
@PutMapping("/terms")
89-
public DataResponseDto<Void> agreeToTerms(@RequestBody @Valid List<TermsAgreement> request,
90-
@AuthenticationPrincipal UserDetails userDetails) {
91-
userService.agreeToTerms(request,userDetails.getUsername());
92-
return DataResponseDto.empty();
93-
}
9471
*/
9572
}

0 commit comments

Comments
 (0)