โš ๏ธ API ๊ณ„์•ฝยท์—๋Ÿฌ ์ฝ”๋“œยท๋ฐ์ดํ„ฐ ์›์ฒœ์€ ์ƒ์œ„ ๊ณตํ†ต ๋ฌธ์„œ์—์„œ๋งŒ ์ •์˜ํ•จ. ์ด ๋ฌธ์„œ์—์„œ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์Œ.

1. ์š”์•ฝ

๋ฐฉ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ 10ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•จ. ์ด ํ™”๋ฉด์˜ ๋‚œ์ด๋„๋Š” ๊ถŒํ•œ ร— ์ฐจ๋‹จ ร— ๋ชจ๋”๋ ˆ์ด์…˜ 3๊ฐœ ์ถ•์ด ๊ณฑํ•ด์ง€๋Š” ์กฐ๊ฑด ๋ถ„๊ธฐ์ž„. ๊ฐ™์€ ํ”ผ๋“œ๊ฐ€ ๋ณด๋Š” ์‚ฌ๋žŒยท์—ญํ• ยท์ฐจ๋‹จ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋ Œ๋”๋จ.

2. ์ „์ œ ๋ฐ ์ง€์› ๋ฒ”์œ„

3. Goals / Non-Goals

Goals โ€” ๊ถŒํ•œ๋ณ„ UI ๋ถ„๊ธฐ๋ฅผ ์‘๋‹ต ํ•„๋“œ๋กœ๋งŒ ๊ฒฐ์ •, ์ฐจ๋‹จ ์œ ์ € 3๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ์ผ๊ด€, ์Šค๋ ˆ๋“œ ๋ฌดํ•œ์Šคํฌ๋กค ์•ˆ์ •ํ™”, ๋นˆ ์ƒํƒœ ์„ค๊ณ„

Non-Goals โ€” ์ด์˜ ์ œ์ถœ ํ™”๋ฉด์€ ์ธ์ฆ ๋ชจ๋“ˆ, ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ ํ™”๋ฉด์€ ๋งˆ์ดํŽ˜์ด์ง€ยท์‹ ๊ณ  ๋ชจ๋“ˆ ์†Œ๊ด€์ž„. ์—ฌ๊ธฐ์„œ๋Š” ์ง„์ž…์ ๋งŒ ์ œ๊ณตํ•จ


4. ๊ณ„ํš

4-1. ํ™”๋ฉด / ๋ผ์šฐํŒ… ๊ตฌ์กฐ

๋ผ์šฐํŠธ ์ง„์ž… ๊ฒฝ๋กœ ์‚ฌ์šฉ API
๋ฐฉ ์Šค๋ ˆ๋“œ ยท ๋ฉ”์ธ ์ฑŒ๋ฆฐ์ง€ ์ƒ์„ธ ยท ๋ฐฉ ์ž…์žฅ GET /api/v1/challenges/{id}/room ยท GET /api/v1/challenges/{id}/threads โ€” ๋ณ‘๋ ฌ ํ˜ธ์ถœ
๊ณต์ง€ ์ƒ์„ธ ์Šค๋ ˆ๋“œ ์•„์ดํ…œ ยท ๊ณ ์ • ๋ฐฐ๋„ˆ ยท ํ‘ธ์‹œ GET /api/v1/challenges/{id}/notices/{noticeId} ยท GET /api/v1/comments
๊ณต์ง€ ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ โ€” ๋ฐฉ์žฅ๋งŒ POST /api/v1/challenges/{id}/notices
๊ณต์ง€ ๋ชจ์•„๋ณด๊ธฐ ์Šค๋ ˆ๋“œ ํ€ต๋งํฌ GET /api/v1/challenges/{id}/notices
์‹ ๊ณ  ์‹œํŠธ โ‹ฏ ๋ฉ”๋‰ด โ€” ๊ณต์ง€ ยท ๋Œ“๊ธ€ ยท ํ”„๋กœํ•„ POST /api/v1/reports
๋ฐฉ ๋‚ด๋ถ€ ๋žญํ‚น ์Šค๋ ˆ๋“œ ํ—ค๋” GET /api/v1/challenges/{id}/ranking
๋ฐฉ ์™ธ๋ถ€ ๋žญํ‚น ๋ฐฉ ๋‚ด๋ถ€ ๋žญํ‚น GET /api/v1/rankings/challenges
๋ˆ„์  ์„ฑ๊ณต ์Šค๋ ˆ๋“œ ํ€ต๋งํฌ ๋ฐฉ ์•ˆ ๋žญํ‚น API ์žฌ์‚ฌ์šฉ
๋ฉค๋ฒ„ ํ”„๋กœํ•„ ์•„๋ฐ”ํƒ€ ํƒญ ยท ๋ฉค๋ฒ„ ๋ชฉ๋ก GET /api/v1/challenges/{id}/members ยท ํƒ€์ธ ํ”„๋กœํ•„
๋นˆ ์ƒํƒœ items ๋นˆ ๋ฐฐ์—ด โ€”

4-2. ๊ถŒํ•œ๋ณ„ UI ๋ถ„๊ธฐ โ€” ์‘๋‹ต ํ•„๋“œ๋กœ๋งŒ ๊ฒฐ์ •

์กฐ๊ฑด ๋…ธ์ถœ
myRole = OWNER ยท ownerType = USER ๊ณต์ง€ ์“ฐ๊ธฐ FAB ยท ๊ณต์ง€ โ‹ฏ ๋ฉ”๋‰ด๋กœ ์ˆ˜์ •ยท์‚ญ์ œยท๊ณ ์ • ยท ๋ฉค๋ฒ„ ๊ด€๋ฆฌ๋กœ ์ดˆ๋Œ€ยท๊ฐ•ํ‡ดยท์œ„์ž„
myRole = MEMBER ยท ownerType = BOT "๋ฐฉ์žฅ ๋˜๊ธฐ" CTA ยท ๊ณต์ง€ ์˜์—ญ์€ ๋นˆ ์ƒํƒœ
myRole = MEMBER ยท ownerType = USER ์กฐํšŒ + ๋Œ“๊ธ€๋งŒ
์ดˆ๋Œ€ ๋ฒ„ํŠผ ๋น„๊ณต๊ฐœ ๋ฐฉ์—์„œ๋งŒ ๋…ธ์ถœํ•œ๋‹ค. ๊ณต๊ฐœยท์†”๋กœ๋Š” ์‚ฌ์ „ ๋น„๋…ธ์ถœ โ€” 409 ์œ ๋ฐœ ๊ธˆ์ง€
๋Œ“๊ธ€ โ‹ฏ deletable = true์ผ ๋•Œ๋งŒ ์‚ญ์ œ ๋ฉ”๋‰ด
๋‹ต๊ธ€ ๋ฒ„ํŠผ ์› ๋Œ“๊ธ€์—๋งŒ ๋…ธ์ถœํ•œ๋‹ค. ๋‹ต๊ธ€์—๋Š” ๋ฏธ๋…ธ์ถœ โ€” 400 ์œ ๋ฐœ ๊ธˆ์ง€
์‹ ๊ณ  ๋ณธ์ธ ๊ธ€ยท๋ณธ์ธ ํ”„๋กœํ•„์—” ๋ฏธ๋…ธ์ถœ

์›์น™: ์„œ๋ฒ„๊ฐ€ 403/400์„ ๋‚ด๋ฆฌ๊ธฐ ์ „์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฒ„ํŠผ์„ ์•ˆ ๋ณด์—ฌ์คŒ. ์—๋Ÿฌ๋Š” ๊ฒฝํ•ฉยท์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ์˜ ๋ฐฑ์—…์ž„.

4-3. ์ฐจ๋‹จ ยท ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์ฒ˜๋ฆฌ โ€” ๊ฒฝ๋กœ๋ณ„๋กœ ๋‹ค๋ฅด๋‹ค

๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํด๋ผ์ด์–ธํŠธ ํ™•์ธ
๊ณต์ง€ ๋ฏธ๋…ธ์ถœ โ€” ๊ณ ์ •์ด์—ˆ์œผ๋ฉด pinnedNotice: null ๊ณ ์ • ๋ฐฐ๋„ˆ ์˜์—ญ ์ž์ฒด๋ฅผ ์ˆจ๊น€
์ธ์ฆ ์ด๋ฒคํŠธ ๋งˆ์Šคํ‚น ๋…ธ์ถœ โ€” ์ž„์‹œ ๋‹‰๋„ค์ž„ + ๊ธฐ๋ณธ ์ด๋ฏธ์ง€ ์•„์ดํ…œ์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์‚ฌ๋žŒ ์ •๋ณด๋งŒ ๊ต์ฒด
๋Œ“๊ธ€ยท๋‹ต๊ธ€ ๋ชฉ๋ก์—์„œ ์ œ์™ธ commentCount์™€ ์‹ค์ œ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ โ€” ์ˆซ์ž ๋ถˆ์ผ์น˜๋ฅผ ๋ฒ„๊ทธ๋กœ ๋ณด์ง€ ๋ง ๊ฒƒ
๊ณต์ง€ ์ƒ์„ธ ์ง์ ‘ ์ง„์ž… 404 โ€” ์กด์žฌ ์€๋‹‰ "์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ณต์ง€" โ€” ์ฐจ๋‹จํ–ˆ๋‹ค๊ณ  ์•Œ๋ฆฌ์ง€ ์•Š์Œ
๋žญํ‚น ๋งˆ์Šคํ‚น๋œ ์ฑ„ ๋“ฑ์ˆ˜ ์œ ์ง€ ์ˆœ์œ„์—์„œ ๋นผ์ง€ ์•Š์Œ

4-4. ์ƒํƒœ ๊ด€๋ฆฌ