
์ธ์ด ๐ฐ๐ท ํ๊ตญ์ด
API ๋ฆฌ์์ค
์ง๊ณ
๊ฐ์ฌ ๋ก๊ทธ
๋๊ธ
์ด๋ฉ์ผ ํ ํ๋ฆฟ
ํด์ํ๊ทธ
๋ชจ๋๋ ์ดํฐ
์๋ฆผ ์
์๋ฆผ
ํ์ด์ง
๋ณด๋ฅ ์ค์ธ ์นํํฌ ์ด๋ฒคํธ
SSO ์ฌ์ฉ์
๊ตฌ๋
ํ ๋ํธ ์ผ๋ณ ์ฌ์ฉ๋
ํ ๋ํธ
ํ ๋ํธ ํจํค์ง
ํ ๋ํธ ์ฌ์ฉ์
์ฌ์ฉ์
ํฌํ
๋๋ฉ์ธ ๊ตฌ์ฑ
์ง๋ฌธ ๊ตฌ์ฑ
์ง๋ฌธ ๊ฒฐ๊ณผ
์ง๋ฌธ ๊ฒฐ๊ณผ ์ง๊ณ
์ฌ์ฉ์ ๋ฐฐ์ง
์ฌ์ฉ์ ๋ฐฐ์ง ์งํ๋ฅ
FastComments API
FastComments๋ ์ฌ๋ฌ ๋ฆฌ์์ค์ ์ํธ ์์ฉํ๊ธฐ ์ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฐ๋ฆฌ ํ๋ซํผ๊ณผ ํตํฉ์ ๊ตฌ์ถํ๊ฑฐ๋, ์ง์ ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์!
์ด ๋ฌธ์์์๋ API๊ฐ ์ง์ํ๋ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์์ฒญ ๋ฐ ์๋ต ํ์ ๊ณผ ํจ๊ป ๋ฌธ์ํ๋์ด ์์ต๋๋ค.
์ํฐํ๋ผ์ด์ฆ ๊ณ ๊ฐ์ ๊ฒฝ์ฐ ๋ชจ๋ API ์ ๊ทผ์ด ๊ฐ์ฌ ๋ก๊ทธ์ ๊ธฐ๋ก๋ฉ๋๋ค.
์์ฑ๋ SDKs
FastComments๋ ์ด์ ์ฝ๋์์ API Spec์ ์์ฑํฉ๋๋ค (์์ง ์์ ํ์ง๋ ์์ง๋ง ๋ง์ API๊ฐ ํฌํจ๋์ด ์์ต๋๋ค).
๋ํ ์ธ๊ธฐ ์๋ ์ธ์ด์ฉ SDK๋ ์ ๊ณต๋ฉ๋๋ค:
- fastcomments-cpp
- fastcomments-go
- fastcomments-java
- fastcomments-sdk-js
- fastcomments-nim
- fastcomments-php
- fastcomments-php-sso
- fastcomments-python
- fastcomments-ruby
- fastcomments-rust
- fastcomments-swift
์ธ์ฆ
API๋ api key๋ฅผ X-API-KEY ํค๋ ๋๋ API_KEY ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ์ฌ ์ธ์ฆํฉ๋๋ค. API ํธ์ถ์ ์ํด tenantId๋ ํ์ํฉ๋๋ค. ์ด๋ api key๊ฐ ์๋ ๋์ผํ ํ์ด์ง์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ณด์ ์ฐธ๊ณ
์ด ๊ฒฝ๋ก๋ค์ ์๋ฒ์์ ํธ์ถ๋๋๋ก ๋์ด ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์ ๋ ํธ์ถํ์ง ๋ง์ธ์. ์ด๋ ๊ฒ ํ๋ฉด API ํค๊ฐ ๋ ธ์ถ๋ฉ๋๋ค - ํ์ด์ง์ ์์ค ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ ๋๊ตฌ์๊ฒ๋ ๊ณ์ ์ ๋ํ ์ ์ฒด ์ ๊ทผ ๊ถํ์ด ๋ถ์ฌ๋ฉ๋๋ค!
์ธ์ฆ ์ต์ 1 - ํค๋
- Header:
X-API-KEY - Header:
X-TENANT-ID
์ธ์ฆ ์ต์ 2 - ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์
- Query Param:
API_KEY - Query Param:
tenantId
API ๋ฆฌ์์ค 
๋ฆฌ์์ค ์ฌ์ฉ๋
API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๊ทํ์ ๊ณ์ ์ฌ์ฉ๋์ผ๋ก ์ง๊ณ๋๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค.
๊ฐ ๋ฆฌ์์ค๋ ํด๋น ์ฌ์ฉ๋์ ์์ฒด ์น์ ์ ๋์ดํฉ๋๋ค.
์ผ๋ถ ๋ฆฌ์์ค๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ณด๋ค ์ ๊ณต ๋น์ฉ์ด ๋ ๋์ต๋๋ค. ๊ฐ ์๋ํฌ์ธํธ๋ API ํธ์ถ๋น ๊ณ ์ ๋ ํฌ๋ ๋ง ๋น์ฉ์ ๊ฐ์ง๋๋ค. ์ผ๋ถ ์๋ํฌ์ธํธ์ ๊ฒฝ์ฐ ์ต์ ๋ฐ ์๋ต ํฌ๊ธฐ์ ๋ฐ๋ผ ํ์ํ ํฌ๋ ๋ง ์๊ฐ ๋ฌ๋ผ์ง๋๋ค.
API ์ฌ์ฉ๋์ ์ฒญ๊ตฌ ๋ถ์ ํ์ด์ง์์ ํ์ธํ ์ ์์ผ๋ฉฐ, ๋ช ๋ถ๋ง๋ค ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์ฐธ๊ณ !
ํผ๋์ ์ค์ด๊ธฐ ์ํด urlId์ ์ ๋ฌํ ๊ฐ์ ๊ฒฐ์ ํ ๋ ๋จผ์ Pages ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์๊ธธ ๊ถ์ฅํฉ๋๋ค.
๋ฐ์ดํฐ ์ง๊ณ 
์ด API๋ ๋ฌธ์๋ฅผ ๊ทธ๋ฃนํ(groupBy๊ฐ ์ ๊ณต๋ ๊ฒฝ์ฐ)ํ๊ณ ์ฌ๋ฌ ์ฐ์ฐ์ ์ ์ฉํ์ฌ ์ง๊ณํฉ๋๋ค. ๋ค์ํ ์ฐ์ฐ(์: sum, countDistinct, avg ๋ฑ)์ ์ง์ํฉ๋๋ค.
๋น์ฉ์ ๊ฐ๋ณ์ ์ ๋๋ค. ์ค์บ๋ ๊ฐ์ฒด 500๊ฐ๋ง๋ค API ํฌ๋ ๋ง 1๊ฐ๊ฐ ์๋ชจ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ API ํธ์ถ์ ํ์ฉ๋๋ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ 64MB์ด๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋์์ ํ๋์ ์ง๊ณ๋ง ์คํํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ง๊ณ๋ฅผ ๋์์ ์ ์ถํ๋ฉด ์ ์ถ๋ ์์๋๋ก ํ์ ๋ค์ด๊ฐ ์คํ๋ฉ๋๋ค. ๋๊ธฐ ์ค์ธ ์ง๊ณ๋ ์ต๋ 60์ด ๋์ ๋๊ธฐํ๋ฉฐ, ๊ทธ ์ดํ์๋ ์์ฒญ์ด ํ์์์๋ฉ๋๋ค. ๊ฐ๋ณ ์ง๊ณ๋ ์ต๋ 5๋ถ ๋์ ์คํ๋ ์ ์์ต๋๋ค.
๊ด๋ฆฌ๋๋ ํ
๋ํธ๊ฐ ์๋ ๊ฒฝ์ฐ parentTenantId ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ์ฌ ํ ๋ฒ์ ํธ์ถ๋ก ๋ชจ๋ ํ์ ํ
๋ํธ ๋ฆฌ์์ค๋ฅผ ์ง๊ณํ ์ ์์ต๋๋ค.
์์
์์ : ๊ณ ์ ๊ฐ ์ธ๊ธฐ


์์ : ๊ณ ์ ๊ฐ ๊ฐ์ ์ธ๊ธฐ

์๋ต:

์์ : ์ฌ๋ฌ ํ๋ ๊ฐ ํฉ๊ณ

์๋ต:

์์ : ์ฌ๋ฌ ํ๋ ๊ฐ ํ๊ท

์๋ต:

์์ : ์ฌ๋ฌ ํ๋์ ์ต์/์ต๋ ๊ฐ

์๋ต:

์์ : ์ฌ๋ฌ ํ๋์ ๊ณ ์ ๊ฐ ์ธ๊ธฐ

์๋ต:

์์ : ์ฟผ๋ฆฌ ์์ฑ ์์

์๋ต:

์์ : ๊ฒํ ๋๊ธฐ ๋๊ธ ์ ์ธ๊ธฐ

์๋ต:

์์ : ์น์ธ, ๊ฒํ ๋ฐ ์คํธ ๋๊ธ ๋ถ๋ฅ

์๋ต:

๊ตฌ์กฐ


๋ค์ ๋ฆฌ์์ค๋ค์ ์ง๊ณํ ์ ์์ต๋๋ค:
- AffiliateEvent
- AnonymousVote
- BannedUser
- BatchJob
- BlockedUser
- Comment
- CommentDeleted
- CommentIdToSyncOutbound
- CommentScheduled
- CommentSyncLog
- CustomConfig
- CustomEmailTemplateRenderError
- EmailToSend
- EventLogEntry
- ImportedCommentScheduled
- ModerationGroup
- Moderator
- Page
- PageReact
- PendingVote
- QuestionResult
- SSOUser
- SentEmail
- SpamEvent
- Tenant
- TenantAuditLog
- TenantBadge
- TenantDailyUsage
- TenantInvoiceHistory
- TenantPackage
- User
- UserBadge
- UserBadgeProgress
- UserNotification
- UserSubscription
- UserUsage
- Vote
๊ฐ์ฌ ๋ก๊ทธ ๊ตฌ์กฐ 
AuditLog๋ ์ด ๊ธฐ๋ฅ์ ์ ๊ทผ ๊ถํ์ด ์๋ ํ
๋ํธ์ ๋ํด ๊ฐ์ฌ๋ ์ด๋ฒคํธ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด์
๋๋ค.
AuditLog ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

๊ฐ์ฌ ๋ก๊ทธ๋ ๋ถ๋ณ์ ๋๋ค. ์๋์ผ๋ก ์ธ ์๋ ์์ต๋๋ค. FastComments.com๋ง ๊ฐ์ฌ ๋ก๊ทธ์ ๊ธฐ๋กํ ์์ ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด API๋ฅผ ํตํด ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
์ด ๊ฐ์ฌ ๋ก๊ทธ์ ์ด๋ฒคํธ๋ 2๋ ํ์ ๋ง๋ฃ๋ฉ๋๋ค.
GET /api/v1/audit-logs 
์ด API๋ skip, before, after ๋งค๊ฐ๋ณ์๋ก ์ ๊ณต๋๋ ํ์ด์ง๋ค์ด์
์ ์ฌ์ฉํฉ๋๋ค. AuditLogs๋ when๊ณผ id๋ก ์ ๋ ฌ๋๋ฉฐ ํ ํ์ด์ง๋น 1000๊ฐ๊ฐ ๋ฐํ๋ฉ๋๋ค.
๋งค 1000๊ฐ์ ๋ก๊ทธ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ๋ ํฌ๋ ๋ง 10์ด ์๋ชจ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก, ๊ฐ์ฅ ์ต์ ํญ๋ชฉ์ด ๋จผ์ ์ธ ๋ชฉ๋ก์ ๋ฐ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด skip=0๋ถํฐ ํด๋ง์ ์์ํ์ฌ ๋ง์ง๋ง์ผ๋ก ์ฒ๋ฆฌํ ๋ ์ฝ๋๋ฅผ ์ฐพ์ ๋๊น์ง ํ์ด์ง๋ค์ด์
ํ ์ ์์ต๋๋ค.
๋๋ ์ค๋๋ ํญ๋ชฉ๋ถํฐ ์ ๋ ฌํ์ฌ ๋ ์ด์ ๋ ์ฝ๋๊ฐ ์์ ๋๊น์ง ํ์ด์ง๋ค์ด์ ํ ์ ์์ต๋๋ค.
์ ๋ ฌ์ order๋ฅผ ASC ๋๋ DESC๋ก ์ค์ ํ์ฌ ์ํํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ASC์
๋๋ค.
๋ ์ง๋ก ์ฟผ๋ฆฌํ๋ ๊ฒ์ ๋ฐ๋ฆฌ์ด ๋จ์ ํ์์คํฌํ๋ก before์ after๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ๋ฅํฉ๋๋ค. before์ after๋ ํฌํจ๋์ง ์์ต๋๋ค.



๋๊ธ ๊ตฌ์กฐ 
A Comment ๊ฐ์ฒด๋ ์ฌ์ฉ์๊ฐ ๋จ๊ธด ๋๊ธ์ ๋ํ๋
๋๋ค.
์์ ๋ฐ ํ์ ๋๊ธ ๊ฐ์ ๊ด๊ณ๋ parentId๋ฅผ ํตํด ์ ์๋ฉ๋๋ค.
Comment ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

์ผ๋ถ ํ๋๋ READONLY๋ก ํ์๋์ด ์์ต๋๋ค โ ์ด๋ค ํ๋๋ API์์ ๋ฐํ๋์ง๋ง ์ค์ ํ ์ ์์ต๋๋ค.
๋๊ธ ํ ์คํธ ๊ตฌ์กฐ
๋๊ธ์ FastComments ๋ณํ ๋งํฌ๋ค์ด์ผ๋ก ์์ฑ๋ฉ๋๋ค. ์ด๋ ์ผ๋ฐ ๋งํฌ๋ค์ด์ ์ ํต์ ์ธ bbcode ์คํ์ผ์ ์ด๋ฏธ์ง ํ๊ทธ(์: [img]path[/img])๋ฅผ ์ถ๊ฐํ ๊ฒ์
๋๋ค.
ํ
์คํธ๋ ๋ ํ๋์ ์ ์ฅ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์๋ฌธ ํ
์คํธ๋ comment ํ๋์ ๋ณ๊ฒฝ ์์ด ์ ์ฅ๋ฉ๋๋ค. ์ด ํ
์คํธ๋ ๋ ๋๋ง๋์ด commentHTML ํ๋์ ์ ์ฅ๋ฉ๋๋ค.
ํ์ฉ๋๋ HTML ํ๊ทธ๋ b, u, i, strike, pre, span, code, img, a, strong, ul, ol, li, and br์
๋๋ค.
ํ์ฉ๋๋ HTML์ด ๋งค์ฐ ์ ์ ํ์ ์งํฉ์ด๋ฏ๋ก HTML์ ๋ ๋๋งํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค. ๋ ๋๋ฌ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค. ์๋ฅผ ๋ค์ด React Native์ Flutter์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ต๋๋ค.
์ ๊ทํ๋์ง ์์ comment ํ๋์ ๊ฐ์ ๋ ๋๋งํ๋๋ก ์ ํํ ์๋ ์์ต๋๋ค. ์์ ํ์๊ฐ ์ฌ๊ธฐ ์์ต๋๋ค..
์์ ํ์๋ HTML๊ณผ ํจ๊ป ์๋ํ๋๋ก ์กฐ์ ํ ์ ์์ผ๋ฉฐ, HTML ํ๊ทธ๋ฅผ ํ๋ซํผ์์ ๋ ๋๋งํ ์์ ์์๋ก ๋ณํํ ์ ์์ต๋๋ค.
ํ๊น
๋๊ธ์์ ์ฌ์ฉ์๊ฐ ํ๊ทธ๋๋ฉด ํด๋น ์ ๋ณด๋ mentions๋ผ๋ ๋ฆฌ์คํธ์ ์ ์ฅ๋ฉ๋๋ค. ํด๋น ๋ฆฌ์คํธ์ ๊ฐ ๊ฐ์ฒด๋ ๋ค์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
Run 
ํด์ํ๊ทธ
ํด์ํ๊ทธ๊ฐ ์ฌ์ฉ๋์ด ์ฑ๊ณต์ ์ผ๋ก ํ์ฑ๋๋ฉด ๊ทธ ์ ๋ณด๋ hashTags๋ผ๋ ๋ฆฌ์คํธ์ ์ ์ฅ๋ฉ๋๋ค. ํด๋น ๋ฆฌ์คํธ์ ๊ฐ ๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค. retain์ด ์ค์ ๋์ด ์์ผ๋ฉด ํด์ํ๊ทธ๋ฅผ ์ฟผ๋ฆฌ๋ฅผ ์ํด ๋๊ธ์ hashTags ๋ฐฐ์ด์ ์๋์ผ๋ก ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
Run 
GET /api/v1/comments 
์ด API๋ ์ฌ์ฉ์์๊ฒ ํ์ํ ๋๊ธ์ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์น์ธ๋์ง ์์๊ฑฐ๋ ์คํธ์ธ ๋๊ธ์ ์๋์ผ๋ก ํํฐ๋ง๋ฉ๋๋ค.
ํ์ด์ง๋ค์ด์
ํ์ด์ง๋ค์ด์ ์ ์ฑ๋ฅ ์๊ตฌ์ฌํญ๊ณผ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์ํํ ์ ์์ต๋๋ค:
- ๊ฐ์ฅ ๋น ๋ฆ: ์ฌ์ ๊ณ์ฐ๋ ํ์ด์ง๋ค์ด์
(Precalculated Pagination):
- ์ด๊ฒ์ด FastComments๊ฐ ์ฐ๋ฆฌ ๋ฏธ๋ฆฌ ์ ์๋ ์์ ฏ๊ณผ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ ๋ ์๋ํ๋ ๋ฐฉ์์ ๋๋ค.
- "๋ค์"์ ํด๋ฆญํ๋ฉด ๋จ์ํ ํ์ด์ง ์๊ฐ ์ฆ๊ฐํฉ๋๋ค.
- ์ด๋ฅผ ํค-๊ฐ ์ ์ฅ์์์ ๊ฒ์๋๋ ๊ฒ์ผ๋ก ์๊ฐํ ์ ์์ต๋๋ค.
- ์ด ๋ฐฉ์์์๋
pageํ๋ผ๋ฏธํฐ๋ฅผ0๋ถํฐ ์ ์ํ๊ณ ์ ๋ ฌ ๋ฐฉํฅ์direction์ผ๋ก ์ง์ ํ๋ฉด ๋ฉ๋๋ค. - ํ์ด์ง ํฌ๊ธฐ๋ ์ปค์คํฐ๋ง์ด์ ์ด์ ๊ท์น์ ํตํด ๋ง์ถค ์ค์ ํ ์ ์์ต๋๋ค.
- ๊ฐ์ฅ ์ ์ฐํจ: ์ ์ฐํ ํ์ด์ง๋ค์ด์
(Flexible Pagination):
- ์ด ๋ฐฉ์์์๋ ์ฌ์ฉ์ ์ ์
limit๋ฐskipํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.page๋ ์ ๋ฌํ์ง ๋ง์ธ์. - ์ ๋ ฌ
direction๋ ์ง์๋ฉ๋๋ค. limit์skip์ด ์ ์ฉ๋ ํ ๋ฐํํ ์ ์ฒด ์์ ๋๋ค.- ์์:
page size = 100์ด๊ณpage = 2์ธ ๊ฒฝ์ฐskip = 200, limit = 100์ผ๋ก ์ค์ ํฉ๋๋ค.
- ์์:
- ์์ ๋๊ธ๋ ์ฌ์ ํ ํ์ด์ง๋ค์ด์
์ ํฌํจ๋ฉ๋๋ค.
asTree์ต์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํํผํ ์ ์์ต๋๋ค.limitChildren๋ฐskipChildren์ผ๋ก ์์๋ค์ ํ์ด์ง๋ค์ด์ ํ ์ ์์ต๋๋ค.- ๋ฐํ๋๋ ์ค๋ ๋์ ๊น์ด๋ฅผ
maxTreeDepth๋ก ์ ํํ ์ ์์ต๋๋ค.
- ์ด ๋ฐฉ์์์๋ ์ฌ์ฉ์ ์ ์
์ค๋ ๋
Precalculated Pagination์ ์ฌ์ฉํ ๋, ๋๊ธ์ ํ์ด์ง๋ณ๋ก ๊ทธ๋ฃนํ๋๋ฉฐ ์ค๋ ๋์ ๋๊ธ์ด ์ ์ฒด ํ์ด์ง์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.- ์ด ๋ฐฉ์์์๋ ํด๋ผ์ด์ธํธ๊ฐ
parentId๊ธฐ๋ฐ์ผ๋ก ์ค๋ ๋๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. - ์๋ฅผ ๋ค์ด, ํ ๊ฐ์ ์ต์์ ๋๊ธ๊ณผ 29๊ฐ์ ๋ต๊ธ์ด ์๋ ํ์ด์ง์์ API์
page=0์ ์ค์ ํ๋ฉด ์ต์์ ๋๊ธ ํ๋์ 29๊ฐ์ ์์๋ง ๋ฐ์ต๋๋ค. - ์์ ์ด๋ฏธ์ง(์ฌ๋ฌ ํ์ด์ง๋ฅผ ์ค๋ช ).
- ์ด ๋ฐฉ์์์๋ ํด๋ผ์ด์ธํธ๊ฐ
Flexible Pagination์ ์ฌ์ฉํ ๋๋parentIdํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.- ์ต์์ ๋๊ธ๋ง ๊ฐ์ ธ์ค๋ ค๋ฉด ์ด๊ฒ์ null๋ก ์ค์ ํ์ธ์.
- ๊ทธ๋ฐ ๋ค์ ์ค๋ ๋๋ฅผ ๋ณด๋ ค๋ฉด API๋ฅผ ๋ค์ ํธ์ถํ๊ณ
parentId๋ฅผ ์ ๋ฌํ์ธ์. - ์ผ๋ฐ์ ์ธ ํด๊ฒฐ์ฑ ์ ์ต์์ ๋๊ธ์ ๋ํด API ํธ์ถ์ ํ๊ณ ๊ฐ ๋๊ธ์ ์์ ๋๊ธ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ณ๋ ฌ API ํธ์ถ์ ํ๋ ๊ฒ์ ๋๋ค.
- NEW As of Feb 2023!
&asTree=true๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.- ์ด๋ฅผ
Flexible Pagination as a Tree๋ก ์๊ฐํ ์ ์์ต๋๋ค. - ํ์ด์ง๋ค์ด์ ์๋ ์ต์์ ๋๊ธ๋ง ๊ณ์ฐ๋ฉ๋๋ค.
- ํธ๋ฆฌ๋ฅผ ๋ฃจํธ์์ ์์ํ๋ ค๋ฉด
parentId=null๋ก ์ค์ ํ์ธ์(๋ฐ๋์parentId๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค). - ํ์ด์ง๋ค์ด์
์ ์ํด
skip๋ฐlimit์ ์ค์ ํ์ธ์. asTree๋ฅผtrue๋ก ์ค์ ํ์ธ์.- ์ด ๊ฒฝ์ฐ ๋ฐฑ์๋๊ฐ ๋ ๋ง์ ์์
์ ์ํํด์ผ ํ๋ฏ๋ก ํฌ๋ ๋ง ๋น์ฉ์ด
2x์ฆ๊ฐํฉ๋๋ค. - ํ์์ ๋ฐ๋ผ
maxTreeDepth,limitChildren,skipChildren๋ฅผ ์ค์ ํ์ธ์.
- ์ด๋ฅผ
ํธ๋ฆฌ ์ค๋ช
asTree๋ฅผ ์ฌ์ฉํ ๋ ํ์ด์ง๋ค์ด์
์ ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋ค์์ ์ ์ฉํ ๊ทธ๋ํฝ์
๋๋ค:
์ฌ์ฉ์ ์ปจํ ์คํธ์์ ๋๊ธ ๊ฐ์ ธ์ค๊ธฐ
/comments API๋ ๋ ๊ฐ์ง ์ปจํ
์คํธ์์ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ ์๋ก ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํฉ๋๋ค:
- ์์ฒด ํด๋ผ์ด์ธํธ๋ฅผ ๋น๋ํ๊ธฐ ์ํด ์ ๋ ฌ๋๊ณ ํ๊ทธ๋ ์ ๋ณด๋ฅผ ๋ฐํํ๋ ค๋ ๊ฒฝ์ฐ.
- ์ด ๊ฒฝ์ฐ
contextUserId์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํ์ธ์.
- ์ด ๊ฒฝ์ฐ
- ๋ง์ถค ํตํฉ์ ์ํด ๋ฐฑ์๋์์ ๋๊ธ์ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ.
- ํ๋ซํผ์
contextUserId์์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๋ชจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํ๋ซํผ์




๋๊ธ์ ํธ๋ฆฌ๋ก ๊ฐ์ ธ์ค๊ธฐ
๋๊ธ์ ํธ๋ฆฌ๋ก ๋ฐํ๋ฐ์ ์ ์์ผ๋ฉฐ, ํ์ด์ง๋ค์ด์ ์ ์ต์์ ๋๊ธ๋ง ๊ณ์ฐํฉ๋๋ค.

์ต์์ ๋๊ธ๊ณผ ๋ฐ๋ก ์๋ ์์๋ค๋ง ๋ฐ๊ณ ์ถ๋์? ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค:

๊ทธ๋ฌ๋ UI์์ ๊ฐ ๋๊ธ์ "๋ต๊ธ ๋ณด๊ธฐ" ๋ฒํผ์ ํ์ํ ์ง ์ฌ๋ถ๋ฅผ ์์์ผ ํ ์ ์์ต๋๋ค. ํธ๋ฆฌ๋ก ๋๊ธ์ ๊ฐ์ ธ์ฌ ๋๋ ํด๋น ๋๊ธ์ ์ ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ hasChildren ์์ฑ์ด ํ๊ทธ๋ก ๋ถ์ต๋๋ค.
ํด์ํ๊ทธ๋ก ๊ฒ์ํ์ฌ ํธ๋ฆฌํ ๋๊ธ ๊ฐ์ ธ์ค๊ธฐ
API๋ฅผ ์ฌ์ฉํ๋ฉด ํ
๋ํธ ์ ์ฒด(ํ ํ์ด์ง๋ urlId์ ํ์ ๋์ง ์์)๋ฅผ ๋์์ผ๋ก ํด์ํ๊ทธ๋ก ๊ฒ์ํ ์ ์์ต๋๋ค.
์ด ์์ ์์๋ urlId๋ฅผ ์๋ตํ๊ณ ์ฌ๋ฌ ํด์ํ๊ทธ๋ก ๊ฒ์ํฉ๋๋ค. API๋ ์์ฒญ๋ ๋ชจ๋ ํด์ํ๊ทธ๋ฅผ ๊ฐ์ง ๋๊ธ๋ง ๋ฐํํฉ๋๋ค.

๋ชจ๋ ์์ฒญ ํ๋ผ๋ฏธํฐ

์๋ต

์ ์ฉํ ํ
URL ID
๋๋ถ๋ถ์ ๊ฒฝ์ฐ urlId ํ๋ผ๋ฏธํฐ์ ํจ๊ป Comment API๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒ์
๋๋ค. ๋จผ์ Pages API๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ urlId ๊ฐ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์ต๋ช ์ก์
์ต๋ช
๋๊ธ ๊ธฐ๋ฅ์ ์ํด์๋ ๋๊ธ์ ๊ฐ์ ธ์ฌ ๋, ๊ทธ๋ฆฌ๊ณ ์ ๊ณ ๋ฐ ์ฐจ๋จ์ ์ํํ ๋ anonUserId๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
(!) ๋ง์ ์ฑ ์คํ ์ด์์๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ์ง ์์๋๋ผ๋ ์์ ์ด ๋ณผ ์ ์๋ ์ฌ์ฉ์ ์์ฑ ์ฝํ ์ธ ๋ฅผ ์ ๊ณ ํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์๊ตฌ๋ฉ๋๋ค. ์ด๋ฅผ ์ค์ํ์ง ์์ผ๋ฉด ํด๋น ์คํ ์ด์์ ์ฑ์ด ์ ๊ฑฐ๋ ์ ์์ต๋๋ค.
๋๊ธ์ด ๋ฐํ๋์ง ์๋ ๊ฒฝ์ฐ
๋๊ธ์ด ์น์ธ๋์๋์ง, ์คํธ์ด ์๋์ง ํ์ธํ์ธ์.
GET /api/v1/comments/:id 
์ด API๋ id๋ก ๋จ์ผ ๋๊ธ์ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



POST /api/v1/comments 
์ด API ์๋ํฌ์ธํธ๋ ๋๊ธ์ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ๋ง์ถค UI, ํตํฉ ๋๋ ๊ฐ์ ธ์ค๊ธฐ์ ๋๋ค.
์ฐธ๊ณ :
- ์ํ๋ฉด ์ด API๋ ๋๊ธ ์์ ฏ์ "๋ผ์ด๋ธ"๋ก ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค (์ด ๊ฒฝ์ฐ
creditsCost๊ฐ1์์2๋ก ์ฆ๊ฐํฉ๋๋ค). - ์ด๋ฉ์ผ์ด ์ ๊ณต๋๋ฉด ์ด API๋ ์๋์ผ๋ก ์ฌ์ฉ์ ๊ฐ์ฒด๋ฅผ ์์คํ ์ ์์ฑํฉ๋๋ค.
- ๋ค๋ฅธ ์ด๋ฉ์ผ์ ์ฌ์ฉํ์ง๋ง ๋์ผํ ์ฌ์ฉ์ ์ด๋ฆ์ ๊ฐ์ง ๋ ๋๊ธ์ ์ ์ฅํ๋ ค๊ณ ํ๋ฉด ๋ ๋ฒ์งธ ๋๊ธ์ ๋ํด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ๋ง์ฝ
parentId๋ฅผ ์ง์ ํ๊ณ ์์ ๋๊ธ์notificationSentForParent๊ฐ false์ธ ๊ฒฝ์ฐ, ๋ถ๋ชจ ๋๊ธ์ ๋ํ ์๋ฆผ์ ์ ์กํฉ๋๋ค. ์ด ์์ ์ ๋งค ์๊ฐ ์ํ๋ฉ๋๋ค(์ ์ก๋๋ ์ด๋ฉ์ผ ์๋ฅผ ์ค์ด๊ธฐ ์ํด ์๋ฆผ์ ์ผ๊ด ์ฒ๋ฆฌํฉ๋๋ค). - ์ฌ์ฉ์๋ฅผ ์์ฑํ ๋ ํ์ ์ด๋ฉ์ผ์ ๋ณด๋ด๊ฑฐ๋ ๋๊ธ ํ์ธ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ค๋ฉด ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์์
sendEmails๋ฅผtrue๋ก ์ค์ ํ์ธ์. - ์ด API๋ก ์์ฑ๋ ๋๊ธ์ ๊ด๋ฆฌ์ ์ฑ์ Analytics ๋ฐ Moderation ํ์ด์ง์ ํ์๋ฉ๋๋ค.
- ์ค์ ์ด ์ผ์ ธ ์์ผ๋ฉด "bad words"๋ ๋๊ธ ์์ฑ์ ์ด๋ฆ๊ณผ ๋๊ธ ๋ด์ฉ์์ ์ฌ์ ํ ๋ง์คํน๋ฉ๋๋ค.
- ์ํ๋ฉด ์ด API๋ก ์์ฑ๋ ๋๊ธ์ ์คํธ ๊ฒ์ฌ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
- Customization Rule ๊ด๋ฆฌ์ ํ์ด์ง์์ ๊ตฌ์ฑ๋ ์ต๋ ๋๊ธ ๊ธธ์ด ๊ฐ์ ์ค์ ์ ์ฌ๊ธฐ์๋ ์ ์ฉ๋ฉ๋๋ค.
๋๊ธ ์์ ฏ์ ํ์๋๊ธฐ ์ํด ์ ์ถ์ ํ์ํ ์ต์ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

๋ ํ์ค์ ์ธ ์์ฒญ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:



PATCH /api/v1/comments/:id 
์ด API ์๋ํฌ์ธํธ๋ ๋จ์ผ ๋๊ธ์ ์ ๋ฐ์ดํธํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฐธ๊ณ :
- ํ์์ ๋ฐ๋ผ ์ด API๋ก ๋๊ธ ์์ ฏ์ "๋ผ์ด๋ธ"๋ก ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค(์ด ๊ฒฝ์ฐ ๊ธฐ๋ณธ
creditsCost๊ฐ1์์2๋ก ์ฆ๊ฐํฉ๋๋ค).- ์ด๋ ๋๊ธ์ ํ์ด์ง ๊ฐ์ "๋ผ์ด๋ธ"๋ก ๋ง์ด๊ทธ๋ ์ด์
(์:
urlId๋ณ๊ฒฝ)ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ๋ง์ด๊ทธ๋ ์ด์
์ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๋ฏ๋ก ์ถ๊ฐ๋ก
2ํฌ๋ ๋ง์ด ์๋ชจ๋ฉ๋๋ค(์ด ์์ ์ CPU ์ง์ฝ์ ์ ๋๋ค).
- ์ด๋ ๋๊ธ์ ํ์ด์ง ๊ฐ์ "๋ผ์ด๋ธ"๋ก ๋ง์ด๊ทธ๋ ์ด์
(์:
- ์์ฑ API์ ๋ฌ๋ฆฌ, ์ด API๋ ์ด๋ฉ์ผ์ด ์ ๊ณต๋์ด๋ ์ฐ๋ฆฌ ์์คํ ์ ์ฌ์ฉ์ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑํ์ง ์์ต๋๋ค.
- ์ด API๋ก ์ ๋ฐ์ดํธ๋ ๋๊ธ์ ์ํ๋ฉด ์คํธ ๊ฒ์ฌ ๋์์ด ๋ ์ ์์ต๋๋ค.
- Customization Rule ๊ด๋ฆฌ์ ํ์ด์ง์์ ๊ตฌ์ฑ๋ ์ต๋ ๋๊ธ ๊ธธ์ด์ ๊ฐ์ ์ค์ ์ด ์ฌ๊ธฐ์๋ ์ ์ฉ๋ฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์์ ์ ๋๊ธ ํ
์คํธ๋ฅผ ์
๋ฐ์ดํธํ๋๋ก ํ์ฉํ๋ ค๋ฉด ์์ฒญ ๋ณธ๋ฌธ์
comment๋ง ์ง์ ํ๋ฉด ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฒฐ๊ณผcommentHTML์ ์์ฑํฉ๋๋ค.comment์commentHTML์ ๋ ๋ค ์ ์ํ๋ฉด HTML์ ์๋์ผ๋ก ์์ฑํ์ง ์์ต๋๋ค.- ์ฌ์ฉ์๊ฐ ์ ํ
์คํธ์ ๋ฉ์
์ด๋ ํด์ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ฉด
POSTAPI์ ๋์ผํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ๋๊ธ์
commenterEmail์ ์ ๋ฐ์ดํธํ ๋๋userId๋ ํจ๊ป ์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋น ์ด๋ฉ์ผ์ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ๊ทํ์ ํ ๋ํธ์ ์ํด ์๋์ง ํ์ธํด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ฒญ์ด ์คํจํฉ๋๋ค.



DELETE /api/v1/comments/:id 
์ด API ์๋ํฌ์ธํธ๋ ๋๊ธ์ ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Notes:
- ์ํ๋ ๊ฒฝ์ฐ ์ด API๋ ๋๊ธ ์์ ฏ์ "์ค์๊ฐ"์ผ๋ก ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค(์ด ๊ฒฝ์ฐ
creditsCost๊ฐ1์์2๋ก ์ฆ๊ฐํฉ๋๋ค). - ์ด API๋ ๋ชจ๋ ํ์ ๋๊ธ์ ์ญ์ ํฉ๋๋ค.



POST /api/v1/comments/:id/flag 
์ด API ์๋ํฌ์ธํธ๋ ํน์ ์ฌ์ฉ์๋ฅผ ์ํด ๋๊ธ์ ์ ๊ณ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Notes:
- ์ด ํธ์ถ์ ํญ์ ์ฌ์ฉ์ ์ปจํ ์คํธ์์ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. ์ฌ์ฉ์๋ FastComments.com ์ฌ์ฉ์, SSO ์ฌ์ฉ์, ๋๋ ํ ๋ํธ ์ฌ์ฉ์๊ฐ ๋ ์ ์์ต๋๋ค.
- ์จ๊น ์๊ณ๊ฐ(flag-to-hide threshold)์ด ์ค์ ๋์ด ์์ผ๋ฉด, ๋๊ธ์ด ์ ์๋ ํ์๋งํผ ์ ๊ณ ๋๋ฉด ์ค์๊ฐ์ผ๋ก ์๋์ผ๋ก ์จ๊น ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ๋๊ธ์ด ์๋์ผ๋ก ๋ฏธ์น์ธ(์จ๊น) ์ฒ๋ฆฌ๋ ํ์๋ ๊ด๋ฆฌ์๋ ๋ชจ๋๋ ์ดํฐ๋ง์ด ๋๊ธ์ ๋ค์ ์น์ธํ ์ ์์ต๋๋ค. ํ๋๊ทธ ํด์ ๋ ๋๊ธ์ ๋ค์ ์น์ธํ์ง ์์ต๋๋ค.

For anonymous flagging, we must specify an anonUserId. This can be an ID that represents the anonymous session, or a random UUID.
This allows us to support flagging and un-flagging comments even if a user is not logged in. This way, the comment can be marked as
flagged when comments are fetched with the same anonUserId.



POST /api/v1/comments/:id/un-flag 
์ด API ์๋ํฌ์ธํธ๋ ํน์ ์ฌ์ฉ์๊ฐ ๋๊ธ์ ํ๋๊ทธ๋ฅผ ํด์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฐธ๊ณ :
- ์ด ํธ์ถ์ ํญ์ ์ฌ์ฉ์ ์ปจํ ์คํธ์์ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. ์ฌ์ฉ์๋ FastComments.com ์ฌ์ฉ์, SSO ์ฌ์ฉ์, ๋๋ ํ ๋ํธ ์ฌ์ฉ์๊ฐ ๋ ์ ์์ต๋๋ค.
- ๋๊ธ์ด ์๋์ผ๋ก ๋ฏธ์น์ธ(์จ๊น)๋ ์ดํ์๋ ํด๋น ๋๊ธ์ ๋ค์ ์น์ธํ ์ ์๋ ์ฌ๋์ ๊ด๋ฆฌ์ ๋๋ ์ค์ฌ์๋ฟ์ ๋๋ค. ํ๋๊ทธ ํด์ ๋ ๋๊ธ์ ๋ค์ ์น์ธํ์ง ์์ต๋๋ค.

์ต๋ช
ํ๋๊ทธ์ ๊ฒฝ์ฐ anonUserId๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๋ ์ต๋ช
์ธ์
์ ๋ํ๋ด๋ ID์ด๊ฑฐ๋ ์์์ UUID์ผ ์ ์์ต๋๋ค.



POST /api/v1/comments/:id/block 
์ด API ์๋ํฌ์ธํธ๋ ํน์ ๋๊ธ์ ์์ฑํ ์ฌ์ฉ์๋ฅผ ์ฐจ๋จํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. FastComments.com ์ฌ์ฉ์, SSO ์ฌ์ฉ์, Tenant ์ฌ์ฉ์๊ฐ ์์ฑํ ๋๊ธ๋ก๋ถํฐ์ ์ฐจ๋จ์ ์ง์ํฉ๋๋ค.
์ด ํธ์ถ์ commentIdsToCheck ๋ฐ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ํ์ฌ, ์ด ์์
์ํ ํ ํด๋ผ์ด์ธํธ์ ํ์๋ ์ ์๋ ๋ค๋ฅธ ๋๊ธ๋ค์ด ์ฐจ๋จ/์ฐจ๋จ ํด์ ๋์ด์ผ ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
Notes:
- ์ด ํธ์ถ์ ํญ์ ์ฌ์ฉ์ ์ปจํ ์คํธ์์ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. ์ฌ์ฉ์๋ FastComments.com ์ฌ์ฉ์, SSO ์ฌ์ฉ์, ๋๋ Tenant ์ฌ์ฉ์์ผ ์ ์์ต๋๋ค.
- ์์ฒญ์
userId๋ ์ฐจ๋จ์ ํํ๋ ์ฌ์ฉ์์ ๋๋ค. ์:User A๊ฐUser B๋ฅผ ์ฐจ๋จํ๋ ค๊ณ ํฉ๋๋ค.userId=User A์User B๊ฐ ์์ฑํ ๋๊ธ์ id๋ฅผ ์ ๋ฌํ์ธ์. - ์์ ํ ์ต๋ช ์ธ ๋๊ธ(์ฌ์ฉ์ id ์์, ์ด๋ฉ์ผ ์์)์ ์ฐจ๋จํ ์ ์์ผ๋ฉฐ ์๋ฌ๊ฐ ๋ฐํ๋ฉ๋๋ค.

์ต๋ช
์ฐจ๋จ์ ๊ฒฝ์ฐ anonUserId๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๋ ์ต๋ช
์ธ์
์ ๋ํ๋ด๋ ID์ด๊ฑฐ๋ ์์์ UUID์ผ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋์ผํ anonUserId๋ก ๋๊ธ์ ๊ฐ์ ธ์ ๋๊ธ์ ์ฐจ๋จํ๋ ๊ฒ์ ์ง์ํ ์ ์์ต๋๋ค.



POST /api/v1/comments/:id/un-block 
์ด API ์๋ํฌ์ธํธ๋ ํน์ ๋๊ธ์ ์์ฑํ ์ฌ์ฉ์์ ์ฐจ๋จ์ ํด์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. FastComments.com ์ฌ์ฉ์, SSO ์ฌ์ฉ์, ๋ฐ ํ ๋ํธ ์ฌ์ฉ์๊ฐ ์์ฑํ ๋๊ธ์์์ ์ฐจ๋จ ํด์ ๋ฅผ ์ง์ํฉ๋๋ค.
์ด ์์
์ด ์ํ๋ ํ ํด๋ผ์ด์ธํธ์์ ์ ์ฌ์ ์ผ๋ก ํ์๋๋ ๋ค๋ฅธ ๋๊ธ๋ค์ด ์ฐจ๋จ/์ฐจ๋จ ํด์ ๋์ด์ผ ํ๋์ง ํ์ธํ๊ธฐ ์ํด commentIdsToCheck ๋ฐ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ํฉ๋๋ค.
์ฐธ๊ณ :
- ์ด ํธ์ถ์ ํญ์ ์ฌ์ฉ์์ ๋งฅ๋ฝ์์ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. ์ฌ์ฉ์๋ FastComments.com ์ฌ์ฉ์, SSO ์ฌ์ฉ์, ๋๋ ํ ๋ํธ ์ฌ์ฉ์์ผ ์ ์์ต๋๋ค.
- ์์ฒญ์
userId๋ ์ฐจ๋จ์ ํด์ ํ๋ ์ฌ์ฉ์์ ๋๋ค. ์๋ฅผ ๋ค์ด:User A๊ฐUser B์ ์ฐจ๋จ์ ํด์ ํ๋ ค๊ณ ํฉ๋๋ค.userId=User A์User B๊ฐ ์์ฑํ ๋๊ธ ID๋ฅผ ์ ๋ฌํ์ธ์. - ์์ ํ ์ต๋ช ์ธ ๋๊ธ(์ฌ์ฉ์ id ์์, ์ด๋ฉ์ผ ์์)์ ์ฐจ๋จํ ์ ์์ผ๋ฉฐ ์ค๋ฅ๊ฐ ๋ฐํ๋ฉ๋๋ค.




์ด๋ฉ์ผ ํ
ํ๋ฆฟ ๊ตฌ์กฐ 
EmailTemplate ๊ฐ์ฒด๋ ํ
๋ํธ์ ๋ง์ถค ์ด๋ฉ์ผ ํ
ํ๋ฆฟ ๊ตฌ์ฑ์ ๋ํ๋
๋๋ค.
์์คํ ์ ์ฌ์ฉํ ์ด๋ฉ์ผ ํ ํ๋ฆฟ์ ๋ค์ ๊ธฐ์ค์ผ๋ก ์ ํํฉ๋๋ค:
- ์ ํ ์๋ณ์ โ ์ด๋ฅผ
emailTemplateId๋ผ๊ณ ํฉ๋๋ค. ์ด ๊ฐ๋ค์ ์์์ ๋๋ค. domain. ๋จผ์ ๊ด๋ จ ๊ฐ์ฒด(์:Comment)๊ฐ ์ํ ๋๋ฉ์ธ์ ๋ํ ํ ํ๋ฆฟ์ ์ฐพ์ต๋๋ค. ์ผ์นํ๋ ํ ํ๋ฆฟ์ด ์์ผ๋ฉด domain์ด null์ด๊ฑฐ๋*์ธ ํ ํ๋ฆฟ์ ์ฐพ์ต๋๋ค.
๋ค์์ EmailTemplate ๊ฐ์ฒด์ ๊ตฌ์กฐ์
๋๋ค:

์ฐธ๊ณ
- ์ ํจํ
emailTemplateId๊ฐ์/definitions์๋ํฌ์ธํธ์์ ํ์ธํ ์ ์์ต๋๋ค. /definitions์๋ํฌ์ธํธ์๋ ๊ธฐ๋ณธ ๋ฒ์ญ๊ณผ ํ ์คํธ ๋ฐ์ดํฐ๋ ํฌํจ๋์ด ์์ต๋๋ค.- ํ ํ๋ฆฟ์ ๊ตฌ์กฐ๋ ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ์ ํจํ์ง ์์ผ๋ฉด ์ ์ฅ์ ์คํจํฉ๋๋ค.
GET /api/v1/email-templates/:id 
๊ฐ๋ณ EmailTemplate๋ ํด๋น id(emailTemplateId๊ฐ ์๋)๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.



GET /api/v1/email-templates 
์ด API๋ ํ์ด์ง ๋งค๊น์ ์ฌ์ฉํ๋ฉฐ, page ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณตํฉ๋๋ค. EmailTemplates๋ 100๊ฐ์ฉ ํ์ด์ง๋ก ๋ฐํ๋๋ฉฐ, createdAt๊ณผ ๊ทธ ๋ค์์ผ๋ก id๋ก ์ ๋ ฌ๋ฉ๋๋ค.



PATCH /api/v1/email-templates/:id 
์ด API ์๋ํฌ์ธํธ๋ id์ ์ ๋ฐ์ดํธํ ์์ฑ๋ง ์ง์ ํ์ฌ ์ด๋ฉ์ผ ํ ํ๋ฆฟ์ ์ ๋ฐ์ดํธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ํ ํ๋ฆฟ์ ์์ฑํ ๋์ ๋์ผํ ๋ชจ๋ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์ ์ฉ๋๋ค๋ ์ ์ ์ ์ํ์ธ์. ์๋ฅผ ๋ค์ด:
- ํ ํ๋ฆฟ์ ๋ ๋๋ง๋์ด์ผ ํฉ๋๋ค. ๊ฐ ์ ๋ฐ์ดํธ ์ ์ด๊ฒ์ด ํ์ธ๋ฉ๋๋ค.
- ๋์ผํ ๋๋ฉ์ธ์ ๋ํด ์ค๋ณต๋ ํ ํ๋ฆฟ์ ๊ฐ์ง ์ ์์ต๋๋ค(๊ทธ๋ ์ง ์์ผ๋ฉด ํ๋๊ฐ ์กฐ์ฉํ ๋ฌด์๋ฉ๋๋ค).



POST /api/v1/email-templates 
์ด API ์๋ํฌ์ธํธ๋ ์ด๋ฉ์ผ ํ ํ๋ฆฟ์ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Notes:
- ๊ฐ์ ๋๋ฉ์ธ์์๋ ๋์ผํ
emailTemplateId๋ฅผ ๊ฐ์ง ํ ํ๋ฆฟ์ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง ์ ์์ต๋๋ค. - ํ์ง๋ง ์์ผ๋์นด๋ ํ
ํ๋ฆฟ(
domain=*)๊ณผ ๋์ผํemailTemplateId์ ๋ํ ๋๋ฉ์ธ๋ณ ํ ํ๋ฆฟ์ ๋์์ ๊ฐ์ง ์ ์์ต๋๋ค. - ์ฌ๋ฌ ๋๋ฉ์ธ์ด ์๊ฑฐ๋ ํ
์คํธ์ฉ์ผ๋ก ํน์ ํ
ํ๋ฆฟ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ(์:
domain์localhost๋ก ์ค์ ) ์๋งdomain์ ์ง์ ํ๋ฉด ๋ฉ๋๋ค. - ๋ง์ฝ
domain์ ์ง์ ํ๋ฉด ํด๋น ๊ฐ์DomainConfig์ ์ผ์นํด์ผ ํฉ๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ ํจํ ๋๋ฉ์ธ ๋ชฉ๋ก์ด ์ ๊ณต๋ฉ๋๋ค. - ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ EJS์ด๋ฉฐ 500ms ํ์์์์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค. ๋ ๋๋ง์ P99๋ <5ms ์ด๋ฏ๋ก 500ms์ ๋๋ฌํ๋ฉด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋๋ค.
- ์ ์ฅํ๋ ค๋ฉด ํ
ํ๋ฆฟ์ด ์ฃผ์ด์ง
testData๋ก ๋ ๋๋ง๋์ด์ผ ํฉ๋๋ค. ๋ ๋๋ง ์ค๋ฅ๋ ์ง๊ณ๋์ด ๋์๋ณด๋์ ๋ณด๊ณ ๋ฉ๋๋ค(๊ณง API๋ฅผ ํตํด์๋ ์ ๊ณต๋ ์์ ์ ๋๋ค).
ํ ํ๋ฆฟ์ ์ถ๊ฐํ๋ ๋ฐ ํ์ํ ์ต์ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

์ฌ์ดํธ๋ณ ํ
ํ๋ฆฟ์ ์ํ ๊ฒฝ์ฐ domain์ ์ ์ํ ์ ์์ต๋๋ค:



POST /api/v1/email-templates/render 
์ด API ์๋ํฌ์ธํธ๋ ์ด๋ฉ์ผ ํ ํ๋ฆฟ์ ๋ฏธ๋ฆฌ ๋ณผ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



DELETE /api/v1/email-templates/:id 
์ด ๊ฒฝ๋ก๋ id๋ก ๋จ์ผ EmailTemplate๋ฅผ ์ ๊ฑฐํฉ๋๋ค.



ํด์ํ๊ทธ ๊ตฌ์กฐ 
HashTag ๊ฐ์ฒด๋ ์ฌ์ฉ์๊ฐ ๋จ๊ธธ ์ ์๋ ํ๊ทธ๋ฅผ ๋ํ๋
๋๋ค. HashTags๋ ์ธ๋ถ ์ฝํ
์ธ ๋ก ์ฐ๊ฒฐํ๊ฑฐ๋
๊ด๋ จ๋ ๋๊ธ๋ค์ ๋ฌถ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
The structure for the HashTag object is as follows:

Notes:
- In some API endpoints you will see that the hashtag is used in the URL. Remember to URI-Encoded values. For example,
#should instead be represented as%23. - Some of these fields are marked
READONLY- these are returned by the API but cannot be set.
GET /api/v1/hash-tags 
์ด API๋ page ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ก ํ์ด์ง๋ค์ด์
์ ์ ๊ณตํฉ๋๋ค. HashTags๋ tag๋ก ์ ๋ ฌ๋์ด ํ์ด์ง๋น 100๊ฐ์ฉ ๋ฐํ๋ฉ๋๋ค.



PATCH /api/v1/hash-tags/:tag 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ HashTag๋ฅผ ์
๋ฐ์ดํธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



POST /api/v1/hash-tags 
์ด ๋ผ์ฐํธ๋ ๋จ์ผ HashTag๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



POST /api/v1/hash-tags/bulk 
์ด ๊ฒฝ๋ก๋ ์ต๋ 100๊ฐ์ HashTag ๊ฐ์ฒด๋ฅผ ํ ๋ฒ์ ์ถ๊ฐํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



DELETE /api/v1/hash-tags/:tag 
์ด ๋ผ์ฐํธ๋ ์ ๊ณต๋ ํ๊ทธ๋ก HashTag ์ฌ์ฉ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์๋ HashTag ์์ฑ์ด ๋นํ์ฑํ๋์ง ์์ ํ, ์ฌ์ฉ์๊ฐ ๋๊ธ ์์ฑ ์ ํด์ํ๊ทธ๋ฅผ ์ ๊ณตํ๋ฉด ํด์ํ๊ทธ๊ฐ ๋ค์ ์์ฑ๋ ์ ์์ต๋๋ค.



๋ชจ๋๋ ์ดํฐ ๊ตฌ์กฐ 
Moderator ๊ฐ์ฒด๋ ๋ชจ๋๋ ์ดํฐ์ ๋ํ ๊ตฌ์ฑ์ ๋ํ๋
๋๋ค.
๋ชจ๋๋ ์ดํฐ์๋ ์ธ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค:
isCommentModeratorAdminํ๋๊ทธ๋ฅผ ๊ฐ์ง ๊ด๋ฆฌ์ ์ฌ์ฉ์.isCommentModeratorAdminํ๋๊ทธ๋ฅผ ๊ฐ์ง SSO ์ฌ์ฉ์.- ์ด๋๋ก ๋ชจ๋๋ ์ดํฐ๊ฐ ๋ ์ผ๋ฐ ๋๊ธ ์์ฑ์ ๋๋ FastComments.com ์ฌ์ฉ์.
Moderator ๊ตฌ์กฐ๋ ์ฌ์ฉ ์ฌ๋ก 3์ ์ค์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
API๋ฅผ ํตํด ์ฌ์ฉ์๋ฅผ ๋ชจ๋๋ ์ดํฐ๋ก ์ด๋ํ๋ ค๋ฉด Moderator API๋ฅผ ์ฌ์ฉํ์ฌ Moderator๋ฅผ ์์ฑํ๊ณ ๊ทธ๋ค์ inviting ํ์ญ์์ค.
์ฌ์ฉ์์๊ฒ FastComments.com ๊ณ์ ์ด ์์ผ๋ฉด ์ด๋ ์ด๋ฉ์ผ์ด ๊ณ์ ์ค์ ์ ๋์ต๋๋ค. ์ด๋ฏธ ๊ณ์ ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ํ
๋ํธ์ ๋ํ ์ค์ฌ ์ ๊ทผ ๊ถํ์ด ๋ถ์ฌ๋๊ณ Moderator ๊ฐ์ฒด์ userId๊ฐ ํด๋น ์ฌ์ฉ์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ํด๋น ์ฌ์ฉ์ ๊ณ์ ์ ๋ณธ์ธ ์์ ์ด๋ฉฐ FastComments.com์์ ๊ด๋ฆฌ๋๋ฏ๋ก, ํด๋น ์ฌ์ฉ์์ ๋ํ API ์ ๊ทผ ๊ถํ์ ์์ต๋๋ค.
์ฌ์ฉ์ ๊ณ์ ์ ์์ ํ ๊ด๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ, SSO๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๊ทธ๋ค์ Tenant User๋ก ์ถ๊ฐํ ๋ค์ Moderator ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ์ฌ ํต๊ณ๋ฅผ ์ถ์ ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
Moderator ๊ตฌ์กฐ๋ ์ฌ์ฉ ์ฌ๋ก 1 ๋ฐ 2์ ๋ํ ํต๊ณ ์ถ์ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ฅผ ์์ฑํ ํ userId๊ฐ ์ ์๋ Moderator ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋น ํต๊ณ๊ฐ Comment Moderators Page์์ ์ถ์ ๋ฉ๋๋ค.
Moderator ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

GET /api/v1/moderators/:id 
์ด ๊ฒฝ๋ก๋ ํด๋น id์ ๋จ์ผ ๋ชจ๋๋ ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.



GET /api/v1/moderators 
์ด API๋ ํ์ด์ง์ ์ฌ์ฉํ๋ฉฐ, skip ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ชจ๋๋ ์ดํฐ๋ createdAt ๋ฐ id ์์ผ๋ก ์ ๋ ฌ๋์ด ํ ํ์ด์ง์ 100๋ช
์ฉ ๋ฐํ๋ฉ๋๋ค.
์๊ธ์ ๋ฐํ๋ ๋ชจ๋๋ ์ดํฐ ์์ ๋ฐ๋ผ ๊ณ์ฐ๋๋ฉฐ, ๋ฐํ๋ ๋ชจ๋๋ ์ดํฐ 10๋ช
๋น 1 credit per 10์ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค.



PATCH /api/v1/moderators/:id 
์ด API ์๋ํฌ์ธํธ๋ id๋ก Moderator๋ฅผ ์
๋ฐ์ดํธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Moderator๋ฅผ ์ ๋ฐ์ดํธํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ด ์์ต๋๋ค:
- Moderator๋ฅผ ์
๋ฐ์ดํธํ ๋ ๋ค์ ๊ฐ๋ค์ ์ ๊ณตํ ์ ์์ต๋๋ค:
acceptedInvitemarkReviewedCountdeletedCountmarkedSpamCountapprovedCounteditedCountbannedCountverificationIdcreatedAt
userId๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ, ํด๋น ์ฌ์ฉ์๊ฐ ์กด์ฌํด์ผ ํฉ๋๋ค.userId๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ, ํด๋น ์ฌ์ฉ์๋ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์ ์ง์ ๋ ๋์ผํtenantId์ ์ํด์ผ ํฉ๋๋ค.- ๋์ผํ ํ
๋ํธ ๋ด์ ๋ ๋ช
์ ๋ชจ๋๋ ์ดํฐ๋ ๋์ผํ
email๋ก ์ถ๊ฐํ ์ ์์ต๋๋ค. - Moderator์ ์ฐ๊ด๋
tenantId๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.



POST /api/v1/moderators 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ Moderator๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Moderator ์์ฑ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ด ์์ต๋๋ค:
name๊ณผemail์ ํญ์ ์ ๊ณต๋์ด์ผ ํฉ๋๋ค.userId๋ ์ ํ ์ฌํญ์ ๋๋ค.Moderator๋ฅผ ์์ฑํ ๋ ๋ค์ ๊ฐ๋ค์ ์ ๊ณตํ ์ ์์ต๋๋ค:acceptedInvitemarkReviewedCountdeletedCountmarkedSpamCountapprovedCounteditedCountbannedCountverificationIdcreatedAt
userId๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ, ํด๋น ์ฌ์ฉ์๋ ์กด์ฌํด์ผ ํฉ๋๋ค.userId๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ, ํด๋น ์ฌ์ฉ์๋ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์ ์ง์ ๋ ๋์ผํtenantId์ ์ํด์ผ ํฉ๋๋ค.- ๋์ผํ ํ
๋ํธ ๋ด์์ ๋ ๋ช
์ ๋ชจ๋๋ ์ดํฐ๋ ๊ฐ์
email๋ก ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
์ด๋ฉ์ผ๋ง ์๊ณ ์๋ ์ฌ์ฉ์์ ๋ํด Moderator๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:

๋๋ ํด๋น ์ฌ์ฉ์๊ฐ ์ฐ๋ฆฌ ํ
๋ํธ์ ์ํด ์๋ ๊ฒฝ์ฐ, ๊ทธ๋ค์ ๋ชจ๋๋ ์ด์
ํต๊ณ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด Moderator๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:



POST /api/v1/moderators/:id/send-invite 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ Moderator๋ฅผ ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ค์ ์ ํ ์ฌํญ์ด Moderator์๊ฒ ์ด๋ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ๋ฐ ์ ์ฉ๋ฉ๋๋ค:
Moderator๋ ์ด๋ฏธ ์กด์ฌํด์ผ ํฉ๋๋ค.fromName์100 characters๋ณด๋ค ๊ธธ ์ ์์ต๋๋ค.
์ฐธ๊ณ :
- ์ ๊ณต๋ ์ด๋ฉ์ผ์ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ฉด, ํด๋น ์ฌ์ฉ์๋ ํ ๋ํธ์ ๋๊ธ์ ๊ด๋ฆฌํ๋๋ก ์ด๋๋ฉ๋๋ค.
- ์ ๊ณต๋ ์ด๋ฉ์ผ์ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ, ์ด๋ ๋งํฌ๋ ๊ณ์ ์์ฑ ์ ์ฐจ๋ก ์๋ดํฉ๋๋ค.
- ์ด๋๋
30 daysํ์ ๋ง๋ฃ๋ฉ๋๋ค.
์ด๋ฉ์ผ๋ง ์๊ณ ์๋ ์ฌ์ฉ์์ ๋ํด Moderator๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:

์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ด๋ฉ์ผ์ ๋ณด๋
๋๋ค: Bob at TenantName is inviting you to be a moderator...


DELETE /api/v1/moderators/:id 
์ด ๊ฒฝ๋ก๋ id๋ก Moderator๋ฅผ ์ ๊ฑฐํฉ๋๋ค.



์๋ฆผ ์ ๊ตฌ์กฐ 
A NotificationCount object represents the unread notification count and metadata for a user.
If there are no unread notifications, there will be no NotificationCount for the user.
NotificationCount objects are created automatically and cannot be created via the API. They also expire after one year.
You can clear a user's unread notification count by deleting their NotificationCount.
The structure for the NotificationCount object is as follows:

GET /api/v1/notification-count/:user_id 
์ด ๋ผ์ฐํธ๋ ์ฌ์ฉ์ ID๋ก ๋จ์ผ NotificationCount๋ฅผ ๋ฐํํฉ๋๋ค. SSO๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ID ํ์์ <tenant id>:<user id>์
๋๋ค.
์ฝ์ง ์์ ์๋ฆผ์ด ์์ผ๋ฉด NotificationCount๊ฐ ์์ผ๋ฏ๋ก 404๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
notifications/count์ ๋ฌ๋ฆฌ ํจ์ฌ ๋น ๋ฅด์ง๋ง ํํฐ๋ง์ ํ์ฉํ์ง ์์ต๋๋ค.



DELETE /api/v1/notification-count/:user_id 
์ด ๊ฒฝ๋ก๋ ์ฌ์ฉ์ id๋ก ๋จ์ผ NotificationCount๋ฅผ ์ญ์ ํฉ๋๋ค. SSO๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์ id๋ <tenant id>:<user id> ํ์์
๋๋ค.
์ด ์์ ์ ์ฌ์ฉ์์ ์ฝ์ง ์์ ์๋ฆผ ์๋ฅผ ์ด๊ธฐํํฉ๋๋ค(๋๊ธ ์์ ฏ์ ๋นจ๊ฐ ๋ฒจ์ด ์ฌ๋ผ์ง๊ณ ์นด์ดํธ๊ฐ ์ฌ๋ผ์ง๋๋ค).



์๋ฆผ ๊ตฌ์กฐ 
A Notification object represents a notification for a user.
Notification objects are created automatically and cannot be created via the API. They also expire after one year.
Notifications cannot be deleted. They can however be updated to set viewed to false, and you can query by viewed.
A user may also opt out of notifications for a specific comment by setting optedOut in the notification to true. You can opt in again by setting it to false.
There are different notification types - check relatedObjectType and type.
The ways notifications are created is quite flexible and can be triggered by many scenarios (see NotificationType).
As of today, the existence of a Notification does not actually imply an email is or should be sent. Rather, the notifications
are used for the notification feed and related integrations.
The structure for the Notification object is as follows:

GET /api/v1/notifications 
์ด ๋ผ์ฐํธ๋ createdAt์ ๊ธฐ์ค์ผ๋ก ์ต์ ์์ผ๋ก ์ ๋ ฌ๋ ์ต๋ 30๊ฐ์ Notification ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
userId๋ก ํํฐ๋งํ ์ ์์ต๋๋ค. SSO์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ID๋ <tenant id>:<user id> ํ์์
๋๋ค.



GET /api/v1/notifications/count 
์ด ๋ผ์ฐํธ๋ count ๋งค๊ฐ๋ณ์์ ์๋ฆผ ์๋ฅผ ๋ด์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
์ด ๋ผ์ฐํธ๋ /notification-count/๋ณด๋ค ๋๋ฆฌ๊ณ ํฌ๋ ๋ง ๋น์ฉ์ด ๋ ๋ฐฐ์ด์ง๋ง ๋ ๋ง์ ์ฐจ์์ผ๋ก ํํฐ๋งํ ์ ์์ต๋๋ค.
/notifications ์๋ํฌ์ธํธ์ ๋์ผํ ๋งค๊ฐ๋ณ์(์: userId)๋ก ํํฐ๋งํ ์ ์์ต๋๋ค. SSO๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ user id๋ <tenant id>:<user id> ํ์์
๋๋ค.




PATCH /api/v1/notifications/:id 
์ด API ์๋ํฌ์ธํธ๋ id๋ก Notification์ ์
๋ฐ์ดํธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Notification์ ์
๋ฐ์ดํธํ ๋ ๋ค์ ์ ํ์ด ์์ต๋๋ค:
- ๋ค์ ํ๋๋ง ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค:
viewedoptedOut



ํ์ด์ง ๊ตฌ์กฐ 
A Page ๊ฐ์ฒด๋ ์ฌ๋ฌ ๋๊ธ์ด ์ํ ์ ์๋ ํ์ด์ง๋ฅผ ๋ํ๋
๋๋ค. ์ด ๊ด๊ณ๋ urlId๋ก ์ ์๋ฉ๋๋ค.
A Page๋ ํ์ด์ง ์ ๋ชฉ, ๋๊ธ ์, ๋ฐ urlId์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
Page ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

GET /api/v1/pages 
ํ์ฌ ๊ณ์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ชจ๋ ํ์ด์ง(๋๋ /by-url-id๋ฅผ ํตํด ๋จ์ผ ํ์ด์ง)๋ง ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๋ณด๋ค ์ธ๋ถํ๋ ๊ฒ์์ ์ํ์๋ฉด, ๋ฌธ์ํด ์ฃผ์ธ์.



Helpful Tip
The Comment API requires a urlId. You can call the Pages API first, to see what the urlId values available to you
look like.
GET /api/v1/pages/by-url-id 
๊ฐ๋ณ ํ์ด์ง๋ ํด๋น urlId๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ ํ์ด์ง ์ ๋ชฉ์ด๋ ๋๊ธ ์๋ฅผ ์กฐํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.



์ ์ฉํ ํ
urlId๊ณผ ๊ฐ์ ๊ฐ์ URI ์ธ์ฝ๋ฉํด์ผ ํฉ๋๋ค.
PATCH /api/v1/pages/:id 
์ด ๋ผ์ฐํธ๋ ๋จ์ผ Page๋ฅผ ์
๋ฐ์ดํธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ํด๋น ๋๊ธ๋ค์ด ์
๋ฐ์ดํธ๋ฉ๋๋ค.



์ฐธ๊ณ
Page ๊ฐ์ฒด์ ์ผ๋ถ ๋งค๊ฐ๋ณ์๋ ์๋์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค. ์ด๋ฌํ ํญ๋ชฉ์๋ ์นด์ดํธ์ title ์์ฑ์ด ํฌํจ๋ฉ๋๋ค. ์นด์ดํธ๋ ๊ณ์ฐ๋ ๊ฐ์ด๋ฏ๋ก
API๋ฅผ ํตํด ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. ํ์ด์ง title์ API๋ฅผ ํตํด ์ค์ ํ ์ ์์ง๋ง, ๋์ผํ urlId๋ฅผ ๊ฐ์ง ํ์ด์ง์์ ๋๊ธ ์์ ฏ์ ์ฌ์ฉํ๊ณ ํ์ด์ง ์ ๋ชฉ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ ๋ฎ์ด์จ์ง ์ ์์ต๋๋ค.
POST /api/v1/pages 
์ด API ์๋ํฌ์ธํธ๋ ํ์ด์ง๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์ ๊ทผ ์ ์ด์ ๋๋ค.
์ฐธ๊ณ :
- ๋๊ธ ์ค๋ ๋์ ๋๊ธ์ ๋ฌ์๊ฑฐ๋,
Comment๋ฅผ ์์ฑํ๋ API๋ฅผ ํธ์ถํ๋ค๋ฉด, ์ด๋ฏธPage๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค! You can try fetching it via the/by-url-idPageroute, passing in the sameurlIdpassed to the comment widget. - The
Pagestructure contains some calculated values. Currently, these arecommentCountandrootCommentCount. They are populated automatically and cannot be set by the API. Attempting to do so will cause the API to return an error.



DELETE /api/v1/pages/:id 
์ด ๋ผ์ฐํธ๋ id๋ก ๋จ์ผ ํ์ด์ง๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋์ผํ urlId๋ฅผ ๊ฐ์ง ํ์ด์ง์ ๋๊ธ ์์ ฏ๊ณผ ์ํธ์์ฉํ๋ฉด Page๊ฐ ์ํํ๊ฒ ์ฌ์์ฑ๋๋ค๋ ์ ์ ์ ์ํ์ธ์.



๋ณด๋ฅ ์ค์ธ ์นํํฌ ์ด๋ฒคํธ ๊ตฌ์กฐ 
A PendingWebhookEvent ๊ฐ์ฒด๋ ๋๊ธฐ ์ค์ธ ํ์ ์ ์ฅ๋ ์นํ
์ด๋ฒคํธ๋ฅผ ๋ํ๋
๋๋ค.
PendingWebhookEvent ๊ฐ์ฒด๋ ์๋์ผ๋ก ์์ฑ๋๋ฉฐ API๋ฅผ ํตํด ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ๋ํ 1๋
ํ ๋ง๋ฃ๋ฉ๋๋ค.
ํ์์ ์์
์ ์ ๊ฑฐํ๋ ์ญ์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ฒคํธ ์ ํ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค - eventType (OutboundSyncEventType) ๋ฐ type (OutboundSyncType)์ ํ์ธํ์ธ์.
์ด API์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ ๋ง์ถคํ ๋ชจ๋ํฐ๋ง ๊ตฌํ์
๋๋ค. ์ฃผ๊ธฐ์ ์ผ๋ก /count ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ์ฌ ์ฃผ์ด์ง ํํฐ์ ๋ํ ๋ฏธํด๊ฒฐ ์๋ฅผ ํด๋งํ ์ ์์ต๋๋ค.
PendingWebhookEvent ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

GET /api/v1/pending-webhook-events 
์ด ๊ฒฝ๋ก๋ pendingWebhookEvents ๋งค๊ฐ๋ณ์ ์๋์ ๋๊ธฐ ์ค์ธ ์นํํฌ ์ด๋ฒคํธ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค.
์ด API๋ ํ์ด์ง์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ skip ๋งค๊ฐ๋ณ์๋ก ์ ๊ณต๋ฉ๋๋ค. PendingWebhookEvents๋ 100๊ฐ์ฉ ํ์ด์ง๋ก ๋ฐํ๋๋ฉฐ createdAt์ ๊ธฐ์ค์ผ๋ก ์ต์ ์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.



GET /api/v1/pending-webhook-events/count 
์ด ๊ฒฝ๋ก๋ ๋ณด๋ฅ ์ค์ธ ์นํ
์ด๋ฒคํธ ์๋ฅผ count ๋งค๊ฐ๋ณ์๋ก ํฌํจํ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
ํํฐ๋ /pending-webhook-events ์๋ํฌ์ธํธ์ ๋์ผํ ๋งค๊ฐ๋ณ์๋ก ํ ์ ์์ต๋๋ค.



DELETE /api/v1/pending-webhook-events/:id 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ PendingWebhookEvent๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
๋๋ ์ญ์ ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ํ์ด์ง์ ์ฌ์ฉํ์ฌ GET API๋ฅผ ํธ์ถํ ๋ค์ ์ด API๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถํ์ธ์.



SSO ์ฌ์ฉ์ ๊ตฌ์กฐ 
FastComments๋ ์ฌ์ฉํ๊ธฐ ์ฌ์ด SSO ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. HMAC ๊ธฐ๋ฐ ํตํฉ์ผ๋ก ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์ฌ์ฉ์๊ฐ ์ ๋ฐ์ดํธ๋ ํ์ด๋ก๋๋ก ํ์ด์ง๋ฅผ ๋ก๋ํ๋๋ก ํ๋ ๊ฒ๋งํผ ๊ฐ๋จํฉ๋๋ค.
๊ทธ๋ฌ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ผ๊ด์ฑ์ ๋์ด๊ธฐ ์ํด ํด๋น ํ๋ฆ ์ธ๋ถ์์ ์ฌ์ฉ์๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋์งํ ์ ์์ต๋๋ค.
SSO User API๋ ์ฐ๋ฆฌ๊ฐ SSOUsers๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฐ์ฒด๋ฅผ CRUDํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ฐ์ฒด๋ค์ ์ผ๋ฐ Users์ ๋ค๋ฅด๋ฉฐ ํ์ ์์ ์ฑ์ ์ํด ๋ถ๋ฆฌ๋์ด ๊ด๋ฆฌ๋ฉ๋๋ค.
SSOUser ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

SSO ์ฌ์ฉ์ ์ฒญ๊ตฌ
SSO ์ฌ์ฉ์๋ ๊ถํ ํ๋๊ทธ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๊ณผ๊ธ๋ฉ๋๋ค:
- Regular SSO Users: ๊ด๋ฆฌ์ ๋๋ ์ค์ฌ์ ๊ถํ์ด ์๋ ์ฌ์ฉ์๋ ์ผ๋ฐ SSO ์ฌ์ฉ์๋ก ๊ณผ๊ธ๋ฉ๋๋ค
- SSO Admins:
isAccountOwner๋๋isAdminAdminํ๋๊ทธ๊ฐ ์๋ ์ฌ์ฉ์๋ SSO ๊ด๋ฆฌ์๋ก ๋ณ๋ ๊ณผ๊ธ๋ฉ๋๋ค (์ผ๋ฐ ํ ๋ํธ ๊ด๋ฆฌ์์ ๋์ผํ ์์จ) - SSO Moderators:
isCommentModeratorAdminํ๋๊ทธ๊ฐ ์๋ ์ฌ์ฉ์๋ SSO ์ค์ฌ์๋ก ๋ณ๋ ๊ณผ๊ธ๋ฉ๋๋ค (์ผ๋ฐ ์ค์ฌ์์ ๋์ผํ ์์จ)
์ค์: ์ด์ค ๊ณผ๊ธ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์์คํ ์ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ๊ธฐ์ค์ผ๋ก SSO ์ฌ์ฉ์์ ์ผ๋ฐ ํ ๋ํธ ์ฌ์ฉ์ ๋ฐ ์ค์ฌ์๋ฅผ ์๋์ผ๋ก ์ค๋ณต ์ ๊ฑฐํฉ๋๋ค. SSO ์ฌ์ฉ์๊ฐ ์ผ๋ฐ ํ ๋ํธ ์ฌ์ฉ์๋ ์ค์ฌ์์ ๋์ผํ ์ด๋ฉ์ผ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด ๋ ๋ฒ ๊ณผ๊ธ๋์ง ์์ต๋๋ค.
์ก์ธ์ค ์ ์ด
์ฌ์ฉ์๋ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ด groupIds ํ๋์ ๋ชฉ์ ์ด๋ฉฐ ์ ํ์ ์
๋๋ค.
@๋ฉ์
๊ธฐ๋ณธ์ ์ผ๋ก @mentions๋ @ ๋ฌธ์๋ฅผ ์
๋ ฅํ๋ฉด ๋ค๋ฅธ sso ์ฌ์ฉ์๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด username์ ์ฌ์ฉํฉ๋๋ค. displayName์ด ์ฌ์ฉ๋๋ฉด displayName์ ์ผ์นํ๋ ๊ฒฐ๊ณผ๊ฐ ์์ ๋ username๊ณผ ์ผ์นํ๋ ๊ฒฐ๊ณผ๋ ๋ฌด์๋๋ฉฐ @mention ๊ฒ์ ๊ฒฐ๊ณผ๋ displayName์ ์ฌ์ฉํฉ๋๋ค.
๊ตฌ๋
FastComments์์๋ ์ฌ์ฉ์๊ฐ ๋๊ธ ์์ ฏ์ ๋ฒจ ์์ด์ฝ์ ํด๋ฆญํ๊ณ ๊ตฌ๋ ์ ํด๋ฆญํ๋ฉด ํ์ด์ง๋ฅผ ๊ตฌ๋ ํ ์ ์์ต๋๋ค.
์ผ๋ฐ ์ฌ์ฉ์์ ํจ๊ป ์ฐ๋ฆฌ๋ ์๋ฆผ ์ค์ ์ ๋ฐ๋ผ ์๋ฆผ ์ด๋ฉ์ผ์ ์ ์กํฉ๋๋ค.
SSO ์ฌ์ฉ์์ ํจ๊ป, ํ์ ํธํ์ฑ์ ์ํด ์ด๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. ์ฌ์ฉ์๋ optedInSubscriptionNotifications๋ฅผ true๋ก ์ค์ ํ ๊ฒฝ์ฐ์๋ง ์ด๋ฌํ ์ถ๊ฐ ๊ตฌ๋
์๋ฆผ ์ด๋ฉ์ผ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
๋ฐฐ์ง
badgeConfig ์์ฑ์ ์ฌ์ฉํ์ฌ SSO ์ฌ์ฉ์์๊ฒ ๋ฐฐ์ง๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค. ๋ฐฐ์ง๋ ๋๊ธ์์ ์ฌ์ฉ์ ์ด๋ฆ ์์ ํ์๋๋ ์๊ฐ์ ํ์๊ธฐ์
๋๋ค.
badgeIds- ์ฌ์ฉ์์๊ฒ ํ ๋นํ ๋ฐฐ์ง ID์ ๋ฐฐ์ด์ ๋๋ค. ์ด๋ FastComments ๊ณ์ ์์ ์์ฑ๋ ์ ํจํ ๋ฐฐ์ง ID์ฌ์ผ ํฉ๋๋ค. 30๊ฐ์ ๋ฐฐ์ง๋ก ์ ํ๋ฉ๋๋ค.override- true์ด๋ฉด ๋๊ธ์ ํ์๋ ๋ชจ๋ ๊ธฐ์กด ๋ฐฐ์ง๊ฐ ์ ๊ณต๋ ๋ฐฐ์ง๋ก ๋์ฒด๋ฉ๋๋ค. false์ด๊ฑฐ๋ ์๋ต๋ ๊ฒฝ์ฐ ์ ๊ณต๋ ๋ฐฐ์ง๊ฐ ๊ธฐ์กด ๋ฐฐ์ง์ ์ถ๊ฐ๋ฉ๋๋ค.update- true์ด๋ฉด ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ๋๋ง๋ค ํ ๋ํธ ๊ตฌ์ฑ์์ ๋ฐฐ์ง ํ์ ์์ฑ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
GET /api/v1/sso-users 
์ด ๋ผ์ฐํธ๋ SSO ์ฌ์ฉ์๋ค์ ํ์ด์ง๋น 100๊ฐ๋ก ๋ฐํํฉ๋๋ค. ํ์ด์ง๋ค์ด์
์ skip ํ๋ผ๋ฏธํฐ๋ก ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ์๋ค์ signUpDate์ id๋ก ์ ๋ ฌ๋ฉ๋๋ค.



GET /api/v1/sso-users/by-id/:id 
์ด ๊ฒฝ๋ก๋ ์ฌ์ฉ์ ID๋ก ๋จ์ผ SSO ์ฌ์ฉ์๋ฅผ ๋ฐํํฉ๋๋ค.



GET /api/v1/sso-users/by-email/:email 
์ด ๊ฒฝ๋ก๋ ์ด๋ฉ์ผ๋ก ๋จ์ผ SSO ์ฌ์ฉ์๋ฅผ ๋ฐํํฉ๋๋ค.



PATCH /api/v1/sso-users/:id 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ SSO ์ฌ์ฉ์๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



POST /api/v1/sso-users 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ SSO ์ฌ์ฉ์๋ฅผ ์์ฑํฉ๋๋ค.
๋์ผํ ID๋ก ๋ ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ ค ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.

In this example we specify groupIds for access control, but this is optional.


ํตํฉ ์ฐธ๊ณ
API๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ ๋ค๋ฅธ SSO User HMAC ํ์ด๋ก๋๋ฅผ ์ ๋ฌํ๋ ๊ฒ๋ง์ผ๋ก ๊ฐ๋จํ ๋ฎ์ด์ธ ์ ์์ต๋๋ค. For example, if API๋ฅผ ํตํด username์ ์ค์ ํ์ง๋ง ํ์ด์ง ๋ก๋ ์ SSO ํ๋ฆ์์ ๋ค๋ฅธ username์ ์ ๋ฌํ๋ฉด, ์ฐ๋ฆฌ๋ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํด๋น ์ฌ์ฉ์์ username.
We will not update user parameters in this flow unless you explicitly specify them or set them to null (not undefined).
PUT /api/v1/sso-users/:id 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ SSO ์ฌ์ฉ์๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.

์ด ์์์๋ ์ ๊ทผ ์ ์ด๋ฅผ ์ํด groupIds๋ฅผ ์ง์ ํ์ง๋ง, ์ด๋ ์ ํ ์ฌํญ์
๋๋ค.


DELETE /api/v1/sso-users/:id 
์ด ๋ผ์ฐํธ๋ id๋ก ๋จ์ผ SSO ์ฌ์ฉ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ด ์ฌ์ฉ์์ ํ์ด๋ก๋๋ก ๋๊ธ ์์ ฏ์ ๋ค์ ๋ก๋ํ๋ฉด ์ฌ์ฉ์๊ฐ ์ํํ๊ฒ ์ฌ์์ฑ๋ฉ๋๋ค.
์ฌ์ฉ์์ ๋๊ธ์ ์ญ์ ํ๋ ค๋ฉด deleteComments ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๊ฐ๋ฅํฉ๋๋ค. ์ด ๊ฐ์ด true์ธ ๊ฒฝ์ฐ์ ์ ์ํ์ธ์:
- ์ฌ์ฉ์์ ๋ชจ๋ ๋๊ธ์ด ์ค์๊ฐ์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
- ๋ชจ๋ child (์ด์ ๊ณ ์๊ฐ ๋) ๋๊ธ์ ๊ฐ ๋๊ธ์ ์ฐ๊ด๋ ํ์ด์ง ์ค์ ์ ๋ฐ๋ผ ์ญ์ ๋๊ฑฐ๋ ์ต๋ช
ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ ๋ ์ญ์ ๋ชจ๋๊ฐ "anonymize"์ด๋ฉด ๋ต๊ธ์ ๋จ์ ์๊ณ ์ฌ์ฉ์์ ๋๊ธ๋ง ์ต๋ช
ํ๋ฉ๋๋ค. ์ด๋
commentDeleteMode๊ฐRemove(๊ธฐ๋ณธ๊ฐ)์ผ ๋๋ง ์ ์ฉ๋ฉ๋๋ค. creditsCost๋2๊ฐ ๋ฉ๋๋ค.
์ต๋ช ํ๋ ๋๊ธ
์ฌ์ฉ์์ ๋๊ธ์ ์ ์งํ๋ commentDeleteMode=1๋ก ์ค์ ํ์ฌ ๊ฐ๋จํ ์ต๋ช
ํํ ์ ์์ต๋๋ค.
์ฌ์ฉ์์ ๋๊ธ์ด ์ต๋ช ํ๋๋ฉด ๋ค์ ๊ฐ๋ค์ด null๋ก ์ค์ ๋ฉ๋๋ค:
- commenterName
- commenterEmail
- avatarSrc
- userId
- anonUserId
- mentions
- badgesisDeleted ๋ฐ isDeletedUser๋ true๋ก ์ค์ ๋ฉ๋๋ค.
๋ ๋๋ง ์ ๋๊ธ ์์ ฏ์ ์ฌ์ฉ์์ ์ด๋ฆ์ DELETED_USER_PLACEHOLDER (๊ธฐ๋ณธ๊ฐ: "[deleted]")์, ๋๊ธ์๋ DELETED_CONTENT_PLACEHOLDER๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ Widget Customization UI์์ ์ฌ์ฉ์ํํ ์ ์์ต๋๋ค.
์์



๊ตฌ๋
๊ตฌ์กฐ 
Subscription ๊ฐ์ฒด๋ ์ฌ์ฉ์์ ๊ตฌ๋
์ ๋ํ๋
๋๋ค.
Subscription ๊ฐ์ฒด๋ ์ฌ์ฉ์๊ฐ ๋๊ธ ์์ ฏ์ ์๋ฆผ ๋ฒจ์ ํด๋ฆญํ๊ณ "์ด ํ์ด์ง ๊ตฌ๋
"์ ํด๋ฆญํ ๋ ์์ฑ๋ฉ๋๋ค.
๊ตฌ๋ ์ API๋ฅผ ํตํด์๋ ์์ฑํ ์ ์์ต๋๋ค.
Subscription ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ์ฐ๊ด๋ ํ์ด์ง์ ๋ฃจํธ์ ์ ๋๊ธ์ด ๋จ๊ฒจ์ง ๋
ํด๋น Subscription์ ๋์์ธ ํ์ด์ง์ ๋ํด Notification ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์ด๋ฉ์ผ์ด ์ ์ก๋ฉ๋๋ค. ์ด๋ฉ์ผ ์ ์ก์ ์ฌ์ฉ์ ์ ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ผ๋ฐ ์ฌ์ฉ์์๊ฒ๋ optedInNotifications์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. SSO ์ฌ์ฉ์์๊ฒ๋ optedInSubscriptionNotifications์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ์ผ๋ถ ์ ํ๋ฆฌ์ผ์ด์
์ ์น์์ ์ ๊ทผ ๊ฐ๋ฅํ ํ์ด์ง ๊ฐ๋
์ด ์์ ์ ์์ผ๋ฏ๋ก, ๊ทธ๋ฐ ๊ฒฝ์ฐ ๊ตฌ๋
ํ๋ ค๋ ํญ๋ชฉ์ id(๋๊ธ ์์ ฏ์ ์ ๋ฌํ urlId์ ๋์ผํ ๊ฐ)๋ฅผ urlId์ ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
Subscription ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

GET /api/v1/subscriptions/:id 
์ด ๊ฒฝ๋ก๋ createdAt ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ์ต์ ์์ผ๋ก ์ต๋ 30๊ฐ์ Subscription ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
userId๋ก ํํฐ๋งํ ์ ์์ต๋๋ค. SSO๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ID๋ <tenant id>:<user id> ํ์์
๋๋ค.



POST /api/v1/subscriptions 
์ด API ์๋ํฌ์ธํธ๋ Subscription์ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ์๋ ํ์ด์ง๋น ํ๋์ ๊ตฌ๋
๋ง ๊ฐ์ง ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์. ์ด๋ ์ค๋ณต๋๋ฏ๋ก, ๊ทธ๋ฆฌ๊ณ
๋์ผํ ์ฌ์ฉ์์ ๋์ผํ ํ์ด์ง์ ๋ํด ๋ ์ด์์ ๊ตฌ๋
์ ์์ฑํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ตฌ๋
์ ์์ฑํ๋ฉด, ๊ตฌ๋
๋ urlId์ ๋ฃจํธ์ ์ ๋๊ธ์ด ๋จ๊ฒจ์ง ๋(๋๊ธ์ parentId๊ฐ null์ธ ๊ฒฝ์ฐ) Notification ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค.



DELETE /api/v1/subscriptions/:id 
์ด ๊ฒฝ๋ก๋ id๋ก ๋จ์ผ Subscription ๊ฐ์ฒด๋ฅผ ์ญ์ ํฉ๋๋ค.



ํ
๋ํธ ์ผ๋ณ ์ฌ์ฉ๋ ๊ตฌ์กฐ 
A TenantDailyUsage ๊ฐ์ฒด๋ ํน์ ๋ ์ง์ ๋ํ ํ
๋ํธ์ ์ฌ์ฉ๋์ ๋ํ๋
๋๋ค. ํน์ ํ
๋ํธ๊ฐ ํด๋น ๋ ์ง์ ํ๋์ด ์์๋ค๋ฉด ๊ทธ ๋ ์ง์๋ TenantDailyUsage ๊ฐ์ฒด๊ฐ ์์ฑ๋์ง ์์ต๋๋ค.
The TenantDailyUsage object is not real time and may be minutes behind actual usage.
TenantDailyUsage ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

GET /api/v1/tenant-daily-usage 
์ด ๋ผ์ฐํธ๋ ์ฐ, ์, ์ผ ๋จ์๋ก ํ ๋ํธ์ ์ฌ์ฉ๋์ ๊ฒ์ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ต๋ 365๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ผ๋ฉฐ, ๋น์ฉ์ 10๊ฐ ๊ฐ์ฒด๋น 1 api credit์ ๋๋ค.
์๋ต ๊ฐ์ฒด๋ ์์ฑ๋ ๋ ์ง์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค(๊ฐ์ฅ ์ค๋๋ ๊ฒ์ด ๋จผ์ ).



ํ
๋ํธ ๊ตฌ์กฐ 
Tenant๋ FastComments.com์ ๊ณ ๊ฐ์ ์ ์ํฉ๋๋ค. ํ์ดํธ ๋ผ๋ฒจ๋ง ๊ถํ์ด ์๋ ํ
๋ํธ๋ API๋ฅผ ํตํด ์์ฑํ ์ ์์ต๋๋ค. ํ์ดํธ ๋ผ๋ฒจ ํ
๋ํธ๋ ๋ค๋ฅธ ํ์ดํธ ๋ผ๋ฒจ ํ
๋ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค(์ค์ฒฉ์ ํ ๋จ๊ณ๋ง ํ์ฉ๋ฉ๋๋ค).
๋ค์์ Tenant ๊ฐ์ฒด์ ๊ตฌ์กฐ์
๋๋ค:

GET /api/v1/tenants/:id 
์ด ๊ฒฝ๋ก๋ ID๋ก ๋จ์ผ Tenant๋ฅผ ๋ฐํํฉ๋๋ค.



GET /api/v1/tenants 
์ด API๋ ๊ทํ์ ํ ๋ํธ๊ฐ ๊ด๋ฆฌํ๋ ํ ๋ํธ๋ฅผ ๋ฐํํฉ๋๋ค.
ํ์ด์ง๋ค์ด์
์ skip ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณต๋ฉ๋๋ค. ํ
๋ํธ๋ signUpDate ๋ฐ id๋ก ์ ๋ ฌ๋์ด 100๊ฐ ๋จ์์ ํ์ด์ง๋ก ๋ฐํ๋ฉ๋๋ค.
๋น์ฉ์ ๋ฐํ๋ ํ
๋ํธ ์์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ฉฐ, ๋ฐํ๋ ํ
๋ํธ 10๊ฐ๋น 1 credit per 10๊ฐ ๋ฐ์ํฉ๋๋ค.

Tenant ๊ฐ์ฒด์ meta ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ๊ณ ์ผ์นํ๋ ํ
๋ํธ๋ฅผ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํค๊ฐ someKey์ด๊ณ ๋ฉํ ๊ฐ์ด some-value์ธ ๊ฒฝ์ฐ, ์ด ํค/๊ฐ ์์ผ๋ก JSON ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ ๋ค์ ์ด๋ฅผ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก URI ์ธ์ฝ๋ฉํ์ฌ ํํฐํ ์ ์์ต๋๋ค:



POST /api/v1/tenants 
์ด ๋ผ์ฐํธ๋ ๋จ์ผ Tenant๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Tenant๋ฅผ ์์ฑํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ด ์์ต๋๋ค:
name์ ํ์์ ๋๋ค.domainConfiguration์ ํ์์ ๋๋ค.Tenant๋ฅผ ์์ฑํ ๋ ๋ค์ ๊ฐ๋ค์ ์ ๊ณตํ ์ ์์ต๋๋ค:hasFlexPricinglastBillingIssueReminderDateflexLastBilledAmount
signUpDate๋ ๋ฏธ๋ ๋ ์ง์ผ ์ ์์ต๋๋ค.name์200 characters๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค.email์300 characters๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค.email์ FastComments.com์ ๋ชจ๋ ํ ๋ํธ์์ ๊ณ ์ ํด์ผ ํฉ๋๋ค.- ๋ถ๋ชจ ํ
๋ํธ์ ์ ํจํ
TenantPackage๊ฐ ์ ์๋์ด ์์ง ์์ผ๋ฉด ํ ๋ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.- ํ ๋ํธ๊ฐ FastComments.com์ ํตํด ์์ฑ๋ ๊ฒฝ์ฐ ์ด๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
- ํจํค์ง์ ์ ์๋
maxWhiteLabeledTenants๋ณด๋ค ๋ง์ ํ ๋ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. - ํ์ดํธ ๋ผ๋ฒจ๋ง์ด ํ์ฑํ๋
parent tenant์ id์ธtenantId์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋์ ์ง์ ํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋ช ๊ฐ์ง ํ๋ผ๋ฏธํฐ๋ง์ผ๋ก Tenant๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:



PATCH /api/v1/tenants/:id 
This API endpoint provides the ability to update a Tenant by id.
Updating a Tenant has the following restrictions:
- The following values may not be updated:
hasFlexPricinglastBillingIssueReminderDateflexLastBilledAmountmanagedByTenantId
- The
signUpDatemay not be in the future. - The
namemay not be longer than200 characters. - The
emailmay not be longer than300 characters. - The
emailmust be unique across all of FastComments.com tenants. - When setting
billingInfoValidtotrue,billingInfomust be provided in the same request. - You may not update the
packageIdassociated with your own tenant. - You may not update the
paymentFrequencyassociated with your own tenant.



DELETE /api/v1/tenants/:id 
์ด ๊ฒฝ๋ก๋ id๋ก Tenant ๋ฐ ์ฐ๊ด๋ ๋ชจ๋ ๋ฐ์ดํฐ (์ฌ์ฉ์, ๋๊ธ ๋ฑ)๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ํ ๋ํธ ์ ๊ฑฐ์ ๋ํ ์ ํ์ด ์์ต๋๋ค:
- ํด๋น ํ ๋ํธ๋ ๊ทํ์ ๊ฒ์ด์ด์ผ ํ๊ฑฐ๋, ๊ทํ๊ฐ ๊ด๋ฆฌํ๋ ํ์ดํธ๋ผ๋ฒจ ํ ๋ํธ์ฌ์ผ ํฉ๋๋ค.
- ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์
sure๋true๋ก ์ค์ ๋์ด ์์ด์ผ ํฉ๋๋ค.



ํ
๋ํธ ํจํค์ง ๊ตฌ์กฐ 
The TenantPackage defines package information available to a Tenant. A tenant may have many packages available, but only
one in use at a given time.
A Tenant cannot be used for any products until its packageId points to a valid TenantPackage.
There are two types of TenantPackage objects:
- Fixed-pricing packages - where
hasFlexPricingis false. - Flexible pricing - where
hasFlexPricingis true.
In both case limits are defined on the account using the package, however with Flex the tenant is charged a base price plus
what they used, defined by the flex* parameters.
A tenant may have multiple tenant packages and have the ability to change the package themselves from the ์ฒญ๊ตฌ ์ ๋ณด ํ์ด์ง.
If you will be handling billing for tenants yourselves, you will still need to define a package for each tenant to define their limits. Simply set billingHandledExternally to true on the Tenant and they
will not be able to change their billing information, or active package, themselves.
You may not create packages with higher limits than the parent tenant.
The structure for the TenantPackage object is as follows:

GET /api/v1/tenant-packages/:id 
์ด ๋ผ์ฐํธ๋ id๋ก ๋จ์ผ Tenant Package๋ฅผ ๋ฐํํฉ๋๋ค.



GET /api/v1/tenant-packages 
์ด API๋ ํ์ด์ง์ ์ฌ์ฉํ๋ฉฐ, skip ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณต๋ฉ๋๋ค. TenantPackages๋ 100๊ฐ ๋จ์๋ก ํ์ด์ง๋ณ๋ก ๋ฐํ๋๋ฉฐ, createdAt ๋ฐ id๋ก ์ ๋ ฌ๋ฉ๋๋ค.
๋น์ฉ์ ๋ฐํ๋๋ tenant packages ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ฉฐ, ๋ฐํ๋๋ tenant packages 10๊ฐ๋น 1 credit per 10๊ฐ ์์๋ฉ๋๋ค.



POST /api/v1/tenant-packages 
์ด ๋ผ์ฐํธ๋ ๋จ์ผ TenantPackage๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
TenantPackage ์์ฑ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ ์ฌํญ์ด ์์ต๋๋ค:
- ๋ค์ ๋งค๊ฐ๋ณ์๊ฐ ํ์ํฉ๋๋ค:
nametenantIdmonthlyCostUSD- null์ผ ์ ์์ต๋๋ค.yearlyCostUSD- null์ผ ์ ์์ต๋๋ค.maxMonthlyPageLoadsmaxMonthlyAPICreditsmaxMonthlyCommentsmaxConcurrentUsersmaxTenantUsersmaxSSOUsersmaxModeratorsmaxDomainshasDebrandingforWhoTextfeatureTaglineshasFlexPricing- true์ด๋ฉด ๋ชจ๋flex*๋งค๊ฐ๋ณ์๊ฐ ํ์ํฉ๋๋ค.
name์50 characters๋ณด๋ค ๊ธธ ์ ์์ต๋๋ค.- ๊ฐ
forWhoTextํญ๋ชฉ์200 characters๋ณด๋ค ๊ธธ ์ ์์ต๋๋ค. - ๊ฐ
featureTaglinesํญ๋ชฉ์100 characters๋ณด๋ค ๊ธธ ์ ์์ต๋๋ค. TenantPackage๋ ๋ถ๋ชจ ํ ๋ํธ๋ณด๋ค "์์์ผ" ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋max*๋งค๊ฐ๋ณ์๋ ๋ถ๋ชจ ํ ๋ํธ๋ณด๋ค ๋ฎ์ ๊ฐ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.- ํ์ดํธ ๋ผ๋ฒจ๋ง๋ ํ ๋ํธ๋ ์ต๋ ๋ค์ฏ ๊ฐ์ ํจํค์ง๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ํ์ดํธ ๋ผ๋ฒจ๋ง ์ ๊ทผ ๊ถํ์ด ์๋ ํ
๋ํธ๋ง
TenantPackage๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. - ์์ ์ ํ ๋ํธ์๋ ํจํค์ง๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. :)
๋ค์๊ณผ ๊ฐ์ด TenantPackage๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:



PATCH /api/v1/tenant-packages/:id 
์ด API ์๋ํฌ์ธํธ๋ id๋ก TenantPackage๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
TenantPackage๋ฅผ ์
๋ฐ์ดํธํ ๋ ๋ค์ ์ ํ ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค:
hasFlexPricing๋ฅผ true๋ก ์ค์ ํ๋ ๊ฒฝ์ฐ, ๊ฐ์ ์์ฒญ์์ ๋ชจ๋flex*๋งค๊ฐ๋ณ์๊ฐ ํ์ํฉ๋๋ค.name์50 characters๋ณด๋ค ๊ธธ ์ ์์ต๋๋ค.- ๊ฐ
forWhoTextํญ๋ชฉ์200 characters๋ณด๋ค ๊ธธ ์ ์์ต๋๋ค. - ๊ฐ
featureTaglinesํญ๋ชฉ์100 characters๋ณด๋ค ๊ธธ ์ ์์ต๋๋ค. TenantPackage๋ ์์ ํ ๋ํธ๋ณด๋ค "์์์ผ" ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋max*๋งค๊ฐ๋ณ์๋ ์์ ํ ๋ํธ๋ณด๋ค ๋ฎ์ ๊ฐ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.TenantPackage์ ์ฐ๊ฒฐ๋tenantId๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.



DELETE /api/v1/tenant-packages/:id 
์ด ๊ฒฝ๋ก๋ id๋ก TenantPackage๋ฅผ ์ญ์ ํฉ๋๋ค.
์ฌ์ฉ ์ค์ธ TenantPackage(ํ
๋ํธ์ packageId๊ฐ ํด๋น ํจํค์ง๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ)๋ ์ญ์ ํ ์ ์์ต๋๋ค. ๋จผ์ Tenant๋ฅผ ์
๋ฐ์ดํธํ์ธ์.



ํ
๋ํธ ์ฌ์ฉ์ ๊ตฌ์กฐ 
The TenantUser defines a User which is managed by a specific tenant. Their account is in complete control of the tenant
they are associated with, and their account can be updated or deleted via the UI or API.
Tenant users can be administrators with all permissions and access to the Tenant, or they can be limited to specific permissions to
moderate comments, access API keys, etc.
The structure for the TenantUser object is as follows:

GET /api/v1/tenant-users/:id 
์ด ๊ฒฝ๋ก๋ id๋ก ๋จ์ผ TenantUser๋ฅผ ๋ฐํํฉ๋๋ค.



GET /api/v1/tenant-users 
์ด API๋ ํ์ด์ง๋ค์ด์
์ ์ฌ์ฉํ๋ฉฐ, skip ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณต๋ฉ๋๋ค. TenantUsers๋ 100๊ฐ ๋จ์์ ํ์ด์ง๋ก ๋ฐํ๋๋ฉฐ signUpDate, username ๋ฐ id ์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.
๋น์ฉ์ ๋ฐํ๋๋ tenant users ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐ๋๋ฉฐ, ๋ฐํ๋๋ tenant users 10๋ช
๋น 1 credit์ด ์๋ชจ๋ฉ๋๋ค.



POST /api/v1/tenant-users 
์ด ๋ผ์ฐํธ๋ ๋จ์ผ TenantUser๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
TenantUser๋ฅผ ์์ฑํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ด ์์ต๋๋ค:
username์ ํ์์ ๋๋ค.email์ ํ์์ ๋๋ค.signUpDate๋ ๋ฏธ๋์ผ ์ ์์ต๋๋ค.locale์ Supported Locales ๋ชฉ๋ก์ ์์ด์ผ ํฉ๋๋ค.username์ FastComments.com ์ ์ฒด์์ ๊ณ ์ ํด์ผ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋์ SSO ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.email์ FastComments.com ์ ์ฒด์์ ๊ณ ์ ํด์ผ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋์ SSO ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.- ํจํค์ง์ ์ ์๋
maxTenantUsers๋ณด๋ค ๋ ๋ง์ ํ ๋ํธ ์ฌ์ฉ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด TenantUser๋ฅผ ์์ฑํ ์ ์์ต๋๋ค



POST /api/v1/tenant-users/:id/send-login-link 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ TenantUser์๊ฒ ๋ก๊ทธ์ธ ๋งํฌ๋ฅผ ๋ณด๋ผ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฌ์ฉ์๋ค์ ์ผ๊ด ์์ฑํ ๋ ๊ทธ๋ค์๊ฒ FastComments.com์ ๋ก๊ทธ์ธํ๋ ๋ฐฉ๋ฒ์ ์๋ดํ ํ์๊ฐ ์์ ๋ ์ ์ฉํฉ๋๋ค. ์ด๋ ๋ง๋ฃ ๊ธฐ๊ฐ์ด 30 days์ธ "๋งค์ง ๋งํฌ"๋ฅผ ์ ์กํฉ๋๋ค.
TenantUser์๊ฒ ๋ก๊ทธ์ธ ๋งํฌ๋ฅผ ๋ณด๋ด๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ ํ์ด ์์ต๋๋ค:
TenantUser๋ ์ด๋ฏธ ์กด์ฌํด์ผ ํฉ๋๋ค.TenantUser๊ฐ ์ํTenant๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๊ถํ์ด ์์ด์ผ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด TenantUser์๊ฒ ๋ก๊ทธ์ธ ๋งํฌ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค:

์ด๊ฒ์ Bob at TenantName is inviting you to be a moderator... ๊ฐ์ ์ด๋ฉ์ผ์ ๋ณด๋
๋๋ค.


PATCH /api/v1/tenant-users/:id 
์ด ๋ผ์ฐํธ๋ ๋จ์ผ TenantUser๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
TenantUser ์
๋ฐ์ดํธ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ด ์์ต๋๋ค:
signUpDate๋ ๋ฏธ๋์ผ ์ ์์ต๋๋ค.locale๋ ์ง์๋๋ ๋ก์ผ์ผ ๋ชฉ๋ก์ ์์ด์ผ ํฉ๋๋ค.username์ FastComments.com ์ ์ฒด์์ ๊ณ ์ ํด์ผ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋๋ ๊ฒฝ์ฐ ๋์ SSO ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.email์ FastComments.com ์ ์ฒด์์ ๊ณ ์ ํด์ผ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋๋ ๊ฒฝ์ฐ ๋์ SSO ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.- ์ฌ์ฉ์์
tenantId๋ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด TenantUser๋ฅผ ์์ฑํ ์ ์์ต๋๋ค



DELETE /api/v1/tenant-users/:id 
์ด ๊ฒฝ๋ก๋ id๋ก TenantUser๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ฌ์ฉ์์ ๋๊ธ ์ญ์ ๋ deleteComments ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ด true์ธ ๊ฒฝ์ฐ:
- ์ฌ์ฉ์์ ๋ชจ๋ ๋๊ธ์ด ์ค์๊ฐ์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
- ๋ชจ๋ child (์ด์ ๋ ๊ณ ์๊ฐ ๋) ๋๊ธ์ ๊ฐ ๋๊ธ์ ์ฐ๊ฒฐ๋ ํ์ด์ง ๊ตฌ์ฑ์ ๋ฐ๋ผ ์ญ์ ๋๊ฑฐ๋ ์ต๋ช
์ฒ๋ฆฌ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ ๋ ์ญ์ ๋ชจ๋๊ฐ "anonymize"์ธ ๊ฒฝ์ฐ ๋ต๊ธ์ ๋จ์ ์๊ณ ์ฌ์ฉ์์ ๋๊ธ๋ง ์ต๋ช
ํ๋ฉ๋๋ค. ์ด๋
commentDeleteMode๊ฐRemove์ผ ๋๋ง ์ ์ฉ๋ฉ๋๋ค(๊ธฐ๋ณธ๊ฐ). creditsCost๋2๊ฐ ๋ฉ๋๋ค.
Anonymized Comments
์ฌ์ฉ์์ ๋๊ธ์ ์ ์งํ๋ ๋จ์ํ ์ต๋ช
ํํ๋ ค๋ฉด commentDeleteMode=1๋ก ์ค์ ํ์ญ์์ค.
์ฌ์ฉ์์ ๋๊ธ์ด ์ต๋ช ํ๋๋ฉด ๋ค์ ๊ฐ๋ค์ด null๋ก ์ค์ ๋ฉ๋๋ค:
- commenterName
- commenterEmail
- avatarSrc
- userId
- anonUserId
- mentions
- badgesisDeleted ๋ฐ isDeletedUser๋ true๋ก ์ค์ ๋ฉ๋๋ค.
๋ ๋๋ง ์ ๋๊ธ ์์ ฏ์ ์ฌ์ฉ์ ์ด๋ฆ์ DELETED_USER_PLACEHOLDER (๊ธฐ๋ณธ๊ฐ: "[deleted]")๋ฅผ, ๋๊ธ์๋ DELETED_CONTENT_PLACEHOLDER๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์์ ฏ ์ฌ์ฉ์ ์ง์ UI๋ฅผ ํตํด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
Examples



์ฌ์ฉ์ ๊ตฌ์กฐ 
User๋ ๋ชจ๋ ์ฌ์ฉ์๋ค์ ๊ณตํต ๋ถ๋ชจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด์
๋๋ค.
FastComments์์๋ ์ฌ์ฉ์์ ๋ํ ์ฌ๋ฌ ๊ฐ์ง ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ค๋ ์ ์ ์ผ๋์ ๋์ธ์:
- Secure SSO
- Simple SSO
- Tenant Users (For example: Administrators)
- Commenters
์ด API๋ Commenters ๋ฐ Simple SSO๋ฅผ ํตํด ์์ฑ๋ ์ฌ์ฉ์๋ค์ ์ํ ๊ฒ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ดํธ๋ฅผ ํตํด ์์ฑ๋ ๋ชจ๋ ์ฌ์ฉ์๋ ์ด API๋ก ์ ๊ทผํ ์ ์์ต๋๋ค. Tenant Users๋ ์ด๋ ๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง, /tenant-users/ API์ ์ํธ์์ฉํ๋ฉด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
Secure SSO์ ๊ฒฝ์ฐ์๋ /sso-users/ API๋ฅผ ์ฌ์ฉํ์ธ์.
์ด ์ ํ์ ์ฌ์ฉ์๋ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ด๋ค์ ๊ทํ์ ์ฌ์ดํธ๋ฅผ ํตํด ๊ณ์ ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ์ฝ๊ธฐ ์ ์ฉ ๊ธฐ๋ณธ ์ก์ธ์ค๋ง ์ ๊ณต๋๋ฉฐ ๋ณ๊ฒฝ์ ํ ์ ์์ต๋๋ค. ์ด๋ฐ ํ๋ฆ์ ์ํ์๋ฉด Secure SSO๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
User ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

GET /api/v1/users/:id 
์ด ๋ผ์ฐํธ๋ id๋ก ๋จ์ผ User๋ฅผ ๋ฐํํฉ๋๋ค.



ํฌํ ๊ตฌ์กฐ 
Vote ๊ฐ์ฒด๋ ์ฌ์ฉ์๊ฐ ๋จ๊ธด ํฌํ๋ฅผ ๋ํ๋
๋๋ค.
๋๊ธ๊ณผ ํฌํ ๊ฐ์ ๊ด๊ณ๋ commentId๋ก ์ ์๋ฉ๋๋ค.
Vote ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

GET /api/v1/votes 
ํฌํ๋ urlId๋ก ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
ํฌํ ์ ํ
ํฌํ์๋ ์ธ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค:
- ์ธ์ฆ๋ ํฌํ(Authenticated Votes)๋ ํด๋น ๋๊ธ์ ์ ์ฉ๋ฉ๋๋ค. ์ด API๋ฅผ ํตํด ์์ฑํ ์ ์์ต๋๋ค.
- ์ธ์ฆ๋ ํฌํ(Authenticated Votes) ์ค ๊ฒ์ฆ ๋๊ธฐ(pending) ์ํ์ธ ํฌํ๋ ์์ง ๋๊ธ์ ์ ์ฉ๋์ง ์์์ต๋๋ค. ์ฌ์ฉ์๊ฐ FastComments.com์ login to vote ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ ๋ ์์ฑ๋ฉ๋๋ค.
- ์ต๋ช ํฌํ(Anonymous Votes)๋ ํด๋น ๋๊ธ์ ์ ์ฉ๋ฉ๋๋ค. ์ต๋ช ๋๊ธ ์์ฑ๊ณผ ํจ๊ป ์์ฑ๋ฉ๋๋ค.
ํผ๋์ ์ค์ด๊ธฐ ์ํด API๋ ์ด๋ฅผ ๋ณ๋์ ๋ชฉ๋ก์ผ๋ก ๋ฐํํฉ๋๋ค.



์ต๋ช ํฌํ ์ฐธ๊ณ
์ด API๋ฅผ ํตํด ์์ฑ๋ ์ต๋ช
ํฌํ๋ appliedAuthorizedVotes ๋ชฉ๋ก์ ๋ํ๋ฉ๋๋ค. API ํค๋ก API๋ฅผ ํตํด ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ๊ถํ์ด ๋ถ์ฌ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
appliedAnonymousVotes ๊ตฌ์กฐ๋ ์ด๋ฉ์ผ, API ํค ๋ฑ์ด ์์ด ์์ฑ๋ ํฌํ์ ๋ํ ๊ฒ์
๋๋ค.
GET /api/v1/votes/for-user 
์ง์ ๋ urlId์ ๋ํด ์ฌ์ฉ์๊ฐ ๋จ๊ธด ํฌํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. userId๋ FastComments.com์ ์ฌ์ฉ์ ๋๋ SSO User๊ฐ ๋ ์ ์์ต๋๋ค.
์ด๋ ์ฌ์ฉ์๊ฐ ๋๊ธ์ ํฌํํ๋์ง ๋ณด์ฌ์ฃผ๋ ค๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ๋๊ธ์ ๊ฐ์ ธ์ฌ ๋ ๋์ผํ urlId๋ก ์ฌ์ฉ์์ ๋ํด ์ด API๋ฅผ ํจ๊ป ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
์ต๋ช
ํฌํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋์ anonUserId๋ฅผ ์ ๋ฌํ์ธ์.


์ต๋ช
ํฌํ๋ appliedAuthorizedVotes ๋ชฉ๋ก์ ํ์๋ฉ๋๋ค. ์ด๋ค์ API ํค๋ก API๋ฅผ ํตํด ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ๊ถํ์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.


POST /api/v1/votes 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ ๊ถํ ์๋ Vote๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ํฌํ๋ up (+1) ๋๋ down (-1)์ผ ์ ์์ต๋๋ค.




์ต๋ช ํฌํ ์์ฑ
์ต๋ช
ํฌํ๋ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์์ userId ๋์ anonUserId๋ฅผ ์ค์ ํ์ฌ ์์ฑํ ์ ์์ต๋๋ค.
์ด id๋ ์ด๋ ๊ณณ์ ์ฌ์ฉ์ ๊ฐ์ฒด์ ์ผ์นํ ํ์๊ฐ ์์ต๋๋ค(๋ฐ๋ผ์ ์ต๋ช ์ ๋๋ค). ์ด๊ฒ์ ๋จ์ํ ์๋ณ์ ์ธ์ ์ ์ํ ๊ฒ์ด๋ฉฐ, ๊ฐ์ ์ธ์ ์์ ๋ค์ ํฌํ๋ฅผ ๊ฐ์ ธ์ ๋๊ธ์ ํฌํ๊ฐ ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
If you do not have such a thing as "anonymous sessions" like FastComments does - you can simply set this to a random ID, like a UUID (although we appreciate smaller identifiers to save space).
๊ธฐํ ์ฐธ๊ณ
- ์ด API๋ ํ
๋ํธ ์์ค ์ค์ ์ ๋ฐ๋ฆ
๋๋ค. ์๋ฅผ ๋ค์ด ํน์ ํ์ด์ง์ ๋ํด ํฌํ๋ฅผ ๋นํ์ฑํํ๊ณ API๋ฅผ ํตํด ํฌํ๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋ฉด,
voting-disabled์ค๋ฅ ์ฝ๋๋ก ์คํจํฉ๋๋ค. - ์ด API๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ์ด๋ธ ์ํ์ ๋๋ค.
- ์ด API๋ ํด๋น
Comment์votes๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
DELETE /api/v1/votes/:id 
์ด ๋ผ์ฐํธ๋ ๋จ์ผ Vote๋ฅผ ์ญ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



Notes:
- ์ด API๋ ํ
๋ํธ ์์ค ์ค์ ์ ๋ฐ๋ฆ
๋๋ค. ์๋ฅผ ๋ค์ด ํน์ ํ์ด์ง์์ ํฌํ๋ฅผ ๋นํ์ฑํํ ์ํ์์ API๋ฅผ ํตํด ํฌํ๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ ์ฝ๋
voting-disabled๋ก ์คํจํฉ๋๋ค. - ์ด API๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ์ด๋ธ ์ํ์ ๋๋ค.
- ์ด API๋ ํด๋น
Comment์votes๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
๋๋ฉ์ธ ๊ตฌ์ฑ ๊ตฌ์กฐ 
A DomainConfig object represents configuration for a domain for a tenant.
The structure for the DomainConfig object is as follows:


์ธ์ฆ์ ์ํด
๋๋ฉ์ธ ๊ตฌ์ฑ์ ๊ทํ์ ๊ณ์ ์ ๋ํด ์ด๋ค ์ฌ์ดํธ๋ค์ด FastComments ์์ ฏ์ ํธ์คํ ํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ธ ํํ์ ์ธ์ฆ์ด๋ฉฐ, ๋๋ฉ์ธ ๊ตฌ์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋ฉด ์ด์ ํ๊ฒฝ์์ FastComments ์ค์น์ ๊ฐ์ฉ์ฑ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
ํ์ฌ ์ฌ์ฉ ์ค์ธ ๋๋ฉ์ธ์ ๋ํด ํด๋น ๋๋ฉ์ธ์ Domain Config์์ domain ์์ฑ์ ์๋์ ์ผ๋ก ๋นํ์ฑํํ์ง ์๋ ํ ์ ๊ฑฐํ๊ฑฐ๋ ์
๋ฐ์ดํธํ์ง ๋ง์ญ์์ค.
์ด๊ฒ์ /auth/my-account/configure-domains์์ ๋๋ฉ์ธ์ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ ๋์ผํ ๋์์ ํฉ๋๋ค.
๋ํ My Domains UI์์ ๋๋ฉ์ธ์ ์ ๊ฑฐํ๋ฉด ์ด UI๋ฅผ ํตํด ์ถ๊ฐ๋์์ ์ ์๋ ํด๋น ๋๋ฉ์ธ์ ๋ํ ๋ชจ๋ ๊ตฌ์ฑ๋ ์ ๊ฑฐ๋๋ค๋ ์ ์ ์ ์ํ์ญ์์ค.
์ด๋ฉ์ผ ์ฌ์ฉ์ํ
์ด๋ฉ์ผ ํธํฐ์ ๊ตฌ๋
์ทจ์ ๋งํฌ ๋ฐ ๋ง์ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ณตํ๋ ์ํด๋ฆญ ๊ตฌ๋
์ทจ์ ๊ธฐ๋ฅ์ ๊ฐ๊ฐ footerUnsubscribeURL๊ณผ emailHeaders๋ฅผ ์ ์ํ์ฌ ์ด API๋ฅผ ํตํด ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
DKIM
DKIM DNS ๋ ์ฝ๋๋ฅผ ์ ์ํ ํ, ์์์ ์ ์ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฉ์ธ ๊ตฌ์ฑ์ DKIM ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ๋ฉด ๋ฉ๋๋ค.
GET /api/v1/domain-configs 
์ด API๋ ํ
๋ํธ์ ๋ชจ๋ DomainConfig ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



GET /api/v1/domain-configs/:domain 
๊ฐ๋ณ DomainConfig๋ ํด๋น domain์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.



POST /api/v1/domain-configs 
์ด API ์๋ํฌ์ธํธ๋ ๋๋ฉ์ธ ๊ตฌ์ฑ์ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋๋ฉ์ธ์ ๋ํ ๊ตฌ์ฑ์ ์ถ๊ฐํ๋ฉด ํด๋น ๋๋ฉ์ธ์ด FastComments ๊ณ์ ์ ๋ํด ์ธ์ฆ๋ฉ๋๋ค.
์ด API์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ก๋ ์ด๊ธฐ ์ค์ , ์ฌ๋ฌ ๋๋ฉ์ธ์ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ, ๋๋ ์ด๋ฉ์ผ ๋ฐ์ก์ ์ํ ๋ง์ถค ๊ตฌ์ฑ ๋ฑ์ด ์์ต๋๋ค.



PATCH /api/v1/domain-configs/:domain 
์ด API ์๋ํฌ์ธํธ๋ ๋๋ฉ์ธ๊ณผ ์ ๋ฐ์ดํธํ ์์ฑ๋ง ์ง์ ํ์ฌ ๋๋ฉ์ธ ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



PUT /api/v1/domain-configs/:domain 
์ด API ์๋ํฌ์ธํธ๋ ๋๋ฉ์ธ ๊ตฌ์ฑ์ ๊ต์ฒดํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



DELETE /api/v1/domain-configs/:domain 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ DomainConfig๋ฅผ id๋ก ์ ๊ฑฐํฉ๋๋ค.
- ์ฐธ๊ณ :
DomainConfig๋ฅผ ์ ๊ฑฐํ๋ฉด ํด๋น ๋๋ฉ์ธ์ด FastComments ์ฌ์ฉ ๊ถํ์ ์์คํฉ๋๋ค. - ์ฐธ๊ณ : UI๋ฅผ ํตํด ๋๋ฉ์ธ์ ๋ค์ ์ถ๊ฐํ๋ฉด ๊ฐ์ฒด๊ฐ ์ฌ์์ฑ๋ฉ๋๋ค(๋จ
domain๋ง ์ฑ์์ง๋๋ค).



์ง๋ฌธ ๊ตฌ์ฑ ๊ตฌ์กฐ 
FastComments๋ ์ง๋ฌธ์ ๊ตฌ์ฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ง๊ณํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ง๋ฌธ์ ์(์ดํ QuestionConfig๋ผ๊ณ ํจ)๋ ๋ณ์ , ์ฌ๋ผ์ด๋, ๋๋ NPS ์ง๋ฌธ(type์ ์ํด ๊ฒฐ์ ๋ ์ ์์)์ด ๋ ์ ์์ต๋๋ค.
์ง๋ฌธ ๋ฐ์ดํฐ๋ ๊ฐ๋ณ์ ์ผ๋ก, ํจ๊ป, ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ, ์ ์ฒด์ ์ผ๋ก, ํ์ด์ง๋ณ๋ก ๋ฑ์ผ๋ก ์ง๊ณํ ์ ์์ต๋๋ค.
์ด ํ๋ ์์ํฌ๋ ํด๋ผ์ด์ธํธ ์ธก ์์ ฏ(์ด API ์์ ์๋ฒ๋ฅผ ๋๋ ๋ฐฉ์), ๊ด๋ฆฌ์ ๋์๋ณด๋ ๋ฐ ๋ฆฌํฌํ ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋จผ์ QuestionConfig๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค. ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

GET /api/v1/question-configs 
์ด ๊ฒฝ๋ก๋ ํ ๋ฒ์ ํ์ด์ง๋ ์ต๋ 100๊ฐ์ QuestionConfig ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ๋น์ฉ์ 100๊ฐ๋น 1์
๋๋ค. ๊ทธ๋ค์
์ง๋ฌธ ํ
์คํธ ์ค๋ฆ์ฐจ์(question ํ๋)์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.



GET /api/v1/question-configs/:id 
์ด ๊ฒฝ๋ก๋ id๋ก ๋จ์ผ QuestionConfig๋ฅผ ๋ฐํํฉ๋๋ค.



POST /api/v1/question-configs 
์ด API ์๋ํฌ์ธํธ๋ QuestionConfig๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



PATCH /api/v1/question-configs/:id 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ QuestionConfig๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ค์ ๊ตฌ์กฐ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ ๋ํ๋ ๋๋ค:




DELETE /api/v1/question-configs/:id 
์ด ๊ฒฝ๋ก๋ id๋ก QuestionConfig๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ด ์์ ์ ๋ชจ๋ ํด๋น ์ง๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ์ญ์ ํฉ๋๋ค(๋๊ธ์ ์ญ์ ๋์ง ์์ต๋๋ค). ์ด๊ฒ์ ๋์ ํฌ๋ ๋ง ๋น์ฉ์ ์ผ๋ถ์ ๋๋ค.



์ง๋ฌธ ๊ฒฐ๊ณผ ๊ตฌ์กฐ 
์ง๋ฌธ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ค๋ฉด QuestionResult๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ง๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ์ง๊ณํ ์ ์๊ณ , ๋ํ
๋ณด๊ณ ๋ชฉ์ ์ ์ํด ๋๊ธ์ ์ฐ๊ฒฐํ ์๋ ์์ต๋๋ค.

GET /api/v1/question-results 
์ด ๋ผ์ฐํธ๋ ํ ๋ฒ์ ์ต๋ 1000๊ฐ์ QuestionResults ๊ฐ์ฒด๋ฅผ ํ์ด์ง๋ค์ด์
๋ ํํ๋ก ๋ฐํํฉ๋๋ค. ๋น์ฉ์ 100๊ฐ๋น 1์
๋๋ค. ๊ฒฐ๊ณผ๋ createdAt ๊ธฐ์ค ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. ๋ค์ํ ๋งค๊ฐ๋ณ์๋ก ํํฐ๋งํ ์ ์์ต๋๋ค.



GET /api/v1/question-results/:id 
์ด ๊ฒฝ๋ก๋ id๋ก ๋จ์ผ QuestionResult๋ฅผ ๋ฐํํฉ๋๋ค.



POST /api/v1/question-results 
์ด API ์๋ํฌ์ธํธ๋ QuestionResult๋ฅผ ์์ฑํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.



PATCH /api/v1/question-results/:id 
์ด ๊ฒฝ๋ก๋ ๋จ์ผ QuestionResult๋ฅผ ์
๋ฐ์ดํธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ค์ ๊ตฌ์กฐ๋ ๋ณ๊ฒฝํ ์ ์๋ ๋ชจ๋ ๊ฐ์ ๋ํ๋ ๋๋ค:




DELETE /api/v1/question-results/:id 
์ด ๊ฒฝ๋ก๋ id๋ก QuestionResult๋ฅผ ์ญ์ ํฉ๋๋ค.



GET /api/v1/question-results-aggregate 
์ฌ๊ธฐ์ ๊ฒฐ๊ณผ์ ์ง๊ณ๊ฐ ์ํ๋ฉ๋๋ค.
The aggregation response structure is as follows:

Here are the query parameters available for aggregation:

Here's an example request:

Example response:


Performance Notes
- For a cache miss aggregations generally take five seconds per million results.
- Otherwise, requests are constant-time.
Caching and Cost Notes
- When
forceRecalculateis specified the cost is always10, instead of the normal2. - If the cache expires and data is recalculated, the cost is still a constant
2ifforceRecalculateis not specified. The cache expires based on the data set size aggregated (can vary between 30 seconds and 5 minutes). - This is to incentivize using the cache.
GET /api/v1/question-results-aggregate/combine/comments 
๊ฒฐ๊ณผ์ ๋๊ธ์ ๊ฒฐํฉํ๋ ๊ธฐ๋ฅ์ด ์ ๊ณต๋๋ ์๋ํฌ์ธํธ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ ํ์ ๋ํ "์ต๊ทผ ๊ธ์ ๋ฐ ๋ถ์ ๋๊ธ" ์ฐจํธ๋ฅผ ๋ง๋๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
๊ฐ์ ๋ฒ์(ํฌํจ), ํ๋ ์ด์์ ์ง๋ฌธ, ๊ทธ๋ฆฌ๊ณ ์์ ๋ ์ง(ํฌํจ)๋ก ๊ฒ์ํ ์ ์์ต๋๋ค.
์๋ต ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:

๋ค์์ ์ง๊ณ๋ฅผ ์ํ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์ ๋๋ค:

๋ค์์ ์์ ์์ฒญ์ ๋๋ค:

๋ค์์ ์์ ์๋ต์ ๋๋ค:


์บ์ฑ ๋ฐ ๋น์ฉ ๊ด๋ จ ์ฃผ์์ฌํญ
forceRecalculate๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ ๋น์ฉ์ ์ผ๋ฐ์ ์ธ2๋์ ํญ์10์ ๋๋ค.- ์บ์๊ฐ ๋ง๋ฃ๋์ด ๋ฐ์ดํฐ๊ฐ ์ฌ๊ณ์ฐ๋๋ ๊ฒฝ์ฐ์๋,
forceRecalculate๊ฐ ์ง์ ๋์ง ์์๋ค๋ฉด ๋น์ฉ์ ์ฌ์ ํ ๊ณ ์ ๋2์ ๋๋ค. - ์ด๋ ์บ์ ์ฌ์ฉ์ ์ฅ๋ คํ๊ธฐ ์ํ ์กฐ์น์ ๋๋ค.
์ฌ์ฉ์ ๋ฐฐ์ง ๊ตฌ์กฐ 
UserBadge๋ FastComments ์์คํ
์์ ์ฌ์ฉ์์๊ฒ ํ ๋น๋ ๋ฐฐ์ง๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด์
๋๋ค.
๋ฐฐ์ง๋ ํ๋(์: ๋๊ธ ์, ์๋ต ์๊ฐ, ๋ฒ ํ ๋ ์ํ)์ ๋ฐ๋ผ ์๋์ผ๋ก ์ฌ์ฉ์์๊ฒ ํ ๋น๋๊ฑฐ๋ ์ฌ์ดํธ ๊ด๋ฆฌ์๊ฐ ์๋์ผ๋ก ํ ๋นํ ์ ์์ต๋๋ค.
The structure for the UserBadge object is as follows:

GET /api/v1/user-badges 
์ด ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ์ ๋ฐฐ์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
Example Request:
Run 
You can add various query parameters to filter the results:
userId- ํน์ ์ฌ์ฉ์์ ๋ฐฐ์ง๋ฅผ ๊ฐ์ ธ์ต๋๋คbadgeId- ํน์ ๋ฐฐ์ง์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ต๋๋คtype- ๋ฐฐ์ง ์ ํ๋ณ๋ก ํํฐ๋ง (0=CommentCount, 1=CommentUpVotes, 2=CommentReplies, etc. See UserBadge structure for full list)displayedOnComments- ๋ฐฐ์ง๊ฐ ๋๊ธ์ ํ์๋๋์ง ์ฌ๋ถ๋ก ํํฐ๋ง (true/false)limit- ๋ฐํํ ๋ฐฐ์ง์ ์ต๋ ๊ฐ์ (๊ธฐ๋ณธ๊ฐ 30, ์ต๋ 200)skip- ๊ฑด๋๋ธ ๋ฐฐ์ง ์ (ํ์ด์ง๋ค์ด์ ์ฉ)
Example Response:

Possible Error Responses:


GET /api/v1/user-badges/:id 
์ด ์๋ํฌ์ธํธ๋ ๊ณ ์ ID๋ก ํน์ ์ฌ์ฉ์ ๋ฐฐ์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํฉ๋๋ค.
Example Request:
Run 
Example Response:

Possible Error Responses:


POST /api/v1/user-badges 
์ด ์๋ํฌ์ธํธ๋ฅผ ํตํด ์๋ก์ด ์ฌ์ฉ์ ๋ฐฐ์ง ํ ๋น์ ์์ฑํ ์ ์์ต๋๋ค.
์์ฒญ ์์ :
Run 
์์ฒญ ๋ณธ๋ฌธ์๋ ๋ค์ ๋งค๊ฐ๋ณ์๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค:
userId(required) - ๋ฐฐ์ง๋ฅผ ํ ๋นํ ์ฌ์ฉ์์ IDbadgeId(required) - ํ ๋นํ ๋ฐฐ์ง์ IDdisplayedOnComments(optional) - ๋ฐฐ์ง๊ฐ ์ฌ์ฉ์์ ๋๊ธ์ ํ์๋ ์ง ์ฌ๋ถ (๊ธฐ๋ณธ๊ฐ: true)
์ค์ ์ฐธ๊ณ ์ฌํญ:
- ๋ฐฐ์ง๋ ํ ๋ํธ์ ๋ฐฐ์ง ์นดํ๋ก๊ทธ์ ์กด์ฌํ๊ณ ํ์ฑํ๋์ด ์์ด์ผ ํฉ๋๋ค
- ๋ฐฐ์ง๋ ๊ทํ์ ํ ๋ํธ์ ์ํด ์๊ฑฐ๋ ๊ทํ์ ์ฌ์ดํธ์ ๋๊ธ์ ๋จ๊ธด ์ฌ์ฉ์์๊ฒ๋ง ํ ๋นํ ์ ์์ต๋๋ค
์๋ต ์์ :

๊ฐ๋ฅํ ์ค๋ฅ ์๋ต:





PUT /api/v1/user-badges/:id 
์ด ์๋ํฌ์ธํธ๋ ์ฌ์ฉ์ ๋ฐฐ์ง ํ ๋น์ ์ ๋ฐ์ดํธํ ์ ์๋๋ก ํฉ๋๋ค.
ํ์ฌ ์
๋ฐ์ดํธํ ์ ์๋ ์ ์ผํ ์์ฑ์ displayedOnComments์ด๋ฉฐ, ์ด ์์ฑ์ ๋ฐฐ์ง๊ฐ ์ฌ์ฉ์์ ๋๊ธ์ ํ์๋๋์ง ์ฌ๋ถ๋ฅผ ์ ์ดํฉ๋๋ค.
Example Request:
Run 
Example Response:

Possible Error Responses:



DELETE /api/v1/user-badges/:id 
์ด ์๋ํฌ์ธํธ๋ฅผ ํตํด ์ฌ์ฉ์ ๋ฐฐ์ง ํ ๋น์ ์ญ์ ํ ์ ์์ต๋๋ค.
์์ฒญ ์์:
Run 
์๋ต ์์:

๊ฐ๋ฅํ ์ค๋ฅ ์๋ต:



์ฌ์ฉ์ ๋ฐฐ์ง ์งํ๋ฅ ๊ตฌ์กฐ 
UserBadgeProgress๋ FastComments ์์คํ
์์ ์ฌ์ฉ์๊ฐ ๋ค์ํ ๋ฐฐ์ง๋ฅผ ํ๋ํ๊ธฐ ์ํ ์งํ ์ํฉ์ ๋ํ๋ด๋ ๊ฐ์ฒด์
๋๋ค.
์ด ์ถ์ ์ ์ฌ์ฉ์์ ํ๋ ๋ฐ ์ปค๋ฎค๋ํฐ ์ฐธ์ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ ์๋์ผ๋ก ๋ฐฐ์ง๋ฅผ ์์ฌํ ์ง ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
The structure for the UserBadgeProgress object is as follows:

GET /api/v1/user-badge-progress 
์ด ์๋ํฌ์ธํธ๋ ๋ค์ํ ๊ธฐ์ค์ ๋ฐ๋ผ ์ฌ์ฉ์ ๋ฐฐ์ง ์งํ ๊ธฐ๋ก์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
Example Request:
Run 
๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ๊ธฐ ์ํด ๋ค์ํ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค:
userId- ํน์ ์ฌ์ฉ์์ ์งํ ์ํฉ์ ๊ฐ์ ธ์ต๋๋คlimit- ๋ฐํํ ์ต๋ ๋ ์ฝ๋ ์ (๊ธฐ๋ณธ๊ฐ 30, ์ต๋ 200)skip- ๊ฑด๋๋ธ ๋ ์ฝ๋ ์ (ํ์ด์ง๋ค์ด์ ์ฉ)
Example Response:

Possible Error Responses:


GET /api/v1/user-badge-progress/:id 
์ด ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณ ์ ID๋ก ํน์ ์ฌ์ฉ์ ๋ฐฐ์ง ์งํ ๊ธฐ๋ก์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์์ฒญ ์์:
Run 
์๋ต ์์:

๊ฐ๋ฅํ ์ค๋ฅ ์๋ต:


GET /api/v1/user-badge-progress/user/:userId 
์ด ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ID๋ก ์ฌ์ฉ์์ ๋ฐฐ์ง ์งํ ๊ธฐ๋ก์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์์ฒญ ์์ :
Run 
์๋ต ์์ :

๊ฐ๋ฅํ ์ค๋ฅ ์๋ต:



๊ฒฐ๋ก
์ ํฌ API ๋ฌธ์๊ฐ ํฌ๊ด์ ์ด๊ณ ์ดํดํ๊ธฐ ์ฌ์ ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ฝ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์๋์ ์๋ ค์ฃผ์ธ์.