Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
3562bfc
refactor: 게스트 필터 제거
wlsh44 Mar 3, 2025
9b2060f
refactor: 게스트 토큰 발급 제거
wlsh44 Mar 3, 2025
b4af6ff
refactor: jwt claim role 추가
wlsh44 Mar 3, 2025
0014733
feat: 게스트 로그인 추가
wlsh44 Mar 3, 2025
43f38bc
refactor: 내 정보 조회 api 수정
wlsh44 Mar 3, 2025
79ad8a6
feat: 권한 예외 기능 추가
wlsh44 Mar 3, 2025
c22947e
docs: 게스트 로그인 추가
wlsh44 Mar 3, 2025
188bd21
refactor: 안 쓰는 에러 코드 제거
wlsh44 Mar 3, 2025
ec8cc4a
refactor: 닉네임 생성 수정
wlsh44 Mar 3, 2025
3c878c4
Merge pull request #90 from SWYP-team-2th/refactor/guest
wlsh44 Mar 3, 2025
4415cb1
docs: 안 쓰는 api 제거
wlsh44 Mar 4, 2025
c559c5b
fix: 투표 현황 조회 방어 로직 추가
wlsh44 Mar 4, 2025
48ab5a3
test: 테스트 코드 추가
wlsh44 Mar 4, 2025
b2bf9b6
fix: batch fetch 뎁스 잘못된 부분 수정
wlsh44 Mar 4, 2025
14974de
fix: 404 처리 버그 수정
wlsh44 Mar 4, 2025
67df796
docs: 테스트 토큰 수정
wlsh44 Mar 4, 2025
0622820
refactor: 페이징 쿼리 id 인덱스 적용
wlsh44 Mar 4, 2025
1004052
refactor: 게시글 조회 쿼리 게시글 이미지 fetch 추가
wlsh44 Mar 4, 2025
f3bc001
Merge pull request #92 from SWYP-team-2th/fix/vote-status
wlsh44 Mar 4, 2025
b08183c
chore: webp 플러그인 추가 및 AWS 람다 의존성 추가
YuuuuuuYu Mar 5, 2025
c93abf3
chore: AWS 람다 설정 추가
YuuuuuuYu Mar 5, 2025
62f5945
refactor: 리사이징 함수 제거 및 webp 외 jpeg 확장자 통일
YuuuuuuYu Mar 5, 2025
ebd0cf9
chore: 프로퍼티 업데이트
YuuuuuuYu Mar 5, 2025
b3e8361
test: 파일 유효성 체크 테스트 추가
YuuuuuuYu Mar 5, 2025
ceb9fea
docs: 댓글 수정 추가
YuuuuuuYu Mar 5, 2025
5dc9701
docs: 회원탈퇴 추가
YuuuuuuYu Mar 5, 2025
5654dc2
docs: 게시글 수정, 노출 변경 추가
YuuuuuuYu Mar 5, 2025
aaad0f2
chore: 함수명 수정
YuuuuuuYu Mar 5, 2025
a88b79c
Merge pull request #93 from SWYP-team-2th/refactor/upload-image
YuuuuuuYu Mar 5, 2025
b4d7b47
chore: querydsl 의존성 추가
wlsh44 Mar 6, 2025
a072d44
feat: querydsl 추가
wlsh44 Mar 6, 2025
36423fd
refactor: 유저가 작성한 게시글 조회 리팩터링
wlsh44 Mar 6, 2025
1ff6a05
refactor: post jpaRepository 이름 변경
wlsh44 Mar 6, 2025
9e0987b
docs: 미구현 수식어 추가
YuuuuuuYu Mar 6, 2025
229fa67
chore: PR 수정건 반영
YuuuuuuYu Mar 6, 2025
3f67050
chore: 데이터 생성일자 고정 및 삭제 메소드 추가
YuuuuuuYu Mar 6, 2025
db8faa4
feat: 댓글 삭제 추가
YuuuuuuYu Mar 6, 2025
21fd66e
test: 댓글 삭제 테스트
YuuuuuuYu Mar 6, 2025
cb3971e
docs: 댓글 삭제 구현
YuuuuuuYu Mar 6, 2025
9186e12
test: 테스트 로직 삭제
YuuuuuuYu Mar 6, 2025
01806e0
Merge pull request #94 from SWYP-team-2th/docs/rest-docs-etc
YuuuuuuYu Mar 6, 2025
57c1c6b
Merge branch 'develop' into feature/delete-comment
YuuuuuuYu Mar 6, 2025
eca66a6
chore: PR 수정건 반영
YuuuuuuYu Mar 7, 2025
38a146b
Merge branch 'feature/delete-comment' of https://github.com/SWYP-team…
YuuuuuuYu Mar 7, 2025
a649cb8
Merge pull request #95 from SWYP-team-2th/feature/delete-comment
YuuuuuuYu Mar 7, 2025
6d52e49
chore: 댓글 추가/수정 Request 통합
YuuuuuuYu Mar 8, 2025
7956754
feat: 댓글 수정 추가
YuuuuuuYu Mar 8, 2025
a6695de
docs: 댓글 수정 구현
YuuuuuuYu Mar 8, 2025
60ae5bc
test: 댓글 수정 테스트
YuuuuuuYu Mar 8, 2025
7c35038
feat: 수정된 댓글 객체 생성으로 수정
YuuuuuuYu Mar 8, 2025
51a7194
chore: 이전 소스 원복
YuuuuuuYu Mar 8, 2025
9868208
chore: 주석 제거
YuuuuuuYu Mar 8, 2025
9ca4a8f
chore: 불필요한 소스 제거
YuuuuuuYu Mar 8, 2025
bbe7766
feat: 게시글 공개범위 필드 추가
YuuuuuuYu Mar 8, 2025
6ba520d
feat: 게시글 공개범위 수정 추가
YuuuuuuYu Mar 8, 2025
fd58279
test: 게시글 공개범위 수정 테스트
YuuuuuuYu Mar 8, 2025
28ef9ad
test: 카카오 앱 키 수정 후 소셜로그인 테스트
YuuuuuuYu Mar 8, 2025
0fc6f2e
Merge pull request #97 from SWYP-team-2th/test/kakao-login-dev
YuuuuuuYu Mar 8, 2025
954d2dc
chore: 앱 키 원복
YuuuuuuYu Mar 8, 2025
ffad053
Merge pull request #98 from SWYP-team-2th/test/kakao-login-dev
YuuuuuuYu Mar 8, 2025
b16a67d
chore: 새로운 개발 앱 키 적용
YuuuuuuYu Mar 8, 2025
65ec1d1
Merge pull request #99 from SWYP-team-2th/test/kakao-login-dev
YuuuuuuYu Mar 8, 2025
3736e33
chore: 카카오 운영 앱 키 적용
YuuuuuuYu Mar 8, 2025
e916921
Merge pull request #100 from SWYP-team-2th/test/kakao-login-dev
YuuuuuuYu Mar 8, 2025
4c122d4
Merge pull request #96 from SWYP-team-2th/feature/update-comment
YuuuuuuYu Mar 9, 2025
60d7fc0
refactor: querydsl 제거
wlsh44 Mar 9, 2025
4a6af22
refactor: infra 계층 분리 롤백
wlsh44 Mar 9, 2025
09cd049
refactor: 유저가 작성한 게시글 조회 쿼리 수정
wlsh44 Mar 9, 2025
184054f
Merge pull request #101 from SWYP-team-2th/feature/toggle-post-scope
YuuuuuuYu Mar 9, 2025
8badd9c
refactor: 투표한 게시글 조회 쿼리 수정
wlsh44 Mar 9, 2025
87e0e5a
feat: 게시글 투표 방식 추가
wlsh44 Mar 9, 2025
9a394c3
refactor: 안 쓰는 코드 제거
wlsh44 Mar 9, 2025
39748c4
feat: 단일/복수 투표 기능 추가
wlsh44 Mar 9, 2025
2e9fa2e
feat: 투표 취소 기능 추가
wlsh44 Mar 9, 2025
d70ec2d
docs: 투표 취소 추가
wlsh44 Mar 9, 2025
3a90cde
feat: 게시글 상세 조회 투표 여부 -> 투표 Id로 변경
wlsh44 Mar 9, 2025
43798c6
Merge branch 'feature/vote-type' into refactor/query
wlsh44 Mar 9, 2025
8525a86
refactor: 코드 위치 수정
wlsh44 Mar 9, 2025
6b71811
Merge pull request #102 from SWYP-team-2th/feature/vote-type
wlsh44 Mar 9, 2025
26a0480
test: 베스트 픽 조회 테스트 코드 추가
wlsh44 Mar 9, 2025
1821c13
refactor: 투표 현황 조회 api 패키지 변경 및 게시글 command query 분리
wlsh44 Mar 9, 2025
0ad6f00
refactor: 공유 url 패키지 이동 및 필요 없는 코드 제거
wlsh44 Mar 9, 2025
44d8b17
fix: scope 누락된 소스 추가
YuuuuuuYu Mar 10, 2025
5093db8
chore: 샘플 데이터 scope 적용
YuuuuuuYu Mar 10, 2025
9dd75f5
test: scope 테스트 코드 수정
YuuuuuuYu Mar 10, 2025
87444cb
test: 샘플 코드에 scope 적용
YuuuuuuYu Mar 10, 2025
be1b292
test: 피드 조회 테스트
YuuuuuuYu Mar 10, 2025
92ec285
test: 피드 조회 서비스단 테스트 수정
YuuuuuuYu Mar 10, 2025
1c1f20c
Merge pull request #103 from SWYP-team-2th/refactor/query
wlsh44 Mar 10, 2025
afc5f3c
Merge remote-tracking branch 'origin/develop' into refactor/query
wlsh44 Mar 10, 2025
dc1dc0d
fix: 버그 수정
wlsh44 Mar 10, 2025
a7e18ee
Merge pull request #106 from SWYP-team-2th/refactor/query
wlsh44 Mar 10, 2025
dc44ccc
fix: 머지 충돌 수정
YuuuuuuYu Mar 10, 2025
cd1c346
fix: 복수투표 시 투표현황 리턴값 2개 오류 수정
YuuuuuuYu Mar 10, 2025
922acff
Merge pull request #108 from SWYP-team-2th/fix/find-vote-status
YuuuuuuYu Mar 10, 2025
51ff679
fix: JPEG 변환 시 패널 관련 오류 수정
YuuuuuuYu Mar 10, 2025
17746f7
Merge pull request #110 from SWYP-team-2th/fix/image-convert-jpeg
YuuuuuuYu Mar 10, 2025
88859b3
docs: 투표 현황 조회, 댓글 조회 문서 수정
YuuuuuuYu Mar 10, 2025
de54d21
Merge pull request #111 from SWYP-team-2th/fix/find-vote-status
YuuuuuuYu Mar 10, 2025
06563e0
test: 충돌 관련 소스 수정
YuuuuuuYu Mar 10, 2025
dedd63f
Merge pull request #104 from SWYP-team-2th/fix/toggle-post-scope
YuuuuuuYu Mar 10, 2025
e588799
fix: 충돌 관련 소스 수정
YuuuuuuYu Mar 10, 2025
0e5457e
Merge pull request #105 from SWYP-team-2th/feature/select-feed
YuuuuuuYu Mar 10, 2025
be08b99
feat: 투표 현황 투표 개수 내림차순으로 정렬 기능 추가
wlsh44 Mar 11, 2025
124dc37
Merge pull request #112 from SWYP-team-2th/feature/vote-status
wlsh44 Mar 11, 2025
4bb4daf
feat: 작성자 정보 추가
YuuuuuuYu Mar 11, 2025
8033940
test: 테스트 코드 수정
YuuuuuuYu Mar 11, 2025
efaf49d
feat: 게시글 공유 URL 추가
YuuuuuuYu Mar 11, 2025
9db088e
docs: shareUrl 형식 수정
YuuuuuuYu Mar 11, 2025
237dc48
Merge pull request #113 from SWYP-team-2th/feature/select-feed
YuuuuuuYu Mar 11, 2025
56ce055
fix: 잘못된 토큰인 경우 invalid token 예외 나오게 수정
wlsh44 Mar 12, 2025
9a29f6a
Merge pull request #114 from SWYP-team-2th/fix/invalid-token
wlsh44 Mar 12, 2025
77af609
chore: 테스트 코드 제거
YuuuuuuYu Mar 12, 2025
2b95efb
fix: 기본 프로필 이미지 수정
YuuuuuuYu Mar 12, 2025
d6112ee
chore: hibernate 쿼리 출력 안하기
YuuuuuuYu Mar 12, 2025
fe3f057
Merge pull request #115 from SWYP-team-2th/fix/user-profileUrl
YuuuuuuYu Mar 12, 2025
ad022fc
chore: 유휴 커넥션, 최대 사이즈 수정
YuuuuuuYu Mar 12, 2025
949e8fe
Merge pull request #116 from SWYP-team-2th/test/upload-image-optimiza…
YuuuuuuYu Mar 12, 2025
817d1ed
fix: logFilter 순서 변경 및 안 쓰는 api 제거
wlsh44 Mar 12, 2025
8622ffb
Merge pull request #117 from SWYP-team-2th/fix/userinfo-error
wlsh44 Mar 12, 2025
b96fed7
fix: userInfo null 예외 수정
wlsh44 Mar 12, 2025
723f78b
Merge remote-tracking branch 'origin/develop' into fix/userinfo-error
wlsh44 Mar 12, 2025
5a734c9
Merge pull request #118 from SWYP-team-2th/fix/userinfo-error
wlsh44 Mar 12, 2025
81044f3
refactor: 피드 조회 쿼리 개선
YuuuuuuYu Mar 13, 2025
d62c037
test: 테스트 코드 수정
YuuuuuuYu Mar 13, 2025
0ea0e32
chore: 에러 메시지 수정
YuuuuuuYu Mar 13, 2025
67d0a09
chore: 운영 프로퍼티에 개발 프로퍼티 적용
YuuuuuuYu Mar 13, 2025
e18e7bd
test: 테스트 코드 수정
YuuuuuuYu Mar 13, 2025
b253ab3
Merge pull request #120 from SWYP-team-2th/test/upload-image-optimiza…
YuuuuuuYu Mar 13, 2025
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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,5 @@ out/
.DS_Store

application*.yml

/src/main/generated/
8 changes: 4 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,8 @@ dependencies {

// image
implementation 'software.amazon.awssdk:s3:2.30.18'
implementation 'org.imgscalr:imgscalr-lib:4.2'
implementation 'com.sksamuel.scrimage:scrimage-core:4.3.0'
implementation 'com.sksamuel.scrimage:scrimage-webp:4.3.0'
implementation 'software.amazon.awssdk:lambda:2.30.18'
implementation 'com.twelvemonkeys.imageio:imageio-webp:3.9.4'

// gson
implementation 'com.google.code.gson:gson:2.8.6'
Expand All @@ -62,6 +61,7 @@ dependencies {
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

// rest docs
ext {
snippetsDir = file('build/generated-snippets')
}
Expand All @@ -73,7 +73,7 @@ asciidoctor {
dependsOn test
}

task copyDocument(type: Copy) {
tasks.register('copyDocument', Copy) {
dependsOn asciidoctor
doFirst {
delete file('src/main/resources/static/docs')
Expand Down
2 changes: 1 addition & 1 deletion server-config
27 changes: 22 additions & 5 deletions src/docs/asciidoc/auth.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,34 @@

operation::auth-controller-test/kakao-o-auth-sign-in[snippets='http-request,curl-request,request-fields,http-response,response-cookies,response-fields']

[[게스트-로그인]]
=== `POST` 게스트 로그인

```
1. 리프레시 토큰이 있는 경우

토큰 재발급 시도 (토큰이 잘못된 경우 400에러 발생)

2. 리프레시 토큰이 없는 경우

게스트 계정 생성
```

operation::auth-controller-test/guest-sign-in[snippets='http-request,curl-request,request-cookies,http-response,response-cookies,response-fields']

[[로그인]]

[[토큰-재발급]]
=== `POST` 토큰 재발급

operation::auth-controller-test/reissue[snippets='http-request,curl-request,request-cookies,http-response,response-cookies,response-fields']

[[게스트-토큰-발급]]
=== `POST` 게스트 토큰 발급

operation::auth-controller-test/guest-token[snippets='http-request,curl-request,http-response,response-fields']

[[로그아웃]]
=== `POST` 로그아웃

operation::auth-controller-test/sign-out[snippets='http-request,curl-request,request-cookies,request-headers,http-response,response-cookies']

[[회원탈퇴]]
=== `POST` 회원탈퇴 (미구현)

operation::auth-controller-test/withdraw[snippets='http-request,curl-request,request-cookies,request-headers,http-response']
7 changes: 6 additions & 1 deletion src/docs/asciidoc/comments.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ operation::comment-controller-test/create-comment[snippets='http-request,curl-re

operation::comment-controller-test/find-comments[snippets='http-request,curl-request,path-parameters,http-response,response-fields']

[[댓글-수정]]
=== `POST` 댓글 수정

operation::comment-controller-test/update-comment[snippets='http-request,curl-request,path-parameters,request-headers,request-fields,http-response']

[[댓글-삭제]]
=== 댓글 삭제 (미구현)
=== `DELETE` 댓글 삭제

operation::comment-controller-test/delete-comment[snippets='http-request,curl-request,path-parameters,request-headers,http-response']
16 changes: 9 additions & 7 deletions src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ HTTP 상태 코드 본 REST API에서 사용하는 HTTP 상태 코드는 가능
| `200 OK`| 요청을 성공적으로 처리함
| `400 Bad Request`| 잘못된 요청을 보낸 경우. 응답 본문에 더 오류에 대한 정보가 담겨있음
| `401 Unauthorization`| 인증에 실패한 경우. 응답 본문에 더 오류에 대한 정보가 담겨있음
| `403 Forbidden`| 권한이 없는 경우. 응답 본문에 더 오류에 대한 정보가 담겨있음
| `404 Not Found`| 요청한 리소스가 없음.
| `500 Internal Server Error`| 서버 내부 오류가 발생한 경우.
| `503 Service Unavailable`| 서버가 요청을 처리할 준비가 되지 않은 경우.
Expand Down Expand Up @@ -67,25 +68,26 @@ Authorization: Bearer accessToken

```
user1
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE3NDAyOTQyMzEsImlzcyI6InN3eXA4dGVhbTIiLCJleHAiOjMzMjc2Mjk0MjMxfQ.gqA245tRiBQB9owKRWIpX1we1T362R-xDTt4YT9AhRY
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJyb2xlIjoiVVNFUiIsImlhdCI6MTc0MTA2MTc2NSwiaXNzIjoic3d5cDh0ZWFtMiIsImV4cCI6MzMyNzcwNjE3NjV9.3o2uNN3IuGZ-uLrAPdkHBBHF9kk9KALlP373eF27HI4

user2
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjIiLCJpYXQiOjE3NDA0NDM0ODIsImlzcyI6InN3eXA4dGVhbTIiLCJleHAiOjMzMjc2NDQzNDgyfQ.2sTlCtSHb4eGzhlL6WlRT6xvJLtvipnHp6EAmC4j1UQ
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjIiLCJyb2xlIjoiVVNFUiIsImlhdCI6MTc0MTA2MjkxMiwiaXNzIjoic3d5cDh0ZWFtMiIsImV4cCI6MzMyNzcwNjI5MTJ9.eC4oUp9ROb6udMarevZQcImTWojcL_3kkY1YgatpuJg
```

[[인증-예외]]
=== 인증 예외

```
인증 토큰관련 예외가 발생하면 다음과 같은 에러 코드와 함께 401 상태 코드를 응답함
인증 토큰관련 예외가 발생하면 다음과 같은 에러 코드와 함께 상태 코드를 응답함
```

|===

| 에러 코드 | 용례
|`EXPIRED_TOKEN`| 토큰이 만료되었을 경우
|`INVALID_TOKEN`| 잘못된 형식의 토큰인 경우
|`INVALID_AUTH_HEADER`| Authorization 헤더가 존재하지 않거나 Bearer 형식이 아닌 경우
| 에러 코드 | 상태 코드 | 용례
|`EXPIRED_TOKEN`| 401 | 토큰이 만료되었을 경우
|`INVALID_TOKEN`| 401 | 잘못된 형식의 토큰인 경우
|`INVALID_AUTH_HEADER`| 401 | Authorization 헤더가 존재하지 않거나 Bearer 형식이 아닌 경우
|`FORBIDDEN`| 403 | 권한이 없는 경우 (ex, 게스트가 투표 생성)
|===

예시
Expand Down
23 changes: 15 additions & 8 deletions src/docs/asciidoc/posts.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,6 @@ operation::post-controller-test/find-post[snippets='http-request,curl-request,pa

operation::post-controller-test/find-post_share-url[snippets='http-request,curl-request,path-parameters,http-response,response-fields']

[[게시글-목록-조회]]

[[사진-투표-현황-조회]]
=== `GET` 사진 투표 현황 조회

operation::post-controller-test/find-vote-status[snippets='http-request,curl-request,request-headers,path-parameters,http-response,response-fields']


[[유저가-작성한-게시글-조회]]
=== `GET` 유저가 작성한 게시글 조회

Expand All @@ -34,6 +26,16 @@ operation::post-controller-test/find-my-post[snippets='http-request,curl-request

operation::post-controller-test/find-voted-post[snippets='http-request,curl-request,query-parameters,request-headers,http-response,response-fields']

[[게시글-투표-수정]]
=== `POST` 게시글 노출 변경

operation::post-controller-test/toggle-status-post[snippets='http-request,curl-request,path-parameters,request-headers,http-response']

[[게시글-투표-수정]]
=== `POST` 게시글 투표 수정 (미구현)

operation::post-controller-test/update-post[snippets='http-request,curl-request,path-parameters,request-headers,http-response']

[[게시글-투표-마감]]
=== `POST` 게시글 투표 마감

Expand All @@ -43,3 +45,8 @@ operation::post-controller-test/close-post[snippets='http-request,curl-request,p
=== `DELETE` 게시글 삭제

operation::post-controller-test/delete-post[snippets='http-request,curl-request,path-parameters,request-headers,http-response']

[[피드-조회]]
=== `GET` 피드 조회

operation::post-controller-test/find-feed[snippets='http-request,curl-request,query-parameters,request-headers,http-response,response-fields']
21 changes: 8 additions & 13 deletions src/docs/asciidoc/votes.adoc
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
[[투표-API]]
== 투표 API

[[투표-현황-조회]]
=== `GET` 투표 현황 조회

operation::vote-controller-test/find-vote-status[snippets='http-request,curl-request,request-headers,path-parameters,http-response,response-fields']

[[투표]]
=== `POST` 투표

operation::vote-controller-test/vote[snippets='http-request,curl-request,request-headers,request-fields,http-response']

[[게스트-투표]]
=== `POST` 게스트 투표

operation::vote-controller-test/guest-vote[snippets='http-request,curl-request,request-headers,request-fields,http-response']

[[투표-변경]]
=== 투표 변경 (투표 API로 통일)

// operation::vote-controller-test/change-vote[snippets='http-request,curl-request,request-headers,request-fields,http-response']

[[게스트-투표-변경]]
=== 게스트 투표 변경 (미구현, 게스트 투표 API로 통일)
[[투표-취소]]
=== `DELETE` 투표 취소

// operation::vote-controller-test/guest-change-vote[snippets='http-request,curl-request,request-headers,request-fields,http-response']
operation::vote-controller-test/cancel-vote[snippets='http-request,curl-request,path-parameters,request-headers,http-response']
62 changes: 34 additions & 28 deletions src/main/java/com/swyp8team2/auth/application/AuthService.java
Original file line number Diff line number Diff line change
@@ -1,68 +1,74 @@
package com.swyp8team2.auth.application;

import com.swyp8team2.auth.application.jwt.JwtClaim;
import com.swyp8team2.auth.application.jwt.JwtService;
import com.swyp8team2.auth.application.oauth.OAuthService;
import com.swyp8team2.auth.application.oauth.dto.OAuthUserInfo;
import com.swyp8team2.auth.domain.Provider;
import com.swyp8team2.auth.domain.SocialAccount;
import com.swyp8team2.auth.domain.SocialAccountRepository;
import com.swyp8team2.auth.presentation.dto.TokenResponse;
import com.swyp8team2.common.annotation.GuestTokenCryptoService;
import com.swyp8team2.crypto.application.CryptoService;
import com.swyp8team2.user.application.UserService;
import com.swyp8team2.user.domain.Role;
import com.swyp8team2.user.domain.User;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Objects;

@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
public class AuthService {

private final JwtService jwtService;
private final OAuthService oAuthService;
private final SocialAccountRepository socialAccountRepository;
private final UserService userService;
private final CryptoService cryptoService;

public AuthService(
JwtService jwtService,
OAuthService oAuthService,
SocialAccountRepository socialAccountRepository,
UserService userService,
@GuestTokenCryptoService CryptoService cryptoService) {
this.jwtService = jwtService;
this.oAuthService = oAuthService;
this.socialAccountRepository = socialAccountRepository;
this.userService = userService;
this.cryptoService = cryptoService;
}

@Transactional
public TokenResponse oauthSignIn(String code, String redirectUri) {
OAuthUserInfo oAuthUserInfo = oAuthService.getUserInfo(code, redirectUri);
SocialAccount socialAccount = socialAccountRepository.findBySocialIdAndProvider(
SocialAccount socialAccount = getSocialAccount(oAuthUserInfo);

TokenResponse response = jwtService.createToken(new JwtClaim(socialAccount.getUserId(), Role.USER));
log.debug("oauthSignIn userId: {} tokenPair: {}", response.userId(), response.tokenPair());
return response;
}

private SocialAccount getSocialAccount(OAuthUserInfo oAuthUserInfo) {
return socialAccountRepository.findBySocialIdAndProvider(
oAuthUserInfo.socialId(),
Provider.KAKAO
).orElseGet(() -> createUser(oAuthUserInfo));
return jwtService.createToken(socialAccount.getUserId());
}

private SocialAccount createUser(OAuthUserInfo oAuthUserInfo) {
Long userId = userService.createUser(oAuthUserInfo.nickname(), oAuthUserInfo.profileImageUrl());
return socialAccountRepository.save(SocialAccount.create(userId, oAuthUserInfo));
}

@Transactional
public TokenResponse reissue(String refreshToken) {
return jwtService.reissue(refreshToken);
}

@Transactional
public String createGuestToken() {
Long guestId = userService.createGuest();
return cryptoService.encrypt(String.valueOf(guestId));
TokenResponse response = jwtService.reissue(refreshToken);
log.debug("reissue userId: {} tokenPair: {}", response.userId(), response.tokenPair());
return response;
}

@Transactional
public void signOut(Long userId, String refreshToken) {
jwtService.signOut(userId, refreshToken);
}

public TokenResponse guestSignIn(String refreshToken) {
TokenResponse response;
if (Objects.isNull(refreshToken)) {
User user = userService.createGuest();
response = jwtService.createToken(new JwtClaim(user.getId(), user.getRole()));
} else {
response = jwtService.reissue(refreshToken);
}
log.debug("guestSignIn userId: {} tokenPair: {}", response.userId(), response.tokenPair());
return response;
}
}
15 changes: 12 additions & 3 deletions src/main/java/com/swyp8team2/auth/application/jwt/JwtClaim.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
package com.swyp8team2.auth.application.jwt;

import com.swyp8team2.user.domain.Role;

public class JwtClaim {

public static final String ID = "id";
public static final String ROLE = "role";

private final String id;
private final Role role;

public JwtClaim(long id) {
public JwtClaim(long id, Role role) {
this.id = String.valueOf(id);
this.role = role;
}

public static JwtClaim from(long id) {
return new JwtClaim(id);
public static JwtClaim from(long id, Role role) {
return new JwtClaim(id, role);
}

public Long idAsLong() {
Expand All @@ -21,4 +26,8 @@ public Long idAsLong() {
public String id() {
return id;
}

public Role role() {
return role;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.swyp8team2.common.exception.ErrorCode;
import com.swyp8team2.common.exception.InternalServerException;
import com.swyp8team2.common.exception.UnauthorizedException;
import com.swyp8team2.user.domain.Role;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtException;
Expand Down Expand Up @@ -63,6 +64,7 @@ private String createToken(JwtClaim claim, long expiration) {

return Jwts.builder()
.claim(JwtClaim.ID, claim.id())
.claim(JwtClaim.ROLE, claim.role())
.setIssuedAt(Date.from(now))
.setIssuer(issuer)
.setExpiration(Date.from(expiredAt))
Expand All @@ -80,15 +82,14 @@ public JwtClaim parseToken(String token) {
Claims claims = parser.parseClaimsJws(token)
.getBody();
String userId = (String) claims.get(JwtClaim.ID);
return new JwtClaim(Long.parseLong(userId));
Role role = Role.valueOf((String) claims.get(JwtClaim.ROLE));
return new JwtClaim(Long.parseLong(userId), role);
} catch (ExpiredJwtException e) {
log.trace("Expired Jwt Token: {}", e.getMessage());
throw new UnauthorizedException(ErrorCode.EXPIRED_TOKEN);
} catch (JwtException e) {
} catch (Exception e) {
log.trace("Invalid Jwt Token: {}", e.getMessage());
throw new UnauthorizedException(ErrorCode.INVALID_TOKEN);
} catch (Exception e) {
throw new InternalServerException(e);
}
}
}
Loading