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

fix: 리프레시 토큰 로직 수정 #556

Open
wants to merge 246 commits into
base: dev_android
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
246 commits
Select commit Hold shift + click to select a range
5717ca0
chore: 안드로이드 프로젝트 폴더 생성 (#2) (#3)
krrong Jul 16, 2023
dc7f7a6
feat: 안드로이드 프로젝트 초기 세팅 (#5)
krrong Jul 17, 2023
d48e249
feat: 프로젝트 초기 세팅 (#7)
zillionme Jul 18, 2023
e02817b
fix: 초기 설정 삭제 (#10)
kokodak Jul 18, 2023
6db7dcf
feat: 백엔드 프로젝트 초기 세팅 (#11)
kokodak Jul 18, 2023
4340442
chore: 패키지 구조 설정 (#12)
krrong Jul 18, 2023
5c19129
[BE] feat: 엔티티 설계 (#15)
kokodak Jul 18, 2023
7311d51
feat: 초기 resource 파일 세팅 (#16)
krrong Jul 18, 2023
ae6a45e
feat: DTO 생성 (#18)
krrong Jul 18, 2023
7e46231
feat: Domain 설계 및 생성 (#21)
krrong Jul 18, 2023
ae3b6c1
feat: 네이버 맵을 화면에 띄우는 기능 구현 (#23)
briandr97 Jul 19, 2023
605fa91
feat: 회원 인증 기능 구현 (#26)
chaewon121 Jul 19, 2023
f35e776
feat: 위치 권한 요청 기능 구현 (#27)
krrong Jul 19, 2023
14ebf8d
feat: 네이버지도에서 현재 위치를 잡는 기능 구현 (#28)
krrong Jul 19, 2023
a4f64af
feat: 장소 추천 기능 구현 (#29)
kokodak Jul 19, 2023
768cfb8
feat: 목적지와 현재위치 사이 거리를 계산하여 사용자에게 보여주는 기능 구현 (#35)
krrong Jul 19, 2023
e5b486f
feat: Coordinate를 받아 해당 위치에 좌표를 찍는 기능 구현 (#39)
krrong Jul 19, 2023
25fabab
feat: 사진 버튼을 클릭하면 사진 다이얼로그를 띄우는 기능 구현 (#40)
briandr97 Jul 19, 2023
21dbb6e
feat: 목적지에 도착 시 도착 버튼 활성화 기능 구현 (#41)
hyunji1203 Jul 20, 2023
56009f6
refactor: API 명세 변경으로 인한 기능 수정 (#43)
zillionme Jul 20, 2023
46df55f
feat: 서버통신 초기세팅 (#44)
krrong Jul 20, 2023
9415709
feat: 목적지 도착 여부 확인 기능 구현 (#47)
chaewon121 Jul 20, 2023
2b5f64d
feat: 백엔드 ci workflows 초안 작성 (#49)
dooboocookie Jul 20, 2023
0334804
chore: step 이름 추가 (#50)
dooboocookie Jul 20, 2023
4cedf10
[BE] fix: 백엔드 ci workflows 초안 작성 (#51)
dooboocookie Jul 20, 2023
b9ad259
fix: working directory 상대경로로 변경 (#52)
dooboocookie Jul 20, 2023
93d80eb
feat: 서버에 모험 시작을 요청하는 기능 구현 (#48)
briandr97 Jul 20, 2023
d4c181e
feat: 모험이 끝났을 때 서버에게 모험이 종료 됐음을 알려주는 기능 구현 (#53)
hyunji1203 Jul 20, 2023
4fdd0cc
feat: 서버에서 목적지를 받아오는 기능 구현 (#54)
krrong Jul 20, 2023
30c0cbe
fix: 목적지 도착 버튼 클릭 시 발생하는 오류 수정 (#56)
hyunji1203 Jul 20, 2023
f649db0
feat: 안드로이드 프로젝트에 firebase 추가 (#75)
krrong Jul 27, 2023
587f2de
feat: 필요 없는 파일 삭제
briandr97 Jul 27, 2023
59363ee
chore: gitignore 수정 (#78)
briandr97 Jul 27, 2023
17d9692
feat: 안드로이드 CI 자동화 (#77)
briandr97 Jul 28, 2023
7265a70
feat: 스플래시 화면에서 진행 중인 모험이 있는지 판단하고 분기 하는 기능 구현 (#58)
briandr97 Jul 28, 2023
68bd1f9
[AN] feat: registerForActivityResult 분기처리 기능 구현 (#72)
briandr97 Jul 28, 2023
3997a3f
feat: BeginAdeventureActivity UI 변경사항 적용 (#71)
briandr97 Jul 28, 2023
e5beaf2
feat: AdventureResultActivity 구현 (#80)
hyunji1203 Jul 28, 2023
5e8e4b1
feat: 3차 데모데이 엔티티 설계 (#84)
kokodak Jul 29, 2023
87bbf37
feat: OnAdventureActivity UI 변경사항 적용 (#73)
krrong Jul 30, 2023
e434719
[AN] feat: UploadActivity 구현
krrong Jul 30, 2023
3cf9e64
feat: 카메라 권한 요청 기능 구현 (#92)
krrong Jul 30, 2023
223dfa5
feat: 명세서 기준으로 Dto들 생성 (#89)
briandr97 Jul 31, 2023
92e6540
feat: 디바이스의 위치를 받아와 뷰에 보여주는 기능 구현 (#93)
krrong Jul 31, 2023
af3543f
feat: 도메인 모델 생성 (#91)
briandr97 Jul 31, 2023
9959ad1
feat: 통계 path 레트로핏 서비스 구현 #101
hyunji1203 Jul 31, 2023
b387271
feat: 서버에서 Rank 관련 데이터를 받아올 때 사용될 service 생성 (#100)
hyunji1203 Jul 31, 2023
dc855fc
feat: 3차 데모데이용 Game Path 레트로핏 서비스 생성 (#102)
briandr97 Jul 31, 2023
db2e1e4
feat: 장소 path 레트로핏 서비스 구현 (#103)
krrong Jul 31, 2023
fb569c2
feat: AdventureHistoryActivity 구현 (#106)
hyunji1203 Jul 31, 2023
117fb6e
feat: RankRepository 생성 (#109)
hyunji1203 Jul 31, 2023
61832b4
feat: StatisticsRepository 생성 (#110)
hyunji1203 Jul 31, 2023
3a8ec5d
feat: 3차 데모데이 기획 변경에 맞는 AdventureRepository 설계 및 구현 (#111)
briandr97 Jul 31, 2023
0047186
feat: PlaceRepository 생성 (#118)
krrong Jul 31, 2023
3bcc951
feat: 통계 path api 목서버 구현 (#116)
hyunji1203 Aug 1, 2023
992a798
feat: 랭크 path api 목서버 구현 (#117)
hyunji1203 Aug 1, 2023
937e6af
feat: RankActivity 구현 (#119)
hyunji1203 Aug 1, 2023
a331d13
feat: 카메라로 찍은 사진을 뷰에 띄우고 Uri 추출기능 구현 (#120)
krrong Aug 1, 2023
17379e7
feat: 3차 데모데이 뼈대 코드 추가 (#130)
dooboocookie Aug 1, 2023
e2ad85f
feat: MyPageActivity 구현 (#121)
briandr97 Aug 1, 2023
9d767b4
fix: BaseEntity에 맞춘 data.sql 수정 (#133)
dooboocookie Aug 1, 2023
ac0c9fe
[BE] refactor: Pull Request 워크플로우 수정 (#134)
zillionme Aug 1, 2023
cc74e0d
refactor: DTO들이 모두 record로 구현되도록 수정 (#136)
dooboocookie Aug 1, 2023
4fa2183
refactor: Pull Request 워크플로우 재수정
zillionme Aug 1, 2023
2e3d17f
feat: merge 워크 플로우 추가 (#137)
chaewon121 Aug 1, 2023
75c00ab
refactor: merge 워크 플로우 추가 (#139)
chaewon121 Aug 1, 2023
6e1fff5
feat: 랭크 조회 기능 구현 (#94)
chaewon121 Aug 2, 2023
da51159
feat: 랭크 뷰 기능 구현 및 서버 통신 구현 (#138)
hyunji1203 Aug 2, 2023
53a9b37
feat: 게임 결과 뷰 서버 통신 및 기능 구현 (#143)
hyunji1203 Aug 2, 2023
8d31d22
feat: 모험 결과 DTO와 도메인 객체의 raisedRank 삭제
hyunji1203 Aug 2, 2023
7fb9e56
feat: 랭크 변동 상황을 알려주는 뷰 삭제
hyunji1203 Aug 2, 2023
5f02107
feat: 인자 변경에 따른 수정 사항 적용
hyunji1203 Aug 2, 2023
cbabbc1
feat: 모험 기록 뷰 기능 구현 및 서버 통신 구현 (#151)
briandr97 Aug 2, 2023
94b8d99
[AN] feat: MyPage 기능 구현 (#146)
krrong Aug 2, 2023
f15b775
feat: 게임 결과 조회 기능 구현 (#152)
chaewon121 Aug 2, 2023
6b138c2
feat: 게임 종료 API 및 게임 조회 테스트 구현 (#147)
zillionme Aug 2, 2023
10eeab0
feat: 장소 등록 api 구현
dooboocookie Aug 2, 2023
33a19b3
chore: 안드로이드 CI workflow 수정
dooboocookie Aug 2, 2023
c8f1204
feat: 힌트 생성 API 설계 및 구현 (#142)
kokodak Aug 2, 2023
e44249c
feat: 특정 게임의 힌트 단건 조회 API 설계 및 구현 (#157)
kokodak Aug 2, 2023
c0181ac
feat: 인게임 화면 기능 및 서버통신 구현 (#149)
briandr97 Aug 3, 2023
daaa880
chore: 백엔드 CD 워크플로우 수정
dooboocookie Aug 3, 2023
873dd29
feat: 점진적 리팩토링이 완료됨에 따라 파일 정리 (#156)
briandr97 Aug 3, 2023
24a9f97
feat: 통계 조회 기능 구현 (#159)
chaewon121 Aug 3, 2023
755717a
fix: 인터셉터 패턴 추가 (#161)
dooboocookie Aug 3, 2023
a5ced33
feat: 게임 시작 화면 기능 구현 (#162)
hyunji1203 Aug 3, 2023
55eac04
feat: 게임 생성 로직 수정 (#166)
kokodak Aug 3, 2023
a023d4f
chore: 서브 모듈 설정 추가
zillionme Aug 3, 2023
5795ebf
feat: firebase crashlytic 초기 환경 설정 (#170)
hyunji1203 Aug 3, 2023
0c50b4c
feat: FirebaseAnalytics 생성 및 로그 삽입을 담당할 객체 생성 및 상수 모음 파일 생성 (#171)
briandr97 Aug 3, 2023
7f4c20d
fix: application 파일 복구 (#174)
kokodak Aug 3, 2023
0793973
chore: 더미 데이터 추가 (#176)
kokodak Aug 3, 2023
b64def7
feat: API 수정으로 인한 변경사항 적용 (#177)
briandr97 Aug 3, 2023
8fee988
refactor: RankReponse 수정 (#179)
chaewon121 Aug 3, 2023
d189815
feat: baseUrl 변경 및 감추기와 그에 따른 yml 파일 변경 (#182)
briandr97 Aug 3, 2023
f0dc5fe
refactor: 쿼리와 uri 수정 (#184)
chaewon121 Aug 4, 2023
973dd4f
feat: 업로드 뷰 기능 구현 (#181)
krrong Aug 4, 2023
c7589dd
fix: GET /games 쿼리 스트링 없어도 되도록 수정 (#187)
zillionme Aug 4, 2023
247cdee
fix: 랭크 전체조회 쿼리 파라미터 조건 수정 (#191)
chaewon121 Aug 4, 2023
aed1807
fix: 장소데이터 추가 및 인터셉터 설정 변경
zillionme Aug 4, 2023
2a16b7f
refactor: 컨트롤러 요청 수정 (#193)
chaewon121 Aug 4, 2023
1d29f0d
fix: POST /games/{gameId}/hints 쿼리 스트링 없어도 되도록 수정 (#195)
zillionme Aug 4, 2023
10e5c73
feat: 게임 종료 시, 플레이어 점수 덧셈 기능 추가 (#198)
zillionme Aug 4, 2023
4373402
feat: Firebase Analytics 버튼 클릭 로그 추가 (#183)
krrong Aug 7, 2023
8306576
[BE] chore: spring profile에 대한 yml 파일 수정
kokodak Aug 7, 2023
76bbcde
fix: 서버 통신 수정 (#196)
briandr97 Aug 7, 2023
84aeb3c
refactor: dev 서버 환경 구축 (#236)
zillionme Aug 9, 2023
1e89906
fix: 깃허브 액션 워크플로우 수정 (#239)
zillionme Aug 9, 2023
74dda58
feat: 소셜 로그인 기능 구현 (#235)
hyunji1203 Aug 9, 2023
ac45912
chore: 오류 코드 정리 및 예외 핸들러 보완
dooboocookie Aug 10, 2023
b38e9ee
fix: 원격 저장소와의 코드 변경 수정
zillionme Aug 10, 2023
4374ac4
Update backend_dev_merge_workflow.yml
kokodak Aug 10, 2023
f1f3554
hotfix: workflow 긴급 수정
kokodak Aug 10, 2023
538e07c
hotfix: yml 파일 삭제
kokodak Aug 10, 2023
219cf99
fix: 게임 종료 실패 시, 남은 도전 횟수 줄지 않는 문제 해결
dooboocookie Aug 10, 2023
a669645
feat: 자동 로그인 및 로그인 로직 수정 (#241)
briandr97 Aug 10, 2023
b2468ef
feat: 예외처리 (#243)
krrong Aug 10, 2023
4b16841
feat: 소셜 로그인 기능과 인터셉터 인가 처리 및 아규먼트 리졸버 기능 추가
dooboocookie Aug 10, 2023
66330c4
feat: 난독화를 위해 모든 Dto 필드에 SerialName을 추가 (#245)
briandr97 Aug 11, 2023
bdfa9c2
fix: AuthInfo에 기본 생성자 추가
dooboocookie Aug 11, 2023
996bf12
fix: 서브모듈 업데이트
dooboocookie Aug 11, 2023
eac1723
feat: 앱 아이콘 설정 (#253)
hyunji1203 Aug 11, 2023
03437f1
fix: 메인으로 돌아갈 시 해당 액티비티가 사라지도록 수정 (#255)
hyunji1203 Aug 11, 2023
57733e5
feat: 사용자가 GPS 기능을 껐을 때 이를 인지하고 키도록 유도하는 기능 구현 (#258)
hyunji1203 Aug 11, 2023
f59f632
feat: 장치 구성 변경 대응 (#250)
briandr97 Aug 11, 2023
8b76d09
feat: 난독화 방지를 위한 ProGuard 수정 (#259)
krrong Aug 11, 2023
8803065
refactor: 좌표 간 거리를 M 단위로 변경 및 힌트/시도횟수 변경
zillionme Aug 11, 2023
bcae3ae
fix: 서브모듈 최신화
dooboocookie Aug 11, 2023
9a8ed11
feat: Firebase Analytics 서버 통신 에러 로그 추가 (#260)
hyunji1203 Aug 11, 2023
5c01fec
refactor: 게임 종료 타입에 따른 점수 계산 기능 수정
zillionme Aug 12, 2023
a853fb7
feat: 로깅 기능 추가 (#268)
zillionme Aug 12, 2023
802c963
feat: 이어하기 기능 추가 (#263)
krrong Aug 12, 2023
6f360e6
refactor: 사진 저장 경로 수정 (#269)
dooboocookie Aug 12, 2023
1f7b4f9
chore: 프로덕트 서버 배포
dooboocookie Aug 12, 2023
1e57d5d
chore: prod 서버 배포
dooboocookie Aug 12, 2023
f7f1b9c
chore: prod 서버 배포
dooboocookie Aug 12, 2023
20f5f59
fix: OnAdventureActivity 수정 (#265)
briandr97 Aug 12, 2023
f9797d7
feat: 로그인 시 사용자의 토큰이 로그에 보여지지 않도록 수정 (#271)
hyunji1203 Aug 12, 2023
f2a682d
feat: 스플래시에서 받아온 게임을 넘겨주는 기능 삭제 (#274)
krrong Aug 12, 2023
3663518
refactor: 로그 경로 변경
dooboocookie Aug 12, 2023
ffb38dd
chore: 서브모듈 수정
dooboocookie Aug 12, 2023
ca29158
fix: 잘못된 로직 수정 (#276)
krrong Aug 12, 2023
736c11e
feat: BeginAdventureActivity에서 진행중인 게임이 있는지 판단하는 기능 구현 (#277)
briandr97 Aug 12, 2023
841bb66
fix: 에러 수정
dooboocookie Aug 15, 2023
2d4c80c
fix: 사진 저장 시 1번 회원으로만 저장되는 오류 수정
dooboocookie Aug 15, 2023
af89c51
chore: 추천 범위 500km로 수정
dooboocookie Aug 16, 2023
0b6ff7b
test: 테스트 fixture 및 builder 추가 및 적용
kokodak Aug 16, 2023
e7298fe
feat: Refresh Token 구현 및 자동 로그인 API, 회원 탈퇴 API, 로그아웃 API 구현
dooboocookie Aug 16, 2023
49d1800
test: 작성되지 않은 테스트 코드 추가
chaewon121 Aug 17, 2023
60d851c
feat: 버전 변경 (#290)
hyunji1203 Aug 17, 2023
58d4f9a
feat: 로깅하기 (#291)
zillionme Aug 18, 2023
f307bea
Merge branch 'rel/v1' of https://github.com/woowacourse-teams/2023-na…
dooboocookie Sep 6, 2023
2a1e413
chore: 서브모듈 업데이트
dooboocookie Sep 6, 2023
45583a5
chore: 워크 플로우 수정
dooboocookie Sep 6, 2023
daae0dc
feat: 장소 업로드 기능 구현 (#301)
krrong Sep 10, 2023
96bebc9
fix: 위치관련 버그 수정 (#302)
krrong Sep 10, 2023
0884c25
refactor: branch 변경 (#311)
hyunji1203 Sep 11, 2023
d784a19
refactor: 네트워크 작업 코루틴으로 변경 (#312)
krrong Sep 11, 2023
0daa497
refactor: ViewModel이 Application을 참조하지 않도록 변경 (#307)
krrong Sep 13, 2023
697a88a
Delete .idea directory
briandr97 Sep 14, 2023
abc1f63
chore: 전체 gitignore 지정 (#320)
briandr97 Sep 14, 2023
a9f424a
refactor: Login 뷰에서 진행하는 네트워크 작업 코루틴으로 변경 (#328)
hyunji1203 Sep 14, 2023
db02356
refactor: my page뷰에서 진행하는 네트워크 작업 코루틴으로 변경 (#323)
krrong Sep 15, 2023
f68cd63
feat: Setting 뷰 구현 (#331)
hyunji1203 Sep 15, 2023
beec36e
fix: History 뷰의 리사이클러뷰 image 오류 문제 해결 (#317)
hyunji1203 Sep 15, 2023
ad1d4e9
refactor: Adventure 도메인에 해당하는 네트워크 작업 코루틴으로 변경 (#315)
briandr97 Sep 15, 2023
e426bba
feat: 장소 업로드 시 로딩 창이 뜨는 기능 구현 (#308)
krrong Sep 15, 2023
e2b53d3
fix: 마이페이지 글자 깨지는 오류 수정 (#333)
briandr97 Sep 16, 2023
9b9017e
feat: AdventureHistoryViewModel 테스트 추가 (#340)
hyunji1203 Sep 16, 2023
1f9031a
feat: 회원 탈퇴 기능 구현 (#335)
hyunji1203 Sep 16, 2023
552bbac
feat: RankViewModel 테스트 추가 (#337)
hyunji1203 Sep 17, 2023
4a4e465
feat: 로그아웃 기능 구현 (#341)
krrong Sep 17, 2023
a9ceb7a
feat: AdventureResultViewModel 테스트 추가 (#338)
hyunji1203 Sep 20, 2023
0702efa
refactor: 리포지터리에 의존성 주입 라이브러리 적용 (#349)
krrong Sep 20, 2023
7be936e
refactor: datasource 의존성 주입 라이브러리 사용 (#352)
krrong Sep 21, 2023
9f26d90
refactor: retrofit 의존성 주입 라이브러리 적용 (#353)
krrong Sep 21, 2023
6248573
feat: 자동로그인 기능 구현 및 스플래시 분리 (#346)
briandr97 Sep 23, 2023
3abfcfd
feat: UploadViewModel 테스트 추가 (#343)
krrong Sep 25, 2023
5712df8
refactor: 디자인 수정을 위한 공통 요소 추가 (#378)
krrong Oct 2, 2023
c6c3a09
fix: OkHttpClient의 interceptor를 AuthInterceptor로 변경 (#375)
krrong Oct 3, 2023
4e6ea20
Refactor/#391 모험 기록 뷰 디자인 변경 (#396)
hyunji1203 Oct 4, 2023
5336875
feat: 앱 강제 업데이트 기능 구현 (#400)
krrong Oct 4, 2023
43f02e5
refactor: 로그인 뷰 디자인 변경 (#399)
hyunji1203 Oct 4, 2023
ea8f791
refactor: 업로드 뷰 디자인 변경 (#381)
krrong Oct 4, 2023
b4f24c7
refactor: 설정 뷰 디자인 변경 (#397)
hyunji1203 Oct 4, 2023
b6da069
refactor: my page 뷰 디자인 변경 (#395)
krrong Oct 4, 2023
bc193f5
refactor: 모험 결과 뷰 디자인 변경 (#402)
hyunji1203 Oct 4, 2023
7f9b454
refactor: 게임 시작 뷰 디자인 변경 (#408)
briandr97 Oct 5, 2023
155846c
feat: 업로드 화면에서 뒤로가기 기능 구현 (#413)
krrong Oct 5, 2023
270f61f
feat: 게임 입장 시 사진이 먼저 뜨는 기능 구현 (#407)
krrong Oct 5, 2023
afddfa8
refactor: 버튼 디자인 일관성 있도록 변경 (#417)
hyunji1203 Oct 5, 2023
9d7aa5f
refactor: 스플래시 디자인 변경 (#416)
krrong Oct 5, 2023
c53876a
refactor: 인게임 뷰 디자인 변경 (#418)
briandr97 Oct 5, 2023
af684a6
refactor: NaagaAlertDialog와 ConfirmDialog 통일 (#421)
briandr97 Oct 5, 2023
5a08f44
refactor: 장소 등록 api 수정 (#369)
krrong Oct 5, 2023
9c5ceee
refactor: 인게임 버튼 drawable resource 변경 (#424)
briandr97 Oct 5, 2023
a4a877f
refactor: permission dialog 통일 (#426)
krrong Oct 5, 2023
0f9d18e
feat: 문의하기 기능 구현 (#427)
hyunji1203 Oct 5, 2023
0d6e7c7
feat: 버전코드 및 버전이름 수정 (#431)
krrong Oct 6, 2023
22b318b
hotfix: 액세스 토큰 리프레시 및 자동 로그인 로직 수정 (#438)
krrong Oct 9, 2023
de104d3
hotfix: 액세스 토큰 리프레시 로직 수정 (#447)
krrong Oct 11, 2023
19423e6
refactor: RetrofitFactory 삭제 (#440)
hyunji1203 Oct 11, 2023
c4acc17
refactor: 폰트 적용
hyunji1203 Oct 11, 2023
0404224
feat: 쪽지 관련 공통 코드 작성 (#450)
krrong Oct 12, 2023
7ec28ba
feat: 쪽지 전송 다이얼로그 구현 (#453)
krrong Oct 12, 2023
23dd669
fix: 저장소 권한 요청 및 알림 변경 (#458)
krrong Oct 14, 2023
2c5aefe
feat: 내 주변 100m 내의 쪽지들을 조회하는 기능 구현 (#480)
hyunji1203 Oct 16, 2023
4ced166
refactor: 에러처리 로직 변경 (#487)
krrong Oct 17, 2023
0161ce9
feat: 모험 기록 상세 페이지 뷰 구현 (#494)
krrong Oct 17, 2023
8f2b1fa
feat: 좋아요 싫어요 기능 제작 (#495)
briandr97 Oct 18, 2023
c154ca5
feat: 쪽지 등록기능 구현 (#478)
krrong Oct 18, 2023
0730010
feat: 쪽지 단건 조회 구현 (#493)
hyunji1203 Oct 18, 2023
e971ea7
fix: 뷰 위치 변경 (#504)
krrong Oct 18, 2023
f21b163
fix: 쪽지 뷰를 wrap_content로 변경 (#507)
krrong Oct 18, 2023
8f0784e
refactor: 주변의 쪽지 조회를 위한 서버 통신 주기 변경 (#509)
hyunji1203 Oct 18, 2023
ce64303
fix: 다이얼로그 중첩 현상 수정 (#511)
hyunji1203 Oct 18, 2023
72d0751
fix: 힌트 개수가 null로 보이는 버그 수정 (#517)
krrong Oct 19, 2023
19dc46b
feat: 앱 gradle 설정 변경 (#522)
krrong Oct 19, 2023
e27f0d0
[ALL] 버전 3 출시(versionName1.1.4) (#533)
krrong Nov 3, 2023
ca0e304
refactor: 도전 실패 반응 확인 기능 구현 (#544)
hyunji1203 Nov 7, 2023
a6457ce
feat: 다크모드 대응하기 (#524)
hyunji1203 Nov 8, 2023
1140a9b
feat: 좋아요, 싫어요 버튼을 연속 클릭할 수 없도록 변경
briandr97 Nov 8, 2023
ddea7e2
feat: 빈 쪽지 못남기게 하는 기능 구현 (#542)
hyunji1203 Nov 8, 2023
d2adc40
feat: 업로드 화질 저하 이슈 해결 (#498)
briandr97 Nov 8, 2023
4a69bdf
feat: 커스텀 버튼 제작 (#467)
briandr97 Nov 8, 2023
b7497d5
Merge branch 'main' of https://github.com/woowacourse-teams/2023-naag…
krrong Nov 8, 2023
1f2bdb8
feat: 삭제해야 될 파일이 남아있어 삭제
briandr97 Nov 8, 2023
9f0af6e
refactor: 인터셉터에서 리포지터리의 역할을 분리
krrong Nov 6, 2023
7ea5683
refactor: AuthInterceptor가 AuthRepository를 참조할 수 있도록 변경
krrong Nov 6, 2023
8a28e6c
refactor: AccessToken의 리프레시를 AuthRepository에서 하도록 분리
krrong Nov 7, 2023
a05af26
refactor: 비동기로 전송한 요청을 기다렸다가 다음 요청을 보내도록 변경
krrong Nov 7, 2023
32bfe55
feat: 리프레시 토큰이 만료된 경우 다시 로그인할 수 있도록 구현
krrong Nov 11, 2023
d295e54
refactor: 토큰에 대한 코드 함수로 분리
krrong Nov 11, 2023
5bd4e47
refactor: 사용하는 메서드 변경
krrong Nov 11, 2023
c7f5de8
refactor: 확장함수 Toast를 사용하도록 변경
krrong Nov 11, 2023
c5f698a
refactor: 불필요한 Dispatcher 삭제
krrong Nov 11, 2023
92dbbfb
refactor: 불필요한 runCatching 삭제
krrong Nov 11, 2023
9ecc5f7
fix: 액세스 토큰이 만료된 경우 실제로 탈퇴가 되지 않음에도 탈퇴되는 것처럼 보이는 문제 수정
krrong Nov 11, 2023
a9759c3
fix: 로그아웃이 성공적으로 되지 않은 경우 토큰을 삭제하지 않도록 수정
krrong Nov 11, 2023
931801f
refactor: 리프레시 토큰이 만료된 경우에도 비정상종료가 되지 않도록 수정
krrong Nov 11, 2023
a4c46ba
refactor: 깨지는 테스트 수정
krrong Nov 11, 2023
5095eac
refactor: 중괄호 삭제
krrong Nov 16, 2023
a670993
refactor: AuthRepository에서 사용하지 않는 메서드 제거
krrong Nov 16, 2023
c621951
refactor: annotation명 변경
krrong Nov 16, 2023
3b45afd
refactor: 인증 문제인 경우만 AuthorizationThrowable로 만들도록 변경
krrong Nov 16, 2023
ab482ed
refactor: 불필요한 datasource 삭제
krrong Nov 16, 2023
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
6 changes: 5 additions & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />

<application
android:name=".NaagaApplication"
Expand Down
17 changes: 0 additions & 17 deletions android/app/src/main/java/com/now/naaga/NaagaApplication.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.now.naaga

import android.app.Application
import androidx.appcompat.app.AppCompatDelegate
import com.kakao.sdk.common.KakaoSdk
import com.now.naaga.data.local.AuthDataSource
import com.now.naaga.data.local.DefaultAuthDataSource
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
Expand All @@ -13,23 +10,9 @@ class NaagaApplication : Application() {
override fun onCreate() {
super.onCreate()
initKakaoSdk()
initDataSources()
disableDarkMode()
}

private fun disableDarkMode() {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}

private fun initKakaoSdk() {
KakaoSdk.init(this, BuildConfig.KAKAO_NATIVE_APP_KEY)
}

private fun initDataSources() {
authDataSource = DefaultAuthDataSource(applicationContext)
}

companion object DependencyContainer {
lateinit var authDataSource: AuthDataSource
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.now.naaga.data.remote.dto.post

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class RefreshTokenDto(
@SerialName("refreshToken")
val refreshToken: String,
)
Original file line number Diff line number Diff line change
@@ -1,110 +1,42 @@
package com.now.naaga.data.remote.retrofit

import com.google.gson.Gson
import com.google.gson.JsonParser
import com.now.naaga.BuildConfig
import com.now.naaga.NaagaApplication
import com.now.naaga.data.remote.dto.FailureDto
import com.now.naaga.data.remote.dto.NaagaAuthDto
import com.now.naaga.data.throwable.DataThrowable
import kotlinx.coroutines.Dispatchers
import com.now.domain.repository.AuthRepository
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import okhttp3.internal.closeQuietly
import org.json.JSONObject

class AuthInterceptor : Interceptor {
private val gson = Gson()
private val client = OkHttpClient.Builder().build()
import java.io.IOException

class AuthInterceptor(
private val authRepository: AuthRepository,
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val accessToken = getAccessToken() ?: return chain.proceed(chain.request())
val accessToken = authRepository.getAccessToken() ?: return chain.proceed(chain.request())

val headerAddedRequest = chain.request().newBuilder().addHeader(AUTH_KEY, accessToken).build()
val response: Response = chain.proceed(headerAddedRequest)
val tokenAddedRequest = chain.request().putToken(accessToken)
val response: Response = chain.proceed(tokenAddedRequest)

if (response.code == 401) {
val newAccessToken = getAccessTokenAfterRefresh(accessToken).getOrElse { return response }
if (response.isTokenInvalid()) {
response.closeQuietly()
return chain.proceed(chain.request().newBuilder().addHeader(AUTH_KEY, newAccessToken).build())
runCatching { runBlocking { authRepository.refreshAccessToken() } }
.onFailure { throw IOException(it) }
return chain.proceed(chain.request().putToken(authRepository.getAccessToken()!!))
}
return response
}

private fun getAccessTokenAfterRefresh(accessToken: String): Result<String> {
val requestBody = createRefreshRequestBody()
val request = createRefreshRequest(requestBody, accessToken)

val auth: NaagaAuthDto = requestRefresh(request).getOrElse {
return Result.failure(it)
}
storeToken(auth.accessToken, auth.refreshToken)
return Result.success(BEARER + auth.accessToken)
}

private fun createRefreshRequestBody(): RequestBody {
return JSONObject()
.put(AUTH_REFRESH_KEY, getRefreshToken())
.toString()
.toRequestBody(contentType = "application/json".toMediaType())
private fun Response.isTokenInvalid(): Boolean {
return this.code == 401
}

private fun createRefreshRequest(requestBody: RequestBody, accessToken: String): Request {
return Request.Builder()
.url(BuildConfig.BASE_URL + AUTH_REFRESH_PATH)
.post(requestBody)
private fun Request.putToken(accessToken: String): Request {
return this.newBuilder()
.addHeader(AUTH_KEY, accessToken)
.build()
}

private fun requestRefresh(request: Request): Result<NaagaAuthDto> {
val response: Response = runBlocking {
withContext(Dispatchers.IO) { client.newCall(request).execute() }
}
if (response.isSuccessful) {
return Result.success(response.getDto<NaagaAuthDto>())
}
val failedResponse = response.getDto<FailureDto>()
if (failedResponse.code == 101) {
return Result.failure(DataThrowable.AuthorizationThrowable(failedResponse.code, failedResponse.message))
}
return Result.failure(IllegalStateException(REFRESH_FAILURE))
}

private fun getAccessToken(): String? {
return NaagaApplication.authDataSource.getAccessToken()
}

private fun getRefreshToken(): String {
return requireNotNull(NaagaApplication.authDataSource.getRefreshToken()) { NO_REFRESH_TOKEN }
}

private fun storeToken(accessToken: String, refreshToken: String) {
NaagaApplication.authDataSource.setAccessToken(accessToken)
NaagaApplication.authDataSource.setRefreshToken(refreshToken)
}

private inline fun <reified T> Response.getDto(): T {
val responseObject = JsonParser.parseString(body?.string()).asJsonObject
return gson.fromJson(responseObject, T::class.java)
}

companion object {
private const val AUTH_KEY = "Authorization"
private const val AUTH_REFRESH_KEY = "refreshToken"

private const val AUTH_REFRESH_PATH = "/auth/refresh"

private const val BEARER = "Bearer "

private const val NO_REFRESH_TOKEN = "리프레시 토큰이 없습니다"
private const val REFRESH_FAILURE = "토큰 리프레시 실패"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package com.now.naaga.data.remote.retrofit.service

import com.now.naaga.data.remote.dto.NaagaAuthDto
import com.now.naaga.data.remote.dto.PlatformAuthDto
import com.now.naaga.data.remote.dto.post.RefreshTokenDto
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.Header
import retrofit2.http.POST

interface AuthService {
Expand All @@ -14,8 +16,17 @@ interface AuthService {
): Response<NaagaAuthDto>

@DELETE("/auth/unlink")
suspend fun withdrawalMember(): Response<Unit>
suspend fun withdrawalMember(
@Header("Authorization") accessToken: String,
): Response<Unit>

@DELETE("/auth")
suspend fun requestLogout(): Response<Unit>
suspend fun requestLogout(
@Header("Authorization") accessToken: String,
): Response<Unit>

@POST("/auth/refresh")
suspend fun requestRefresh(
@Body refreshToken: RefreshTokenDto,
): Response<NaagaAuthDto>
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,42 +4,55 @@ import com.now.domain.model.PlatformAuth
import com.now.domain.repository.AuthRepository
import com.now.naaga.data.local.AuthDataSource
import com.now.naaga.data.mapper.toDto
import com.now.naaga.data.remote.dto.post.RefreshTokenDto
import com.now.naaga.data.remote.retrofit.service.AuthService
import com.now.naaga.util.extension.getValueOrThrow
import com.now.naaga.util.unlinkWithKakao
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

class DefaultAuthRepository(
private val authDataSource: AuthDataSource,
private val authService: AuthService,
private val dispatcher: CoroutineDispatcher = Dispatchers.IO,
) : AuthRepository {

override suspend fun getToken(platformAuth: PlatformAuth): Boolean {
return withContext(dispatcher) {
val response = authService.requestAuth(platformAuth.toDto())
runCatching {
val naagaAuthDto = response.getValueOrThrow()
authDataSource.setAccessToken(naagaAuthDto.accessToken)
authDataSource.setRefreshToken(naagaAuthDto.refreshToken)
return@withContext true
}
return@withContext false
}
override suspend fun logIn(platformAuth: PlatformAuth): Boolean {
val response = authService.requestAuth(platformAuth.toDto())
val naagaAuthDto = response.getValueOrThrow()
storeToken(naagaAuthDto.accessToken, naagaAuthDto.refreshToken)
return true
}

override suspend fun logout() {
withContext(dispatcher) {
val response = authService.requestLogout()
authDataSource.resetToken()
response.getValueOrThrow()
}
val response = authService.requestLogout(getAccessToken()!!)
response.getValueOrThrow()
authDataSource.resetToken()
}

override suspend fun withdrawalMember() {
authService.withdrawalMember()
val response = authService.withdrawalMember(getAccessToken()!!)
response.getValueOrThrow()
unlinkWithKakao()
}

override fun getAccessToken(): String? {
return authDataSource.getAccessToken()
}

private fun getRefreshToken(): String {
return requireNotNull(authDataSource.getRefreshToken()) { NO_REFRESH_TOKEN }
}

private fun storeToken(accessToken: String, refreshToken: String) {
authDataSource.setAccessToken(accessToken)
authDataSource.setRefreshToken(refreshToken)
}

override suspend fun refreshAccessToken() {
val response = authService.requestRefresh(RefreshTokenDto(getRefreshToken()))
val naagaAuthDto = response.getValueOrThrow()
storeToken(naagaAuthDto.accessToken, naagaAuthDto.refreshToken)
}

companion object {
private const val NO_REFRESH_TOKEN = "리프레시 토큰이 없습니다"
}
}
42 changes: 33 additions & 9 deletions android/app/src/main/java/com/now/naaga/di/ServiceModule.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.now.naaga.di

import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import com.now.domain.repository.AuthRepository
import com.now.naaga.BuildConfig
import com.now.naaga.data.remote.retrofit.AuthInterceptor
import com.now.naaga.data.remote.retrofit.service.AdventureService
Expand All @@ -17,48 +18,71 @@ import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import javax.inject.Qualifier
import javax.inject.Singleton

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class AuthRetrofit

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class CommonRetrofit

@Module
@InstallIn(SingletonComponent::class)
class ServiceModule {
private val BASE_URL = BuildConfig.BASE_URL

@Singleton
@Provides
fun provideOkHttpClient(): OkHttpClient = OkHttpClient.Builder().apply {
addInterceptor(AuthInterceptor())
fun provideOkHttpClient(authRepository: AuthRepository): OkHttpClient = OkHttpClient.Builder().apply {
addInterceptor(AuthInterceptor(authRepository))
}.build()

@AuthRetrofit
@Singleton
@Provides
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit = Retrofit.Builder()
fun provideAuthRetrofit(okHttpClient: OkHttpClient): Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
.client(okHttpClient)
.build()

@CommonRetrofit
@Singleton
@Provides
fun provideNormalRetrofit(): Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
.build()

@Singleton
@Provides
fun provideRankService(retrofit: Retrofit): RankService = retrofit.create(RankService::class.java)
fun provideRankService(@AuthRetrofit retrofit: Retrofit): RankService = retrofit.create(RankService::class.java)

@Singleton
@Provides
fun provideStatisticsService(retrofit: Retrofit): StatisticsService = retrofit.create(StatisticsService::class.java)
fun provideStatisticsService(@AuthRetrofit retrofit: Retrofit): StatisticsService = retrofit.create(
StatisticsService::class.java,
)

@Singleton
@Provides
fun provideAdventureService(retrofit: Retrofit): AdventureService = retrofit.create(AdventureService::class.java)
fun provideAdventureService(@AuthRetrofit retrofit: Retrofit): AdventureService = retrofit.create(
AdventureService::class.java,
)

@Singleton
@Provides
fun providePlaceService(retrofit: Retrofit): PlaceService = retrofit.create(PlaceService::class.java)
fun providePlaceService(@AuthRetrofit retrofit: Retrofit): PlaceService = retrofit.create(PlaceService::class.java)

@Singleton
@Provides
fun provideAuthService(retrofit: Retrofit): AuthService = retrofit.create(AuthService::class.java)
fun provideAuthService(@CommonRetrofit retrofit: Retrofit): AuthService = retrofit.create(AuthService::class.java)

@Singleton
@Provides
fun provideLetterService(retrofit: Retrofit): LetterService = retrofit.create(LetterService::class.java)
fun provideLetterService(@AuthRetrofit retrofit: Retrofit): LetterService =
retrofit.create(LetterService::class.java)
}
Loading
Loading