FastComments.com

API FastComments

FastComments udostępnia API do interakcji z wieloma zasobami. Twórz integracje z naszą platformą lub nawet własnych klientów!

W tej dokumentacji znajdziesz wszystkie zasoby obsługiwane przez API wraz z udokumentowanymi typami żądań i odpowiedzi.

Dla klientów Enterprise cały dostęp do API jest rejestrowany w Audit Log.

Wygenerowane SDK

FastComments generuje teraz API Spec z naszego kodu (nie jest jeszcze kompletna, ale obejmuje wiele interfejsów API).

Mamy również SDKi dla popularnych języków:

Uwierzytelnianie

API uwierzytelnia się poprzez przekazanie Twojego api key jako nagłówka X-API-KEY lub parametru zapytania API_KEY. Do wykonywania wywołań API będziesz także potrzebować tenantId. Można go pobrać z tej samej strony co Twój api key.

Uwaga dotycząca bezpieczeństwa

Te trasy są przeznaczone do wywoływania z serwera. NIE wywołuj ich z przeglądarki. Spowoduje to ujawnienie Twojego API key — zapewni to pełny dostęp do Twojego konta każdemu, kto może zobaczyć kod źródłowy strony!

Opcja uwierzytelniania jedna - Nagłówki

  • Nagłówek: X-API-KEY
  • Nagłówek: X-TENANT-ID

Opcja uwierzytelniania druga - Parametry zapytania

  • Parametr zapytania: API_KEY
  • Parametr zapytania: tenantId

Struktura dziennika audytu Internal Link

Obiekt AuditLog reprezentuje zdarzenie podlegające audytowi dla tenantów, którzy mają dostęp do tej funkcji.

Struktura obiektu AuditLog wygląda następująco:

Struktura obiektu 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

Dziennik audytu jest niezmienny. Nie można też zapisywać do niego ręcznie. FastComments.com decyduje jedynie, kiedy zapisywać wpisy w dzienniku audytu. Możesz jednak odczytywać go za pomocą tego API.

Wpisy w dzienniku audytu wygasają po dwóch latach.

Struktura komentarza Internal Link

A Comment object represents a comment left by a user.

The relationship between parent and child comments is defined via parentId.

The structure for the Comment object is as follows:

Struktura komentarza
Copy Copy
1
2interface Comment {
3 /** TYLKO DO ODCZYTU: Ustawione na true, jeśli silnik antyspamowy uznał komentarz za spam. **/
4 aiDeterminedSpam?: boolean
5 /** Czy komentarz jest zatwierdzony do wyświetlania. Ustawione na true podczas zapisywania komentarza, w przeciwnym razie będzie ukryty. **/
6 approved?: boolean
7 /** Avatar użytkownika. **/
8 avatarSrc?: string
9 /** Komentarze podrzędne. Nie są wypełniane we wszystkich scenariuszach. Używane, gdy asTree jest ustawione na true przez API. **/
10 children: Comment[]
11 /** Surowy komentarz autora. **/
12 comment: string
13 /** TYLKO DO ODCZYTU: Komentarz autora sparsowany do HTML. **/
14 commentHTML?: string
15 /** Email autora komentarza. Wymagany, jeśli komentowanie anonimowe jest wyłączone. **/
16 commenterEmail?: string
17 /** Link autora komentarza (np. ich blog). **/
18 commenterLink?: string
19 /** Imię autora komentarza. Zawsze wymagane. Jeśli niedostępne, ustaw na coś w rodzaju "Anonymous". **/
20 commenterName: string
21 /** Data pozostawienia komentarza, w formacie epoki UTC. **/
22 date: number
23 /** "Etykieta wyświetlana" komentarza - na przykład "Admin", "Moderator", lub coś w stylu "VIP User". **/
24 displayLabel?: string
25 /** Domenę, na której opublikowano komentarz. **/
26 domain?: string
27 /** TYLKO DO ODCZYTU: Liczba razy, kiedy komentarz został oznaczony (zgłoszony). **/
28 flagCount?: number
29 /** #hashtagi napisane w komentarzu, które zostały pomyślnie sparsowane. Można też ręcznie dodać hashtagi do zapytania, ale nie będą one automatycznie wyświetlane w treści komentarza. **/
30 hashTags?: CommentHashTag[]
31 /** TYLKO DO ODCZYTU: Czy komentarz zawiera obrazy? **/
32 hasImages?: boolean
33 /** TYLKO DO ODCZYTU: Czy komentarz zawiera linki? **/
34 hasLinks?: boolean
35 /** TYLKO DO ODCZYTU: Unikalne id komentarza. **/
36 id: string
37 /** Tylko podczas tworzenia! To jest haszowane do przechowywania. **/
38 ip?: string
39 /** TYLKO DO ODCZYTU: Czy bieżący użytkownik zablokował użytkownika, który napisał ten komentarz? **/
40 isBlocked?: boolean
41 /** TYLKO DO ODCZYTU: Czy komentarz jest napisany przez administratora? Ustawiane automatycznie na podstawie userId. **/
42 isByAdmin?: boolean
43 /** TYLKO DO ODCZYTU: Czy komentarz jest napisany przez moderatora? Ustawiane automatycznie na podstawie userId. **/
44 isByModerator?: boolean
45 /** Ustawione na true, jeśli komentarz został miękko usunięty (zostawiono zastępczy wpis z powodu innej konfiguracji). **/
46 isDeleted?: boolean
47 /** Ustawione na true, jeśli konto użytkownika zostało usunięte, a komentarz musiał zostać zachowany. **/
48 isDeletedUser?: boolean
49 /** TYLKO DO ODCZYTU: Czy został oznaczony przez aktualnie zalogowanego użytkownika (contextUserId)? **/
50 isFlagged?: boolean
51 /** Czy komentarz jest przypięty? **/
52 isPinned?: boolean
53 /** Czy komentarz jest zablokowany dla nowych odpowiedzi (moderatorzy nadal mogą odpowiadać)? **/
54 isLocked?: boolean
55 /** Czy komentarz jest spamem? **/
56 isSpam?: boolean
57 /** TYLKO DO ODCZYTU: Czy komentarz został oceniony negatywnie przez bieżącego użytkownika (contextUserId)? **/
58 isVotedDown?: boolean
59 /** TYLKO DO ODCZYTU: Czy komentarz został oceniony pozytywnie przez bieżącego użytkownika (contextUserId)? **/
60 isVotedUp?: boolean
61 /** Lokalizacja/język komentarza. Jeśli nie podano, zostanie wywnioskowana z nagłówka 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 /** TYLKO DO ODCZYTU: Wzmianki @ napisane w komentarzu, które zostały pomyślnie sparsowane. **/
64 mentions?: CommentUserMention[]
65 /** Opcjonalne metadane powiązane z komentarzem. **/
66 meta?: Record<string, string | number | boolean>
67 /** Opcjonalna lista id grup moderacyjnych powiązanych z tym komentarzem. **/
68 moderationGroupIds?: string[]|null
69 /** TYLKO DO ODCZYTU: Id obiektu głosowania odpowiadającego głosowi bieżącego użytkownika (contextUserId) na tym komentarzu. **/
70 myVoteId?: string
71 /** Czy powiadomienia zostały wysłane dla tego komentarza do komentujących. Aby zapobiec wysyłaniu powiadomień podczas importu, ustaw to na true. **/
72 notificationSentForParent?: boolean
73 /** Czy powiadomienia zostały wysłane dla tego komentarza do użytkowników tenantów. Aby zapobiec wysyłaniu powiadomień podczas importu, ustaw to na true. **/
74 notificationSentForParentTenant?: boolean
75 /** Tytuł strony, na której znajdował się ten komentarz. **/
76 pageTitle?: string
77 /** Jeśli odpowiadamy na komentarz, to jest ID komentarza, na który odpowiadamy. **/
78 parentId?: string|null
79 /** Czy komentarz jest oznaczony jako przejrzany. **/
80 reviewed: boolean
81 /** Id tenanta, do którego należy komentarz. **/
82 tenantId: string
83 /** Użytkownik, który napisał komentarz. Tworzony automatycznie podczas zapisywania komentarza z nazwą/email. **/
84 userId?: string|null
85 /** URL do miejsca, gdzie komentarz jest widoczny, np. wpis na blogu. **/
86 url: string
87 /** "Oczyszczona" wersja urlId, które przekazałeś. Podczas zapisu określasz to pole, ale po pobraniu komentarza zostanie ono "oczyszczone", a twoja oryginalna wartość przeniesiona do "urlIdRaw". **/
88 urlId: string
89 /** TYLKO DO ODCZYTU: Oryginalne urlId, które przekazałeś. **/
90 urlIdRaw?: string
91 /** Czy użytkownik i ten komentarz są zweryfikowani? **/
92 verified: boolean
93 /** Liczba głosów za. **/
94 votesUp?: number
95 /** Liczba głosów przeciw. **/
96 votesDown?: number
97 /** "Karma" komentarza (= głosy za - głosy przeciw). **/
98 votes?: number
99}
100

Some of these fields are marked READONLY - these are returned by the API but cannot be set.

Struktura tekstu komentarza

Comments are written in a FastComments flavor of markdown, which is just markdown plus traditional bbcode style tags for images, like [img]path[/img].

Text is stored in two fields. The text the user entered is stored unmodified in the comment field. This is rendered and stored in the commentHTML field.

The allowed HTML tags are b, u, i, strike, pre, span, code, img, a, strong, ul, ol, li, and br.

It's recommended to render the HTML, since it is a very small subset of HTML, building a renderer is pretty straightforward. There are multiple libraries for React Native and Flutter, for instance, to help with this

You may choose to render the un-normalized value of the comment field. An example parser is here..

The example parser could also be adjusted to work with HTML, and transform the HTML tags into expected elements to render for your platform.

Oznaczanie

When users are tagged in a comment, the information is stored in a list called mentions. Each object in that list has the following structure.

Obiekt wzmianki komentarza
Copy CopyRun External Link
1
2interface CommentUserMention {
3 /** Id użytkownika. Dla użytkowników SSO będzie miało prefiks identyfikatora tenant'a. **/
4 id: string
5 /** Ostateczny tekst wzmianki @, łącznie z symbolem @. **/
6 tag: string
7 /** Oryginalny tekst wzmianki @, łącznie z symbolem @. **/
8 rawTag: string
9 /** Typ oznaczonego użytkownika. user = konto FastComments.com. sso = Użytkownik SSO. **/
10 type: 'user'|'sso'
11 /** Jeśli użytkownik zrezygnuje z powiadomień, to nadal będzie ustawione na true. **/
12 sent: boolean
13}
14

Hashtagi

When hashtags are used and successfully parsed, the information is stored in a list called hashTags. Each object in that list has the following structure. Hashtags can also be manually added to the comment hashTags array for querying, if retain is set.

Obiekt hashtagu komentarza
Copy CopyRun External Link
1
2interface CommentHashTag {
3 /** Id hashtagu. **/
4 id: string
5 /** Ostateczny tekst tagu #hashtag, łącznie ze symbolem #. **/
6 tag: string
7 /** Jeśli hashtag jest powiązany z niestandardowym URL, to będzie to zdefiniowane. **/
8 url?: string
9 /** Czy powinniśmy zachować hashtag, nawet jeśli nie istnieje w treści komentarza podczas aktualizacji. Przydatne do tagowania komentarzy bez zmiany treści komentarza. **/
10 retain?: boolean
11}
12

Struktura szablonu e-mail Internal Link

Obiekt EmailTemplate reprezentuje konfigurację niestandardowego szablonu e-mail dla dzierżawcy.

System wybierze używany szablon e-mail na podstawie:

  • jego identyfikatora typu, nazywanego emailTemplateId. Są to stałe.
  • domain. Najpierw spróbujemy znaleźć szablon dla domeny, z którą powiązany jest dany obiekt (np. Comment), a jeśli nie znajdzie się dopasowanie, spróbujemy znaleźć szablon, gdzie domain jest null lub *.

Struktura obiektu EmailTemplate wygląda następująco:

Struktura szablonu e-mail
Copy Copy
1
2interface EmailTemplate {
3 id: string
4 tenantId: string
5 emailTemplateId: string
6 displayName: string
7 /** TYLKO DO ODCZYTU **/
8 createdAt: string
9 /** TYLKO DO ODCZYTU **/
10 updatedAt: string
11 /** TYLKO DO ODCZYTU **/
12 updatedByUserId: string
13 /** Domena, z którą powinien być powiązany szablon. **/
14 domain?: string | '*' | null
15 /** Zawartość szablonu e-mail w składni EJS. **/
16 ejs: string
17 /** Mapowanie nadpisanych kluczy tłumaczeń na wartości dla każdej obsługiwanej lokalizacji. **/
18 translationOverridesByLocale: Record<string, Record<string, string>>
19 /** Obiekt reprezentujący kontekst renderowania szablonu. **/
20 testData: object
21}
22

Uwagi

  • Poprawne wartości emailTemplateId można pobrać z endpointu /definitions.
  • Endpoint /definitions zawiera również domyślne tłumaczenia i dane testowe.
  • Zapisywanie szablonów zakończy się niepowodzeniem, jeśli struktura lub dane testowe są nieprawidłowe.

Struktura hashtagu Internal Link


Obiekt HashTag reprezentuje tag, który może zostawić użytkownik. Hashtagi mogą być używane do łączenia z zewnętrzną treścią lub do łączenia ze sobą powiązanych komentarzy.

Struktura obiektu HashTag jest następująca:

Struktura obiektu HashTag
Copy Copy
1
2interface HashTag {
3 /** Powinien zaczynać się od "#" lub wybranego znaku. **/
4 tag: string
5 /** Opcjonalny URL, na który może wskazywać hashtag. Zamiast filtrować komentarze po haśtagu, interfejs przekieruje do tego po kliknięciu. **/
6 url?: string
7 /** TYLKO DO ODCZYTU **/
8 createdAt: string
9}
10

Notes:

  • W niektórych punktach końcowych API zobaczysz, że hashtag jest używany w URL. Pamiętaj o kodowaniu wartości URI. Na przykład, # powinien być zamiast tego reprezentowany jako %23.
  • Niektóre z tych pól są oznaczone READONLY - są one zwracane przez API, ale nie można ich ustawić.

Struktura licznika powiadomień Internal Link

Obiekt NotificationCount reprezentuje liczbę nieprzeczytanych powiadomień i metadane dla użytkownika.

Jeśli nie ma nieprzeczytanych powiadomień, nie będzie istniał żaden NotificationCount dla użytkownika.

Obiekty NotificationCount są tworzone automatycznie i nie można ich tworzyć za pomocą API. Wygasają również po roku.

Możesz wyczyścić liczbę nieprzeczytanych powiadomień użytkownika, usuwając jego NotificationCount.

Struktura obiektu NotificationCount jest następująca:

Struktura obiektu NotificationCount
Copy Copy
1
2interface NotificationCount {
3 id: string // id użytkownika
4 count: number
5 createdAt: string // łańcuch daty
6 expireAt: string // łańcuch daty
7}
8

Struktura powiadomienia Internal Link

Obiekt Notification reprezentuje powiadomienie dla użytkownika.

Obiekty Notification są tworzone automatycznie i nie można ich tworzyć przez API. Wygasają też po roku. Powiadomień nie można usuwać. Można jednak zaktualizować je, ustawiając viewed na false, i można filtrować zapytania po viewed.

Użytkownik może również zrezygnować z powiadomień dla konkretnego komentarza, ustawiając optedOut w powiadomieniu na true. Można ponownie wyrazić zgodę, ustawiając je na false.

Istnieją różne typy powiadomień - sprawdź relatedObjectType i type.

Sposoby tworzenia powiadomień są dość elastyczne i mogą być wyzwalane w wielu scenariuszach (zob. NotificationType).

Na dzień dzisiejszy istnienie Notification niekoniecznie oznacza, że e-mail został lub powinien zostać wysłany. Raczej powiadomienia są używane do kanału powiadomień i powiązanych integracji.

Struktura obiektu Notification jest następująca:

Struktura powiadomienia
Copy Copy
1
2enum NotificationObjectType {
3 Comment = 0,
4 Profile = 1,
5 Tenant = 2
6}
7
8enum NotificationType {
9 /** Jeśli ktoś odpowiedział na Twój komentarz. **/
10 RepliedToMe = 0,
11 /** Jeśli ktoś odpowiedział gdziekolwiek w wątku (nawet w odpowiedziach zagnieżdżonych) w wątku, w którym skomentowałeś. **/
12 RepliedTransientChild = 1,
13 /** Jeśli Twój komentarz otrzymał głos poparcia. **/
14 VotedMyComment = 2,
15 /** Jeśli na głównym wątku strony, na którą jesteś subskrybowany, zostanie dodany nowy komentarz. **/
16 SubscriptionReplyRoot = 3,
17 /** Jeśli ktoś skomentował Twój profil. **/
18 CommentedOnProfile = 4,
19 /** Jeśli masz wiadomość prywatną. **/
20 DirectMessage = 5,
21 /** TrialLimits dotyczy tylko użytkowników tenant. **/
22 TrialLimits = 6,
23 /** Jeśli zostałeś wspomniany przy użyciu @. **/
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 /** Przy pracy z SSO wystarczy zwrócić uwagę na `userId`. **/
33 anonUserId?: string
34 /** urlId jest prawie zawsze zdefiniowany. Jest opcjonalny tylko dla powiadomień na poziomie tenant, które są rzadkie. **/
35 urlId?: string
36 /** URL jest buforowany dla szybkiej nawigacji do źródła powiadomienia. **/
37 url?: string
38 /** Tytuł strony jest buforowany dla szybkiego odczytania źródła powiadomienia. **/
39 pageTitle?: string
40 relatedObjectType: NotificationObjectType
41 /** Na przykład id komentarza. **/
42 relatedObjectId: string
43 viewed: boolean
44 createdAt: string // ciąg reprezentujący datę
45 type: NotificationType
46 fromCommentId?: string
47 fromVoteId?: string
48 /** fromUserName i fromUserAvatarSrc są buforowane tutaj dla szybkiego wyświetlania powiadomienia. Są aktualizowane, gdy użytkownik zostanie zaktualizowany. **/
49 fromUserName: string
50 fromUserId: string
51 fromUserAvatarSrc?: string
52 /** Ustaw to na true, aby przestać otrzymywać powiadomienia dla tego obiektu. **/
53 optedOut?: boolean
54}
55

Struktura strony Internal Link


Obiekt Page reprezentuje stronę, do której może należeć wiele komentarzy. Ten związek jest określony przez urlId.

Obiekt Page przechowuje informacje takie jak tytuł strony, liczba komentarzy oraz urlId.

Struktura obiektu Page jest następująca:

Struktura strony
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 /** Ustawienie tego na null oznacza, że wszyscy użytkownicy SSO mogą zobaczyć stronę. Pusta lista oznacza, że jest zamknięta dla wszystkich użytkowników. **/
11 accessibleByGroupIds?: string[] | null
12 /** Czy ta strona jest zamknięta dla nowych komentarzy? **/
13 isClosed?: boolean
14}
15

Struktura oczekującego zdarzenia webhook Internal Link

Obiekt PendingWebhookEvent reprezentuje zdarzenie webhooka w kolejce oczekujące na przetworzenie.

Obiekty PendingWebhookEvent są tworzone automatycznie i nie można ich tworzyć ręcznie przez API. Wygasają też po roku. Można je usunąć, co usuwa zadanie z kolejki.

Istnieją różne typy zdarzeń - sprawdź eventType (OutboundSyncEventType) oraz type (OutboundSyncType).

Typowym przypadkiem użycia tego API jest implementacja niestandardowego monitorowania. Możesz chcieć okresowo wywoływać endpoint /count aby odpytywać liczbę oczekujących zadań dla określonych filtrów.

Struktura obiektu PendingWebhookEvent jest następująca:

Struktura obiektu PendingWebhookEvent
Copy Copy
1
2enum OutboundSyncEventType {
3 Create: 0,
4 Delete: 1,
5 Update: 2
6}
7
8enum OutboundSyncType {
9 /** Zadanie synchronizacji specyficzne dla WordPress. **/
10 WP: 0,
11 Webhook: 1
12}
13
14interface PendingWebhookEvent {
15 id: string
16 /** Id komentarza powiązany ze zdarzeniem. **/
17 commentId: string
18 /** Obiekt komentarza dla zdarzenia w chwili jego wystąpienia. Zaczęliśmy dodawać je w listopadzie 2023. **/
19 comment: Comment
20 /** Zewnętrzne id, które może być powiązane z komentarzem. **/
21 externalId: string | null
22 createdAt: Date
23 tenantId: string
24 attemptCount: number
25 /** Ustawiane przed pierwszą próbą i po każdym niepowodzeniu. **/
26 nextAttemptAt: Date
27 /** Czy jest to zdarzenie utworzenia, usunięcia czy aktualizacji... **/
28 eventType: OutboundSyncEventType
29 /** Typ synchronizacji do wykonania (WordPress, wywołanie API itp.). **/
30 type: OutboundSyncType
31 /** Domena, która dopasowała komentarz. Używamy tej domeny do wyboru klucza API. **/
32 domain: string
33 /** Ostatni występujący błąd. Ten typ jest nietypowany i jest „zrzutem” tego, co się stało. Zazwyczaj zawiera obiekt ze statusCode, body i mapą headers. **/
34 lastError: object | null
35}
36

Struktura użytkownika SSO Internal Link

FastComments provides an easy to use SSO solution. Updating a user's information with the HMAC-based integration is as simple as having the user load the page with an updated payload.

However, it may be desirable to manage a user outside that flow, to improve consistency of your application.

The SSO User API provides a way to CRUD objects that we call SSOUsers. These objects are different from regular Users and kept separate for type safety.

The structure for the SSOUser object is as follows:

Struktura 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 // Uprawnienie administratora - użytkownicy SSO z tą flagą są rozliczani jako administratorzy SSO (oddzielnie od zwykłych użytkowników SSO)
16 isAdminAdmin?: boolean // Uprawnienie administratora - użytkownicy SSO z tą flagą są rozliczani jako administratorzy SSO (oddzielnie od zwykłych użytkowników SSO)
17 isCommentModeratorAdmin?: boolean // Uprawnienie moderatora - użytkownicy SSO z tą flagą są rozliczani jako moderatorzy SSO (oddzielnie od zwykłych użytkowników SSO)
18 /** Jeśli null, Kontrola Dostępu nie zostanie zastosowana do użytkownika. Jeśli pusta lista, ten użytkownik nie będzie mógł widzieć żadnych stron ani używać @mention wobec innych użytkowników. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Nie pozwalaj innym użytkownikom widzieć aktywności tego użytkownika, w tym komentarzy, na jego profilu. Domyślnie true, aby zapewnić bezpieczne profile. **/
22 isProfileActivityPrivate?: boolean
23 /** Nie pozwalaj innym użytkownikom zostawiać komentarzy na profilu tego użytkownika ani widzieć istniejących komentarzy na profilu. Domyślnie false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Nie pozwalaj innym użytkownikom wysyłać prywatnych wiadomości do tego użytkownika. Domyślnie false. **/
26 isProfileDMDisabled?: boolean
27 karma?: number
28 /** Opcjonalna konfiguracja odznak użytkownika. **/
29 badgeConfig?: {
30 /** Tablica identyfikatorów odznak przypisanych użytkownikowi. Ograniczenie do 30 odznak. Kolejność zachowana. **/
31 badgeIds: string[]
32 /** Jeśli true, zastępuje wszystkie istniejące wyświetlane odznaki dostarczonymi. Jeśli false lub pominięte, dodaje do istniejących odznak. **/
33 override?: boolean
34 /** Jeśli true, aktualizuje właściwości wyświetlania odznak z konfiguracji najemcy. **/
35 update?: boolean
36 }
37}
38

Billing for SSO Users

SSO users are billed differently based on their permission flags:

  • Zwykli użytkownicy SSO: Users without admin or moderator permissions are billed as regular SSO users
  • Administratorzy SSO: Users with isAccountOwner or isAdminAdmin flags are billed separately as SSO Admins (same rate as regular tenant admins)
  • Moderatorzy SSO: Users with isCommentModeratorAdmin flag are billed separately as SSO Moderators (same rate as regular moderators)

Ważne: Aby zapobiec podwójnemu naliczaniu, system automatycznie deduplikuje użytkowników SSO względem zwykłych użytkowników i moderatorów konta na podstawie adresu e-mail. Jeśli użytkownik SSO ma ten sam adres e-mail co zwykły użytkownik konta lub moderator, nie zostanie naliczony dwukrotnie.

Access Control

Użytkownicy mogą być podzieleni na grupy. Do tego służy pole groupIds i jest ono opcjonalne.

@Wzmianki

Domyślnie @mentions używają username do wyszukiwania innych użytkowników SSO, gdy wpisany zostanie znak @. Jeśli użyty jest displayName, wyniki pasujące do username zostaną zignorowane, gdy istnieje zgodność z displayName, a wyniki wyszukiwania @mention będą używać displayName.

Subscriptions

W FastComments użytkownicy mogą subskrybować stronę, klikając ikonę dzwonka w widgetcie komentarzy i wybierając Subskrybuj.

W przypadku zwykłego użytkownika wysyłamy mu e-maile z powiadomieniami na podstawie jego ustawień powiadomień.

W przypadku użytkowników SSO rozdzielamy to dla zachowania kompatybilności wstecz. Użytkownicy otrzymają dodatkowe e-maile z powiadomieniami o subskrypcji tylko jeśli ustawisz optedInSubscriptionNotifications na true.

Badges

Możesz przypisać odznaki użytkownikom SSO za pomocą właściwości badgeConfig. Odznaki to wizualne wskaźniki pojawiające się obok nazwy użytkownika w komentarzach.

  • badgeIds - Tablica identyfikatorów odznak, które zostaną przypisane użytkownikowi. Muszą to być prawidłowe identyfikatory odznak utworzone na Twoim koncie FastComments. Ograniczenie do 30 odznak.
  • override - Jeśli true, wszystkie istniejące odznaki wyświetlane w komentarzach zostaną zastąpione dostarczonymi. Jeśli false lub pominięte, dostarczone odznaki zostaną dodane do istniejących.
  • update - Jeśli true, właściwości wyświetlania odznak będą aktualizowane z konfiguracji konta za każdym razem, gdy użytkownik się zaloguje.

Struktura subskrypcji Internal Link

Obiekt Subscription reprezentuje subskrypcję dla użytkownika.

Obiekty Subscription są tworzone, gdy użytkownik kliknie dzwonek powiadomień w widżecie komentarzy i wybierze "Subskrybuj tę stronę".

Subskrypcje można również tworzyć za pomocą API.

Posiadanie obiektu Subscription powoduje wygenerowanie obiektów Notification i wysłanie e-maili, gdy nowe komentarze zostaną umieszczone w korzeniu powiązanej strony na którą dotyczy Subscription. Wysyłanie e-maili zależy od typu użytkownika. Dla zwykłych użytkowników zależy to od optedInNotifications. Dla użytkowników SSO zależy to od optedInSubscriptionNotifications. Zwróć uwagę, że niektóre aplikacje mogą nie mieć pojęcia strony dostępnej w sieci, w takim przypadku po prostu ustaw urlId na identyfikator elementu, który subskrybujesz (ta sama wartość urlId, którą przekazałbyś do widżetu komentarzy).

Struktura obiektu Subscription jest następująca:

Struktura obiektu Subscription
Copy Copy
1
2interface Subscription {
3 id: string
4 tenantId: string
5 /** W przypadku SSO identyfikator użytkownika ma format `<tenant id>:<user id>`. **/
6 userId: string
7 anonUserId?: string
8 urlId: string
9 url?: string
10 pageTitle?: string
11 createdAt: string // łańcuch daty
12}
13

Struktura dziennego zużycia najemcy Internal Link

Obiekt TenantDailyUsage reprezentuje użycie dla najemcy w danym dniu. Jeżeli nie było aktywności dla danego najemcy na danym dniu, ten dzień nie będzie miał obiektu TenantDailyUsage.

Obiekt TenantDailyUsage nie jest w czasie rzeczywistym i może być opóźniony o kilka minut względem rzeczywistego użycia.

Struktura obiektu TenantDailyUsage jest następująca:

Struktura 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 /** Pomijane przy rozliczaniu. **/
19 ignored: boolean
20}
21

Struktura najemcy Internal Link

Tenant definiuje klienta FastComments.com. Mogą być tworzone za pomocą API przez tenantów z dostępem do white labelingu. Tenanci z white-labelingiem nie mogą tworzyć innych tenantów z white-labelingiem (dozwolony jest tylko jeden poziom zagnieżdżenia).

Struktura obiektu Tenant jest następująca:

Struktura obiektu Tenant
Copy Copy
1
2export enum SiteType {
3 Unknown = 0,
4 WordPress = 1
5}
6
7/** To może być również obsługiwane przez API DomainConfig. **/
8export interface TenantDomainConfig {
9 domain: string
10 emailFromName?: string
11 emailFromEmail?: string
12 createdAt?: string,
13 siteType?: FastCommentsSiteType, // prawdopodobnie chcesz Unknown
14 logoSrc?: string, // surowa ścieżka obrazu
15 logoSrc100px?: string, // przeskalowane dla miniatur
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 ze względów „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 - Obliczane na podstawie packageId. **/
65 hasFlexPricing?: boolean
66 /** @readonly **/
67 flexLastBilledAmount?: number
68 /** @readonly - Obliczane na podstawie packageId. **/
69 hasAuditing?: boolean
70 /** Możesz przechowywać parę klucz-wartość z tenantem, której możesz użyć do zapytań. Klucze nie mogą zawierać "." ani "$", lub być dłuższe niż 100 znaków. Wartości nie mogą być dłuższe niż 2k znaków. **/
71 meta?: Record<string, string | null>
72}
73

Struktura użytkownika Internal Link

User to obiekt, który reprezentuje wspólny mianownik wszystkich użytkowników.

Pamiętaj, że w FastComments mamy wiele różnych zastosowań użytkowników:

  • Secure SSO
  • Simple SSO
  • Tenant Users (Na przykład: Administratorzy)
  • Commenters

To API jest przeznaczone dla Commenters oraz użytkowników utworzonych przez Simple SSO. Zasadniczo każdy użytkownik utworzony przez Twoją stronę może być dostępny przez to API. Tenant Users można również pobrać w ten sposób, ale uzyskasz więcej informacji, korzystając z API /tenant-users/.

Dla Secure SSO użyj API /sso-users/.

Nie możesz aktualizować tych typów użytkowników. Utworzyli oni swoje konto przez Twoją stronę, więc zapewniamy podstawowy dostęp tylko do odczytu, ale nie możesz wprowadzać zmian. Jeśli chcesz mieć taki sposób działania — musisz skonfigurować Secure SSO.

Struktura obiektu User jest następująca:

Struktura obiektu User
Copy Copy
1
2export interface User {
3 /** To jest również id używane jako userId w obiektach komentarzy. **/
4 id: string
5 username: string
6 /** Na przykład link do bloga komentującego. **/
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

Struktura głosu Internal Link


Obiekt Vote reprezentuje głos oddany przez użytkownika.

Relacja między komentarzami a głosami jest określona za pomocą commentId.

Struktura obiektu Vote jest następująca:

Struktura obiektu 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

Struktura konfiguracji pytania Internal Link

FastComments zapewnia sposób tworzenia pytań i agregowania ich wyników. Przykładem pytania (dalej nazywanego QuestionConfig) może być ocena w gwiazdkach, suwak lub pytanie NPS (określane przez type).

Dane z pytań można agregować indywidualnie, łącznie, w czasie, ogólnie, według strony i tak dalej.

Framework posiada wszystkie niezbędne możliwości do budowy widgetów po stronie klienta (z Twoim serwerem przed tym API), paneli administracyjnych i narzędzi raportujących.

Najpierw musimy zdefiniować QuestionConfig. Struktura jest następująca:

Struktura 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 /** TYLKO DO ODCZYTU - zwiększane przy każdej nowej odpowiedzi. **/
13 usedCount: number
14 /** Ciąg znaków z datą określający, kiedy konfiguracja była ostatnio użyta (gdy pozostawiono wynik). **/
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

Struktura wyniku pytania Internal Link

Aby zapisać wyniki dla pytań, tworzysz QuestionResult. Następnie możesz agregować wyniki pytań, a także powiązać je z komentarzami do celów raportowania.

Struktura 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

Struktura odznaki użytkownika Internal Link

UserBadge jest obiektem, który reprezentuje odznakę przypisaną użytkownikowi w systemie FastComments.

Odznaki mogą być przydzielane użytkownikom automatycznie na podstawie ich aktywności (takiej jak liczba komentarzy, czas odpowiedzi, status weterana) lub ręcznie przez administratorów strony.

Struktura dla obiektu UserBadge jest następująca:

Struktura UserBadge
Copy Copy
1
2export interface UserBadge {
3 /** Unikalny identyfikator przypisania tej odznaki użytkownikowi */
4 id: string
5 /** ID użytkownika, któremu przypisano tę odznakę */
6 userId: string
7 /** ID definicji odznaki z katalogu odznak najemcy */
8 badgeId: string
9 /** ID najemcy, który utworzył/przypisał tę odznakę */
10 fromTenantId: string
11 /** Kiedy ta odznaka została utworzona (milisekundy od epoki) */
12 createdAt?: number
13 /** Kiedy użytkownik otrzymał tę odznakę (milisekundy od epoki) */
14 receivedAt?: number
15 /**
16 * Typ odznaki:
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 /** Dla odznak opartych na progach, wartość progu */
25 threshold?: number
26 /** Nazwa/etykieta odznaki */
27 name?: string
28 /** Szczegółowy opis odznaki */
29 description?: string
30 /** Tekst wyświetlany na odznace */
31 displayLabel?: string
32 /** URL do obrazu wyświetlanego na odznace */
33 displaySrc?: string
34 /** Kolor tła odznaki (kod szesnastkowy) */
35 backgroundColor?: string
36 /** Kolor obramowania odznaki (kod szesnastkowy) */
37 borderColor?: string
38 /** Kolor tekstu odznaki (kod szesnastkowy) */
39 textColor?: string
40 /** Dodatkowa klasa CSS do stylizacji */
41 cssClass?: string
42 /** Dla odznak weterana, próg czasu w milisekundach */
43 veteranUserThresholdMillis?: number
44 /** Czy ta odznaka jest wyświetlana w komentarzach użytkownika */
45 displayedOnComments: boolean
46 /** Kolejność wyświetlania odznaki */
47 order?: number
48}
49
---

Struktura postępu odznaki użytkownika Internal Link

UserBadgeProgress to obiekt, który reprezentuje postęp użytkownika w zdobywaniu różnych odznak w systemie FastComments.

To śledzenie pomaga określić, kiedy użytkownicy powinni otrzymać automatyczne odznaki na podstawie ich aktywności i uczestnictwa w Twojej społeczności.

Struktura obiektu UserBadgeProgress jest następująca:

Struktura UserBadgeProgress
Copy Copy
1
2export interface UserBadgeProgress {
3 /** Unikalny identyfikator tego rekordu postępu */
4 id: string
5 /** ID tenanta, do którego należy ten rekord postępu */
6 tenantId: string
7 /** ID użytkownika, którego dotyczy ten rekord postępu */
8 userId: string
9 /** ID pierwszego komentarza użytkownika w systemie */
10 firstCommentId?: string
11 /** Data pierwszego komentarza użytkownika (milisekundy od epoki Unix) */
12 firstCommentDate?: number
13 /** Automatycznie obliczany współczynnik zaufania na podstawie aktywności użytkownika */
14 autoTrustFactor?: number
15 /** Współczynnik zaufania ustawiony ręcznie przez administratorów */
16 manualTrustFactor?: number
17 /** Szczegółowy obiekt postępu z różnymi miarami, klucze odpowiadają enumeracji BadgeType */
18 progress: {
19 /** 0: CommentCount - Liczba komentarzy, które użytkownik napisał */
20 '0'?: number
21 /** 1: CommentUpVotes - Liczba upvote'ów, które użytkownik otrzymał */
22 '1'?: number
23 /** 2: CommentReplies - Liczba odpowiedzi, które użytkownik napisał */
24 '2'?: number
25 /** 3: CommentsPinned - Liczba przypiętych komentarzy, które posiada użytkownik */
26 '3'?: number
27 /** 4: Veteran - Wiek konta użytkownika */
28 '4'?: number
29 /** 5: NightOwl - Liczba razy, gdy użytkownik publikował w godzinach nocnych */
30 '5'?: number
31 /** 6: FastReplyTime - Średni czas odpowiedzi w milisekundach */
32 '6'?: number
33 /** 7: ModeratorCommentsDeleted - W przypadku odznak moderatora, liczba usuniętych komentarzy */
34 '7'?: number
35 /** 8: ModeratorCommentsApproved - W przypadku odznak moderatora, liczba zatwierdzonych komentarzy */
36 '8'?: number
37 /** 9: ModeratorCommentsUnapproved - W przypadku odznak moderatora, liczba niezatwierdzonych komentarzy */
38 '9'?: number
39 /** 10: ModeratorCommentsReviewed - W przypadku odznak moderatora, liczba przejrzanych komentarzy */
40 '10'?: number
41 /** 11: ModeratorCommentsMarkedSpam - W przypadku odznak moderatora, liczba komentarzy oznaczonych jako spam */
42 '11'?: number
43 /** 12: ModeratorCommentsMarkedNotSpam - W przypadku odznak moderatora, liczba komentarzy oznaczonych jako nie-spam */
44 '12'?: number
45 /** 13: RepliedToSpecificPage - Dla każdej strony, liczba odpowiedzi */
46 '13'?: Record<string, number>
47 }
48}
49

W podsumowaniu

Mamy nadzieję, że nasza dokumentacja API była wyczerpująca i łatwa do zrozumienia. Jeśli znajdziesz jakieś luki, daj nam znać poniżej.