FastComments.com

लाइव टिप्पणी APIs

FastComments API

FastComments कई संसाधनों (resources) के साथ इंटरैक्ट करने के लिए एक API प्रदान करता है। हमारे प्लेटफ़ॉर्म के साथ इंटीग्रेशन बनाएं, या अपने स्वयं के क्लाइंट भी बनाएं!

इस दस्तावेज़ीकरण में, आपको API द्वारा समर्थित सभी संसाधनों का दस्तावेज़ीकरण उनके रिक्वेस्ट और रिस्पॉन्स प्रकारों के साथ मिलेगा।

Enterprise ग्राहकों के लिए, सभी API एक्सेस Audit Log में कैप्चर किया जाता है।

जेनरेट किए गए SDKs

FastComments अब हमारे कोड से एक API Spec जेनरेट करता है (यह अभी पूरा नहीं है, लेकिन इसमें कई APIs शामिल हैं)।

हमारे पास अब लोकप्रिय भाषाओं के लिए SDKs भी हैं:

प्रमाणीकरण (Authentication)

API आपकी api key को X-API-KEY हेडर या API_KEY क्वेरी पैरामीटर के रूप में पास करके प्रमाणित की जाती है। API कॉल करने के लिए आपको अपनी tenantId भी चाहिए होगी। यह आपकी api key वाले उसी पेज से प्राप्त की जा सकती है।

सुरक्षा नोट

इन रूट्स को सर्वर से कॉल करने के लिए ही है। इन्हें ब्राउज़र से कॉल न करें। ऐसा करने से आपकी API key उजागर हो जाएगी - इससे आपके खाते तक पूर्ण एक्सेस उन सभी को मिल जाएगा जो किसी पेज का सोर्स कोड देख सकते हैं!

प्रमाणीकरण विकल्प एक - Headers

  • Header: X-API-KEY
  • Header: X-TENANT-ID

प्रमाणीकरण विकल्प दो - Query Parameters

  • Query Param: API_KEY
  • Query Param: tenantId

प्रमाणीकरण विकल्प तीन - OAuth Bearer Token

  • Header: Authorization: Bearer fcat_...

Zapier जैसे थर्ड-पार्टी एप्लिकेशन और MCP server के क्लाइंट API key के बजाय OAuth के माध्यम से एक टोकन प्राप्त करते हैं। वह टोकन यहाँ हर एंडपॉइंट पर काम करता है। टोकन से tenant निहित रहता है, इसलिए tenantId वैकल्पिक है, लेकिन दिया जाने पर यह टोकन से मेल खाना चाहिए। GET रिक्वेस्ट को read स्कोप की आवश्यकता होती है और हर अन्य मेथड को write स्कोप की। पूरा फ़्लो, जिसमें क्लाइंट रजिस्ट्रेशन, PKCE, रिफ्रेश और रिवोकेशन शामिल है, OAuth Authorization के अंतर्गत दस्तावेज़ित है। डिस्कवरी https://fastcomments.com/.well-known/oauth-authorization-server से शुरू होती है।

अपने स्वयं के राइट्स पढ़ना (Reading Your Own Writes)

FastComments Active-Active उपलब्धता प्रदान करता है। आपके डेटासेंटर से रिक्वेस्ट आपके निकटतम पॉइंट ऑफ़ प्रेज़ेंस पर रूट की जाती हैं। यह स्वचालित है, और सामान्यतः आप read-your-write सिमेंटिक्स देख सकते हैं। यदि आप यह सुनिश्चित करना चाहते हैं कि आप अपने स्वयं के राइट्स पढ़ें, तो आप उस क्षेत्र को अपने API होस्ट के रूप में उपयोग करके अपनी रिक्वेस्ट को एक निश्चित क्षेत्र (region) पर पिन कर सकते हैं (हालाँकि अधिकांश इंटीग्रेशन के लिए यह सामान्यतः आवश्यक नहीं है):

  • gdc-oregon.fastcomments.com
  • gdc-virginia.fastcomments.com
  • gdc-singapore.fastcomments.com
  • gdc-falkenstein2.fastcomments.com
  • gdc-sao-paulo.fastcomments.com
  • eudc-helsinki2.fastcomments.com
  • eudc-limburg.fastcomments.com
  • eudc-france.fastcomments.com

ध्यान दें कि यदि आप ऐसा करते हैं तो आप एक फ़ॉलबैक परिभाषित करना चाह सकते हैं, क्योंकि हमने अतीत में एंट्रीपॉइंट नोड्स को deprecated किया है और स्विचओवर के लिए नए नामों का उपयोग किया है।

AuditLog संरचना Internal Link

एक AuditLog एक ऐसा ऑब्जेक्ट है जो उन टेनेंट्स के लिए ऑडिट की गई घटना को दर्शाता है जिनके पास इस सुविधा तक पहुँच है।

AuditLog ऑब्जेक्ट की संरचना इस प्रकार है:

AuditLog संरचना
Copy Copy
1
2interface AuditLog {
3 id: string;
4 /** घटना किसने की। **/
5 userId?: string;
6 username?: string;
7 resourceName: string;
8 crudType: 'c' | 'r' | 'u' | 'd' | 'login';
9 from: string;
10 url?: string;
11 ip?: string;
12 /** वह ब्राउज़र जिसने घटना की, जब वह किसी ब्राउज़र से आई हो। **/
13 ua?: string;
14 /** उस सेशन का हैश जिससे घटना आई, एक व्यक्ति की क्रियाओं को सहसंबंधित करने के लिए। कभी भी सेशन स्वयं नहीं। **/
15 sIdHashed?: string;
16 when: string;
17 description?: string;
18 serverStartDate: string;
19 /** उस ऑब्जेक्ट की id जिस पर घटना की गई, इसके विपरीत कि किसने की। **/
20 targetId?: string;
21 /** उस ऑब्जेक्ट के लिए मानव-पठनीय लेबल, जैसे "jsmith (jsmith@example.com)"। **/
22 targetLabel?: string;
23 objectDetails?: object;
24}
25

targetId और targetLabel यह बताते हैं कि घटना किस पर की गई; userId और username यह बताते हैं कि उसे किसने की। अपडेट के लिए, objectDetails.changes में वास्तव में क्या बदला, इसका एक {field: {from, to}} मैप होता है।

ऑडिट लॉग अपरिवर्तनीय (immutable) है। इसे मैन्युअल रूप से लिखा भी नहीं जा सकता। FastComments.com ही तय कर सकता है कि ऑडिट लॉग में कब लिखा जाए। हालाँकि, आप इस API के माध्यम से इसे पढ़ सकते हैं।

ऑडिट लॉग में घटनाएँ दो साल बाद समाप्त हो जाती हैं।

BatchJob संरचना Internal Link

एक BatchJob एक लंबे समय तक चलने वाला कार्य होता है, जैसे कोई import, export, या page migration। Jobs को queue में रखा जाता है, फिर background में उठाया और चलाया जाता है।

processedCount और totalCount प्रगति दिखाते हैं। इनकी इकाई type पर निर्भर करती है:

  • migrate-pages: पूर्ण हुई migrations, अनुरोधित migrations में से।
  • undo-page-migration: पुनर्स्थापित records। यहाँ कोई totalCount नहीं होता।
  • import, export और अन्य jobs: प्रोसेस की गई rows।

BatchJob object की संरचना इस प्रकार है:

BatchJob संरचना
Copy Copy
1
2interface BatchJob {
3 id: string
4 /** उदाहरण के लिए migrate-pages, undo-page-migration, migrate-domains, import, export, users-export या copy-comments। **/
5 type: string
6 status: 'requested' | 'running' | 'success' | 'failed'
7 createdAt: string
8 completedAt?: string
9 processedCount: number
10 /** कुल कार्य, जब यह पहले से ज्ञात हो। **/
11 totalCount?: number
12 /** migrate-pages: प्रत्येक पूर्ण हुई migration के लिए एक entry, अनुरोध के क्रम में। **/
13 pageMigrationResults?: Array<PageMigrationSuccess | PageMigrationFailure>
14 /**
15 * migrate-pages: job पूर्ण होने पर (success या failed) एक बार सेट होता है। 90 दिनों के भीतर POST /api/v1/pages/migrations/:undoId/undo को पास करें।
16 * undo-page-migration: जो migration पूर्ववत की जा रही है।
17 **/
18 undoId?: string
19 /** undo-page-migration: job पूर्ण होने पर सेट होता है। **/
20 pageMigrationUndoResult?: PageMigrationUndoResult
21}
22
23interface PageMigrationSuccess {
24 from: string
25 to: string
26 type: 'urlId' | 'domain'
27 status: 'success'
28 commentsMigrated: number
29}
30
31interface PageMigrationFailure {
32 from: string
33 to: string
34 type: 'urlId' | 'domain'
35 status: 'failed'
36 code: string
37 reason: string
38}
39
40interface PageMigrationUndoResult {
41 /** Records जिन्हें migration से पहले के मानों पर वापस रखा गया। **/
42 restored: number
43 /** Records जिन्हें छोड़ दिया गया क्योंकि वे migration के बाद बदल गए थे, या अब मौजूद नहीं हैं। **/
44 skipped: number
45 /** Records जिन्हें migration ने pages merge करते समय delete किया। इन्हें वापस लाया नहीं जा सकता। **/
46 notRestorable: number
47}
48

Retries

यदि page migration job चलाने वाला server restart हो जाता है, तो job वापस queue में चला जाता है और अंतिम पूर्ण हुई migration के बाद से फिर शुरू होता है। एक job को अधिकतम 3 बार try किया जाता है, जिसके बाद उसका status failed हो जाता है।

Comment संरचना Internal Link

एक Comment ऑब्जेक्ट किसी उपयोगकर्ता द्वारा छोड़ी गई टिप्पणी को दर्शाता है।

पैरेंट और चाइल्ड कमेंट्स के बीच संबंध parentId के माध्यम से परिभाषित होता है।

Comment ऑब्जेक्ट की संरचना इस प्रकार है:

Comment संरचना
Copy Copy
1
2interface Comment {
3 /** READONLY: यदि स्पैम इंजन ने कमेंट को स्पैम निर्धारित किया तो 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 /** READONLY: कमेंटर की कमेंट 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 /** READONLY: कमेंट कितनी बार फ्लैग की गई। **/
28 flagCount?: number
29 /** कमेंट में लिखे गए #hashtags जो सफलतापूर्वक पार्स हुए। आप क्वेरी के लिए मैन्युअल रूप से भी हैशटैग जोड़ सकते हैं, लेकिन वे कमेंट टेक्स्ट में स्वतः डिस्प्ले नहीं होंगे। **/
30 hashTags?: CommentHashTag[]
31 /** READONLY: क्या कमेंट में इमेज हैं? **/
32 hasImages?: boolean
33 /** READONLY: क्या कमेंट में लिंक हैं? **/
34 hasLinks?: boolean
35 /** READONLY: अद्वितीय कमेंट आईडी। **/
36 id: string
37 /** केवल बनाते समय! इसे स्टोरेज के लिए हैश किया जाता है। **/
38 ip?: string
39 /** READONLY: क्या वर्तमान उपयोगकर्ता ने इस कमेंट को लिखने वाले उपयोगकर्ता को ब्लॉक किया है? **/
40 isBlocked?: boolean
41 /** READONLY: क्या कमेंट एडमिन द्वारा है? userId के आधार पर स्वतः सेट होता है। **/
42 isByAdmin?: boolean
43 /** READONLY: क्या कमेंट मॉडरेटर द्वारा है? userId के आधार पर स्वतः सेट होता है। **/
44 isByModerator?: boolean
45 /** यदि कमेंट सॉफ्ट डिलीट की गई थी तो true पर सेट (कुछ अन्य कॉन्फ़िगरेशन के कारण प्लेसहोल्डर छोड़ना पड़ा)। **/
46 isDeleted?: boolean
47 /** यदि उपयोगकर्ता का खाता डिलीट हो गया था और कमेंट को बनाए रखना पड़ा तो true पर सेट। **/
48 isDeletedUser?: boolean
49 /** READONLY: क्या वर्तमान में लॉग-इन उपयोगकर्ता (contextUserId) द्वारा फ्लैग की गई है? **/
50 isFlagged?: boolean
51 /** क्या कमेंट पिन की गई है? **/
52 isPinned?: boolean
53 /** क्या कमेंट लॉक है? true होने पर, अनलॉक होने तक कोई भी (मॉडरेटर सहित) उत्तर, संपादन या डिलीट नहीं कर सकता। **/
54 isLocked?: boolean
55 /** क्या कमेंट स्पैम है? **/
56 isSpam?: boolean
57 /** READONLY: क्या वर्तमान उपयोगकर्ता (contextUserId) के लिए कमेंट डाउनवोट की गई है? **/
58 isVotedDown?: boolean
59 /** READONLY: क्या वर्तमान उपयोगकर्ता (contextUserId) के लिए कमेंट अपवोट की गई है? **/
60 isVotedUp?: boolean
61 /** कमेंट की लोकेल। यदि प्रदान नहीं की गई, तो language accept HTTP हेडर से प्राप्त की जाएगी। **/
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 /** READONLY: कमेंट में लिखे गए @mentions जो सफलतापूर्वक पार्स हुए। **/
64 mentions?: CommentUserMention[]
65 /** कमेंट से जुड़ा वैकल्पिक मेटाडेटा। **/
66 meta?: Record<string, string | number | boolean>
67 /** इस कमेंट से जुड़े मॉडरेशन ग्रुप आईडी की वैकल्पिक सूची। **/
68 moderationGroupIds?: string[]|null
69 /** READONLY: इस कमेंट पर वर्तमान उपयोगकर्ता (contextUserId) के वोट से संबंधित वोट ऑब्जेक्ट की आईडी। **/
70 myVoteId?: string
71 /** क्या इस कमेंट के लिए कमेंटर्स को सूचनाएं भेजी गईं। इंपोर्ट पर सूचनाएं भेजने से रोकने के लिए, इसे true पर सेट करें। **/
72 notificationSentForParent?: boolean
73 /** क्या इस कमेंट के लिए टेनेंट उपयोगकर्ताओं को सूचनाएं भेजी गईं। इंपोर्ट पर सूचनाएं भेजने से रोकने के लिए, इसे true पर सेट करें। **/
74 notificationSentForParentTenant?: boolean
75 /** वह पेज शीर्षक जिस पर यह कमेंट थी। **/
76 pageTitle?: string
77 /** यदि हम किसी कमेंट का उत्तर दे रहे हैं, तो यह उस आईडी है जिसका उत्तर दिया जा रहा है। **/
78 parentId?: string|null
79 /** क्या कमेंट समीक्षित (reviewed) चिह्नित है। **/
80 reviewed: boolean
81 /** वह टेनेंट आईडी जिससे कमेंट संबंधित है। **/
82 tenantId: string
83 /** वह उपयोगकर्ता जिसने कमेंट लिखी। नाम/ईमेल के साथ कमेंट सेव करते समय स्वतः बनाया जाता है। **/
84 userId?: string|null
85 /** वह URL जहाँ यह कमेंट दृश्यमान है, जैसे ब्लॉग पोस्ट। **/
86 url: string
87 /** आपके द्वारा पास किए गए urlId का "साफ़" संस्करण। सेव करते समय, आप यह फ़ील्ड निर्दिष्ट करते हैं, लेकिन कमेंट वापस फ़ेच करने पर यह "साफ़" होगा और आपका मूल मान "urlIdRaw" में चला जाएगा। **/
88 urlId: string
89 /** READONLY: आपके द्वारा पास किया गया मूल 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, और br।

HTML रेंडर करने की सिफारिश की जाती है, क्योंकि यह HTML का बहुत छोटा सबसेट है, रेंडरर बनाना काफी सरल है। उदाहरण के लिए, React Native और Flutter के लिए इसमें मदद के लिए कई लाइब्रेरीज़ उपलब्ध हैं।

आप comment फ़ील्ड का अन-नॉर्मलाइज़्ड मान रेंडर करना चुन सकते हैं। एक उदाहरण पार्सर यहाँ है।।

उदाहरण पार्सर को HTML के साथ काम करने के लिए भी समायोजित किया जा सकता है, और HTML टैग को आपके प्लेटफ़ॉर्म के लिए रेंडर करने योग्य अपेक्षित तत्वों में बदला जा सकता है।

टैगिंग

जब कमेंट में उपयोगकर्ताओं को टैग किया जाता है, तो जानकारी mentions नामक सूची में संग्रहीत होती है। उस सूची में प्रत्येक ऑब्जेक्ट की संरचना निम्नलिखित है।

Comment Mentions ऑब्जेक्ट
Copy CopyRun External Link
1
2interface CommentUserMention {
3 /** उपयोगकर्ता आईडी। SSO उपयोगकर्ताओं के लिए, इसमें आपकी टेनेंट आईडी प्रीफ़िक्स्ड होगी। **/
4 id: string
5 /** अंतिम @mention टैग टेक्स्ट, @ प्रतीक सहित। **/
6 tag: string
7 /** मूल @mention टैग टेक्स्ट, @ प्रतीक सहित। **/
8 rawTag: string
9 /** किस प्रकार के उपयोगकर्ता को टैग किया गया। user = FastComments.com खाता। sso = SSOUser। **/
10 type: 'user'|'sso'
11 /** यदि उपयोगकर्ता सूचनाओं से ऑप्ट आउट करता है, तो भी यह true पर सेट रहेगा। **/
12 sent: boolean
13}
14

हैशटैग

जब हैशटैग का उपयोग किया जाता है और सफलतापूर्वक पार्स किया जाता है, तो जानकारी hashTags नामक सूची में संग्रहीत होती है। उस सूची में प्रत्येक ऑब्जेक्ट की संरचना निम्नलिखित है। यदि retain सेट है, तो क्वेरी के लिए हैशटैग को मैन्युअल रूप से कमेंट के hashTags ऐरे में भी जोड़ा जा सकता है।

Comment HashTag ऑब्जेक्ट
Copy CopyRun External Link
1
2interface CommentHashTag {
3 /** हैशटैग आईडी। **/
4 id: string
5 /** अंतिम #hashtag टैग टेक्स्ट, # प्रतीक सहित। **/
6 tag: string
7 /** यदि हैशटैग कस्टम URL से जुड़ा है, तो यह परिभाषित होगा। **/
8 url?: string
9 /** यदि कमेंट अपडेट होने पर हैशटैग को बनाए रखना चाहिए, भले ही वह कमेंट टेक्स्ट में मौजूद न हो। कमेंट टेक्स्ट बदले बिना कमेंट्स को टैग करने के लिए उपयोगी। **/
10 retain?: boolean
11}
12

ईमेल टेम्पलेट संरचना Internal Link

एक EmailTemplate ऑब्जेक्ट किसी tenant के लिए कस्टम ईमेल टेम्पलेट की कॉन्फ़िगरेशन को दर्शाता है।

सिस्टम उपयोग करने के लिए ईमेल टेम्पलेट का चयन इस प्रकार करेगा:

  • इसके type identifier द्वारा, जिसे हम emailTemplateId कहते हैं। ये constants होते हैं।
  • domain द्वारा। हम पहले संबंधित ऑब्जेक्ट (जैसे Comment) से जुड़े domain के लिए टेम्पलेट खोजने का प्रयास करेंगे, और यदि कोई मैच नहीं मिलता है तो हम ऐसा टेम्पलेट खोजने का प्रयास करेंगे जिसमें domain null या * हो।

EmailTemplate ऑब्जेक्ट की संरचना इस प्रकार है:

ईमेल टेम्पलेट संरचना
Copy Copy
1
2interface EmailTemplate {
3 id: string
4 tenantId: string
5 emailTemplateId: string
6 displayName: string
7 /** READONLY **/
8 createdAt: string
9 /** READONLY **/
10 updatedAt: string
11 /** READONLY **/
12 updatedByUserId: string
13 /** वह domain जिससे टेम्पलेट संबद्ध होना चाहिए। **/
14 domain?: string | '*' | null
15 /** EJS सिंटैक्स में ईमेल टेम्पलेट की सामग्री। **/
16 ejs: string
17 /** प्रत्येक समर्थित locale के लिए, ओवरराइड की गई अनुवाद keys से values तक का मैप। **/
18 translationOverridesByLocale: Record<string, Record<string, string>>
19 /** एक ऑब्जेक्ट जो टेम्पलेट के render context को दर्शाता है। **/
20 testData: object
21}
22

नोट्स

  • आप मान्य emailTemplateId values /definitions endpoint से प्राप्त कर सकते हैं।
  • /definitions endpoint में डिफ़ॉल्ट अनुवाद और test data भी शामिल हैं।
  • अमान्य संरचना या test data के साथ टेम्पलेट सहेजने में विफल हो जाएंगे।

FeedPost संरचना Internal Link

एक FeedPost ऑब्जेक्ट FastComments फ़ीड में एक पोस्ट को दर्शाता है। फ़ीड एक पोस्ट स्ट्रीम होती है जिसमें प्रत्येक पोस्ट की अपनी कमेंट थ्रेड होती है, और इसे Feed विजेट द्वारा रेंडर किया जाता है। हर पोस्ट का एक लेखक, वैकल्पिक रिच कंटेंट, मीडिया और लिंक होते हैं, और इसे टैग किया जा सकता है ताकि फ़ीड को फ़िल्टर किया जा सके।

FeedPost ऑब्जेक्ट की संरचना इस प्रकार है:

FeedPost संरचना
Copy Copy
1
2interface FeedPost {
3 /** READONLY **/
4 _id: string
5 /** READONLY **/
6 tenantId: string
7 title?: string
8 /** पोस्ट के लेखक FastComments या SSO उपयोगकर्ता की id। **/
9 fromUserId?: string
10 /** सेट न होने पर उपयोगकर्ता से भरा जाता है। **/
11 fromUserDisplayName?: string | null
12 /** READONLY. उपयोगकर्ता से भरा जाता है। **/
13 fromUserAvatar?: string | null
14 /** फ़ीड को फ़िल्टर करने के लिए उपयोग किया जाता है। **/
15 tags?: string[]
16 /** फ़ीड के भीतर सॉर्ट वेट। उच्च मान पहले सॉर्ट होते हैं। **/
17 weight?: number
18 /** आपके अपने उपयोग के लिए फ्री-फॉर्म key/value जोड़े। **/
19 meta?: Record<string, string>
20 /** सैनिटाइज़ किया गया HTML। **/
21 contentHTML?: string
22 media?: FeedPostMediaItem[]
23 links?: FeedPostLink[]
24 /** READONLY **/
25 createdAt: string
26 /** READONLY. रिएक्शन प्रकार से गिनती। **/
27 reacts?: Record<string, number>
28 /** READONLY **/
29 commentCount?: number | null
30}
31
32interface FeedPostMediaItem {
33 title?: string
34 /** क्लिक करने पर मीडिया आइटम कहाँ लिंक होता है। **/
35 linkUrl?: string
36 /** प्रत्येक रेंडिशन के लिए एक प्रविष्टि। विजेट सबसे उपयुक्त चुनता है। **/
37 sizes: FeedPostMediaItemAsset[]
38}
39
40interface FeedPostMediaItemAsset {
41 w: number
42 h: number
43 src: string
44}
45
46interface FeedPostLink {
47 /** लिंक का टेक्स्ट, जैसे "Sign up now"। **/
48 text?: string
49 /** लिंक के साथ दिखाया जाने वाला शीर्षक। **/
50 title?: string
51 /** लिंक के साथ दिखाया जाने वाला विवरण। **/
52 description?: string
53 url?: string
54}
55

नोट्स:

  • इनमें से कुछ फ़ील्ड READONLY चिह्नित हैं - ये API द्वारा लौटाए जाते हैं लेकिन सेट नहीं किए जा सकते।
  • किसी पोस्ट पर कमेंट सामान्य कमेंट होते हैं जिनका urlId post: होता है जिसके बाद पोस्ट का _id आता है। किसी पोस्ट पर कमेंट पढ़ने या बनाने के लिए उस मान का उपयोग Comment API के साथ करें।

HashTag संरचना Internal Link

एक HashTag ऑब्जेक्ट एक ऐसे टैग को दर्शाता है जिसे उपयोगकर्ता द्वारा छोड़ा जा सकता है। HashTags का उपयोग किसी बाहरी सामग्री से लिंक करने या संबंधित टिप्पणियों को एक साथ जोड़ने के लिए किया जा सकता है।

HashTag ऑब्जेक्ट की संरचना इस प्रकार है:

HashTag संरचना
Copy Copy
1
2interface HashTag {
3 /** इसे "#" या इच्छित वर्ण से शुरू होना चाहिए। **/
4 tag: string
5 /** एक वैकल्पिक URL जिसकी ओर हैशटैग इंगित कर सकता है। हैशटैग द्वारा टिप्पणियों को फ़िल्टर करने के बजाय, क्लिक करने पर UI इस पर रीडायरेक्ट कर देगा। **/
6 url?: string
7 /** READONLY **/
8 createdAt: string
9}
10

नोट्स:

  • कुछ API endpoints में आप देखेंगे कि हैशटैग का उपयोग URL में किया जाता है। URI-Encoded मानों को याद रखें। उदाहरण के लिए, # को इसके बजाय %23 के रूप में दर्शाया जाना चाहिए।
  • इनमें से कुछ फ़ील्ड READONLY चिह्नित हैं - इन्हें API द्वारा लौटाया जाता है लेकिन इन्हें सेट नहीं किया जा सकता।

सूचना संख्या संरचना Internal Link

एक NotificationCount ऑब्जेक्ट किसी उपयोगकर्ता के लिए अपठित नोटिफिकेशन की संख्या और मेटाडेटा को दर्शाता है।

यदि कोई अपठित नोटिफिकेशन नहीं है, तो उपयोगकर्ता के लिए कोई NotificationCount नहीं होगा।

NotificationCount ऑब्जेक्ट स्वचालित रूप से बनाए जाते हैं और API के माध्यम से नहीं बनाए जा सकते। ये एक वर्ष बाद समाप्त (expire) हो जाते हैं।

आप उपयोगकर्ता का NotificationCount डिलीट करके उसकी अपठित नोटिफिकेशन संख्या साफ़ कर सकते हैं।

NotificationCount ऑब्जेक्ट की संरचना इस प्रकार है:

NotificationCount संरचना
Copy Copy
1
2interface NotificationCount {
3 id: string // user id
4 count: number
5 createdAt: string // date string
6 expireAt: string // date string
7}
8

सूचना संरचना Internal Link

एक Notification ऑब्जेक्ट किसी उपयोगकर्ता के लिए एक नोटिफिकेशन को दर्शाता है।

Notification ऑब्जेक्ट्स स्वचालित रूप से बनाए जाते हैं और इन्हें API के माध्यम से नहीं बनाया जा सकता। ये एक वर्ष बाद समाप्त (expire) भी हो जाते हैं। नोटिफिकेशन को डिलीट नहीं किया जा सकता। हालाँकि, इन्हें अपडेट करके viewed को false सेट किया जा सकता है, और आप viewed के आधार पर क्वेरी कर सकते हैं।

एक उपयोगकर्ता किसी विशेष कमेंट के लिए नोटिफिकेशन से ऑप्ट आउट भी कर सकता है, नोटिफिकेशन में optedOut को true सेट करके। आप इसे false सेट करके दोबारा ऑप्ट इन कर सकते हैं।

विभिन्न नोटिफिकेशन प्रकार होते हैं - relatedObjectType और type देखें।

नोटिफिकेशन बनाने के तरीके काफी लचीले हैं और इन्हें कई परिदृश्यों द्वारा ट्रिगर किया जा सकता है (NotificationType देखें)।

आज की तारीख तक, एक Notification का अस्तित्व वास्तव में यह नहीं दर्शाता कि कोई ईमेल भेजा गया है या भेजा जाना चाहिए। बल्कि, नोटिफिकेशन का उपयोग नोटिफिकेशन फ़ीड और संबंधित इंटीग्रेशन के लिए किया जाता है।

Notification ऑब्जेक्ट की संरचना इस प्रकार है:

Notification संरचना
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 केवल tenant उपयोगकर्ताओं के लिए है। **/
22 TrialLimits = 6,
23 /** अगर आपको @mentioned किया गया। **/
24 Mentioned = 7
25}
26
27interface Notification {
28 id: string
29 tenantId: string
30 /** SSO के साथ, user id का फ़ॉर्मैट `<tenant id>:<user id>` होता है। **/
31 userId?: string
32 /** SSO के साथ काम करते समय, आपको केवल `userId` की चिंता करनी होती है। **/
33 anonUserId?: string
34 /** urlId लगभग हमेशा परिभाषित होता है। यह केवल tenant-स्तरीय नोटिफिकेशन के लिए वैकल्पिक होता है, जो दुर्लभ होते हैं। **/
35 urlId?: string
36 /** नोटिफिकेशन के स्रोत तक तेज़ी से नेविगेट करने के लिए URL कैश किया जाता है। **/
37 url?: string
38 /** नोटिफिकेशन स्रोत को तेज़ी से पढ़ने के लिए Page Title कैश किया जाता है। **/
39 pageTitle?: string
40 relatedObjectType: NotificationObjectType
41 /** उदाहरण के लिए, comment id। **/
42 relatedObjectId: string
43 viewed: boolean
44 createdAt: string // date 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

एक Page ऑब्जेक्ट उस पेज को दर्शाता है जिससे कई कमेंट्स संबंधित हो सकते हैं। यह संबंध urlId द्वारा परिभाषित होता है।

एक Page पेज का शीर्षक, कमेंट काउंट और urlId जैसी जानकारी संग्रहीत करता है।

Page ऑब्जेक्ट की संरचना इस प्रकार है:

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

एक Poll किसी कमेंट से जुड़ा होता है, न कि अपने आप में एक अलग ऑब्जेक्ट होता है। यह कमेंट के साथ बनाया जाता है (POST /api/v1/comments देखें), या बाद में PUT /api/v1/polls/:commentId के ज़रिए किसी मौजूदा कमेंट में जोड़ा जाता है।

वोट की गिनती पोल पर ही रखी जाती है, इसलिए पोल पढ़ने पर आपको कुछ जोड़े बिना ही परिणाम मिल जाते हैं। इन गिनतियों के पीछे के अलग-अलग वोट PollVote ऑब्जेक्ट होते हैं।

प्रत्येक विकल्प का एक id होता है जो पोल बनाते समय जनरेट होता है। वही id आप वोट डालने के लिए, किसी विकल्प का लेबल बदलने के लिए, और पोल को PUT करते समय विकल्प जोड़ने या हटाने पर किसी विकल्प (और उसके वोटों) को बनाए रखने के लिए उपयोग करते हैं। किसी विकल्प को संदर्भित करने का यही एकमात्र सुरक्षित तरीका है - कभी भी सूची में उसकी स्थिति का उपयोग न करें।

पोल संरचना
Copy Copy
1
2interface CommentPollOption {
3 id: string
4 label: string
5 votes: number
6}
7
8interface CommentPoll {
9 question: string
10 options: CommentPollOption[]
11 totalVotes: number
12 /** जब सेट हो और भूतकाल में हो, तो पोल बंद हो जाता है और अब वोट स्वीकार नहीं करता। **/
13 closesAt?: string | null
14 /** 0 गुमनाम (डिफ़ॉल्ट), 1 एडमिन और मॉडरेटर, 2 सभी। अनुपस्थित होने का अर्थ गुमनाम है। **/
15 privacy?: 0 | 1 | 2 | null
16 /** जब true हो, तो गिनती उन सभी से छिपी रहती है जिन्होंने अभी तक वोट नहीं दिया है। अनुपस्थित होने का अर्थ false है। **/
17 requireVoteToSeeResults?: boolean | null
18}
19

सीमाएँ

  • एक प्रश्न आवश्यक है, और अधिकतम 200 वर्णों का हो सकता है।
  • एक पोल में 2 से 10 विकल्प हो सकते हैं।
  • एक विकल्प का लेबल आवश्यक है, अधिकतम 100 वर्णों का हो सकता है, और पोल के भीतर अद्वितीय होना चाहिए (केस को अनदेखा करते हुए)।
  • closesAt पोल बनाते समय भविष्य की तारीख होनी चाहिए। किसी पोल को तुरंत बंद करने के लिए, उसे भूतकाल की तारीख के साथ PATCH करें।

साइट सेटिंग्स

पोल आपकी साइट कॉन्फ़िगरेशन का पालन करते हैं, जिसे आप Customize Widget के अंतर्गत बदल सकते हैं:

  • पोल बनाने से पहले पोल सक्षम होने चाहिए, अन्यथा API polls-disabled के साथ प्रतिक्रिया देता है।
  • वोटिंग केवल लॉग-इन उपयोगकर्ताओं तक सीमित की जा सकती है, जिस स्थिति में केवल anonUserId के साथ भेजा गया वोट poll-login-required के साथ अस्वीकार कर दिया जाता है।

पोल वोट संरचना Internal Link

एक PollVote किसी पोल पर एक व्यक्ति का उत्तर होता है। पोल पर दिखाए जाने वाले काउंट इनके साथ सिंक में रखे जाते हैं, इसलिए आपको ये केवल तब चाहिए जब आप यह जानना चाहें कि किसने किस विकल्प के लिए वोट दिया, न कि कुल संख्या।

एक वोटर का प्रति पोल अधिकतम एक वोट होता है। दोबारा वोट देने पर दूसरा वोट जोड़ने के बजाय उनका मौजूदा वोट नए विकल्प पर चला जाता है, और updatedAt यह रिकॉर्ड करता है कि वह कब हुआ।

voterId वह userId होता है जब वोटर लॉग इन था, अन्यथा वह anonUserId होता है।

PollVote संरचना
Copy Copy
1
2interface PollVote {
3 id: string
4 tenantId: string
5 commentId: string
6 urlId: string
7 /** वोटर लॉग इन होने पर userId, अन्यथा anonUserId। **/
8 voterId: string
9 optionId: string
10 createdAt: string
11 /** जब वोटर ने अंतिम बार अपना वोट किसी अन्य विकल्प पर स्थानांतरित किया। **/
12 updatedAt?: string
13}
14

गोपनीयता

पोल की privacy सेटिंग इस API पर उसी तरह लागू होती है जिस तरह वह कमेंट विजेट में लागू होती है:

  • Anonymous (डिफ़ॉल्ट): कोई भी नहीं देख सकता कि किसी ने कैसे वोट दिया, इसलिए वोट पढ़े नहीं जा सकते। GET /api/v1/poll-votes और GET /api/v1/poll-votes/:id poll-anonymous के साथ प्रतिक्रिया देते हैं। पोल के काउंट अभी भी GET /api/v1/polls/:commentId से उपलब्ध हैं।
  • Admins और moderators: आपकी API key आपकी साइट के एडमिन की होती है, इसलिए यह वोट पढ़ सकती है।
  • Everyone: वोट पढ़े जा सकते हैं।

पोल की गोपनीयता वोट होने के बाद संकुचित की जा सकती है लेकिन बढ़ाई नहीं जा सकती।

PendingWebhookEvent संरचना Internal Link

एक PendingWebhookEvent ऑब्जेक्ट एक कतार में लंबित (pending) वेबहुक इवेंट का प्रतिनिधित्व करता है।

PendingWebhookEvent ऑब्जेक्ट स्वचालित रूप से बनाए जाते हैं और इन्हें API के माध्यम से मैन्युअल रूप से नहीं बनाया जा सकता। ये एक वर्ष के बाद समाप्त (expire) भी हो जाते हैं। इन्हें डिलीट किया जा सकता है, जिससे यह कार्य कतार से हट जाता है।

अलग-अलग इवेंट प्रकार होते हैं - 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 से जोड़ना शुरू किया। **/
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-आधारित इंटीग्रेशन के साथ उपयोगकर्ता की जानकारी अपडेट करना उतना ही सरल है जितना उपयोगकर्ता को अपडेटेड पेलोड के साथ पेज लोड करवाना।

हालाँकि, अपने एप्लिकेशन की निरंतरता (consistency) सुधारने के लिए उस फ्लो के बाहर उपयोगकर्ता को प्रबंधित करना वांछनीय हो सकता है।

SSO User API उन ऑब्जेक्ट्स को CRUD करने का एक तरीका प्रदान करती है जिन्हें हम SSOUsers कहते हैं। ये ऑब्जेक्ट्स सामान्य 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 // Admin permission - SSO users with this flag are billed as SSO Admins (separate from regular SSO users)
16 isAdminAdmin?: boolean // Admin permission - SSO users with this flag are billed as SSO Admins (separate from regular SSO users)
17 isCommentModeratorAdmin?: boolean // Moderator permission - SSO users with this flag are billed as SSO Moderators (separate from regular SSO users)
18 /** If null, Access Control will not be applied to the user. If an empty list, this user will not be able to see any pages or @mention other users. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Don't let other users see this user's activity, including comments, on their profile. Default is true to provide secure profiles by default. **/
22 isProfileActivityPrivate?: boolean
23 /** Don't let other users leave comments on the user's profile, or see existing profile comments. Default false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Don't let other users send direct messages to this user. Default false. **/
26 isProfileDMDisabled?: boolean
27 karma?: number
28 /** Optional configuration for user badges. **/
29 badgeConfig?: {
30 /** Array of badge IDs to assign to the user. Limited to 30 badges. Order is respected. These are global badges visible on all pages. **/
31 badgeIds: string[]
32 /** Array of badge IDs scoped to the current page (urlId). These badges are only displayed on the page where they were assigned. **/
33 pageBadgeIds?: string[]
34 /** If true, replaces all existing displayed badges with the provided ones. Global and page-scoped badges are overridden independently. If false, adds to existing badges. **/
35 override?: boolean
36 /** If true, updates badge display properties from tenant configuration. **/
37 update?: boolean
38 }
39}
40

SSO उपयोगकर्ताओं के लिए बिलिंग

SSO उपयोगकर्ताओं की बिलिंग उनके परमिशन फ्लैग्स के आधार पर अलग-अलग होती है:

  • सामान्य SSO उपयोगकर्ता: बिना एडमिन या मॉडरेटर परमिशन वाले उपयोगकर्ता सामान्य SSO उपयोगकर्ताओं के रूप में बिल किए जाते हैं
  • SSO एडमिन: isAccountOwner या isAdminAdmin फ्लैग्स वाले उपयोगकर्ता SSO एडमिन के रूप में अलग से बिल किए जाते हैं (सामान्य टेनेंट एडमिन के समान दर पर)
  • SSO मॉडरेटर: isCommentModeratorAdmin फ्लैग वाले उपयोगकर्ता SSO मॉडरेटर के रूप में अलग से बिल किए जाते हैं (सामान्य मॉडरेटर के समान दर पर)

महत्वपूर्ण: दोहरी बिलिंग रोकने के लिए, सिस्टम ईमेल पते के आधार पर SSO उपयोगकर्ताओं को सामान्य टेनेंट उपयोगकर्ताओं और मॉडरेटर्स के विरुद्ध स्वचालित रूप से डीडुप्लिकेट करता है। यदि किसी SSO उपयोगकर्ता का ईमेल किसी सामान्य टेनेंट उपयोगकर्ता या मॉडरेटर के समान है, तो उनसे दो बार बिल नहीं किया जाएगा।

एक्सेस कंट्रोल

उपयोगकर्ताओं को समूहों में विभाजित किया जा सकता है। groupIds फ़ील्ड इसी काम के लिए है, और यह वैकल्पिक (optional) है।

@Mentions

डिफ़ॉल्ट रूप से, जब @ कैरेक्टर टाइप किया जाता है तो @mentions अन्य SSO उपयोगकर्ताओं को खोजने के लिए username का उपयोग करेगा। यदि displayName का उपयोग किया जाता है, तो जब displayName के लिए मैच होता है, username से मैच होने वाले परिणामों को अनदेखा कर दिया जाएगा, और @mention खोज परिणाम displayName का उपयोग करेंगे।

सब्सक्रिप्शन

FastComments के साथ, उपयोगकर्ता कमेंट विजेट में घंटी आइकन पर क्लिक करके और Subscribe पर क्लिक करके किसी पेज की सदस्यता ले सकते हैं।

सामान्य उपयोगकर्ता के साथ, हम उन्हें उनकी नोटिफिकेशन सेटिंग्स के आधार पर नोटिफिकेशन ईमेल भेजते हैं।

SSO उपयोगकर्ताओं के साथ, हम इसे पिछली संगतता (backwards compatibility) के लिए विभाजित करते हैं। उपयोगकर्ताओं को ये अतिरिक्त सब्सक्रिप्शन नोटिफिकेशन ईमेल तभी भेजे जाएंगे जब आप optedInSubscriptionNotifications को true पर सेट करें।

बैज

आप badgeConfig प्रॉपर्टी का उपयोग करके SSO उपयोगकर्ताओं को बैज असाइन कर सकते हैं। बैज विज़ुअल इंडिकेटर होते हैं जो कमेंट्स में उपयोगकर्ता के नाम के बगल में दिखाई देते हैं।

  • badgeIds - उपयोगकर्ता को असाइन करने के लिए बैज ID की एक सरणी। ये सभी पेजों पर दिखाई देने वाले ग्लोबल बैज हैं। आपके FastComments खाते में बनाई गई वैध बैज ID होनी चाहिए। अधिकतम 30 बैज।
  • pageBadgeIds - वर्तमान पेज (urlId) तक सीमित बैज ID की एक वैकल्पिक सरणी। ये बैज केवल उस पेज पर प्रदर्शित होते हैं जहाँ उन्हें असाइन किया गया था। एक ही उपयोगकर्ता के लिए अलग-अलग पेजों पर अलग-अलग पेज-स्कोप्ड बैज हो सकते हैं।
  • override - यदि true है, तो सभी मौजूदा प्रदर्शित बैज प्रदान किए गए बैजों से बदल दिए जाएंगे। ग्लोबल और पेज-स्कोप्ड बैज स्वतंत्र रूप से ओवरराइड किए जाते हैं — ग्लोबल बैज को ओवरराइड करना पेज-स्कोप्ड बैज को प्रभावित नहीं करता, और इसके विपरीत भी। यदि false या छोड़ा गया हो, तो प्रदान किए गए बैज किसी भी मौजूदा बैज में जोड़ दिए जाएंगे।
  • update - यदि true है, तो जब भी उपयोगकर्ता लॉग इन करेगा, बैज डिस्प्ले प्रॉपर्टीज़ टेनेंट कॉन्फ़िगरेशन से अपडेट कर दी जाएंगी।

सदस्यता संरचना Internal Link

एक Subscription ऑब्जेक्ट किसी उपयोगकर्ता की सदस्यता (subscription) को दर्शाता है।

Subscription ऑब्जेक्ट तब बनाए जाते हैं जब कोई उपयोगकर्ता कमेंट विजेट में नोटिफिकेशन बेल पर क्लिक करता है और "Subscribe to this page" पर क्लिक करता है।

सदस्यताएँ API के माध्यम से भी बनाई जा सकती हैं।

एक Subscription ऑब्जेक्ट होने से, संबंधित पेज के रूट पर नए कमेंट छोड़े जाने पर, उस Subscription के लिए Notification ऑब्जेक्ट बनते हैं और ईमेल भेजे जाते हैं। ईमेल भेजना उपयोगकर्ता के प्रकार पर निर्भर करता है। सामान्य उपयोगकर्ताओं के लिए यह optedInNotifications पर निर्भर करता है। SSO उपयोगकर्ताओं के लिए यह optedInSubscriptionNotifications पर निर्भर करता है। ध्यान दें कि कुछ एप्लिकेशन में वेब-एक्सेसिबल पेज की अवधारणा नहीं हो सकती, ऐसे में बस urlId को उस आइटम की id पर सेट करें जिसकी आप सदस्यता ले रहे हैं (कमेंट विजेट को जो urlId पास करेंगे, वही मान)।

Subscription ऑब्जेक्ट की संरचना इस प्रकार है:

Subscription संरचना
Copy Copy
1
2interface Subscription {
3 id: string
4 tenantId: string
5 /** SSO के साथ, user id का फॉर्मैट `<tenant id>:<user id>` होता है। **/
6 userId: string
7 anonUserId?: string
8 urlId: string
9 url?: string
10 pageTitle?: string
11 createdAt: string // date string
12}
13

TenantDailyUsage संरचना Internal Link

एक TenantDailyUsage ऑब्जेक्ट किसी टेनेंट के लिए किसी दिए गए दिन के उपयोग को दर्शाता है। यदि किसी दिए गए दिन में किसी टेनेंट की कोई गतिविधि नहीं थी, तो उस दिन के लिए कोई TenantDailyUsage ऑब्जेक्ट नहीं होगा।

TenantDailyUsage ऑब्जेक्ट रीयल टाइम नहीं है और वास्तविक उपयोग से कुछ मिनट पीछे हो सकता है।

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 ग्राहक (customer) को परिभाषित करता है। इन्हें API के माध्यम से उन tenants द्वारा बनाया जा सकता है जिनके पास white labeling एक्सेस है। White labeled tenants अन्य white labeled tenants नहीं बना सकते (केवल एक स्तर की nesting की अनुमति है)।

Tenant ऑब्जेक्ट की संरचना इस प्रकार है:

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; // "legacy" कारणों से 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 /** आप tenant के साथ एक key value pair स्टोर कर सकते हैं जिसका उपयोग आप क्वेरी के लिए कर सकते हैं। Keys में "." या "$" नहीं हो सकता, और 100 वर्णों से लंबा नहीं हो सकता। Values 2k वर्णों से लंबी नहीं हो सकतीं। **/
71 meta?: Record<string, string | null>
72}
73

उपयोगकर्ता संरचना Internal Link

User एक ऑब्जेक्ट है जो सभी उपयोगकर्ताओं के सबसे सामान्य गुणों को दर्शाता है।

ध्यान रखें कि FastComments पर उपयोगकर्ताओं के लिए हमारे पास कई अलग-अलग उपयोग के मामले हैं:

  • Secure SSO
  • Simple SSO
  • Tenant Users (उदाहरण के लिए: Administrators)
  • Commenters

यह API Commenters और Simple SSO के माध्यम से बनाए गए उपयोगकर्ताओं के लिए है। मूल रूप से, आपकी साइट के माध्यम से बनाया गया कोई भी उपयोगकर्ता इस API के माध्यम से एक्सेस किया जा सकता है। Tenant Users को भी इस तरह प्राप्त किया जा सकता है, लेकिन /tenant-users/ API के साथ इंटरैक्ट करने पर आपको अधिक जानकारी मिलेगी।

Secure SSO के लिए कृपया /sso-users/ API का उपयोग करें।

आप इन प्रकार के उपयोगकर्ताओं को अपडेट नहीं कर सकते। उन्होंने अपना खाता आपकी साइट के माध्यम से बनाया है, इसलिए हम कुछ बुनियादी केवल-पढ़ने योग्य (read-only) एक्सेस प्रदान करते हैं, लेकिन आप बदलाव नहीं कर सकते। यदि आप इस प्रकार का फ्लो चाहते हैं - तो आपको Secure SSO सेटअप करना होगा।

User ऑब्जेक्ट की संरचना इस प्रकार है:

User संरचना
Copy Copy
1
2export interface User {
3 /** यह वही id है जो comment ऑब्जेक्ट्स पर userId के रूप में उपयोग की जाती है। **/
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

QuestionConfig संरचना Internal Link

FastComments प्रश्न बनाने और उनके परिणामों को संग्रहित (aggregate) करने का एक तरीका प्रदान करता है। एक प्रश्न (आगे इसे 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 /** READONLY - incremented for each new response. **/
13 usedCount: number
14 /** A date string for when the configuration was last used (result left). **/
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

QuestionResult संरचना 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

UserBadge संरचना Internal Link

UserBadge एक ऑब्जेक्ट है जो FastComments सिस्टम में किसी उपयोगकर्ता को सौंपे गए बैज को दर्शाता है।

बैज उपयोगकर्ताओं को उनकी गतिविधि (जैसे कमेंट संख्या, रिप्लाई समय, वेटेरन स्थिति) के आधार पर स्वचालित रूप से या साइट व्यवस्थापकों द्वारा मैन्युअल रूप से सौंपे जा सकते हैं।

UserBadge ऑब्जेक्ट की संरचना इस प्रकार है:

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 /** यह बैज कब बनाया गया (epoch से मिलीसेकंड) */
12 createdAt?: number
13 /** उपयोगकर्ता को यह बैज कब प्राप्त हुआ (epoch से मिलीसेकंड) */
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 /** यदि सेट है, तो यह बैज केवल मेल खाते urlId वाले पेज पर दिखाया जाता है। ग्लोबल बैज के लिए Null। */
49 urlId?: string | null
50}
51

UserBadgeProgress संरचना Internal Link

UserBadgeProgress एक ऑब्जेक्ट है जो FastComments सिस्टम में विभिन्न बैज अर्जित करने की दिशा में उपयोगकर्ता की प्रगति को दर्शाता है।

यह ट्रैकिंग यह निर्धारित करने में मदद करती है कि उपयोगकर्ताओं को आपके समुदाय में उनकी गतिविधि और भागीदारी के आधार पर स्वचालित बैज कब प्राप्त होने चाहिए।

UserBadgeProgress ऑब्जेक्ट की संरचना इस प्रकार है:

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 /** उपयोगकर्ता की पहली टिप्पणी की तिथि (epoch से मिलीसेकंड) */
12 firstCommentDate?: number
13 /** उपयोगकर्ता गतिविधि के आधार पर स्वचालित रूप से गणना किया गया ट्रस्ट फैक्टर */
14 autoTrustFactor?: number
15 /** व्यवस्थापकों द्वारा मैन्युअल रूप से सेट किया गया ट्रस्ट फैक्टर */
16 manualTrustFactor?: number
17 /** विभिन्न मेट्रिक्स के साथ विस्तृत प्रगति ऑब्जेक्ट, कुंजियाँ BadgeType enum से मेल खाती हैं */
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 दस्तावेज़ीकरण विस्तृत और समझने में आसान लगा होगा। यदि आपको कोई कमी मिलती है, तो हमें नीचे बताएं।