Skip to content

Commit

Permalink
[Main] CK Backend v1.1.0 (#204)
Browse files Browse the repository at this point in the history
* [feat/CK-179] ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#141)

* feat: ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* feat: ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ ์„œ๋น„์Šค ๊ตฌํ˜„

* feat: ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ api ๊ตฌํ˜„

* docs: ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ docs ์ž‘์„ฑ

* refactor: ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ api๋กœ ์ˆ˜์ •

* feat: ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์•ž๋’ค ๊ณต๋ฐฑ ์ œ๊ฑฐํ•˜๋„๋ก ์ˆ˜์ •

* [feat/CK-190] ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋ฅผ ํ•„์ˆ˜๋กœ ์ž…๋ ฅ๋ฐ›๋Š” ๋กœ์ง์„ ์ œ๊ฑฐํ•œ๋‹ค (#145)

* feat: ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ํ•„์ˆ˜ ์ž…๋ ฅ ๋กœ์ง ์ œ๊ฑฐ

* refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

* [feat/CK-189] ๋„ค์ด๋ฒ„ OAuth ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#144)

* feat: ํšŒ์› ์ „ํ™”๋ฒˆํ˜ธ, ์ƒ๋…„์›”์ผ ์‚ญ์ œ, ์ด๋ฉ”์ผ ์ถ”๊ฐ€

* feat: naver oauth ๊ตฌํ˜„ ๋ฐ member field ๋ณ€๊ฒฝ

* feat: ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ uri ๋ณ€๊ฒฝ

* docs: ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ API ๋ช…์„ธ ์ž‘์„ฑ

* feat: NaverOauthService ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ

* test: oauth ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€

* test: NaverOauthNetworkService ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* chore: git submodule ์—…๋ฐ์ดํŠธ

---------

Co-authored-by: ChoiYoungHoon <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>

* feat: MemberProfile email not null ๋ฐ Member salt nullable ์„ค์ •

* feat: oauth ํšŒ์›๊ฐ€์ž… ์‹œ ์•„์ด๋””์— uuid ๋ถ™ํžˆ๋„๋ก ์ˆ˜์ •

* design: ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ๊ตฌํ˜„

* feat: naver oauth API ํ†ต์‹  ๊ตฌํ˜„

* feat: ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์ฃผ์†Œ ๋ฐ˜ํ™˜ ์‹œ ์‘๋‹ต ์ฝ”๋“œ 200์œผ๋กœ ๋ณ€๊ฒฝ

* feat: ๋„ค์ด๋ฒ„ oauth ๋กœ๊ทธ์ธ ์‹œ ์ฝœ๋ฐฑ ๋ณ€๊ฒฝ ๋ฐ auth code ๋ฐ›๋„๋ก ์ˆ˜์ •

* feat: ๋„ค์ด๋ฒ„ oauth api ์ˆ˜์ •

* fix: ์‹œ์ž‘ ๋‚ ์งœ๊ฐ€ ์˜ค๋Š˜ ์ด์ „์ด๋ฉด์„œ ๋ชจ์ง‘ ์ค‘์ธ ๊ณจ๋ฃธ๋„ ์ž๋™์œผ๋กœ ์‹œ์ž‘ํ•˜๋„๋ก ์ˆ˜์ •

* feat: ์ด๋ฏธ์ง€ ํŒŒ์ผ get url ์š”์ฒญ ์‹œ cloud front๋กœ ๋‚ด๋ ค์ฃผ๋„๋ก ์ˆ˜์ •

* fix: ๋กœ๋“œ๋งต ํƒœ๊ทธ ์—ฌ๋Ÿฌ๊ฐœ์ผ์‹œ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์ค‘๋ณต ๋ฌธ์ œ ํ•ด๊ฒฐ

* fix: ํŒŒ์ผ ๊ฒฝ๋กœ ์ƒ์„ฑ์‹œ ํ•œ๊ธ€๊ณผ ๊ณต๋ฐฑ์€ ์ธ์ฝ”๋”ฉํ•œ๋‹ค

* test: test coverage ์ˆ˜์ •

* fix: file ํ™•์žฅ์ž ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค

* fix: file์ด๋ฆ„์„ ์ €์žฅํ• ๋•Œ uuid๋กœ๋งŒ ์ €์žฅํ•œ๋‹ค

* feat: ๋กœ๋“œ๋งต ํƒœ๊ทธ์— BatchSize ์ ์šฉ

* [Release] ๊ณจ๋ฃธ ๋Œ€์‹œ๋ณด๋“œ ๋‚ด์˜ ๋…ธ๋“œ ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋ฐ ๊ณจ๋ฃธ ๋ชฉ๋ก ์กฐํšŒ ์‹œ ๋ชจ๋“  ์ƒํƒœ์˜ ๊ณจ๋ฃธ์„ ์กฐํšŒํ•˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค. (#188)

* feat: ๊ณจ๋ฃธ ๋…ธ๋“œ ๋ชฉ๋ก ์กฐํšŒ ์‹œ ๋…ธ๋“œ ์„ค๋ช…๊ณผ ์ด๋ฏธ์ง€ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* [feat/CK-227] ๋กœ๋“œ๋งต ๊ณจ๋ฃธ ์กฐํšŒ ์‹œ ์ตœ์‹ ์ˆœ์ผ๋•Œ๋Š” ๋ชจ๋“  ์ƒํƒœ๋ฅผ, ๋งˆ๊ฐ์ž„๋ฐ• ์ˆœ์ผ ๋• ๋ชจ์ง‘ ์ค‘์ธ ์ƒํƒœ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค (#185)

* chore: ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์ˆ˜์ •

* feat: ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋กœ๋“œ๋งต ๊ณจ๋ฃธ ์กฐํšŒ ์‹œ ์ฟผ๋ฆฌ ์ˆ˜์ •

* refactor: 1:N ๋ฌธ์ œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด @batchsize ์„ค์ •

* feat: ๋กœ๋“œ๋งต ๊ณจ๋ฃธ ์‘๋‹ต์— ๊ณจ๋ฃธ ์ƒํƒœ ์ถ”๊ฐ€

* chore: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

* chore: ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์ˆ˜์ •

* refactor: ๋ฉ”์„œ๋“œ ๋„ค์ด๋ฐ ์ˆ˜์ •

---------

Co-authored-by: Ohjintaek <[email protected]>

* [Release] ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ์บ์‹œ๋ฅผ ์ ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ•œ๋‹ค. (#203)

* feat: ๊ณจ๋ฃธ ๋…ธ๋“œ ๋ชฉ๋ก ์กฐํšŒ ์‹œ ๋…ธ๋“œ ์„ค๋ช…๊ณผ ์ด๋ฏธ์ง€ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* [feat/CK-227] ๋กœ๋“œ๋งต ๊ณจ๋ฃธ ์กฐํšŒ ์‹œ ์ตœ์‹ ์ˆœ์ผ๋•Œ๋Š” ๋ชจ๋“  ์ƒํƒœ๋ฅผ, ๋งˆ๊ฐ์ž„๋ฐ• ์ˆœ์ผ ๋• ๋ชจ์ง‘ ์ค‘์ธ ์ƒํƒœ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค (#185)

* chore: ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์ˆ˜์ •

* feat: ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋กœ๋“œ๋งต ๊ณจ๋ฃธ ์กฐํšŒ ์‹œ ์ฟผ๋ฆฌ ์ˆ˜์ •

* refactor: 1:N ๋ฌธ์ œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด @batchsize ์„ค์ •

* feat: ๋กœ๋“œ๋งต ๊ณจ๋ฃธ ์‘๋‹ต์— ๊ณจ๋ฃธ ์ƒํƒœ ์ถ”๊ฐ€

* chore: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

* chore: ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์ˆ˜์ •

* refactor: ๋ฉ”์„œ๋“œ ๋„ค์ด๋ฐ ์ˆ˜์ •

* refactor: BaseEntity์˜ CreatedAt ์Šคํ”„๋ง ์˜์กด์„ฑ ๋Š๊ธฐ (#191)

* refactor: MemberIdentifierArgumentResolver์—์„œ Authenticated ์–ด๋…ธํ…Œ์ด์…˜ ํ™•์ธํ•˜๋„๋ก ์ˆ˜์ • (#193)

* [feat/CK-232] ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Exception์„ ๋ถ„๋ฆฌํ•˜๊ณ  AOP๋กœ ์˜ˆ์™ธ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค. (#194)

* refactor: exception ํŒจํ‚ค์ง€๋ฅผ service ํŒจํ‚ค์ง€ ํ•˜์œ„๋กœ ์ด๋™

* feat: ๋„๋ฉ”์ธ Exception์„ ์„œ๋น„์Šค Exception์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” AOP ๊ตฌํ˜„

* [feat/CK-222] Redis๋ฅผ ๋„์ž…ํ•˜๊ณ  Refresh Token์„ Redis์— ์ €์žฅํ•˜๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค (#190)

* build: spring data redis ๋ฐ testcontainers ์˜์กด์„ฑ ์ถ”๊ฐ€

* feat: RefreshToken ๋ ˆ๋””์Šค์— ์ €์žฅํ•˜๋„๋ก ๋ณ€๊ฒฝ

* test: Redis ํ…Œ์ŠคํŠธ ์„ค์ • ๋ฐ RefreshTokenRedisRepository ํ…Œ์ŠคํŠธ

* chore: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

* refactor: JwtTokenProvider์—์„œ RefreshToken ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* refactor: ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: RedisTemplate์œผ๋กœ ๋ณ€๊ฒฝ

* test: JwtTokenProvider ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: test config์— redis ์„ค์ • ์ถ”๊ฐ€

* test: test ์ถ”๊ฐ€

* chore: ๊ธฐ์กด refresh token table์„ dropํ•˜๋Š” ์ฟผ๋ฆฌ ์ถ”๊ฐ€

* refactor: ttl์„ ์ดˆ๋‹จ์œ„๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง ๋ณ€์ˆ˜ ์ถ”์ถœ

* refactor: ๋ณ€์ˆ˜๋ช… ๋ณ€๊ฒฝ

* refactor: ๋ ˆ๋””์Šค ํ…Œ์ŠคํŠธ ๊ฐ„ ๊ฒฉ๋ฆฌ

* chore: git submodule ์—…๋ฐ์ดํŠธ

* [feat/CK-235] Redis ์บ์‹œ๋ฅผ ์ ์šฉํ•œ๋‹ค (#197)

* test: test container์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ

* feat: redis cache ์ ์šฉ

* feat: redis config ์„ค์ • ์ˆ˜์ •

* fix: RedisConfig๋ฅผ test์—์„œ ๋น„ํ™œ์„ฑํ™” ์‹œํ‚จ๋‹ค

* test: CacheKeyGenerator test code ์ž‘์„ฑ

* feat: ์ˆ˜์ • ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ˜์˜

* chore: ์„œ๋ธŒ๋ชจ๋“ˆ ์ตœ์‹ ํ™”

* chore: ์„œ๋ธŒ๋ชจ๋“ˆ ์ตœ์‹ ํ™”

* chore: flyway v4 ํŒŒ์ผ ์ œ๊ฑฐ

* chore: flyway v4 ํŒŒ์ผ ๋ณต๊ตฌ

* [feat/CK-237] ๊ณจ๋ฃธ ์ฐธ์—ฌ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋™์‹œ์„ฑ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค (#199)

* refactor: ๊ณจ๋ฃธ ์ฐธ์—ฌ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋™์‹œ์„ฑ ์ด์Šˆ๋ฅผ ๋น„๊ด€์  ๋ฝ์œผ๋กœ ํ•ด๊ฒฐ

* test: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •

* [feat/CK-236] JdbcTemplate์„ ์ด์šฉํ•˜์—ฌ bulk insert๋ฅผ ์ ์šฉํ•œ๋‹ค (#198)

* refactor: ๊ธฐ์กด saveAll, deleteAll์„ bulk insert๋กœ ๊ฐœ์„ 

* refactor: Dao ๋Œ€์‹  Repository ๊ณ„์ธต์— ์˜์กดํ•˜๋„๋ก ์ˆ˜์ • - JdbcRepository ์ถ”์ƒํ™”

* [feat/CK-239] Amazon S3 ์ ‘๊ทผ ์‹œ credential ์ •๋ณด๋ฅผ ์ด์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค (#201)

* feat: amazon s3 ์ ‘๊ทผ ์‹œ credentials ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •

* test: test application.yml์— credentials ์ถ”๊ฐ€

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>

* chore: properties ๋ฒ„์ ผ ๋ณ€๊ฒฝ

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Jungwoo <[email protected]>
Co-authored-by: ๋ถ€์—‰์ด <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
  • Loading branch information
7 people authored Dec 10, 2023
1 parent b9f89fc commit 065f2b5
Show file tree
Hide file tree
Showing 245 changed files with 3,103 additions and 1,603 deletions.
9 changes: 7 additions & 2 deletions backend/kirikiri/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ jacocoTestReport {
"**/*Request*",
"**/*Response*",
"**/*Interceptor*",
"**/*Exception*"
"**/*Exception*",
"**/*Mapper*"
] + QDomains)
})
)
Expand Down Expand Up @@ -122,7 +123,8 @@ jacocoTestCoverageVerification {
"**.*Request*",
"**.*Response*",
"**.*Interceptor*",
"**.*Exception*"
"**.*Exception*",
"**.*Mapper*"
] + QDomains
}
}
Expand Down Expand Up @@ -168,6 +170,9 @@ dependencies {
// flyway
implementation 'org.flywaydb:flyway-mysql'

// redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// test
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
Expand Down
11 changes: 11 additions & 0 deletions backend/kirikiri/src/docs/asciidoc/auth.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,14 @@ operation::auth-create-api-test/ํ† ํฐ_์žฌ๋ฐœํ–‰_์‹œ_ํ† ํฐ์ด_๋งŒ๋ฃŒ_๋์„_๋•Œ
=== *2-4* ์‹คํŒจ - ํ† ํฐ ์žฌ๋ฐœํ–‰ ์‹œ ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š์„ ๋•Œ

operation::auth-create-api-test/ํ† ํฐ_์žฌ๋ฐœํ–‰_์‹œ_ํ† ํฐ์ด_์œ ํšจํ•˜์ง€_์•Š์„_๋•Œ_์˜ˆ์™ธ๋ฅผ_๋˜์ง„๋‹ค[snippets='http-request,http-response']

[[๋„ค์ด๋ฒ„OAuth๋กœ๊ทธ์ธ-API]]
== *3. ๋„ค์ด๋ฒ„ OAuth ๋กœ๊ทธ์ธ*

=== *3-1* ์„ฑ๊ณต - ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ์„ฑ๊ณตํ•œ๋‹ค

operation::auth-create-api-test/๋„ค์ด๋ฒ„_๋กœ๊ทธ์ธ_ํŽ˜์ด์ง€๋ฅผ_์ •์ƒ์ ์œผ๋กœ_๋ฐ˜ํ™˜ํ•œ๋‹ค[snippets='http-request,http-response,response-fields']

=== *3-2* ์„ฑ๊ณต - ๋„ค์ด๋ฒ„ ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ์„ ์„ฑ๊ณตํ•œ๋‹ค

operation::auth-create-api-test/๋„ค์ด๋ฒ„์—์„œ_์ฝœ๋ฐฑ์š”์ฒญ์„_๋ฐ›์•„_์‚ฌ์šฉ์ž_์ •๋ณด๋ฅผ_๋ฐ˜ํ™˜ํ•œ๋‹ค[snippets='http-request,http-response']
16 changes: 4 additions & 12 deletions backend/kirikiri/src/docs/asciidoc/goalroom.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -45,27 +45,19 @@ operation::goal-room-create-api-test/๊ณจ๋ฃธ_์ƒ์„ฑ_์‹œ_์‚ญ์ œ๋œ_๋กœ๋“œ๋งต_๊ฒฝ

operation::goal-room-create-api-test/๊ณจ๋ฃธ_์ƒ์„ฑ_์‹œ_์กด์žฌํ•˜์ง€_์•Š๋Š”_ํšŒ์›์ผ_๊ฒฝ์šฐ[snippets='http-request,http-response']

=== *1-8* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ํˆฌ๋‘์˜ ์‹œ์ž‘ ๋‚ ์งœ๊ฐ€ ์˜ค๋Š˜๋ณด๋‹ค ์ „์ผ ๊ฒฝ์šฐ

operation::goal-room-create-api-test/๊ณจ๋ฃธ_์ƒ์„ฑ_์‹œ_๊ณจ๋ฃธ_ํˆฌ๋‘์˜_์‹œ์ž‘_๋‚ ์งœ๊ฐ€_์˜ค๋Š˜๋ณด๋‹ค_์ „์ผ_๊ฒฝ์šฐ[snippets='http-request,http-response']

=== *1-9* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ํˆฌ๋‘์˜ ์‹œ์ž‘ ๋‚ ์งœ๋ณด๋‹ค ์ข…๋ฃŒ ๋‚ ์งœ๊ฐ€ ๋น ๋ฅธ ๊ฒฝ์šฐ

operation::goal-room-create-api-test/๊ณจ๋ฃธ_์ƒ์„ฑ_์‹œ_๊ณจ๋ฃธ_ํˆฌ๋‘์˜_์‹œ์ž‘_๋‚ ์งœ๋ณด๋‹ค_์ข…๋ฃŒ_๋‚ ์งœ๊ฐ€_๋น ๋ฅธ_๊ฒฝ์šฐ[snippets='http-request,http-response']

=== *1-10* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ๋…ธ๋“œ์˜ ์‹œ์ž‘ ๋‚ ์งœ๊ฐ€ ์˜ค๋Š˜๋ณด๋‹ค ์ „์ผ ๊ฒฝ์šฐ
=== *1-9* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ๋…ธ๋“œ์˜ ์‹œ์ž‘ ๋‚ ์งœ๊ฐ€ ์˜ค๋Š˜๋ณด๋‹ค ์ „์ผ ๊ฒฝ์šฐ

operation::goal-room-create-api-test/๊ณจ๋ฃธ_์ƒ์„ฑ_์‹œ_๊ณจ๋ฃธ_๋…ธ๋“œ์˜_์‹œ์ž‘_๋‚ ์งœ๊ฐ€_์˜ค๋Š˜๋ณด๋‹ค_์ „์ผ_๊ฒฝ์šฐ[snippets='http-request,http-response']

=== *1-11* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ๋…ธ๋“œ์˜ ์‹œ์ž‘ ๋‚ ์งœ๋ณด๋‹ค ์ข…๋ฃŒ ๋‚ ์งœ๊ฐ€ ๋น ๋ฅธ ๊ฒฝ์šฐ
=== *1-10* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ๋…ธ๋“œ์˜ ์‹œ์ž‘ ๋‚ ์งœ๋ณด๋‹ค ์ข…๋ฃŒ ๋‚ ์งœ๊ฐ€ ๋น ๋ฅธ ๊ฒฝ์šฐ

operation::goal-room-create-api-test/๊ณจ๋ฃธ_์ƒ์„ฑ_์‹œ_๊ณจ๋ฃธ_๋…ธ๋“œ์˜_์‹œ์ž‘_๋‚ ์งœ๋ณด๋‹ค_์ข…๋ฃŒ_๋‚ ์งœ๊ฐ€_๋น ๋ฅธ_๊ฒฝ์šฐ[snippets='http-request,http-response']

=== *1-12* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ๋…ธ๋“œ์˜ ์ธ์ฆ ํšŸ์ˆ˜๊ฐ€ 0๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ
=== *1-11* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ๋…ธ๋“œ์˜ ์ธ์ฆ ํšŸ์ˆ˜๊ฐ€ 0๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ

operation::goal-room-create-api-test/๊ณจ๋ฃธ_์ƒ์„ฑ_์‹œ_๊ณจ๋ฃธ_๋…ธ๋“œ์˜_์ธ์ฆ_ํšŸ์ˆ˜๊ฐ€_0๋ณด๋‹ค_์ž‘์„_๊ฒฝ์šฐ[snippets='http-request,http-response']

=== *1-13* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ๋…ธ๋“œ์˜ ์ธ์ฆ ํšŸ์ˆ˜๊ฐ€ ๊ธฐ๊ฐ„๋ณด๋‹ค ํด ๊ฒฝ์šฐ
=== *1-12* ์‹คํŒจ - ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ ๊ณจ๋ฃธ ๋…ธ๋“œ์˜ ์ธ์ฆ ํšŸ์ˆ˜๊ฐ€ ๊ธฐ๊ฐ„๋ณด๋‹ค ํด ๊ฒฝ์šฐ

operation::goal-room-create-api-test/๊ณจ๋ฃธ_์ƒ์„ฑ_์‹œ_๊ณจ๋ฃธ_๋…ธ๋“œ์˜_์ธ์ฆ_ํšŸ์ˆ˜๊ฐ€_๊ธฐ๊ฐ„๋ณด๋‹ค_ํด_๊ฒฝ์šฐ[snippets='http-request,http-response']

Expand Down
22 changes: 7 additions & 15 deletions backend/kirikiri/src/docs/asciidoc/member.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -32,37 +32,29 @@ operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€_ํ˜•์‹์—_๋งž

operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_๋‹‰๋„ค์ž„์ด_ํ˜•์‹์—_๋งž์ง€์•Š์„๋•Œ[snippets='http-request,http-response']

=== *1-5* ์‹คํŒจ - ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹์— ๋งž์ง€ ์•Š์„ ๋•Œ

operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_์ „ํ™”๋ฒˆํ˜ธ_ํ˜•์‹์—_๋งž์ง€์•Š์„๋•Œ[snippets='http-request,http-response']

=== *1-6* ์‹คํŒจ - ์ค‘๋ณต๋œ ์•„์ด๋””์ผ ๋•Œ
=== *1-5* ์‹คํŒจ - ์ค‘๋ณต๋œ ์•„์ด๋””์ผ ๋•Œ

operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_์ค‘๋ณต๋œ_๋‹‰๋„ค์ž„์ผ_๋•Œ[snippets='http-request,http-response']

=== *1-7* ์‹คํŒจ - ์ค‘๋ณต๋œ ๋‹‰๋„ค์ž„์ผ ๋•Œ
=== *1-6* ์‹คํŒจ - ์ค‘๋ณต๋œ ๋‹‰๋„ค์ž„์ผ ๋•Œ

operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_์ค‘๋ณต๋œ_์•„์ด๋””์ผ_๋•Œ[snippets='http-request,http-response']

=== *1-8* ์‹คํŒจ - ํšŒ์›๊ฐ€์ž… ์‹œ ์•„์ด๋””์— ๋นˆ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ
=== *1-7* ์‹คํŒจ - ํšŒ์›๊ฐ€์ž… ์‹œ ์•„์ด๋””์— ๋นˆ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ

operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_์•„์ด๋””์—_๋นˆ๊ฐ’์ด_๋“ค์–ด์˜ฌ_๋•Œ[snippets='http-request,http-response']

=== *1-9* ์‹คํŒจ - ํšŒ์›๊ฐ€์ž… ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ์— ๋นˆ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ
=== *1-8* ์‹คํŒจ - ํšŒ์›๊ฐ€์ž… ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ์— ๋นˆ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ

operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_๋น„๋ฐ€๋ฒˆํ˜ธ์—_๋นˆ๊ฐ’์ด_๋“ค์–ด์˜ฌ_๋•Œ[snippets='http-request,http-response']

=== *1-10* ์‹คํŒจ - ํšŒ์›๊ฐ€์ž… ํ•  ๋•Œ ๋‹‰๋„ค์ž„์— ๋นˆ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ
=== *1-9* ์‹คํŒจ - ํšŒ์›๊ฐ€์ž… ํ•  ๋•Œ ๋‹‰๋„ค์ž„์— ๋นˆ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ

operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_๋‹‰๋„ค์ž„์—_๋นˆ๊ฐ’์ด_๋“ค์–ด์˜ฌ_๋•Œ[snippets='http-request,http-response']

=== *1-11* ์‹คํŒจ - ํšŒ์›๊ฐ€์ž… ์‹œ ์ „ํ™”๋ฒˆํ˜ธ์— ๋นˆ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ

operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_์ „ํ™”๋ฒˆํ˜ธ์—_๋นˆ๊ฐ’์ด_๋“ค์–ด์˜ฌ_๋•Œ[snippets='http-request,http-response']

=== *1-12* ์‹คํŒจ - ํšŒ์›๊ฐ€์ž… ์‹œ ์•„์ด๋”” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋‹‰๋„ค์ž„ ์ „ํ™”๋ฒˆํ˜ธ ํ•„๋“œ์— ๋นˆ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ
=== *1-10* ์‹คํŒจ - ํšŒ์›๊ฐ€์ž…_์‹œ_์•„์ด๋””_๋น„๋ฐ€๋ฒˆํ˜ธ_๋‹‰๋„ค์ž„_์ด๋ฉ”์ผ_ํ•„๋“œ์—_๋นˆ๊ฐ’์ด_๋“ค์–ด์˜ฌ_๋•Œ

operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_์•„์ด๋””_๋น„๋ฐ€๋ฒˆํ˜ธ_๋‹‰๋„ค์ž„_์ „ํ™”๋ฒˆํ˜ธ_ํ•„๋“œ์—_๋นˆ๊ฐ’์ด_๋“ค์–ด์˜ฌ_๋•Œ[snippets='http-request,http-response']
operation::member-create-api-test/ํšŒ์›๊ฐ€์ž…_์‹œ_์•„์ด๋””_๋น„๋ฐ€๋ฒˆํ˜ธ_๋‹‰๋„ค์ž„_์ด๋ฉ”์ผ_ํ•„๋“œ์—_๋นˆ๊ฐ’์ด_๋“ค์–ด์˜ฌ_๋•Œ[snippets='http-request,http-response']

[[์‚ฌ์šฉ์ž์ •๋ณด์กฐํšŒ-API]]
== *2. ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ*
Expand Down
20 changes: 0 additions & 20 deletions backend/kirikiri/src/docs/asciidoc/overview.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,6 @@

|===

[[overview-page-response]]
=== *Page Response Data*

|===
| Field Name | Type | Description

| currentPage
| int
| ํ˜„์žฌ ํŽ˜์ด์ง€ ๊ฐ’

| totalPage
| int
| ์ด ํŽ˜์ด์ง€ ๊ฐ’

| data
| Object
| ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ

|===

[[overview-error-response]]
=== *Error Response Data*

Expand Down
19 changes: 19 additions & 0 deletions backend/kirikiri/src/docs/asciidoc/roadmap.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -219,3 +219,22 @@ operation::roadmap-create-api-test/๋กœ๋“œ๋งต_์‚ญ์ œ์‹œ_์กด์žฌํ•˜์ง€_์•Š๋Š”_๋กœ
=== *10-3* ์‹คํŒจ - ์ž์‹ ์ด ์ƒ์„ฑํ•œ ๋กœ๋“œ๋งต์ด ์•„๋‹Œ ๊ฒฝ์šฐ

operation::roadmap-create-api-test/๋กœ๋“œ๋งต_์‚ญ์ œ์‹œ_์ž์‹ ์ด_์ƒ์„ฑํ•œ_๋กœ๋“œ๋งต์ด_์•„๋‹Œ_๊ฒฝ์šฐ_์˜ˆ์™ธ๊ฐ€_๋ฐœ์ƒํ•œ๋‹ค[snippets='http-request,http-response,response-fields']

[[๋กœ๋“œ๋งต์นดํ…Œ๊ณ ๋ฆฌ์ƒ์„ฑ-API]]
== *11. ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ API*

=== *11-1* ์„ฑ๊ณต

operation::roadmap-create-api-test/์ •์ƒ์ ์œผ๋กœ_๋กœ๋“œ๋งต_์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ_์ƒ์„ฑํ•œ๋‹ค[snippets='http-request,request-fields,http-response']

=== *11-2* ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ ์‹œ ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„์ด ๋นˆ๊ฐ’์ผ ๊ฒฝ์šฐ

operation::roadmap-create-api-test/๋กœ๋“œ๋งต_์นดํ…Œ๊ณ ๋ฆฌ_์ƒ์„ฑ_์‹œ_์นดํ…Œ๊ณ ๋ฆฌ_์ด๋ฆ„์ด_๋นˆ๊ฐ’์ผ_๊ฒฝ์šฐ[snippets='http-request,request-fields,http-response']

=== *11-3* ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ ์‹œ ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„์ด 10์ž ์ดˆ๊ณผ์ผ ๊ฒฝ์šฐ

operation::roadmap-create-api-test/๋กœ๋“œ๋งต_์นดํ…Œ๊ณ ๋ฆฌ_์ƒ์„ฑ_์‹œ_์นดํ…Œ๊ณ ๋ฆฌ_์ด๋ฆ„์ด_10์ž_์ดˆ๊ณผ์ผ_๊ฒฝ์šฐ[snippets='http-request,request-fields,http-response']

=== *11-4* ๋กœ๋“œ๋งต ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ ์‹œ ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„์ด ์ค‘๋ณต๋  ๊ฒฝ์šฐ

operation::roadmap-create-api-test/๋กœ๋“œ๋งต_์นดํ…Œ๊ณ ๋ฆฌ_์ƒ์„ฑ_์‹œ_์นดํ…Œ๊ณ ๋ฆฌ_์ด๋ฆ„์ด_์ค‘๋ณต๋ _๊ฒฝ์šฐ[snippets='http-request,request-fields,http-response']
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package co.kirikiri.common.config;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
Expand All @@ -11,15 +13,23 @@
public class AWSConfig {

private final Regions region;
private final String accessKey;
private final String secretKey;

public AWSConfig(@Value("${cloud.aws.region.static}") final String region) {
public AWSConfig(@Value("${cloud.aws.region.static}") final String region,
@Value("${cloud.aws.credentials.access-key}") final String accessKey,
@Value("${cloud.aws.credentials.secret-key}") final String secretKey) {
this.region = Regions.fromName(region);
this.accessKey = accessKey;
this.secretKey = secretKey;
}

@Bean
public AmazonS3 amazonS3() {
final BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
return AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package co.kirikiri.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class NetworkConfig {

@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package co.kirikiri.common.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.Duration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@EnableCaching
@Profile(value = {"prod", "dev", "local"})
public class RedisConfig {

@Bean
public RedisTemplate<String, String> redisTemplate(final RedisConnectionFactory redisConnectionFactory) {
final RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}

@Bean
public CacheManager redisCacheManager(final RedisConnectionFactory redisConnectionFactory) {
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.EVERYTHING);

final RedisSerializer<Object> serializer = new GenericJackson2JsonRedisSerializer(objectMapper);

final RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30L))
.disableCachingNullValues()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer));

return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(redisCacheConfiguration)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
import co.kirikiri.common.interceptor.AuthInterceptor;
import co.kirikiri.common.resolver.MemberIdentifierArgumentResolver;
import co.kirikiri.common.resolver.RoadmapSaveArgumentResolver;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;

@Configuration
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package co.kirikiri.common.interceptor;

import co.kirikiri.exception.AuthenticationException;
import co.kirikiri.service.AuthService;
import co.kirikiri.service.auth.AuthService;
import co.kirikiri.service.exception.AuthenticationException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package co.kirikiri.common.resolver;

import co.kirikiri.exception.AuthenticationException;
import co.kirikiri.service.AuthService;
import co.kirikiri.common.interceptor.Authenticated;
import co.kirikiri.service.auth.AuthService;
import co.kirikiri.service.exception.AuthenticationException;
import co.kirikiri.service.exception.ServerException;
import lombok.RequiredArgsConstructor;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
Expand All @@ -21,6 +23,9 @@ public class MemberIdentifierArgumentResolver implements HandlerMethodArgumentRe

@Override
public boolean supportsParameter(final MethodParameter parameter) {
if (!parameter.hasMethodAnnotation(Authenticated.class)) {
throw new ServerException("MemberIdentifier๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (@Authenticated)");
}
return parameter.getParameterType().equals(String.class)
&& parameter.hasParameterAnnotation(MemberIdentifier.class);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package co.kirikiri.common.resolver;

import co.kirikiri.exception.BadRequestException;
import co.kirikiri.service.dto.roadmap.request.RoadmapNodeSaveRequest;
import co.kirikiri.service.dto.roadmap.request.RoadmapSaveRequest;
import co.kirikiri.service.exception.BadRequestException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
package co.kirikiri.controller;

import co.kirikiri.service.AuthService;
import co.kirikiri.service.auth.AuthService;
import co.kirikiri.service.auth.NaverOauthService;
import co.kirikiri.service.dto.auth.OauthRedirectResponse;
import co.kirikiri.service.dto.auth.request.LoginRequest;
import co.kirikiri.service.dto.auth.request.ReissueTokenRequest;
import co.kirikiri.service.dto.auth.response.AuthenticationResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;

@RestController
@RequestMapping("/auth")
@RequiredArgsConstructor
public class AuthController {

private final AuthService authService;
private final NaverOauthService naverOauthService;

@PostMapping("/login")
public ResponseEntity<AuthenticationResponse> login(@RequestBody @Valid final LoginRequest request) {
Expand All @@ -31,4 +37,22 @@ public ResponseEntity<AuthenticationResponse> reissue(@RequestBody @Valid final
return ResponseEntity.ok(response);
}

@GetMapping("/oauth/naver")
public ResponseEntity<OauthRedirectResponse> loginOauth() {
final OauthRedirectResponse oauthRedirectResponse = naverOauthService.makeOauthUrl();
return ResponseEntity.ok(oauthRedirectResponse);
}

@GetMapping("/login/oauth")
public ResponseEntity<AuthenticationResponse> loginOauth(
@RequestParam(value = "code") final String code,
@RequestParam("state") final String state) {
final Map<String, String> queryParams = Map.of(
"code", code,
"state", state,
"grant_type", "authorization_code"
);
final AuthenticationResponse response = naverOauthService.login(queryParams);
return ResponseEntity.ok(response);
}
}
Loading

0 comments on commit 065f2b5

Please sign in to comment.