FastComments.com

The FastComments API

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

В этой документации вы найдёте все поддерживаемые API ресурсы с описанием типов запросов и ответов.

Для корпоративных клиентов весь доступ к API фиксируется в журнале аудита.

Generated SDKs

FastComments теперь генерирует Спецификация API из нашего кода (это ещё не завершено, но включает многие API).

У нас также есть SDK для популярных языков:

Authentication

Доступ к API осуществляется путём передачи вашего API-ключа либо в заголовке X-API-KEY, либо в параметре запроса API_KEY. Для вызова API вам также понадобится ваш tenantId — его можно получить на той же странице, что и ваш API-ключ.

Security Note

Эти маршруты предназначены для вызова с сервера. НЕ вызывайте их из браузера. В противном случае вы выставите ваш API-ключ — это даст полный доступ к вашей учётной записи любому, кто может просмотреть исходный код страницы!

Authentication Option One - Headers

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

Authentication Option Two - Query Parameters

  • Query Param: API_KEY
  • Query Param: tenantId

Структура журнала аудита Internal Link

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

Структура объекта AuditLog выглядит следующим образом:

Структура AuditLog
Copy Copy
1
2interface AuditLog {
3 id: string;
4 userId?: string;
5 username?: string;
6 resourceName: string;
7 crudType: 'c' | 'r' | 'u' | 'd' | 'login';
8 from: string;
9 url?: string;
10 ip?: string;
11 when: string;
12 description?: string;
13 serverStartDate: string;
14 objectDetails?: object;
15}
16

Журнал аудита является неизменяемым. В него также нельзя записывать вручную. Только FastComments.com может решать, когда записывать в журнал аудита. Тем не менее, вы можете читать его через этот API.

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

Структура комментария 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 /** Email комментатора. Обязателен, если анонимные комментарии отключены. **/
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 /** Заблокирован ли комментарий для новых ответов (модераторы всё ещё могут отвечать)? **/
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 /** Если мы отвечаем на комментарий, это ID комментария, на который дается ответ. **/
78 parentId?: string|null
79 /** Отмечен ли комментарий как просмотренный. **/
80 reviewed: boolean
81 /** Идентификатор тенанта, к которому принадлежит комментарий. **/
82 tenantId: string
83 /** Пользователь, написавший комментарий. Создаётся автоматически при сохранении комментария с указанием имени/email. **/
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 /** "Карма" комментария (= votes up - votes down). **/
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-тегов в ожидаемые элементы для рендера в вашей платформе.

Упоминания

Когда пользователи отмечаются в комментарии, информация сохраняется в списке mentions. Каждый объект в этом списке имеет следующую структуру.

Объект упоминания в комментарии
Copy CopyRun External Link
1
2interface CommentUserMention {
3 /** Идентификатор пользователя. Для SSO-пользователей будет добавлен префикс вашего tenant id. **/
4 id: string
5 /** Финальный текст @упоминания, включая символ @. **/
6 tag: string
7 /** Оригинальный текст @упоминания, включая символ @. **/
8 rawTag: string
9 /** Тип отмеченного пользователя. user = аккаунт FastComments.com. sso = SSOUser. **/
10 type: 'user'|'sso'
11 /** Даже если пользователь отказался от уведомлений, это поле всё равно будет true. **/
12 sent: boolean
13}
14

Хэштеги

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

Объект хэштега комментария
Copy CopyRun External Link
1
2interface CommentHashTag {
3 /** Идентификатор хэштега. **/
4 id: string
5 /** Финальный текст #хэштега, включая символ #. **/
6 tag: string
7 /** Если хэштег связан с кастомным URL, это будет указано. **/
8 url?: string
9 /** Флаг, указывающий, нужно ли сохранять хэштег, даже если он отсутствует в тексте комментария при его обновлении. Полезно для пометки комментариев без изменения текста. **/
10 retain?: boolean
11}
12

Структура шаблона письма Internal Link

Объект EmailTemplate представляет конфигурацию для пользовательского шаблона электронной почты для тенанта.

Система будет выбирать шаблон электронной почты по:

  • Его идентификатору типа, мы называем это emailTemplateId. Они являются константами.
  • domain. Сначала мы попытаемся найти шаблон для домена, к которому привязан связанный объект (например, Comment), и если совпадение не найдено, то попытаемся найти шаблон, где domain равен null или *.

Структура для объекта EmailTemplate выглядит следующим образом:

Структура шаблона электронной почты
Copy Copy
1
2interface EmailTemplate {
3 id: string
4 tenantId: string
5 emailTemplateId: string
6 displayName: string
7 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ **/
8 createdAt: string
9 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ **/
10 updatedAt: string
11 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ **/
12 updatedByUserId: string
13 /** Домен, с которым должен быть связан шаблон. **/
14 domain?: string | '*' | null
15 /** Содержимое шаблона письма в синтаксисе EJS. **/
16 ejs: string
17 /** Отображение переопределённых ключей переводов в значения для каждого поддерживаемого языка. **/
18 translationOverridesByLocale: Record<string, Record<string, string>>
19 /** Объект, представляющий контекст рендеринга шаблона. **/
20 testData: object
21}
22

Примечания

  • Вы можете получить допустимые значения emailTemplateId через endpoint /definitions.
  • Endpoint /definitions также содержит переводы по умолчанию и тестовые данные.
  • Сохранение шаблона не удастся при неверной структуре или некорректных тестовых данных.

Структура хэштега Internal Link

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

The structure for the HashTag object is as follows:

Структура HashTag
Copy Copy
1
2interface HashTag {
3 /** Должен начинаться с "#" или другого желаемого символа. **/
4 tag: string
5 /** Необязательный URL, на который может указывать хэштег. Вместо фильтрации комментариев по хэштегу интерфейс перенаправит на этот URL при клике. **/
6 url?: string
7 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ **/
8 createdAt: string
9}
10

Notes:

  • In some API endpoints you will see that the hashtag is used in the URL. Remember to URI-Encoded values. For example, # should instead be represented as %23.
  • Some of these fields are marked READONLY - these are returned by the API but cannot be set.

Структура счётчика уведомлений Internal Link

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

Если нет непрочитанных уведомлений, для пользователя не будет объекта NotificationCount.

Объекты NotificationCount создаются автоматически и не могут быть созданы через API. Они также истекают через год.

Вы можете очистить количество непрочитанных уведомлений пользователя, удалив его объект NotificationCount.

Структура объекта NotificationCount выглядит следующим образом:

Структура объекта NotificationCount
Copy Copy
1
2interface NotificationCount {
3 id: string // идентификатор пользователя
4 count: number
5 createdAt: string // строка с датой
6 expireAt: 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 /** Если кто-то ответил вам. **/
10 RepliedToMe = 0,
11 /** Если кто-то ответил где-либо в ветке обсуждения (включая ответы на ответы) темы, в которой вы оставили комментарий. **/
12 RepliedTransientChild = 1,
13 /** Если ваш комментарий был оценён положительно. **/
14 VotedMyComment = 2,
15 /** Если на корне страницы, на которую вы подписаны, оставлен новый комментарий. **/
16 SubscriptionReplyRoot = 3,
17 /** Если кто-то прокомментировал ваш профиль. **/
18 CommentedOnProfile = 4,
19 /** Если у вас есть личное сообщение. **/
20 DirectMessage = 5,
21 /** TrialLimits предназначен только для пользователей тенанта. **/
22 TrialLimits = 6,
23 /** Если вас упомянули. **/
24 Mentioned = 7
25}
26
27interface Notification {
28 id: string
29 tenantId: string
30 /** При SSO идентификатор пользователя имеет формат `<tenant id>:<user id>`. **/
31 userId?: string
32 /** При работе с SSO вам нужно учитывать только `userId`. **/
33 anonUserId?: string
34 /** urlId почти всегда определён. Он является необязательным только для уведомлений на уровне тенанта, которые случаются редко. **/
35 urlId?: string
36 /** URL кешируется для быстрого перехода к источнику уведомления. **/
37 url?: string
38 /** Заголовок страницы кешируется для быстрого ознакомления с источником уведомления. **/
39 pageTitle?: string
40 relatedObjectType: NotificationObjectType
41 /** Например, идентификатор комментария. **/
42 relatedObjectId: string
43 viewed: boolean
44 createdAt: string // строка даты
45 type: NotificationType
46 fromCommentId?: string
47 fromVoteId?: string
48 /** fromUserName и fromUserAvatarSrc кешируются здесь для быстрого отображения уведомления. Они обновляются при обновлении пользователя. **/
49 fromUserName: string
50 fromUserId: string
51 fromUserAvatarSrc?: string
52 /** Установите это в true, чтобы перестать получать уведомления для этого объекта. **/
53 optedOut?: boolean
54}
55

Структура страницы Internal Link


Объект Page представляет страницу, к которой могут относиться многие комментарии. Эта связь определяется urlId.

Объект Page хранит информацию, такую как заголовок страницы, количество комментариев и urlId.

Структура объекта Page выглядит следующим образом:

Структура страницы
Copy Copy
1
2interface Page {
3 id: string
4 urlId: string
5 url: string
6 title?: string
7 createdAt: string
8 commentCount: number
9 rootCommentCount: number
10 /** Установка этого в null означает, что все пользователи SSO могут видеть страницу. Пустой список означает, что она закрыта для всех пользователей. **/
11 accessibleByGroupIds?: string[] | null
12 /** Закрыта ли эта страница для новых комментариев? **/
13 isClosed?: boolean
14}
15

Структура ожидающего события вебхука Internal Link


A PendingWebhookEvent object represents a queued webhook event that is pending.

PendingWebhookEvent objects are created automatically and cannot be manually created via the API. They also expire after one year. They can be deleted which removes the task from the queue.

There are different event types - check eventType (OutboundSyncEventType) and type (OutboundSyncType).

A common use case for this API is to implement custom monitoring. You may want to call the /count endpoint periodically to poll the outstanding count for given filters.

The structure for the PendingWebhookEvent object is as follows:

Структура 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 /** Идентификатор комментария, связанный с событием. **/
17 commentId: string
18 /** Объект комментария для события на момент его возникновения. Мы начали добавлять их в ноябре 2023 г. **/
19 comment: Comment
20 /** Внешний идентификатор, который может быть связан с комментарием. **/
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 так само просте, як завантаження сторінки користувачем з оновленим 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 users з цим прапором враховуються як SSO Admins (окремо від звичайних SSO users)
16 isAdminAdmin?: boolean // Разрешение адміністратора - SSO users з цим прапором враховуються як SSO Admins (окремо від звичайних SSO users)
17 isCommentModeratorAdmin?: boolean // Разрешение модератора - SSO users з цим прапором враховуються як SSO Moderators (окремо від звичайних SSO users)
18 /** Якщо null, Контроль доступу не буде застосований до користувача. Якщо порожній список, цей користувач не зможе бачити жодні сторінки або згадувати інших користувачів через @mention. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Не дозволяйте іншим користувачам бачити активність цього користувача, включаючи коментарі, на його профілі. За замовчуванням true, щоб забезпечити безпечні профілі за замовчуванням. **/
22 isProfileActivityPrivate?: boolean
23 /** Не дозволяйте іншим користувачам залишати коментарі в профілі користувача або бачити існуючі коментарі профілю. За замовчуванням false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Не дозволяйте іншим користувачам надсилати цьому користувачу приватні повідомлення. За замовчуванням false. **/
26 isProfileDMDisabled?: boolean
27 karma?: number
28 /** Необов'язкова конфігурація для бейджів користувача. **/
29 badgeConfig?: {
30 /** Масив ID бейджів, які призначаються користувачу. Обмежено 30 бейджами. Порядок зберігається. **/
31 badgeIds: string[]
32 /** Якщо true, замінює всі існуючі відображувані бейджі на вказані. Якщо false, додає до існуючих бейджів. **/
33 override?: boolean
34 /** Якщо true, оновлює властивості відображення бейджів з конфігурації tenant. **/
35 update?: boolean
36 }
37}
38

Білінг для SSO користувачів

SSO users оплачуються по-різному в залежності від їхніх прапорів дозволів:

  • Регулярні SSO users: Користувачі без прав адміністратора або модератора оплачуються як регулярні SSO users
  • SSO Admins: Користувачі з прапорами isAccountOwner або isAdminAdmin оплачуються окремо як SSO Admins (така ж ставка, як для звичайних адміністраторів tenant)
  • SSO Moderators: Користувачі з прапором isCommentModeratorAdmin оплачуються окремо як SSO Moderators (така ж ставка, як для звичайних модераторів)

Важливо: Щоб запобігти подвійній оплаті, система автоматично дедуплікує SSO users щодо звичайних tenant users і moderators за адресою електронної пошти. Якщо SSO user має той самий адресу електронної пошти, що й звичайний tenant user або moderator, він не буде оплачений двічі.

Контроль доступу

Користувачів можна розбити на групи. Саме для цього призначено поле groupIds, і воно є необов'язковим.

@Упоминания

За замовчуванням @mentions будуть використовувати username для пошуку інших sso users, коли вводиться символ @. Якщо використовується displayName, то результати, що відповідають username, будуть ігноруватися, коли знайдено відповідність для displayName, і результати пошуку @mention будуть використовувати displayName.

Підписки

У FastComments користувачі можуть підписатися на сторінку, натиснувши іконку дзвінка у віджеті коментарів і вибравши Subscribe.

Для звичайного користувача ми відправляємо їм повідомлення електронною поштою відповідно до їхніх налаштувань повідомлень.

У випадку SSO Users ми розділяємо це для зворотної сумісності. Додаткові електронні листи з повідомленнями про підписки будуть надсилатися лише якщо ви встановите optedInSubscriptionNotifications в true.

Значки

Ви можете призначати значки SSO users за допомогою властивості badgeConfig. Значки — це візуальні індикатори, які відображаються поруч із ім'ям користувача в коментарях.

  • badgeIds - Масив ID бейджів, які призначаються користувачу. Ці ID повинні бути дійсними ID бейджів, створених у вашому акаунті FastComments. Обмежено 30 бейджами.
  • override - Якщо true, всі існуючі бейджі, що відображаються в коментарях, будуть замінені на вказані. Якщо false або опущено, вказані бейджі будуть додані до будь-яких існуючих бейджів.
  • update - Якщо true, властивості відображення бейджів будуть оновлюватися з конфігурації tenant щоразу, коли користувач входить в систему.

Структура подписки Internal Link

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

Subscription объекты создаются, когда пользователь нажимает значок уведомлений в виджете комментариев и нажимает "Подписаться на эту страницу".

Подписки также можно создавать через API.

Наличие объекта Subscription вызывает создание объектов Notification и отправку электронных писем, когда на корне связанной страницы появляются новые комментарии, для которой предназначена подписка Subscription. Отправка писем зависит от типа пользователя. Для обычных пользователей это зависит от optedInNotifications. Для SSO-пользователей это зависит от optedInSubscriptionNotifications. Обратите внимание, что в некоторых приложениях может отсутствовать понятие веб-доступной страницы, в этом случае просто установите urlId равным идентификатору элемента, на который вы подписываетесь (то же значение для urlId, которое вы передали бы в виджет комментариев).

Структура объекта Subscription выглядит следующим образом:

Структура Subscription
Copy Copy
1
2interface Subscription {
3 id: string
4 tenantId: string
5 /** При SSO идентификатор пользователя имеет формат `<tenant id>:<user id>`. **/
6 userId: string
7 anonUserId?: string
8 urlId: string
9 url?: string
10 pageTitle?: string
11 createdAt: string // строка с датой
12}
13

Структура ежедневного использования тенанта Internal Link

Объект 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. Их можно создать через API арендаторами с доступом white-label. Арендаторы с white-label не могут создавать других арендаторов с white-label (разрешён только один уровень вложенности).

Структура объекта 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" причинам
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, которую можно использовать для запросов. Ключи не могут содержать "." или "$", или быть длиннее 100 символов. Значения не могут быть длиннее 2k символов. **/
71 meta?: Record<string, string | null>
72}
73

Структура пользователя Internal Link

User — это объект, который представляет собой наибольший общий знаменатель всех пользователей.

Имейте в виду, что в FastComments у нас есть несколько разных сценариев использования пользователей:

  • Secure SSO
  • Simple SSO
  • Tenant Users (For example: Administrators)
  • Commenters

Этот API предназначен для Комментаторов и пользователей, созданных через Simple SSO. По сути, любой пользователь, созданный через ваш сайт, доступен через этот API. Пользователи арендатора также могут быть получены таким образом, но вы получите больше информации, взаимодействуя с API /tenant-users/.

Для Secure SSO используйте API /sso-users/.

Вы не можете обновлять эти типы пользователей. Они создали свои аккаунты через ваш сайт, поэтому мы предоставляем лишь базовый доступ только для чтения, но вы не можете вносить изменения. Если вы хотите иметь такой поток — вам нужно настроить Secure SSO.

Структура объекта User выглядит следующим образом:

Структура User
Copy Copy
1
2export interface User {
3 /** Это также id, используемый как 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

Структура конфигурации вопроса Internal Link

FastComments предоставляет способ создания вопросов и агрегирования их результатов. Пример вопроса (в дальнейшем называемого QuestionConfig) может быть рейтингом в виде звёзд, ползунком или вопросом NPS (определяется через type).

Данные вопросов можно агрегировать отдельно, вместе, по времени, в целом, по странице и т.д.

Фреймворк обладает всеми возможностями, необходимыми для создания клиентских виджетов (с вашим сервером перед этим API), административных панелей и инструментов отчётности.

Сначала нам нужно определить QuestionConfig. Структура выглядит следующим образом:

Структура QuestionConfig
Copy Copy
1
2type QuestionConfigType = 'nps' | 'slider' | 'star' | 'thumbs';
3
4interface QuestionConfig {
5 id: string
6 tenantId: string
7 name: string
8 question: string
9 helpText?: string
10 createdAt: string
11 createdBy: string
12 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ - увеличивается при каждом новом ответе. **/
13 usedCount: number
14 /** Строка с датой, когда конфигурация была в последний раз использована (оставлен результат). **/
15 lastUsed?: string
16 type: QuestionConfigType
17 numStars?: number
18 min?: number
19 max?: number
20 defaultValue?: number
21 labelNegative?: string
22 labelPositive?: string
23 subQuestionIds?: string[]
24 alwaysShowSubQuestions?: boolean
25 reportingOrder: number
26}
27

Структура результата вопроса Internal Link

Чтобы сохранить результаты для вопросов, вы создаёте QuestionResult. Затем вы можете агрегировать результаты вопросов, и также привязывать их к комментариям для целей отчётности.

Структура QuestionResult
Copy Copy
1
2interface QuestionResultMeta {
3 name: string
4 values: string[]
5}
6
7interface QuestionResult {
8 id: string
9 tenantId: string
10 urlId: string
11 anonUserId?: string
12 userId?: string
13 createdAt?: string
14 value: number
15 commentId?: string
16 questionId: string
17 meta?: QuestionResultMeta[]
18}
19

Структура значка пользователя Internal Link

UserBadge — это объект, представляющий бейдж, присвоенный пользователю в системе FastComments.

Бейджи могут присваиваться пользователям автоматически на основе их активности (например, количества комментариев, времени ответа, статуса Veteran) или вручную администраторами сайта.

Структура объекта 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 /** Когда этот бейдж был создан (миллисекунды с начала эпохи) */
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 /** Для бейджей типа Veteran, порог времени в миллисекундах */
43 veteranUserThresholdMillis?: number
44 /** Отображается ли этот бейдж на комментариях пользователя */
45 displayedOnComments: boolean
46 /** Порядок отображения бейджа */
47 order?: number
48}
49

Структура прогресса значка пользователя 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 /** Дата первого комментария пользователя (миллисекунды с начала эпохи Unix) */
12 firstCommentDate?: number
13 /** Автоматически рассчитанный коэффициент доверия на основе активности пользователя */
14 autoTrustFactor?: number
15 /** Коэффициент доверия, установленный вручную администраторами */
16 manualTrustFactor?: number
17 /** Подробный объект прогресса с различными метриками, ключи соответствуют перечислению BadgeType */
18 progress: {
19 /** 0: CommentCount - Количество комментариев, оставленных пользователем */
20 '0'?: number
21 /** 1: CommentUpVotes - Количество полученных пользователем голосов 'за' */
22 '1'?: number
23 /** 2: CommentReplies - Количество ответов, оставленных пользователем */
24 '2'?: number
25 /** 3: CommentsPinned - Количество закреплённых комментариев у пользователя */
26 '3'?: number
27 /** 4: Veteran - Возраст аккаунта пользователя */
28 '4'?: number
29 /** 5: NightOwl - Количество раз, когда пользователь публиковал в ночное время */
30 '5'?: number
31 /** 6: FastReplyTime - Среднее время ответа в миллисекундах */
32 '6'?: number
33 /** 7: ModeratorCommentsDeleted - Для бейджей модератора, количество удалённых комментариев */
34 '7'?: number
35 /** 8: ModeratorCommentsApproved - Для бейджей модератора, количество одобренных комментариев */
36 '8'?: number
37 /** 9: ModeratorCommentsUnapproved - Для бейджей модератора, количество неодобренных комментариев */
38 '9'?: number
39 /** 10: ModeratorCommentsReviewed - Для бейджей модератора, количество проверенных комментариев */
40 '10'?: number
41 /** 11: ModeratorCommentsMarkedSpam - Для бейджей модератора, количество помеченных как спам комментариев */
42 '11'?: number
43 /** 12: ModeratorCommentsMarkedNotSpam - Для бейджей модератора, количество помеченных как 'не спам' комментариев */
44 '12'?: number
45 /** 13: RepliedToSpecificPage - Для каждой страницы, количество ответов */
46 '13'?: Record<string, number>
47 }
48}
49

В заключение

Надеемся, что наша документация по API была для вас исчерпывающей и понятной. Если вы обнаружите какие-либо пробелы, сообщите нам об этом ниже.