FastComments.com

FastComments API

FastComments๋Š” ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํ”Œ๋žซํผ๊ณผ ํ†ตํ•ฉ์„ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜, ์ง์ ‘ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”!

์ด ๋ฌธ์„œ์—์„œ๋Š” API๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ์š”์ฒญ ๋ฐ ์‘๋‹ต ํƒ€์ž…๊ณผ ํ•จ๊ป˜ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ณ ๊ฐ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  API ์ ‘๊ทผ์ด ๊ฐ์‚ฌ ๋กœ๊ทธ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ SDKs

FastComments๋Š” ์ด์ œ ์ฝ”๋“œ์—์„œ API Spec์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (์•„์ง ์™„์ „ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋งŽ์€ API๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค).

๋˜ํ•œ ์ธ๊ธฐ ์žˆ๋Š” ์–ธ์–ด์šฉ SDK๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:

์ธ์ฆ

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

๊ฐ์‚ฌ ๋กœ๊ทธ ๊ตฌ์กฐ Internal Link


AuditLog๋Š” ์ด ๊ธฐ๋Šฅ์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š” ํ…Œ๋„ŒํŠธ์— ๋Œ€ํ•ด ๊ฐ์‚ฌ๋œ ์ด๋ฒคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

AuditLog ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

AuditLog ๊ตฌ์กฐ
Copy Copy
1
2interface AuditLog {
3 id: string;
4 userId?: string;
5 username?: string;
6 resourceName: string;
7 crudType: 'c' | 'r' | 'u' | 'd' | 'login';
8 from: string;
9 url?: string;
10 ip?: string;
11 when: string;
12 description?: string;
13 serverStartDate: string;
14 objectDetails?: object;
15}
16

๊ฐ์‚ฌ ๋กœ๊ทธ๋Š” ๋ถˆ๋ณ€์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์“ธ ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. FastComments.com๋งŒ ๊ฐ์‚ฌ ๋กœ๊ทธ์— ๊ธฐ๋กํ•  ์‹œ์ ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด API๋ฅผ ํ†ตํ•ด ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ์‚ฌ ๋กœ๊ทธ์˜ ์ด๋ฒคํŠธ๋Š” 2๋…„ ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.


๋Œ“๊ธ€ ๊ตฌ์กฐ Internal Link

A Comment ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‚จ๊ธด ๋Œ“๊ธ€์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ƒ์œ„ ๋ฐ ํ•˜์œ„ ๋Œ“๊ธ€ ๊ฐ„์˜ ๊ด€๊ณ„๋Š” parentId๋ฅผ ํ†ตํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

Comment ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

๋Œ“๊ธ€ ๊ตฌ์กฐ
Copy Copy
1
2interface Comment {
3 /** ์ฝ๊ธฐ ์ „์šฉ: ์ŠคํŒธ ์—”์ง„์ด ํ•ด๋‹น ๋Œ“๊ธ€์„ ์ŠคํŒธ์œผ๋กœ ํŒ๋ณ„ํ•œ ๊ฒฝ์šฐ true๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. **/
4 aiDeterminedSpam?: boolean
5 /** ๋Œ“๊ธ€์ด ํ‘œ์‹œ๋˜๋„๋ก ์Šน์ธ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€. ๋Œ“๊ธ€ ์ €์žฅ ์‹œ true๋กœ ์„ค์ •๋˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค. **/
6 approved?: boolean
7 /** ์‚ฌ์šฉ์ž์˜ ์•„๋ฐ”ํƒ€. **/
8 avatarSrc?: string
9 /** ์ž์‹ ๋Œ“๊ธ€. ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ฑ„์›Œ์ง€์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. API๋ฅผ ํ†ตํ•ด asTree๊ฐ€ true๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. **/
10 children: Comment[]
11 /** ์ž‘์„ฑ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์›๋ณธ ๋Œ“๊ธ€ ํ…์ŠคํŠธ. **/
12 comment: string
13 /** ์ฝ๊ธฐ ์ „์šฉ: ์ž‘์„ฑ์ž์˜ ๋Œ“๊ธ€์„ ํŒŒ์‹ฑํ•ด HTML๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’. **/
14 commentHTML?: string
15 /** ์ž‘์„ฑ์ž์˜ ์ด๋ฉ”์ผ. ์ต๋ช… ๋Œ“๊ธ€์ด ๊บผ์ ธ ์žˆ์œผ๋ฉด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. **/
16 commenterEmail?: string
17 /** ์ž‘์„ฑ์ž์˜ ๋งํฌ(์˜ˆ: ๋ธ”๋กœ๊ทธ). **/
18 commenterLink?: string
19 /** ์ž‘์„ฑ์ž์˜ ์ด๋ฆ„. ํ•ญ์ƒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด "Anonymous" ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”. **/
20 commenterName: string
21 /** ๋Œ“๊ธ€์ด ์ž‘์„ฑ๋œ ๋‚ ์งœ(UTC epoch). **/
22 date: number
23 /** ๋Œ“๊ธ€์˜ "ํ‘œ์‹œ ๋ ˆ์ด๋ธ”" - ์˜ˆ: "Admin", "Moderator" ๋˜๋Š” "VIP User" ๊ฐ™์€ ๊ฐ’. **/
24 displayLabel?: string
25 /** ๋Œ“๊ธ€์ด ๊ฒŒ์‹œ๋œ ๋„๋ฉ”์ธ. **/
26 domain?: string
27 /** ์ฝ๊ธฐ ์ „์šฉ: ๋Œ“๊ธ€์ด ์‹ ๊ณ ๋œ ํšŸ์ˆ˜. **/
28 flagCount?: number
29 /** ๋Œ“๊ธ€์— ์ž‘์„ฑ๋˜์–ด ์„ฑ๊ณต์ ์œผ๋กœ ํŒŒ์‹ฑ๋œ #ํ•ด์‹œํƒœ๊ทธ๋“ค. ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•ด์‹œํƒœ๊ทธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ทธ๋Ÿฌ๋ฉด ๋Œ“๊ธ€ ํ…์ŠคํŠธ์— ์ž๋™์œผ๋กœ ํ‘œ์‹œ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. **/
30 hashTags?: CommentHashTag[]
31 /** ์ฝ๊ธฐ ์ „์šฉ: ๋Œ“๊ธ€์— ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€. **/
32 hasImages?: boolean
33 /** ์ฝ๊ธฐ ์ „์šฉ: ๋Œ“๊ธ€์— ๋งํฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€. **/
34 hasLinks?: boolean
35 /** ์ฝ๊ธฐ ์ „์šฉ: ๊ณ ์œ  ๋Œ“๊ธ€ ID. **/
36 id: string
37 /** ์ƒ์„ฑ ์‹œ์—๋งŒ! ์ €์žฅ์„ ์œ„ํ•ด ํ•ด์‹œ๋ฉ๋‹ˆ๋‹ค. **/
38 ip?: string
39 /** ์ฝ๊ธฐ ์ „์šฉ: ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๋ฅผ ์ฐจ๋‹จํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€. **/
40 isBlocked?: boolean
41 /** ์ฝ๊ธฐ ์ „์šฉ: ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๊ฐ€ ๊ด€๋ฆฌ์ž์ธ์ง€ ์—ฌ๋ถ€. userId๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. **/
42 isByAdmin?: boolean
43 /** ์ฝ๊ธฐ ์ „์šฉ: ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๊ฐ€ ์ค‘์žฌ์ž์ธ์ง€ ์—ฌ๋ถ€. userId๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. **/
44 isByModerator?: boolean
45 /** ๋Œ“๊ธ€์ด ์†Œํ”„ํŠธ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ(true๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค). (๋‹ค๋ฅธ ๊ตฌ์„ฑ ๋•Œ๋ฌธ์— ํ”Œ๋ ˆ์ด์Šคํ™€๋”๋ฅผ ๋‚จ๊ฒจ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ) **/
46 isDeleted?: boolean
47 /** ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •์ด ์‚ญ์ œ๋˜์–ด ๋Œ“๊ธ€๋งŒ ๋ณด์กดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ true๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. **/
48 isDeletedUser?: boolean
49 /** ์ฝ๊ธฐ ์ „์šฉ: ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž(contextUserId)๊ฐ€ ์ด ๋Œ“๊ธ€์„ ์‹ ๊ณ ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€. **/
50 isFlagged?: boolean
51 /** ๋Œ“๊ธ€์ด ๊ณ ์ •๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€. **/
52 isPinned?: boolean
53 /** ์ƒˆ ๋‹ต๊ธ€ ์ž‘์„ฑ์ด ์ž ๊ฒจ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€(์ค‘์žฌ์ž๋Š” ์—ฌ์ „ํžˆ ๋‹ต๊ธ€ ์ž‘์„ฑ ๊ฐ€๋Šฅ). **/
54 isLocked?: boolean
55 /** ๋Œ“๊ธ€์ด ์ŠคํŒธ์ธ์ง€ ์—ฌ๋ถ€. **/
56 isSpam?: boolean
57 /** ์ฝ๊ธฐ ์ „์šฉ: ํ˜„์žฌ ์‚ฌ์šฉ์ž(contextUserId)๊ฐ€ ์ด ๋Œ“๊ธ€์— ๋Œ€ํ•ด downvoteํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€. **/
58 isVotedDown?: boolean
59 /** ์ฝ๊ธฐ ์ „์šฉ: ํ˜„์žฌ ์‚ฌ์šฉ์ž(contextUserId)๊ฐ€ ์ด ๋Œ“๊ธ€์— ๋Œ€ํ•ด upvoteํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€. **/
60 isVotedUp?: boolean
61 /** ๋Œ“๊ธ€์˜ ๋กœ์ผ€์ผ. ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด HTTP Accept-Language ํ—ค๋”์—์„œ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค. **/
62 locale?: 'de_de' | 'en_us' | 'es_es' | 'fr_fr' | 'it_it' | 'ja_jp' | 'ko_kr' | 'pl_pl' | 'pt_br' | 'ru_ru' | 'tr_tr' | 'zh_cn' | 'zh_tw'
63 /** ์ฝ๊ธฐ ์ „์šฉ: ๋Œ“๊ธ€์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ํŒŒ์‹ฑ๋œ @๋ฉ˜์…˜๋“ค. **/
64 mentions?: CommentUserMention[]
65 /** ๋Œ“๊ธ€์— ์—ฐ๊ฒฐ๋œ ์„ ํƒ์  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ. **/
66 meta?: Record<string, string | number | boolean>
67 /** ์ด ๋Œ“๊ธ€์— ์—ฐ๊ฒฐ๋œ ์„ ํƒ์  ์ค‘์žฌ ๊ทธ๋ฃน ID ๋ชฉ๋ก. **/
68 moderationGroupIds?: string[]|null
69 /** ์ฝ๊ธฐ ์ „์šฉ: ํ˜„์žฌ ์‚ฌ์šฉ์ž(contextUserId)๊ฐ€ ์ด ๋Œ“๊ธ€์— ๋‚จ๊ธด ํˆฌํ‘œ์— ํ•ด๋‹นํ•˜๋Š” ํˆฌํ‘œ ๊ฐ์ฒด์˜ ID. **/
70 myVoteId?: string
71 /** ์ด ๋Œ“๊ธ€์— ๋Œ€ํ•ด ์ž‘์„ฑ์ž๋“ค์—๊ฒŒ ์•Œ๋ฆผ์ด ์ „์†ก๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€. ๊ฐ€์ ธ์˜ค๊ธฐ(imports) ์‹œ ์•Œ๋ฆผ ์ „์†ก์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ด ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜์„ธ์š”. **/
72 notificationSentForParent?: boolean
73 /** ์ด ๋Œ“๊ธ€์— ๋Œ€ํ•ด ํ…Œ๋„ŒํŠธ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์•Œ๋ฆผ์ด ์ „์†ก๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€. ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ ์•Œ๋ฆผ ์ „์†ก์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ด ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜์„ธ์š”. **/
74 notificationSentForParentTenant?: boolean
75 /** ์ด ๋Œ“๊ธ€์ด ์ž‘์„ฑ๋œ ํŽ˜์ด์ง€์˜ ์ œ๋ชฉ. **/
76 pageTitle?: string
77 /** ๋Œ“๊ธ€์— ๋‹ต๊ธ€์„ ๋‹ค๋Š” ๊ฒฝ์šฐ, ๋‹ต๊ธ€ ๋Œ€์ƒ ๋Œ“๊ธ€์˜ ID์ž…๋‹ˆ๋‹ค. **/
78 parentId?: string|null
79 /** ๋Œ“๊ธ€์ด ๊ฒ€ํ† ๋จ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€. **/
80 reviewed: boolean
81 /** ๋Œ“๊ธ€์ด ์†ํ•œ ํ…Œ๋„ŒํŠธ ID. **/
82 tenantId: string
83 /** ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•œ ์‚ฌ์šฉ์ž. ์ด๋ฆ„/์ด๋ฉ”์ผ๋กœ ๋Œ“๊ธ€์„ ์ €์žฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. **/
84 userId?: string|null
85 /** ์ด ๋Œ“๊ธ€์ด ํ‘œ์‹œ๋˜๋Š” ์œ„์น˜์˜ URL(์˜ˆ: ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ). **/
86 url: string
87 /** ์ „๋‹ฌํ•œ urlId์˜ "์ •๋ฆฌ๋œ" ๋ฒ„์ „. ์ €์žฅ ์‹œ์—๋Š” ์ด ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜์ง€๋งŒ, ๋Œ“๊ธ€์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ด ๊ฐ’์€ ์ •๋ฆฌ๋˜์–ด ์›๋ž˜ ๊ฐ’์€ "urlIdRaw"๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. **/
88 urlId: string
89 /** ์ฝ๊ธฐ ์ „์šฉ: ์ „๋‹ฌํ•œ ์›๋ž˜ urlId. **/
90 urlIdRaw?: string
91 /** ์‚ฌ์šฉ์ž์™€ ์ด ๋Œ“๊ธ€์ด ์ธ์ฆ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€. **/
92 verified: boolean
93 /** ์ฐฌ์„ฑ(์—…) ํˆฌํ‘œ ์ˆ˜. **/
94 votesUp?: number
95 /** ๋ฐ˜๋Œ€(๋‹ค์šด) ํˆฌํ‘œ ์ˆ˜. **/
96 votesDown?: number
97 /** ๋Œ“๊ธ€์˜ "์นด๋ฅด๋งˆ"(= ์ฐฌ์„ฑ ์ˆ˜ - ๋ฐ˜๋Œ€ ์ˆ˜). **/
98 votes?: number
99}
100

์ผ๋ถ€ ํ•„๋“œ๋Š” 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๋ผ๋Š” ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ๊ฐ์ฒด๋Š” ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๋Œ“๊ธ€ ๋ฉ˜์…˜ ๊ฐ์ฒด
Copy CopyRun External Link
1
2interface CommentUserMention {
3 /** ์‚ฌ์šฉ์ž ID. SSO ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ํ…Œ๋„ŒํŠธ ID๊ฐ€ ์ ‘๋‘์‚ฌ๋กœ ๋ถ™์Šต๋‹ˆ๋‹ค. **/
4 id: string
5 /** ์ตœ์ข… @๋ฉ˜์…˜ ํƒœ๊ทธ ํ…์ŠคํŠธ(@ ๊ธฐํ˜ธ ํฌํ•จ). **/
6 tag: string
7 /** ์›๋ž˜์˜ @๋ฉ˜์…˜ ํƒœ๊ทธ ํ…์ŠคํŠธ(@ ๊ธฐํ˜ธ ํฌํ•จ). **/
8 rawTag: string
9 /** ํƒœ๊ทธ๋œ ์‚ฌ์šฉ์ž์˜ ์œ ํ˜•. user = FastComments.com ๊ณ„์ •, sso = SSO ์‚ฌ์šฉ์ž. **/
10 type: 'user'|'sso'
11 /** ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ๋ฆผ์„ ์ˆ˜์‹  ๊ฑฐ๋ถ€ํ•˜๋”๋ผ๋„ ์ด ๊ฐ’์€ ์—ฌ์ „ํžˆ true๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. **/
12 sent: boolean
13}
14

ํ•ด์‹œํƒœ๊ทธ

ํ•ด์‹œํƒœ๊ทธ๊ฐ€ ์‚ฌ์šฉ๋˜์–ด ์„ฑ๊ณต์ ์œผ๋กœ ํŒŒ์‹ฑ๋˜๋ฉด ๊ทธ ์ •๋ณด๋Š” hashTags๋ผ๋Š” ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. retain์ด ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ํ•ด์‹œํƒœ๊ทธ๋ฅผ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋Œ“๊ธ€์˜ hashTags ๋ฐฐ์—ด์— ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€ ํ•ด์‹œํƒœ๊ทธ ๊ฐ์ฒด
Copy CopyRun External Link
1
2interface CommentHashTag {
3 /** ํ•ด์‹œํƒœ๊ทธ ID. **/
4 id: string
5 /** ์ตœ์ข… #ํ•ด์‹œํƒœ๊ทธ ํ…์ŠคํŠธ(# ๊ธฐํ˜ธ ํฌํ•จ). **/
6 tag: string
7 /** ํ•ด์‹œํƒœ๊ทธ์— ๋งž์ถค URL์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ด ๊ฐ’์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค. **/
8 url?: string
9 /** ๋Œ“๊ธ€์ด ์—…๋ฐ์ดํŠธ๋  ๋•Œ ๋Œ“๊ธ€ ํ…์ŠคํŠธ์— ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ํ•ด์‹œํƒœ๊ทธ๋ฅผ ์œ ์ง€(retain)ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€. ๋Œ“๊ธ€ ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋Œ“๊ธ€์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. **/
10 retain?: boolean
11}
12

์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ ๊ตฌ์กฐ Internal Link

EmailTemplate ๊ฐ์ฒด๋Š” ํ…Œ๋„ŒํŠธ์˜ ๋งž์ถค ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ ๊ตฌ์„ฑ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์€ ์‚ฌ์šฉํ•  ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์Œ ๊ธฐ์ค€์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค:

  • ์œ ํ˜• ์‹๋ณ„์ž โ€” ์ด๋ฅผ emailTemplateId๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’๋“ค์€ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • domain. ๋จผ์ € ๊ด€๋ จ ๊ฐ์ฒด(์˜ˆ: Comment)๊ฐ€ ์†ํ•œ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์ด ์—†์œผ๋ฉด domain์ด null์ด๊ฑฐ๋‚˜ *์ธ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ EmailTemplate ๊ฐ์ฒด์˜ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค:

์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ ๊ตฌ์กฐ
Copy Copy
1
2interface EmailTemplate {
3 id: string
4 tenantId: string
5 emailTemplateId: string
6 displayName: string
7 /** ์ฝ๊ธฐ ์ „์šฉ **/
8 createdAt: string
9 /** ์ฝ๊ธฐ ์ „์šฉ **/
10 updatedAt: string
11 /** ์ฝ๊ธฐ ์ „์šฉ **/
12 updatedByUserId: string
13 /** ํ…œํ”Œ๋ฆฟ์ด ์—ฐ๊ด€๋œ ๋„๋ฉ”์ธ. **/
14 domain?: string | '*' | null
15 /** EJS ๊ตฌ๋ฌธ์œผ๋กœ ๋œ ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ ์ฝ˜ํ…์ธ . **/
16 ejs: string
17 /** ์ง€์›๋˜๋Š” ๊ฐ ๋กœ์ผ€์ผ์— ๋Œ€ํ•ด ์žฌ์ •์˜๋œ ๋ฒˆ์—ญ ํ‚ค์™€ ๊ฐ’์˜ ๋งต. **/
18 translationOverridesByLocale: Record<string, Record<string, string>>
19 /** ํ…œํ”Œ๋ฆฟ์˜ ๋ Œ๋” ์ปจํ…์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด. **/
20 testData: object
21}
22

์ฐธ๊ณ 

  • ์œ ํšจํ•œ emailTemplateId ๊ฐ’์€ /definitions ์—”๋“œํฌ์ธํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • /definitions ์—”๋“œํฌ์ธํŠธ์—๋Š” ๊ธฐ๋ณธ ๋ฒˆ์—ญ๊ณผ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ…œํ”Œ๋ฆฟ์€ ๊ตฌ์กฐ๋‚˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์ €์žฅ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํ•ด์‹œํƒœ๊ทธ ๊ตฌ์กฐ Internal Link

HashTag ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋Š” ํƒœ๊ทธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. HashTags๋Š” ์™ธ๋ถ€ ์ฝ˜ํ…์ธ ๋กœ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋œ ๋Œ“๊ธ€๋“ค์„ ๋ฌถ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

The structure for the HashTag object is as follows:

HashTag ๊ตฌ์กฐ
Copy Copy
1
2interface HashTag {
3 /** "#" ๋˜๋Š” ์›ํ•˜๋Š” ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. **/
4 tag: string
5 /** ํ•ด์‹œํƒœ๊ทธ๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์„ ํƒ์  URL์ž…๋‹ˆ๋‹ค. ํ•ด์‹œํƒœ๊ทธ๋กœ ๋Œ“๊ธ€์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋Œ€์‹ , UI๋Š” ํด๋ฆญ ์‹œ ์ด URL๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค. **/
6 url?: string
7 /** ์ฝ๊ธฐ ์ „์šฉ **/
8 createdAt: string
9}
10

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.

์•Œ๋ฆผ ์ˆ˜ ๊ตฌ์กฐ Internal Link

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:

NotificationCount ๊ตฌ์กฐ
Copy Copy
1
2interface NotificationCount {
3 id: string // ์‚ฌ์šฉ์ž id
4 count: number
5 createdAt: string // ๋‚ ์งœ ๋ฌธ์ž์—ด
6 expireAt: string // ๋‚ ์งœ ๋ฌธ์ž์—ด
7}
8

์•Œ๋ฆผ ๊ตฌ์กฐ Internal Link

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:

์•Œ๋ฆผ ๊ตฌ์กฐ
Copy Copy
1
2enum NotificationObjectType {
3 Comment = 0,
4 Profile = 1,
5 Tenant = 2
6}
7
8enum NotificationType {
9 /** ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹น์‹ ์—๊ฒŒ ๋‹ต๊ธ€์„ ๋‚จ๊ธด ๊ฒฝ์šฐ. **/
10 RepliedToMe = 0,
11 /** ๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‚จ๊ธด ์Šค๋ ˆ๋“œ์˜ ์–ด๋А ๊ณณ(์ž์‹์˜ ์ž์‹ ๋“ฑ ํฌํ•จ)์—์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹ต๊ธ€์„ ๋‚จ๊ธด ๊ฒฝ์šฐ. **/
12 RepliedTransientChild = 1,
13 /** ๋‹น์‹ ์˜ ๋Œ“๊ธ€์ด ์—…๋ณดํŠธ๋œ ๊ฒฝ์šฐ. **/
14 VotedMyComment = 2,
15 /** ๋‹น์‹ ์ด ๊ตฌ๋…ํ•œ ํŽ˜์ด์ง€์˜ ๋ฃจํŠธ์— ์ƒˆ ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฐ ๊ฒฝ์šฐ. **/
16 SubscriptionReplyRoot = 3,
17 /** ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹น์‹ ์˜ ํ”„๋กœํ•„์— ๋Œ“๊ธ€์„ ๋‚จ๊ธด ๊ฒฝ์šฐ. **/
18 CommentedOnProfile = 4,
19 /** ๋‹น์‹ ์—๊ฒŒ DM(๋‹ค์ด๋ ‰ํŠธ ๋ฉ”์‹œ์ง€)์ด ๋„์ฐฉํ•œ ๊ฒฝ์šฐ. **/
20 DirectMessage = 5,
21 /** TrialLimits๋Š” ํ…Œ๋„ŒํŠธ ์‚ฌ์šฉ์ž ์ „์šฉ์ž…๋‹ˆ๋‹ค. **/
22 TrialLimits = 6,
23 /** ๋‹น์‹ ์ด @์–ธ๊ธ‰๋œ ๊ฒฝ์šฐ. **/
24 Mentioned = 7
25}
26
27interface Notification {
28 id: string
29 tenantId: string
30 /** With SSO, the user id is in the format `<tenant id>:<user id>`. **/
31 userId?: string
32 /** SSO๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” `userId`๋งŒ ์‹ ๊ฒฝ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค. **/
33 anonUserId?: string
34 /** urlId๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ํ…Œ๋„ŒํŠธ ์ˆ˜์ค€์˜ ์•Œ๋ฆผ์—๋Š” ์„ ํƒ์ ์ด๋ฉฐ, ์ด๋Š” ๋“œ๋ญ…๋‹ˆ๋‹ค. **/
35 urlId?: string
36 /** URL์€ ์•Œ๋ฆผ ์ถœ์ฒ˜๋กœ ๋น ๋ฅด๊ฒŒ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ์บ์‹œ๋ฉ๋‹ˆ๋‹ค. **/
37 url?: string
38 /** ํŽ˜์ด์ง€ ์ œ๋ชฉ์€ ์•Œ๋ฆผ ์ถœ์ฒ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์บ์‹œ๋ฉ๋‹ˆ๋‹ค. **/
39 pageTitle?: string
40 relatedObjectType: NotificationObjectType
41 /** ์˜ˆ: ๋Œ“๊ธ€ ID. **/
42 relatedObjectId: string
43 viewed: boolean
44 createdAt: string // ๋‚ ์งœ ๋ฌธ์ž์—ด
45 type: NotificationType
46 fromCommentId?: string
47 fromVoteId?: string
48 /** fromUserName ๋ฐ fromUserAvatarSrc๋Š” ์•Œ๋ฆผ์„ ๋น ๋ฅด๊ฒŒ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์บ์‹œ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. **/
49 fromUserName: string
50 fromUserId: string
51 fromUserAvatarSrc?: string
52 /** ์ด ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜๋ฉด ์ด ๊ฐ์ฒด์— ๋Œ€ํ•œ ์•Œ๋ฆผ ์ˆ˜์‹ ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. **/
53 optedOut?: boolean
54}
55

ํŽ˜์ด์ง€ ๊ตฌ์กฐ Internal Link

A Page ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๋Œ“๊ธ€์ด ์†ํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ๊ด€๊ณ„๋Š” urlId๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

A Page๋Š” ํŽ˜์ด์ง€ ์ œ๋ชฉ, ๋Œ“๊ธ€ ์ˆ˜, ๋ฐ urlId์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Page ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

ํŽ˜์ด์ง€ ๊ตฌ์กฐ
Copy Copy
1
2interface Page {
3 id: string
4 urlId: string
5 url: string
6 title?: string
7 createdAt: string
8 commentCount: number
9 rootCommentCount: number
10 /** ์ด๋ฅผ null๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  SSO ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฆฌ์ŠคํŠธ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ซํ˜€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. **/
11 accessibleByGroupIds?: string[] | null
12 /** ์ด ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ ๋Œ“๊ธ€ ์ž‘์„ฑ์— ๋Œ€ํ•ด ๋‹ซํ˜€ ์žˆ๋‚˜์š”? **/
13 isClosed?: boolean
14}
15

๋ณด๋ฅ˜ ์ค‘์ธ ์›นํ›„ํฌ ์ด๋ฒคํŠธ ๊ตฌ์กฐ Internal Link

A PendingWebhookEvent ๊ฐ์ฒด๋Š” ๋Œ€๊ธฐ ์ค‘์ธ ํ์— ์ €์žฅ๋œ ์›นํ›… ์ด๋ฒคํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

PendingWebhookEvent ๊ฐ์ฒด๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ API๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ 1๋…„ ํ›„ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ํ์—์„œ ์ž‘์—…์„ ์ œ๊ฑฐํ•˜๋Š” ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์œ ํ˜•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค - eventType (OutboundSyncEventType) ๋ฐ type (OutboundSyncType)์„ ํ™•์ธํ•˜์„ธ์š”.

์ด API์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” ๋งž์ถคํ˜• ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์ ์œผ๋กœ /count ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฃผ์–ด์ง„ ํ•„ํ„ฐ์— ๋Œ€ํ•œ ๋ฏธํ•ด๊ฒฐ ์ˆ˜๋ฅผ ํด๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PendingWebhookEvent ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

PendingWebhookEvent ๊ตฌ์กฐ
Copy Copy
1
2enum OutboundSyncEventType {
3 Create: 0,
4 Delete: 1,
5 Update: 2
6}
7
8enum OutboundSyncType {
9 /** WordPress ์ „์šฉ ๋™๊ธฐํ™” ์ž‘์—…. **/
10 WP: 0,
11 Webhook: 1
12}
13
14interface PendingWebhookEvent {
15 id: string
16 /** ์ด๋ฒคํŠธ์™€ ์—ฐ๊ด€๋œ ๋Œ“๊ธ€ ID. **/
17 commentId: string
18 /** ์ด๋ฒคํŠธ ์‹œ์ ์˜ ๋Œ“๊ธ€ ๊ฐ์ฒด. 2023๋…„ 11์›”๋ถ€ํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. **/
19 comment: Comment
20 /** ๋Œ“๊ธ€๊ณผ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ์™ธ๋ถ€ ID. **/
21 externalId: string | null
22 createdAt: Date
23 tenantId: string
24 attemptCount: number
25 /** ์ฒซ ์‹œ๋„ ์ „์— ์„ค์ •๋˜๋ฉฐ, ์‹คํŒจํ•  ๋•Œ๋งˆ๋‹ค ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค. **/
26 nextAttemptAt: Date
27 /** ์ƒ์„ฑ, ์‚ญ์ œ, ๋˜๋Š” ์—…๋ฐ์ดํŠธ ์ด๋ฒคํŠธ์ธ์ง€ ์—ฌ๋ถ€. **/
28 eventType: OutboundSyncEventType
29 /** ์ˆ˜ํ–‰ํ•  ๋™๊ธฐํ™” ์œ ํ˜• (WordPress, API ํ˜ธ์ถœ ๋“ฑ). **/
30 type: OutboundSyncType
31 /** ๋Œ“๊ธ€๊ณผ ์ผ์น˜ํ•œ ๋„๋ฉ”์ธ. ์ด ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ API ํ‚ค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. **/
32 domain: string
33 /** ๋ฐœ์ƒํ•œ ๋งˆ์ง€๋ง‰ ์˜ค๋ฅ˜. ์ด ํƒ€์ž…์€ ๊ตฌ์ฒด์ ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ ๋ฐœ์ƒํ•œ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๋คํ”„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ statusCode, body, headers ๋งต์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. **/
34 lastError: object | null
35}
36

SSO ์‚ฌ์šฉ์ž ๊ตฌ์กฐ Internal Link

FastComments๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด SSO ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. HMAC ๊ธฐ๋ฐ˜ ํ†ตํ•ฉ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ ํŽ˜์ด๋กœ๋“œ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๊ด€์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํ๋ฆ„ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSO User API๋Š” ์šฐ๋ฆฌ๊ฐ€ SSOUsers๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฐ์ฒด๋ฅผ CRUDํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋“ค์€ ์ผ๋ฐ˜ Users์™€ ๋‹ค๋ฅด๋ฉฐ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด ๋ถ„๋ฆฌ๋˜์–ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

SSOUser ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

SSOUser ๊ตฌ์กฐ
Copy Copy
1
2interface SSOUser {
3 id: string
4 username: string
5 email?: string
6 websiteUrl?: string
7 signUpDate: number
8 createdFromUrlId?: string
9 loginCount?: number
10 avatarSrc?: string
11 optedInNotifications?: boolean
12 optedInSubscriptionNotifications?: boolean
13 displayLabel?: string
14 displayName?: string
15 isAccountOwner?: boolean // ๊ด€๋ฆฌ์ž ๊ถŒํ•œ - ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ SSO ์‚ฌ์šฉ์ž๋Š” SSO ๊ด€๋ฆฌ์ž์œผ๋กœ ๊ณผ๊ธˆ๋ฉ๋‹ˆ๋‹ค (์ผ๋ฐ˜ SSO ์‚ฌ์šฉ์ž์™€ ๋ณ„๋„)
16 isAdminAdmin?: boolean // ๊ด€๋ฆฌ์ž ๊ถŒํ•œ - ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ SSO ์‚ฌ์šฉ์ž๋Š” SSO ๊ด€๋ฆฌ์ž์œผ๋กœ ๊ณผ๊ธˆ๋ฉ๋‹ˆ๋‹ค (์ผ๋ฐ˜ SSO ์‚ฌ์šฉ์ž์™€ ๋ณ„๋„)
17 isCommentModeratorAdmin?: boolean // ์ค‘์žฌ์ž ๊ถŒํ•œ - ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ SSO ์‚ฌ์šฉ์ž๋Š” SSO ์ค‘์žฌ์ž๋กœ ๊ณผ๊ธˆ๋ฉ๋‹ˆ๋‹ค (์ผ๋ฐ˜ SSO ์‚ฌ์šฉ์ž์™€ ๋ณ„๋„)
18 /** null์ด๋ฉด ์•ก์„ธ์Šค ์ œ์–ด๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฆฌ์ŠคํŠธ์ด๋ฉด ์ด ์‚ฌ์šฉ์ž๋Š” ์–ด๋–ค ํŽ˜์ด์ง€๋„ ๋ณผ ์ˆ˜ ์—†๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋ฅผ @mentionํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ์‚ฌ์šฉ์ž์˜ ํ”„๋กœํ•„์—์„œ ๋Œ“๊ธ€์„ ํฌํ•จํ•œ ํ™œ๋™์„ ๋ณด์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์•ˆ์ „ํ•œ ํ”„๋กœํ•„์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด true์ž…๋‹ˆ๋‹ค. **/
22 isProfileActivityPrivate?: boolean
23 /** ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ์‚ฌ์šฉ์ž์˜ ํ”„๋กœํ•„์— ๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ๊ธฐ์กด ํ”„๋กœํ•„ ๋Œ“๊ธ€์„ ๋ณด๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. **/
24 isProfileCommentsPrivate?: boolean
25 /** ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง์ ‘ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. **/
26 isProfileDMDisabled?: boolean
27 karma?: number
28 /** ์‚ฌ์šฉ์ž ๋ฐฐ์ง€์— ๋Œ€ํ•œ ์„ ํƒ์  ๊ตฌ์„ฑ. **/
29 badgeConfig?: {
30 /** ์‚ฌ์šฉ์ž์—๊ฒŒ ํ• ๋‹นํ•  ๋ฐฐ์ง€ ID์˜ ๋ฐฐ์—ด. ์ตœ๋Œ€ 30๊ฐœ์˜ ๋ฐฐ์ง€๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. **/
31 badgeIds: string[]
32 /** true์ด๋ฉด ํ‘œ์‹œ๋œ ๋ชจ๋“  ๊ธฐ์กด ๋ฐฐ์ง€๋ฅผ ์ œ๊ณต๋œ ๋ฐฐ์ง€๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. false์ด๋ฉด ๊ธฐ์กด ๋ฐฐ์ง€์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. **/
33 override?: boolean
34 /** true์ด๋ฉด ํ…Œ๋„ŒํŠธ ๊ตฌ์„ฑ์—์„œ ๋ฐฐ์ง€ ํ‘œ์‹œ ์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. **/
35 update?: boolean
36 }
37}
38

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์ด๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ๋„ŒํŠธ ๊ตฌ์„ฑ์—์„œ ๋ฐฐ์ง€ ํ‘œ์‹œ ์†์„ฑ์ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ๋… ๊ตฌ์กฐ Internal Link

Subscription ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ์ž์˜ ๊ตฌ๋…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Subscription ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ“๊ธ€ ์œ„์ ฏ์˜ ์•Œ๋ฆผ ๋ฒจ์„ ํด๋ฆญํ•˜๊ณ  "์ด ํŽ˜์ด์ง€ ๊ตฌ๋…"์„ ํด๋ฆญํ•  ๋•Œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ๋…์€ API๋ฅผ ํ†ตํ•ด์„œ๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Subscription ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ์—ฐ๊ด€๋œ ํŽ˜์ด์ง€์˜ ๋ฃจํŠธ์— ์ƒˆ ๋Œ“๊ธ€์ด ๋‚จ๊ฒจ์งˆ ๋•Œ ํ•ด๋‹น Subscription์˜ ๋Œ€์ƒ์ธ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด Notification ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ด๋ฉ”์ผ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ ์ „์†ก์€ ์‚ฌ์šฉ์ž ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” optedInNotifications์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. SSO ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” optedInSubscriptionNotifications์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์›น์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํŽ˜์ด์ง€ ๊ฐœ๋…์ด ์—†์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ๊ตฌ๋…ํ•˜๋ ค๋Š” ํ•ญ๋ชฉ์˜ id(๋Œ“๊ธ€ ์œ„์ ฏ์— ์ „๋‹ฌํ•  urlId์™€ ๋™์ผํ•œ ๊ฐ’)๋ฅผ urlId์— ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Subscription ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

๊ตฌ๋… ๊ตฌ์กฐ
Copy Copy
1
2interface Subscription {
3 id: string
4 tenantId: string
5 /** SSO์˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž id๋Š” `<tenant id>:<user id>` ํ˜•์‹์ž…๋‹ˆ๋‹ค. **/
6 userId: string
7 anonUserId?: string
8 urlId: string
9 url?: string
10 pageTitle?: string
11 createdAt: string // ๋‚ ์งœ ๋ฌธ์ž์—ด
12}
13

ํ…Œ๋„ŒํŠธ ์ผ๋ณ„ ์‚ฌ์šฉ๋Ÿ‰ ๊ตฌ์กฐ Internal Link

A TenantDailyUsage ๊ฐ์ฒด๋Š” ํŠน์ • ๋‚ ์งœ์— ๋Œ€ํ•œ ํ…Œ๋„ŒํŠธ์˜ ์‚ฌ์šฉ๋Ÿ‰์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํŠน์ • ํ…Œ๋„ŒํŠธ๊ฐ€ ํ•ด๋‹น ๋‚ ์งœ์— ํ™œ๋™์ด ์—†์—ˆ๋‹ค๋ฉด ๊ทธ ๋‚ ์งœ์—๋Š” TenantDailyUsage ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

The TenantDailyUsage object is not real time and may be minutes behind actual usage.

TenantDailyUsage ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

TenantDailyUsage ๊ตฌ์กฐ
Copy Copy
1
2export interface TenantDailyUsage {
3 yearNumber: number
4 monthNumber: number
5 dayNumber: number
6 commentFetchCount?: number
7 commentCreateCount?: number
8 conversationCreateCount?: number
9 voteCount?: number
10 accountCreatedCount?: number
11 userMentionSearch?: number
12 hashTagSearch?: number
13 gifSearchTrending?: number
14 gifSearch?: number
15 apiCreditsUsed?: number
16 createdAt: string
17 billed: boolean
18 /** ์ฒญ๊ตฌ์—์„œ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. **/
19 ignored: boolean
20}
21

ํ…Œ๋„ŒํŠธ ๊ตฌ์กฐ Internal Link

Tenant๋Š” FastComments.com์˜ ๊ณ ๊ฐ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ™”์ดํŠธ ๋ผ๋ฒจ๋ง ๊ถŒํ•œ์ด ์žˆ๋Š” ํ…Œ๋„ŒํŠธ๋Š” API๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”์ดํŠธ ๋ผ๋ฒจ ํ…Œ๋„ŒํŠธ๋Š” ๋‹ค๋ฅธ ํ™”์ดํŠธ ๋ผ๋ฒจ ํ…Œ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ค‘์ฒฉ์€ ํ•œ ๋‹จ๊ณ„๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค).

๋‹ค์Œ์€ Tenant ๊ฐ์ฒด์˜ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค:

ํ…Œ๋„ŒํŠธ ๊ตฌ์กฐ
Copy Copy
1
2export enum SiteType {
3 Unknown = 0,
4 WordPress = 1
5}
6
7/** ์ด๋Š” DomainConfig API๋กœ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **/
8export interface TenantDomainConfig {
9 domain: string
10 emailFromName?: string
11 emailFromEmail?: string
12 createdAt?: string,
13 siteType?: FastCommentsSiteType, // ์•„๋งˆ Unknown์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค
14 logoSrc?: string, // ์›๋ณธ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ
15 logoSrc100px?: string, // ์ธ๋„ค์ผ์šฉ์œผ๋กœ ๋ฆฌ์‚ฌ์ด์ฆˆ๋จ
16 footerUnsubscribeURL?: string,
17 emailHeaders?: Record<string, string>,
18 disableUnsubscribeLinks?: boolean,
19 dkim?: {
20 domainName: string,
21 keySelector: string,
22 privateKey: string
23 }
24}
25
26export interface TenantBillingInfo {
27 name: string
28 address: string
29 city: string
30 state: string
31 zip: string
32 country: string
33}
34
35export enum TenantPaymentFrequency {
36 Monthly = 0,
37 Annually = 1
38}
39
40export interface Tenant {
41 id: string
42 name: string
43 email?: string
44 signUpDate: number; // '๋ ˆ๊ฑฐ์‹œ' ์ด์œ ๋กœ number ํƒ€์ž…์ž…๋‹ˆ๋‹ค
45 packageId?: string | null
46 paymentFrequency?: TenantPaymentFrequency
47 billingInfoValid?: boolean
48 billingHandledExternally?: boolean
49 createdBy?: string
50 isSetup?: boolean
51 domainConfiguration: FastCommentsAPITenantDomainConfig[]
52 billingInfo?: FastCommentsAPITenantBillingInfo
53 stripeCustomerId?: string
54 stripeSubscriptionId?: string
55 stripePlanId?: string
56 enableProfanityFilter?: boolean
57 enableSpamFilter?: boolean
58 lastBillingIssueReminderDate?: string
59 removeUnverifiedComments?: boolean
60 unverifiedCommentsTTLms?: number
61 commentsRequireApproval?: boolean
62 autoApproveCommentOnVerification?: boolean
63 sendProfaneToSpam?: boolean
64 /** @readonly - packageId๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. **/
65 hasFlexPricing?: boolean
66 /** @readonly **/
67 flexLastBilledAmount?: number
68 /** @readonly - packageId๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. **/
69 hasAuditing?: boolean
70 /** ํ…Œ๋„ŒํŠธ์— ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜์—ฌ ์ฟผ๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค์—๋Š” "." ๋˜๋Š” "$"๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†๊ณ  ๊ธธ์ด๋Š” 100์ž๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ 2k ๋ฌธ์ž๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. **/
71 meta?: Record<string, string | null>
72}
73

์‚ฌ์šฉ์ž ๊ตฌ์กฐ Internal Link

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 ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

User ๊ตฌ์กฐ
Copy Copy
1
2export interface User {
3 /** ์ด๊ฒƒ์€ ๋Œ“๊ธ€ ๊ฐ์ฒด์˜ userId๋กœ๋„ ์‚ฌ์šฉ๋˜๋Š” id์ž…๋‹ˆ๋‹ค. **/
4 id: string
5 username: string
6 /** ์˜ˆ: ๋Œ“๊ธ€ ์ž‘์„ฑ์ž์˜ ๋ธ”๋กœ๊ทธ ๋งํฌ์ž…๋‹ˆ๋‹ค. **/
7 websiteUrl?: string
8 email: string
9 signUpDate: number
10 createdFromUrlId: string
11 createdFromTenantId: string
12 avatarSrc?: string
13 locale: FastCommentsLocale
14 displayLabel?: string
15 karma?: number
16}
17

ํˆฌํ‘œ ๊ตฌ์กฐ Internal Link


Vote ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‚จ๊ธด ํˆฌํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋Œ“๊ธ€๊ณผ ํˆฌํ‘œ ๊ฐ„์˜ ๊ด€๊ณ„๋Š” commentId๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

Vote ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

Vote ๊ตฌ์กฐ
Copy Copy
1
2interface Vote {
3 id: string
4 urlId: string
5 commentId: string
6 userId: string
7 direction: 1 | -1
8 createdAt: string
9}
10

์งˆ๋ฌธ ๊ตฌ์„ฑ ๊ตฌ์กฐ Internal Link

FastComments๋Š” ์งˆ๋ฌธ์„ ๊ตฌ์„ฑํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ง‘๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธ์˜ ์˜ˆ(์ดํ•˜ QuestionConfig๋ผ๊ณ  ํ•จ)๋Š” ๋ณ„์ , ์Šฌ๋ผ์ด๋”, ๋˜๋Š” NPS ์งˆ๋ฌธ(type์— ์˜ํ•ด ๊ฒฐ์ •๋  ์ˆ˜ ์žˆ์Œ)์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ ๋ฐ์ดํ„ฐ๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ, ํ•จ๊ป˜, ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ผ, ์ „์ฒด์ ์œผ๋กœ, ํŽ˜์ด์ง€๋ณ„๋กœ ๋“ฑ์œผ๋กœ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์œ„์ ฏ(์ด API ์•ž์— ์„œ๋ฒ„๋ฅผ ๋‘๋Š” ๋ฐฉ์‹), ๊ด€๋ฆฌ์ž ๋Œ€์‹œ๋ณด๋“œ ๋ฐ ๋ฆฌํฌํŒ… ๋„๊ตฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € QuestionConfig๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

QuestionConfig ๊ตฌ์กฐ
Copy Copy
1
2type QuestionConfigType = 'nps' | 'slider' | 'star' | 'thumbs';
3
4interface QuestionConfig {
5 id: string
6 tenantId: string
7 name: string
8 question: string
9 helpText?: string
10 createdAt: string
11 createdBy: string
12 /** ์ฝ๊ธฐ ์ „์šฉ - ๊ฐ ์ƒˆ ์‘๋‹ต๋งˆ๋‹ค ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. **/
13 usedCount: number
14 /** ๊ตฌ์„ฑ์ด ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ(๊ฒฐ๊ณผ๊ฐ€ ๋‚จ๊ฒจ์ง„)๋œ ์‹œ์ ์˜ ๋‚ ์งœ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. **/
15 lastUsed?: string
16 type: QuestionConfigType
17 numStars?: number
18 min?: number
19 max?: number
20 defaultValue?: number
21 labelNegative?: string
22 labelPositive?: string
23 subQuestionIds?: string[]
24 alwaysShowSubQuestions?: boolean
25 reportingOrder: number
26}
27

์งˆ๋ฌธ ๊ฒฐ๊ณผ ๊ตฌ์กฐ Internal Link

์งˆ๋ฌธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด QuestionResult๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์งˆ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ๊ณ , ๋˜ํ•œ ๋ณด๊ณ  ๋ชฉ์ ์„ ์œ„ํ•ด ๋Œ“๊ธ€์— ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

QuestionResult ๊ตฌ์กฐ
Copy Copy
1
2interface QuestionResultMeta {
3 name: string
4 values: string[]
5}
6
7interface QuestionResult {
8 id: string
9 tenantId: string
10 urlId: string
11 anonUserId?: string
12 userId?: string
13 createdAt?: string
14 value: number
15 commentId?: string
16 questionId: string
17 meta?: QuestionResultMeta[]
18}
19

์‚ฌ์šฉ์ž ๋ฐฐ์ง€ ๊ตฌ์กฐ Internal Link

UserBadge๋Š” FastComments ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ• ๋‹น๋œ ๋ฐฐ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋ฐฐ์ง€๋Š” ํ™œ๋™(์˜ˆ: ๋Œ“๊ธ€ ์ˆ˜, ์‘๋‹ต ์‹œ๊ฐ„, ๋ฒ ํ…Œ๋ž‘ ์ƒํƒœ)์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ• ๋‹น๋˜๊ฑฐ๋‚˜ ์‚ฌ์ดํŠธ ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

The structure for the UserBadge object is as follows:

UserBadge ๊ตฌ์กฐ
Copy Copy
1
2export interface UserBadge {
3 /** ์ด ์‚ฌ์šฉ์ž ๋ฐฐ์ง€ ํ• ๋‹น์˜ ๊ณ ์œ  ์‹๋ณ„์ž */
4 id: string
5 /** ์ด ๋ฐฐ์ง€๊ฐ€ ํ• ๋‹น๋œ ์‚ฌ์šฉ์ž์˜ ID */
6 userId: string
7 /** ํ…Œ๋„ŒํŠธ์˜ ๋ฐฐ์ง€ ์นดํƒˆ๋กœ๊ทธ์— ์žˆ๋Š” ๋ฐฐ์ง€ ์ •์˜์˜ ID */
8 badgeId: string
9 /** ์ด ๋ฐฐ์ง€๋ฅผ ์ƒ์„ฑ/ํ• ๋‹นํ•œ ํ…Œ๋„ŒํŠธ์˜ ID */
10 fromTenantId: string
11 /** ์ด ๋ฐฐ์ง€๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ๊ฐ (์—ํฌํฌ ์ดํ›„ ๋ฐ€๋ฆฌ์ดˆ) */
12 createdAt?: number
13 /** ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋ฐฐ์ง€๋ฅผ ๋ฐ›์€ ์‹œ๊ฐ (์—ํฌํฌ ์ดํ›„ ๋ฐ€๋ฆฌ์ดˆ) */
14 receivedAt?: number
15 /**
16 * ๋ฐฐ์ง€ ์œ ํ˜•:
17 * 0=CommentCount, 1=CommentUpVotes, 2=CommentReplies, 3=CommentsPinned,
18 * 4=Veteran, 5=NightOwl, 6=FastReplyTime, 7=ModeratorCommentsDeleted,
19 * 8=ModeratorCommentsApproved, 9=ModeratorCommentsUnapproved, 10=ModeratorCommentsReviewed,
20 * 11=ModeratorCommentsMarkedSpam, 12=ModeratorCommentsMarkedNotSpam, 13=RepliedToSpecificPage,
21 * 14=Manual
22 */
23 type: number
24 /** ์ž„๊ณ„๊ฐ’ ๊ธฐ๋ฐ˜ ๋ฐฐ์ง€์˜ ์ž„๊ณ„๊ฐ’ */
25 threshold?: number
26 /** ๋ฐฐ์ง€์˜ ์ด๋ฆ„/๋ ˆ์ด๋ธ” */
27 name?: string
28 /** ๋ฐฐ์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… */
29 description?: string
30 /** ๋ฐฐ์ง€์— ํ‘œ์‹œ๋˜๋Š” ํ…์ŠคํŠธ */
31 displayLabel?: string
32 /** ๋ฐฐ์ง€์— ํ‘œ์‹œ๋˜๋Š” ์ด๋ฏธ์ง€์˜ URL */
33 displaySrc?: string
34 /** ๋ฐฐ์ง€์˜ ๋ฐฐ๊ฒฝ์ƒ‰ (ํ—ฅ์Šค ์ฝ”๋“œ) */
35 backgroundColor?: string
36 /** ๋ฐฐ์ง€์˜ ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ (ํ—ฅ์Šค ์ฝ”๋“œ) */
37 borderColor?: string
38 /** ๋ฐฐ์ง€์˜ ํ…์ŠคํŠธ ์ƒ‰์ƒ (ํ—ฅ์Šค ์ฝ”๋“œ) */
39 textColor?: string
40 /** ์Šคํƒ€์ผ๋ง์„ ์œ„ํ•œ ์ถ”๊ฐ€ CSS ํด๋ž˜์Šค */
41 cssClass?: string
42 /** ๋ฒ ํ…Œ๋ž‘ ๋ฐฐ์ง€์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„ ์ž„๊ณ„๊ฐ’(๋ฐ€๋ฆฌ์ดˆ) */
43 veteranUserThresholdMillis?: number
44 /** ์ด ๋ฐฐ์ง€๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋Œ“๊ธ€์— ํ‘œ์‹œ๋˜๋Š”์ง€ ์—ฌ๋ถ€ */
45 displayedOnComments: boolean
46 /** ๋ฐฐ์ง€์˜ ํ‘œ์‹œ ์ˆœ์„œ */
47 order?: number
48}
49
---

์‚ฌ์šฉ์ž ๋ฐฐ์ง€ ์ง„ํ–‰๋ฅ  ๊ตฌ์กฐ Internal Link

UserBadgeProgress๋Š” FastComments ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์–‘ํ•œ ๋ฐฐ์ง€๋ฅผ ํš๋“ํ•˜๊ธฐ ์œ„ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์ด ์ถ”์ ์€ ์‚ฌ์šฉ์ž์˜ ํ™œ๋™ ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฐธ์—ฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ธ์ œ ์ž๋™์œผ๋กœ ๋ฐฐ์ง€๋ฅผ ์ˆ˜์—ฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

The structure for the UserBadgeProgress object is as follows:

UserBadgeProgress ๊ตฌ์กฐ
Copy Copy
1
2export interface UserBadgeProgress {
3 /** ์ด ์ง„ํ–‰ ๊ธฐ๋ก์˜ ๊ณ ์œ  ์‹๋ณ„์ž */
4 id: string
5 /** ์ด ์ง„ํ–‰ ๊ธฐ๋ก์ด ์†ํ•œ ํ…Œ๋„ŒํŠธ์˜ ID */
6 tenantId: string
7 /** ์ด ์ง„ํ–‰ ๊ธฐ๋ก์ด ์ถ”์ ํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ID */
8 userId: string
9 /** ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ฒซ ๋Œ“๊ธ€ ID */
10 firstCommentId?: string
11 /** ์‚ฌ์šฉ์ž์˜ ์ฒซ ๋Œ“๊ธ€ ๋‚ ์งœ(์—ํฌํฌ ์ดํ›„ ๋ฐ€๋ฆฌ์ดˆ) */
12 firstCommentDate?: number
13 /** ์‚ฌ์šฉ์ž ํ™œ๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ๊ณ„์‚ฐ๋œ ์‹ ๋ขฐ๋„ */
14 autoTrustFactor?: number
15 /** ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•œ ์‹ ๋ขฐ๋„ */
16 manualTrustFactor?: number
17 /** ์—ฌ๋Ÿฌ ์ง€ํ‘œ๋ฅผ ํฌํ•จํ•œ ์ƒ์„ธ ์ง„ํ–‰ ๊ฐ์ฒด, ํ‚ค๋Š” BadgeType ์—ด๊ฑฐํ˜•๊ณผ ์ผ์น˜ํ•จ */
18 progress: {
19 /** 0: CommentCount - ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๋Œ“๊ธ€ ์ˆ˜ */
20 '0'?: number
21 /** 1: CommentUpVotes - ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ›์€ ์ถ”์ฒœ(์—…๋ณดํŠธ) ์ˆ˜ */
22 '1'?: number
23 /** 2: CommentReplies - ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๋‹ต๊ธ€ ์ˆ˜ */
24 '2'?: number
25 /** 3: CommentsPinned - ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ์ •ํ•œ ๋Œ“๊ธ€ ์ˆ˜ */
26 '3'?: number
27 /** 4: Veteran - ์‚ฌ์šฉ์ž ๊ณ„์ • ์ƒ์„ฑ ํ›„ ๊ฒฝ๊ณผ ์‹œ๊ฐ„ */
28 '4'?: number
29 /** 5: NightOwl - ์‚ฌ์šฉ์ž๊ฐ€ ์•ผ๊ฐ„ ์‹œ๊ฐ„๋Œ€์— ๊ฒŒ์‹œํ•œ ํšŸ์ˆ˜ */
30 '5'?: number
31 /** 6: FastReplyTime - ํ‰๊ท  ๋‹ต๊ธ€ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ) */
32 '6'?: number
33 /** 7: ModeratorCommentsDeleted - ๋ชจ๋”๋ ˆ์ดํ„ฐ ๋ฐฐ์ง€์˜ ๊ฒฝ์šฐ ์‚ญ์ œ๋œ ๋Œ“๊ธ€ ์ˆ˜ */
34 '7'?: number
35 /** 8: ModeratorCommentsApproved - ๋ชจ๋”๋ ˆ์ดํ„ฐ ๋ฐฐ์ง€์˜ ๊ฒฝ์šฐ ์Šน์ธ๋œ ๋Œ“๊ธ€ ์ˆ˜ */
36 '8'?: number
37 /** 9: ModeratorCommentsUnapproved - ๋ชจ๋”๋ ˆ์ดํ„ฐ ๋ฐฐ์ง€์˜ ๊ฒฝ์šฐ ๋ฏธ์Šน์ธ๋œ ๋Œ“๊ธ€ ์ˆ˜ */
38 '9'?: number
39 /** 10: ModeratorCommentsReviewed - ๋ชจ๋”๋ ˆ์ดํ„ฐ ๋ฐฐ์ง€์˜ ๊ฒฝ์šฐ ๊ฒ€ํ† ๋œ ๋Œ“๊ธ€ ์ˆ˜ */
40 '10'?: number
41 /** 11: ModeratorCommentsMarkedSpam - ๋ชจ๋”๋ ˆ์ดํ„ฐ ๋ฐฐ์ง€์˜ ๊ฒฝ์šฐ ์ŠคํŒธ์œผ๋กœ ํ‘œ์‹œ๋œ ๋Œ“๊ธ€ ์ˆ˜ */
42 '11'?: number
43 /** 12: ModeratorCommentsMarkedNotSpam - ๋ชจ๋”๋ ˆ์ดํ„ฐ ๋ฐฐ์ง€์˜ ๊ฒฝ์šฐ ์ŠคํŒธ ์•„๋‹˜์œผ๋กœ ํ‘œ์‹œ๋œ ๋Œ“๊ธ€ ์ˆ˜ */
44 '12'?: number
45 /** 13: RepliedToSpecificPage - ๊ฐ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋‹ต๊ธ€ ์ˆ˜ */
46 '13'?: Record<string, number>
47 }
48}
49

๊ฒฐ๋ก 

์ €ํฌ API ๋ฌธ์„œ๊ฐ€ ํฌ๊ด„์ ์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์› ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์•„๋ž˜์— ์•Œ๋ ค์ฃผ์„ธ์š”.