FastComments.com

API за живи коментари

FastComments API

FastComments предоставя API за взаимодействие с множество ресурси. Създавайте интеграции с нашата платформа или дори създавайте свои собствени клиенти!

В тази документация ще намерите всички поддържани ресурси от API, документирани с техните типове заявки и отговори.

За Enterprise клиентите, целият достъп до API се записва в одитния журнал.

Генерирани SDK‑ове

FastComments сега генерира API Spec от нашия код (това все още не е завършено, но включва множество API‑та).

Също така вече имаме SDK‑ове за популярни езици:

Удостоверяване

API‑то се удостоверява, като предадете вашия api key като заглавие X-API-KEY или като параметър на заявката API_KEY. Също така ще ви е необходим вашият tenantId за извършване на API повиквания. Той може да се извлече от същата страница като вашия api key.

Бележка за сигурност

Тези маршрути са предназначени да се извикват от сървър. НЕ ги извиквайте от браузър. Това ще изложи вашия API ключ – ще даде пълен достъп до вашия акаунт на всеки, който може да види изходния код на страницата!

Опция за удостоверяване 1 – Заглавки

  • Заглавка: X-API-KEY
  • Заглавка: X-TENANT-ID

Опция за удостоверяване 2 – Параметри на заявката

  • Параметър на заявката: API_KEY
  • Параметър на заявката: tenantId

Опция за удостоверяване 3 – OAuth Bearer Token

  • Заглавка: Authorization: Bearer fcat_...

Приложения от трети страни, като Zapier и клиенти на MCP сървъра, получават токен чрез OAuth вместо API ключ. Този токен работи за всеки крайна точка тук. Наемателят е подразбиращ се от токена, така че tenantId е незадължителен, но трябва да съвпада с токена, ако е зададен. GET заявките изискват обхват read, а всички останали методи – обхват write. Пълният процес, включително регистрация на клиент, PKCE, обновяване и отмяна, е документиран в OAuth Authorization. Откриването започва на https://fastcomments.com/.well-known/oauth-authorization-server.

Четене на собствените ви записи

FastComments осигурява Active-Active достъпност. Заявките от вашия датацентър се маршрутизират към най-близката точка на присъствие спрямо вашата. Това е автоматично и обикновено можете да наблюдавате семантиката „прочети‑твоето‑записване“. Ако искате да сте сигурни, че четете собствените си записи, можете да фиксирате вашите заявки към определен регион, като използвате този регион като API хост (въпреки че обикновено това не е необходимо за повечето интеграции):

  • 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

Имайте предвид, че ако направите това, може да искате да дефинирате резервен вариант, тъй като в миналото сме премахвали входни възли и използваме нови имена за превключването.

Структура на AuditLog Internal Link

An AuditLog е обект, който представлява одитирано събитие за наематели, които имат достъп до тази функция.

Структурата на обекта AuditLog е следната:

Структура на AuditLog
Copy Copy
1
2interface AuditLog {
3 id: string;
4 /** Who performed the event. **/
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 /** The browser that performed the event, when it came from one. **/
13 ua?: string;
14 /** A hash of the session the event came from, for correlating one person's actions. Never the session itself. **/
15 sIdHashed?: string;
16 when: string;
17 description?: string;
18 serverStartDate: string;
19 /** The id of the object the event was performed on, as opposed to who performed it. **/
20 targetId?: string;
21 /** A human-readable label for that object, e.g. "jsmith (jsmith@example.com)". **/
22 targetLabel?: string;
23 objectDetails?: object;
24}
25

targetId и targetLabel описват върху какво е извършено събитието; userId и username описват кой го е извършил. При актуализации, objectDetails.changes съдържа карта {field: {from, to}} на това, което действително е променено.

Одитният журнал е неизменяем. Също така не може да се записва ръчно. FastComments.com може единствено да реши кога да записва в одитния журнал. Въпреки това, можете да четете от него чрез това API.

Събитията в одитния журнал изтичат след две години.

Структура на BatchJob Internal Link

BatchJob е дълготрайна задача, като импорт, експорт или миграция на страници. Задачите се поставят в опашка, след което се вземат и изпълняват във фонов режим.

processedCount и totalCount показват напредъка. Единицата им зависи от type:

  • migrate-pages: завършени миграции, от общия брой заявени миграции.
  • undo-page-migration: възстановени записи. Няма totalCount.
  • import, export и други задачи: обработени редове.

Структурата на обекта BatchJob е следната:

Структура на 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: един запис за всяка завършена миграция, в реда на заявката. **/
13 pageMigrationResults?: Array<PageMigrationSuccess | PageMigrationFailure>
14 /**
15 * migrate-pages: задава се, след като задачата завърши (успешно или неуспешно). Предайте към POST /api/v1/pages/migrations/:undoId/undo в рамките на 90 дни.
16 * undo-page-migration: миграцията, която се отменя.
17 **/
18 undoId?: string
19 /** undo-page-migration: задава се, след като задачата завърши. **/
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 /** Записи, върнати към стойностите им преди миграцията. **/
42 restored: number
43 /** Записи, оставени непроменени, защото са се променили след миграцията или вече не съществуват. **/
44 skipped: number
45 /** Записи от миграцията, изтрити при обединяване на страници. Те не могат да бъдат възстановени. **/
46 notRestorable: number
47}
48

Повторни опити

Ако сървърът, изпълняващ задача за миграция на страници, се рестартира, задачата се поставя отново в опашката и се продължава след последната завършена миграция. Задачата се опитва до 3 пъти, след което нейният status е failed.

Структура на коментар 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 /** Дъщерни коментари. Не се попълват във всички сценарии. Използва се, когато asTree е зададено на true чрез API-то. **/
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 /** #хештаговете, написани в коментара, които са били успешно анализирани. Можете също да добавяте хештагове ръчно, за заявки, но те няма да се показват автоматично в текста на коментара. **/
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 /** Локалът на коментара. Ако не е предоставен, ще бъде извлечен от 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 /** READONLY: @споменаванията, написани в коментара, които са били успешно анализирани. **/
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 /** Дали коментарът е маркиран като прегледан. **/
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-то, но не могат да бъдат задавани.

Структура на текста на коментара

Коментарите се пишат във вариант на markdown, характерен за FastComments, който е просто markdown плюс традиционни тагове в стил 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 таговете в очаквани елементи за рендиране на вашата платформа.

Споменавания (Tagging)

Когато потребители бъдат споменати в коментар, информацията се съхранява в списък, наречен 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

Когато хештагове са използвани и успешно анализирани, информацията се съхранява в списък, наречен hashTags. Всеки обект в този списък има следната структура. Хештагове могат също да бъдат добавяни ръчно към масива hashTags на коментара за заявки, ако retain е зададено.

Обектът 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.

Системата ще избере имейл шаблона за използване чрез:

  • Неговия идентификатор на типа, наречен emailTemplateId. Това са константи.
  • domain. Първо ще се опитаме да намерим шаблон за домейна, към който е свързан съответният обект (като Comment), и ако не бъде намерено съвпадение, ще се опитаме да намерим шаблон, където domain е null или *.

Структурата на обекта EmailTemplate е следната:

Структура на Email Template
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 /** The domain the template should be associated with. **/
14 domain?: string | '*' | null
15 /** The email template content in EJS syntax. **/
16 ejs: string
17 /** A map of overridden translation keys to values, for each supported locale. **/
18 translationOverridesByLocale: Record<string, Record<string, string>>
19 /** An object that represents the render context of the template. **/
20 testData: object
21}
22

Забележки

  • Можете да получите валидните стойности на emailTemplateId от крайната точка /definitions.
  • Крайната точка /definitions също включва преводите по подразбиране и тестовите данни.
  • Шаблоните няма да се запазят с невалидна структура или тестови данни.

Структура на FeedPost Internal Link

A FeedPost обект представлява публикация във FastComments емисия. Емисията е поток от публикации със свои собствени нишки за коментари, визуализирани от Feed уиджета. Всяка публикация има автор, по избор богато съдържание, медия и връзки, и може да бъде етикетирана, за да може емисията да се филтрира.

Структурата за обекта FeedPost е следната:

FeedPost Structure
Copy Copy
1
2interface FeedPost {
3 /** READONLY **/
4 _id: string
5 /** READONLY **/
6 tenantId: string
7 title?: string
8 /** Идентификаторът на FastComments или SSO потребителя, който е създал публикацията. **/
9 fromUserId?: string
10 /** Попълнено от потребителя, ако не е зададено. **/
11 fromUserDisplayName?: string | null
12 /** READONLY. Попълнено от потребителя. **/
13 fromUserAvatar?: string | null
14 /** Използва се за филтриране на емисия. **/
15 tags?: string[]
16 /** Тегло за сортиране в емисия. По-големи стойности се сортират първи. **/
17 weight?: number
18 /** Свободни двойки ключ/стойност за ваша употреба. **/
19 meta?: Record<string, string>
20 /** Санитизиран HTML. **/
21 contentHTML?: string
22 media?: FeedPostMediaItem[]
23 links?: FeedPostLink[]
24 /** READONLY **/
25 createdAt: string
26 /** READONLY. Reaction type to count. **/
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, за да прочетете или създадете коментари към публикацията.

Структура на хаштаг Internal Link

Обектът HashTag представлява таг, който може да бъде оставен от потребител. HashTags могат да се използват за свързване към външно съдържание или за свързване на свързани коментари заедно.

Структурата на обекта HashTag е следната:

Структура на HashTag
Copy Copy
1
2interface HashTag {
3 /** Should start with the "#" or desired character. **/
4 tag: string
5 /** An optional URL that the hashtag can point to. Instead of filtering comments by hashtag, the UI will redirect to this upon click. **/
6 url?: string
7 /** READONLY **/
8 createdAt: string
9}
10

Забележки:

  • В някои API крайни точки ще видите, че хаштагът се използва в URL. Не забравяйте да URI-кодирате стойностите. Например # трябва вместо това да се представи като %23.
  • Някои от тези полета са маркирани като READONLY - те се връщат от API, но не могат да бъдат зададени.

Структура на броя известия Internal Link

Обектът NotificationCount представлява броя на непрочетените известия и метаданни за потребител.

Ако няма непрочетени известия, няма да има NotificationCount за потребителя.

Обектите NotificationCount се създават автоматично и не могат да бъдат създавани чрез API. Те също изтичат след една година.

Можете да изчистите броя на непрочетените известия на потребител, като изтриете неговия 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. Те също изтичат след една година. Известията не могат да бъдат изтривани. Въпреки това те могат да бъдат актуализирани, за да зададете 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 /** If someone replied to you. **/
10 RepliedToMe = 0,
11 /** If someone replied anywhere in a thread (even children of children) of a thread you commented on. **/
12 RepliedTransientChild = 1,
13 /** If your comment was up-voted. **/
14 VotedMyComment = 2,
15 /** If a new comment is left on the root of a page you're subscribed to. **/
16 SubscriptionReplyRoot = 3,
17 /** If someone commented on your profile. **/
18 CommentedOnProfile = 4,
19 /** If you have a DM. **/
20 DirectMessage = 5,
21 /** TrialLimits is for tenant users only. **/
22 TrialLimits = 6,
23 /** If you were @mentioned. **/
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 /** When working with SSO, you only have to worry about `userId`. **/
33 anonUserId?: string
34 /** urlId is almost always defined. It is only optional for tenant-level notifications, which are infrequent. **/
35 urlId?: string
36 /** URL is cached for quick navigation to the source of the notification. **/
37 url?: string
38 /** Page Title is cached for quick reading of notification source. **/
39 pageTitle?: string
40 relatedObjectType: NotificationObjectType
41 /** For example, comment id. **/
42 relatedObjectId: string
43 viewed: boolean
44 createdAt: string // date string
45 type: NotificationType
46 fromCommentId?: string
47 fromVoteId?: string
48 /** fromUserName and fromUserAvatarSrc are cached here for quick displaying of the notification. They are updated when the user is updated. **/
49 fromUserName: string
50 fromUserId: string
51 fromUserAvatarSrc?: string
52 /** Set this to true to stop getting notifications for this object. **/
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 /** Setting this to null means all SSO users can see the page. An empty list means it is closed to all users. **/
11 accessibleByGroupIds?: string[] | null
12 /** Is this page closed for new comments? **/
13 isClosed?: boolean
14}
15

POST /api/v1/pages/migrations Internal Link

Resource: Page Migrations as POST /api/v1/pages/migrations Credit Cost: 1

Този маршрут премества коментари и страници от един urlId или домейн към друг, същото като инструмента за миграция на домейни в таблото. До 100 миграции могат да бъдат изпратени в една заявка. Те се изпълняват в зададения ред, така че a към b, последвано от b към c, работи.

Всяка миграция има type:

  • urlId премества страницата, чийто urlId е точно from. post-1 не съвпада с post-10.
  • domain намира/заменя from във всеки urlId и url и актуализира domain на всеки коментар. И двете стойности трябва да бъдат домейн, като old.example.com.

Коментарите, страницата, реакциите към страницата, гласовете, известията и абонаментите се преместват. Ако страница вече съществува на to, двете страници се обединяват.

Миграцията се изпълнява като пакетна задача. Отговорът съдържа batchJobId. Извършвайте заявки GET /api/v1/batch-jobs/:id, за да следите прогреса. След като задачата завърши, тя има резултат за всяка миграция и undoId, който можете да предадете на POST /api/v1/pages/migrations/:undoId/undo в рамките на 90 дни.

Заявката се валидира преди да бъде поставена в опашка. Ако някоя миграция е невалидна, цялата заявка се проваля с код 422 и нищо не се изпълнява.

Поставянето в опашка на миграция не струва нищо. Когато задачата завърши, се начислява 1 кредит за всеки 1000 мигрирани коментари, с минимум 1.

Пример cURL за миграции на страници
Copy Copy
1
2curl --request POST \
3 --url 'https://fastcomments.fastcomments.com/api/v1/pages/migrations?tenantId=demo&API_KEY=DEMO_API_SECRET' \
4 --header 'Content-Type: application/json' \
5 --data '{
6 "migrations": [
7 {"from": "old-post-id", "to": "new-post-id", "type": "urlId"},
8 {"from": "old.example.com", "to": "new.example.com", "type": "domain"}
9 ]
10}'
11
Структура на заявка за миграции на страници
Copy Copy
1
2interface PageMigrationsQueryParams {
3 tenantId: string
4 API_KEY: string
5}
6
7interface PageMigrationsBody {
8 /** Run in the order given. At most 100. **/
9 migrations: PageMigration[]
10}
11
12interface PageMigration {
13 /** At most 1000 characters. Leading and trailing whitespace is removed. **/
14 from: string
15 /** Must be different from "from". At most 1000 characters. **/
16 to: string
17 /** "urlId" only matches the exact urlId. "domain" find/replaces the value inside every urlId and url. **/
18 type: 'urlId' | 'domain'
19}
20
Структура на отговор за миграции на страници
Copy Copy
1
2interface PageMigrationsResponse {
3 status: 'success' | 'failed'
4 /** Included on failure. **/
5 code?: 'missing-tenant-id' | 'invalid-tenant-id' | 'invalid-api-key' | 'missing-api-key' | 'missing-migrations' | 'too-many-migrations' | 'invalid-migration' | 'internal'
6 /** Included on failure. For invalid-migration, this names the index of the first invalid migration. **/
7 reason?: string
8 /** Pass to GET /api/v1/batch-jobs/:id for progress and the result. **/
9 batchJobId?: string
10}
11

Notes

  • Задачите за един наемател се изпълняват една по една, най-старите първо. Втора миграция изчаква първата да завърши.
  • PATCH /api/v1/pages/:id с нов urlId променя само страницата, а не нейните коментари. Използвайте този маршрут, за да преместите коментарите на страница.

Структура на анкета Internal Link

Poll е прикачен към коментар, а не е самостоятелен обект. Той се създава заедно с коментара (виж POST /api/v1/comments) или се добавя към съществуващ коментар по-късно с PUT /api/v1/polls/:commentId.

Броячите на гласове се съхраняват в самия poll, така че четенето на poll ви дава резултатите, без да се налага да събирате нищо. Отделните гласове зад тези броячи са обекти PollVote.

Всяка опция има id, който се генерира при създаването на poll. Този id се използва за подаване на глас, за преименуване на опция и за запазване на опция (и нейните гласове), когато изпратите PUT на poll с добавени или премахнати опции. Това е единственият безопасен начин за препратка към опция - никога нейната позиция в списъка.

Структура на Poll
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 /** Когато е зададено и е в миналото, poll е затворен и вече не приема гласове. **/
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

A 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 по същия начин, както се прилага в уиджета за коментари:

  • Анонимно (по подразбиране): никой не може да види как е гласувал никой, така че гласовете не могат да бъдат прочетени.
    GET /api/v1/poll-votes и GET /api/v1/poll-votes/:id отговарят с poll-anonymous. Броячетата на анкетата все още са достъпни чрез GET /api/v1/polls/:commentId.
  • Администратори и модератори: вашият API ключ принадлежи на администратора на вашия сайт, така че може да чете гласовете.
  • Всеки: гласовете могат да бъдат прочетени.

Поверителността на анкетата може да бъде стеснявана, но не и разширявана, след като има гласове.

Структура на чакащо Webhook събитие Internal Link

Обектът PendingWebhookEvent представлява webhook събитие в опашката, което чака обработка.

Обектите PendingWebhookEvent се създават автоматично и не могат да бъдат създадени ръчно чрез API. Те също изтичат след една година. Могат да бъдат изтрити, което премахва задачата от опашката.

Има различни типове събития - проверете 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-specific sync task. **/
10 WP: 0,
11 Webhook: 1
12}
13
14interface PendingWebhookEvent {
15 id: string
16 /** The comment id associated with the event. **/
17 commentId: string
18 /** The comment object for the event at the time of the event. We started adding these in Nov 2023. **/
19 comment: Comment
20 /** An external id that may be associated with the comment. **/
21 externalId: string | null
22 createdAt: Date
23 tenantId: string
24 attemptCount: number
25 /** Set before first attempt, and after every failure. **/
26 nextAttemptAt: Date
27 /** Whether this is a creation, deletion, or update event... **/
28 eventType: OutboundSyncEventType
29 /** The type of sync to perform (WordPress, call API, etc). **/
30 type: OutboundSyncType
31 /** The domain that matched the comment. We use this domain to pick the API key. **/
32 domain: string
33 /** The last error that occurred. This type is untyped and is a "dump" of whatever happened. Usually it contains an object with statusCode, body, and a headers map. **/
34 lastError: object | null
35}
36

Структура на SSO потребител Internal Link

FastComments предоставя лесно за използване SSO решение. Актуализирането на информацията за потребител чрез интеграция, базирана на HMAC, е толкова просто, колкото потребителят да зареди страницата с обновен payload.

Въпреки това, може да е желателно да управлявате потребител извън този поток, за да подобрите консистентността на вашето приложение.

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 // Административно разрешение - SSO потребители с този флаг се таксуват като SSO админи (отделно от обикновените SSO потребители)
16 isAdminAdmin?: boolean // Административно разрешение - SSO потребители с този флаг се таксуват като SSO админи (отделно от обикновените SSO потребители)
17 isCommentModeratorAdmin?: boolean // Разрешение за модератор - SSO потребители с този флаг се таксуват като SSO модератори (отделно от обикновените модератори)
18 /** Ако е null, Контролът на достъпа няма да се прилага за потребителя. Ако е празен списък, този потребител няма да може да вижда никакви страници или да @споменава други потребители. **/
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 /** Масив от ID-та на значки, ограничени до текущата страница (urlId). Тези значки се показват само на страницата, където са присвоени. **/
33 pageBadgeIds?: string[]
34 /** Ако е true, заменя всички съществуващи показвани значки с предоставените. Глобалните и странично-обвързаните значки се презаписват независимо. Ако е false, добавя към съществуващите значки. **/
35 override?: boolean
36 /** Ако е true, обновява свойствата за показване на значките от конфигурацията на наемателя. **/
37 update?: boolean
38 }
39}
40

Таксуване на SSO потребители

SSO потребителите се таксуват по различен начин в зависимост от техните флагове за разрешения:

  • Обикновени SSO потребители: Потребители без администраторски или модераторски разрешения се таксуват като обикновени SSO потребители
  • SSO админи: Потребители с флаговете isAccountOwner или isAdminAdmin се таксуват отделно като SSO админи (същата тарифа като обикновените админи на наемателя)
  • SSO модератори: Потребители с флага isCommentModeratorAdmin се таксуват отделно като SSO модератори (същата тарифа като обикновените модератори)

Важно: За да се предотврати двойно таксуване, системата автоматично премахва дублиращите се SSO потребители спрямо обикновените потребители на наемателя и модераторите по имейл адрес. Ако един SSO потребител има същия имейл като обикновен потребител на наемателя или модератор, той няма да бъде таксуван два пъти.

Контрол на достъпа

Потребителите могат да бъдат разделени в групи. За това служи полето groupIds, и то е опционално.

@Споменавания

По подразбиране @mentions ще използва username за търсене на други SSO потребители, когато се въведе символът @. Ако се използва displayName, тогава резултатите, съвпадащи с username, ще бъдат игнорирани, когато има съвпадение за displayName, и резултатите от търсенето за @mention ще използват displayName.

Абонаменти

С FastComments, потребителите могат да се абонират за страница, като кликнат на иконата звънец в коментарния джадж и изберат Абониране.

При обикновен потребител, ние им изпращаме имейли за уведомления според техните настройки за уведомления.

При SSO потребители разделяме това за обратна съвместимост. Потребителите ще получават тези допълнителни имейли за абонаментни уведомления само ако зададете optedInSubscriptionNotifications на true.

Значки

Можете да присвоявате значки на SSO потребители, използвайки свойството badgeConfig. Значките са визуални индикатори, които се появяват до името на потребителя в коментарите.

  • badgeIds - Масив от ID-та на значки, които да се присвоят на потребителя. Това са глобални значки, видими на всички страници. Трябва да са валидни ID-та на значки, създадени във вашия FastComments акаунт. Ограничено до 30 значки.
  • pageBadgeIds - Опционален масив от ID-та на значки, ограничени до текущата страница (urlId). Тези значки се показват само на страницата, където са били присвоени. Различни страници могат да имат различни странично-обвързани значки за един и същ потребител.
  • override - Ако е true, всички съществуващи показвани значки ще бъдат заменени с предоставените. Глобалните и странично-обвързаните значки се презаписват независимо — презаписването на глобални значки не влияе на странично-обвързаните значки и обратно. Ако е false или липсва, предоставените значки ще бъдат добавени към вече съществуващите.
  • update - Ако е true, свойствата за показване на значките ще бъдат обновявани от конфигурацията на наемателя всеки път, когато потребителят влезе.

Структура на абонамент Internal Link

Обектът Subscription представлява абонамент за потребител.

Обектите Subscription се създават, когато потребител кликне върху камбанката за известия в уиджета за коментари и щракне върху "Абониране за тази страница".

Абонаментите могат да бъдат създадени и чрез API.

Наличието на обект Subscription причинява генерирането на обекти Notification и изпращането на имейли, когато нови коментари са оставени в корена на асоциираната страница, за която е Subscription. Изпращането на имейли зависи от типа потребител. За обикновени потребители това зависи от optedInNotifications. За SSO потребители това зависи от optedInSubscriptionNotifications. Обърнете внимание, че някои приложения може да нямат концепцията за уеб достъпна страница, в този случай просто задайте urlId на id на елемента, за който се абонирате (същата стойност за urlId, която бихте подали на уиджета за коментари).

Структурата на обекта Subscription е следната:

Структура на Subscription
Copy Copy
1
2interface Subscription {
3 id: string
4 tenantId: string
5 /** With SSO, the user id is in the format `<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

Структура на дневната употреба на наемател Internal Link

Обектът TenantDailyUsage представлява използването за tenant за даден ден. Ако няма активност за даден tenant за даден ден, този ден няма да има обект 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 /** Ignored for billing. **/
19 ignored: boolean
20}
21

Структура на наемател Internal Link

Tenant дефинира клиент на FastComments.com. Те могат да бъдат създадени чрез API от tenant-и с достъп до white labeling. White labeled tenant-и не могат да създават други white labeled tenant-и (позволено е само едно ниво на влагане).

Структурата на обекта Tenant е следната:

Структура на Tenant
Copy Copy
1
2export enum SiteType {
3 Unknown = 0,
4 WordPress = 1
5}
6
7/** This can also be handled via the DomainConfig API. **/
8export interface TenantDomainConfig {
9 domain: string
10 emailFromName?: string
11 emailFromEmail?: string
12 createdAt?: string,
13 siteType?: FastCommentsSiteType, // you probably want Unknown
14 logoSrc?: string, // raw image path
15 logoSrc100px?: string, // resized for thumbnails
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 due to "legacy" reasons
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 - Is calculated based on packageId. **/
65 hasFlexPricing?: boolean
66 /** @readonly **/
67 flexLastBilledAmount?: number
68 /** @readonly - Is calculated based on packageId. **/
69 hasAuditing?: boolean
70 /** You can store a key value pair with the tenant which you can use to query. Keys cannot contain "." or "$", or be longer than 100 chars. Values may not be longer than 2k chars. **/
71 meta?: Record<string, string | null>
72}
73

Структура на потребител Internal Link

User е обект, който представлява най-общ знаменател на всички потребители.

Имайте предвид, че във FastComments имаме множество различни случаи на употреба за потребители:

  • Сигурно SSO
  • Просто SSO
  • Tenant потребители (Например: Администратори)
  • Коментатори

Този API е за Коментатори и потребители, създадени чрез Просто SSO. По същество всеки потребител, създаден чрез вашия сайт, може да бъде достъпен чрез този API. Tenant потребители също могат да бъдат извлечени по този начин, но ще получите повече информация, като взаимодействате с API /tenant-users/.

За Сигурно SSO моля използвайте API /sso-users/.

Не можете да актуализирате тези типове потребители. Те са създали акаунта си чрез вашия сайт, така че предоставяме някакъв базов достъп само за четене, но не можете да правите промени. Ако искате да имате такъв тип поток - трябва да настроите Сигурно SSO.

Структурата на обекта User е следната:

Структура на User
Copy Copy
1
2export interface User {
3 /** This is also the id used as userId on comment objects. **/
4 id: string
5 username: string
6 /** A link to the commenter's blog, for example. **/
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 предоставя начин за конструиране на въпроси и агрегиране на техните резултати. Пример за въпрос (наричан по-нататък 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

Структура на потребителска значка Internal Link

UserBadge е обект, който представлява значка, присвоена на потребител в системата FastComments.

Значките могат да бъдат присвоявани на потребителите автоматично въз основа на тяхната активност (например брой коментари, време за отговор, статус на ветеран) или ръчно от администраторите на сайта.

Структурата на обекта UserBadge е следната:

Структура на UserBadge
Copy Copy
1
2export interface UserBadge {
3 /** Уникален идентификатор за това присвояване на значка на потребител */
4 id: string
5 /** ID of the user this badge is assigned to */
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 /** Фонов цвят за значката (hex код) */
35 backgroundColor?: string
36 /** Цвят на рамката за значката (hex код) */
37 borderColor?: string
38 /** Цвят на текста за значката (hex код) */
39 textColor?: string
40 /** Допълнителен CSS клас за стилизиране */
41 cssClass?: string
42 /** За ветерански значки, праговото време в милисекунди */
43 veteranUserThresholdMillis?: number
44 /** Дали тази значка се показва върху коментарите на потребителя */
45 displayedOnComments: boolean
46 /** Ред на показване на значката */
47 order?: number
48 /** If set, this badge is only displayed on the page with the matching urlId. Null for global badges. */
49 urlId?: string | null
50}
51

Структура на прогрес на потребителска значка Internal Link

UserBadgeProgress е обект, който представлява напредъка на потребител към спечелване на различни значки в системата FastComments.

Това проследяване помага да се определи кога потребителите трябва да получат автоматични значки въз основа на тяхната активност и участие във вашата общност.

Структурата на обекта UserBadgeProgress е следната:

Структура на UserBadgeProgress
Copy Copy
1
2export interface UserBadgeProgress {
3 /** Unique identifier for this progress record */
4 id: string
5 /** ID of the tenant this progress record belongs to */
6 tenantId: string
7 /** ID of the user this progress record tracks */
8 userId: string
9 /** ID of the user's first comment in the system */
10 firstCommentId?: string
11 /** Date of the user's first comment (milliseconds since epoch) */
12 firstCommentDate?: number
13 /** Automatically calculated trust factor based on user activity */
14 autoTrustFactor?: number
15 /** Manually set trust factor by administrators */
16 manualTrustFactor?: number
17 /** Detailed progress object with various metrics, keys match BadgeType enum */
18 progress: {
19 /** 0: CommentCount - Count of comments the user has made */
20 '0'?: number
21 /** 1: CommentUpVotes - Count of upvotes the user has received */
22 '1'?: number
23 /** 2: CommentReplies - Count of replies the user has made */
24 '2'?: number
25 /** 3: CommentsPinned - Count of pinned comments the user has */
26 '3'?: number
27 /** 4: Veteran - User's account age */
28 '4'?: number
29 /** 5: NightOwl - Times user has posted during nighttime hours */
30 '5'?: number
31 /** 6: FastReplyTime - Average reply time in milliseconds */
32 '6'?: number
33 /** 7: ModeratorCommentsDeleted - For moderator badges, comments deleted count */
34 '7'?: number
35 /** 8: ModeratorCommentsApproved - For moderator badges, comments approved count */
36 '8'?: number
37 /** 9: ModeratorCommentsUnapproved - For moderator badges, comments unapproved count */
38 '9'?: number
39 /** 10: ModeratorCommentsReviewed - For moderator badges, comments reviewed count */
40 '10'?: number
41 /** 11: ModeratorCommentsMarkedSpam - For moderator badges, comments marked as spam count */
42 '11'?: number
43 /** 12: ModeratorCommentsMarkedNotSpam - For moderator badges, comments marked as not spam count */
44 '12'?: number
45 /** 13: RepliedToSpecificPage - For each page, count of replies */
46 '13'?: Record<string, number>
47 }
48}
49

В заключение

Надяваме се, че нашата API документация е била изчерпателна и лесна за разбиране. Ако откриете пропуски, уведомете ни по-долу.