FastComments.com

API komentarzy na żywo

API FastComments

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

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

Dla klientów Enterprise, cały dostęp do API jest rejestrowany w dzienniku audytu.

Wygenerowane SDK

FastComments teraz generuje Specyfikację API z naszego kodu (nie jest jeszcze kompletna, ale zawiera wiele API).

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

Uwierzytelnianie

API jest uwierzytelniane poprzez przekazanie swojego klucza API jako nagłówka X-API-KEY lub parametru zapytania API_KEY. Będziesz także potrzebował swojego tenantId do wykonywania wywołań API. Można go uzyskać na tej samej stronie co klucz API.

Uwaga dotycząca bezpieczeństwa

Te trasy są przeznaczone do wywoływania z serwera. NIE WYWOLUJ ich z przeglądarki. Zrobienie tego ujawni Twój klucz API – da to pełny dostęp do Twojego konta każdemu, kto może zobaczyć kod źródłowy strony!

Opcja uwierzytelniania 1 – Nagłówki

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

Opcja uwierzytelniania 2 – Parametry zapytania

  • Query Param: API_KEY
  • Query Param: tenantId

Opcja uwierzytelniania 3 – Token OAuth Bearer

  • Header: Authorization: Bearer fcat_...

Aplikacje firm trzecich, takie jak Zapier oraz klienci serwera MCP, uzyskują token poprzez OAuth zamiast klucza API. Ten token działa na każdym endpointzie tutaj. Tenant jest domyślnie określany przez token, więc tenantId jest opcjonalny, ale musi odpowiadać tokenowi, jeśli jest podany. Żądania GET wymagają zakresu read, a wszystkie inne metody wymagają zakresu write. Pełny przepływ, w tym rejestracja klienta, PKCE, odświeżanie i unieważnianie, jest udokumentowany w sekcji OAuth Authorization. Odkrywanie zaczyna się pod adresem https://fastcomments.com/.well-known/oauth-authorization-server.

Odczytywanie własnych zapisów

FastComments zapewnia dostępność Active-Active. Żądania z Twojego centrum danych są kierowane do najbliższego punktu obecności względem Ciebie. Jest to automatyczne i zazwyczaj możesz obserwować semantykę odczytu po zapisie. Jeśli chcesz mieć pewność, że odczytasz własne zapisy, możesz przypiąć swoje żądania do określonego regionu, używając tego regionu jako hosta API (choć zazwyczaj nie jest to potrzebne w większości integracji):

  • 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

Zauważ, że jeśli to zrobisz, możesz chcieć zdefiniować rozwiązanie awaryjne, ponieważ w przeszłości wycofywaliśmy węzły wejściowe i używamy nowych nazw przy przełączaniu.

Struktura dziennika audytu Internal Link

An AuditLog jest obiektem, który reprezentuje zdarzenie audytowane dla najemców, którzy mają dostęp do tej funkcji.

Struktura obiektu AuditLog jest następująca:

Struktura AuditLog
Copy Copy
1
2interface AuditLog {
3 id: string;
4 /** Kto wykonał zdarzenie. **/
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 /** Przeglądarka, która wykonała zdarzenie, jeśli pochodziło ono z przeglądarki. **/
13 ua?: string;
14 /** Hash sesji, z której pochodzi zdarzenie, służący do powiązania działań jednej osoby. Nigdy nie samej sesji. **/
15 sIdHashed?: string;
16 when: string;
17 description?: string;
18 serverStartDate: string;
19 /** Identyfikator obiektu, na którym wykonano zdarzenie, w przeciwieństwie do tego, kto je wykonał. **/
20 targetId?: string;
21 /** Czytelna etykieta tego obiektu, np. "jsmith (jsmith@example.com)". **/
22 targetLabel?: string;
23 objectDetails?: object;
24}
25

targetId i targetLabel opisują, na czym zdarzenie zostało wykonane; userId i username opisują, kto je wykonał. W przypadku aktualizacji, objectDetails.changes zawiera mapę {field: {from, to}} przedstawiającą, co faktycznie się zmieniło.

Dziennik audytu jest niezmienny. Nie może być również zapisywany ręcznie. FastComments.com może jedynie decydować, kiedy zapisać do dziennika audytu. Jednak możesz odczytywać go za pomocą tego API.

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

Struktura zadań wsadowych Internal Link

A BatchJob to długotrwałe zadanie, takie jak import, eksport lub migracja stron. Zadania są kolejkowane, a następnie pobierane i uruchamiane w tle.

processedCount i totalCount pokazują postęp. Ich jednostka zależy od type:

  • migrate-pages: zakończone migracje, w stosunku do żądanych migracji.
  • undo-page-migration: przywrócone rekordy. Nie ma totalCount.
  • import, export i inne zadania: przetworzone wiersze.

Struktura obiektu BatchJob jest następująca:

Struktura BatchJob
Copy Copy
1
2interface BatchJob {
3 id: string
4 /** For example migrate-pages, undo-page-migration, migrate-domains, import, export, users-export or copy-comments. **/
5 type: string
6 status: 'requested' | 'running' | 'success' | 'failed'
7 createdAt: string
8 completedAt?: string
9 processedCount: number
10 /** Total work, when it is known up front. **/
11 totalCount?: number
12 /** migrate-pages: one entry per finished migration, in request order. **/
13 pageMigrationResults?: Array<PageMigrationSuccess | PageMigrationFailure>
14 /**
15 * migrate-pages: set once the job has finished (success or failed). Pass to POST /api/v1/pages/migrations/:undoId/undo within 90 days.
16 * undo-page-migration: the migration being undone.
17 **/
18 undoId?: string
19 /** undo-page-migration: set once the job has finished. **/
20 pageMigrationUndoResult?: PageMigrationUndoResult
21}
22
23interface PageMigrationSuccess {
24 from: string
25 to: string
26 type: 'urlId' | 'domain'
27 status: 'success'
28 commentsMigrated: number
29}
30
31interface PageMigrationFailure {
32 from: string
33 to: string
34 type: 'urlId' | 'domain'
35 status: 'failed'
36 code: string
37 reason: string
38}
39
40interface PageMigrationUndoResult {
41 /** Records put back to their values from before the migration. **/
42 restored: number
43 /** Records left alone because they changed after the migration, or no longer exist. **/
44 skipped: number
45 /** Records the migration deleted while merging pages. These cannot be brought back. **/
46 notRestorable: number
47}
48

Ponowne próby

Jeśli serwer uruchamiający zadanie migracji stron zostanie zrestartowany, zadanie zostaje ponownie umieszczone w kolejce i kontynuuje po ostatniej zakończonej migracji. Zadanie jest podejmowane maksymalnie 3 razy, po czym jego status jest failed.

Struktura komentarza Internal Link

Obiekt Comment reprezentuje komentarz pozostawiony przez użytkownika.

Relacja między komentarzami rodzica i potomka jest określana za pomocą parentId.

Struktura obiektu Comment jest następująca:

Struktura obiektu Comment
Copy Copy
1
2interface Comment {
3 /** READONLY: Ustaw na true, jeśli silnik antyspamowy uznał komentarz za spam. **/
4 aiDeterminedSpam?: boolean
5 /** Czy komentarz jest zatwierdzony do wyświetlania. Ustaw na true przy zapisie komentarza, w przeciwnym razie będzie ukryty. **/
6 approved?: boolean
7 /** Avatar użytkownika. **/
8 avatarSrc?: string
9 /** Komentarze potomne. Nie zawsze wypełnione. Używane, gdy parametr asTree jest ustawiony na true przez API. **/
10 children: Comment[]
11 /** Surowy tekst komentarza. **/
12 comment: string
13 /** READONLY: Komentarz autora sparsowany do HTML. **/
14 commentHTML?: string
15 /** Email autora komentarza. Wymagany, jeśli anonimowe komentowanie jest wyłączone. **/
16 commenterEmail?: string
17 /** Link autora komentarza (np. jego blog). **/
18 commenterLink?: string
19 /** Nazwa autora komentarza. Zawsze wymagana. Jeśli niedostępna, ustaw np. "Anonim". **/
20 commenterName: string
21 /** Data pozostawienia komentarza, w formacie epoch UTC. **/
22 date: number
23 /** „Etykieta wyświetlana” dla komentarza — na przykład "Admin", "Moderator" lub coś w rodzaju "Użytkownik VIP". **/
24 displayLabel?: string
25 /** Domenę, na której opublikowano komentarz. **/
26 domain?: string
27 /** READONLY: Liczba razy, kiedy komentarz został zgłoszony. **/
28 flagCount?: number
29 /** #hashtagi zapisane w komentarzu, które zostały poprawnie sparsowane. Można również ręcznie dodać hashtagi do zapytań, ale nie będą one automatycznie wyświetlane w treści komentarza. **/
30 hashTags?: CommentHashTag[]
31 /** READONLY: Czy komentarz zawiera obrazy? **/
32 hasImages?: boolean
33 /** READONLY: Czy komentarz zawiera linki? **/
34 hasLinks?: boolean
35 /** READONLY: Unikalne id komentarza. **/
36 id: string
37 /** Tylko podczas tworzenia! To jest haszowane do przechowywania. **/
38 ip?: string
39 /** READONLY: Czy bieżący użytkownik zablokował autora tego komentarza? **/
40 isBlocked?: boolean
41 /** READONLY: Czy komentarz został napisany przez administratora? Ustawiane automatycznie na podstawie userId. **/
42 isByAdmin?: boolean
43 /** READONLY: Czy komentarz został napisany przez moderatora? Ustawiane automatycznie na podstawie userId. **/
44 isByModerator?: boolean
45 /** Ustaw na true, jeśli komentarz został soft usunięty (zostawiono zastępczy wpis z powodu innej konfiguracji). **/
46 isDeleted?: boolean
47 /** Ustaw na true, jeśli konto użytkownika zostało usunięte, a komentarz musiał zostać zachowany. **/
48 isDeletedUser?: boolean
49 /** READONLY: Czy komentarz został oznaczony (flag) przez aktualnie zalogowanego użytkownika (contextUserId)? **/
50 isFlagged?: boolean
51 /** Czy komentarz jest przypięty? **/
52 isPinned?: boolean
53 /** Czy komentarz jest zablokowany? Gdy true, nikt (włącznie z moderatorami) nie może na niego odpowiadać, edytować ani usuwać go dopóki nie zostanie odblokowany. **/
54 isLocked?: boolean
55 /** Czy komentarz to spam? **/
56 isSpam?: boolean
57 /** READONLY: Czy komentarz został oceniony negatywnie przez bieżącego użytkownika (contextUserId)? **/
58 isVotedDown?: boolean
59 /** READONLY: Czy komentarz został oceniony pozytywnie przez bieżącego użytkownika (contextUserId)? **/
60 isVotedUp?: boolean
61 /** Lokalizacja (locale), w której jest komentarz. Jeśli nie podano, zostanie wyprowadzona z nagłówka Accept-Language HTTP. **/
62 locale?: 'de_de' | 'en_us' | 'es_es' | 'fr_fr' | 'it_it' | 'ja_jp' | 'ko_kr' | 'pl_pl' | 'pt_br' | 'ru_ru' | 'tr_tr' | 'zh_cn' | 'zh_tw'
63 /** READONLY: @wzmianki zapisane w komentarzu, które zostały poprawnie sparsowane. **/
64 mentions?: CommentUserMention[]
65 /** Opcjonalne metadane związane z komentarzem. **/
66 meta?: Record<string, string | number | boolean>
67 /** Opcjonalna lista id grup moderacji powiązanych z tym komentarzem. **/
68 moderationGroupIds?: string[]|null
69 /** READONLY: Id obiektu głosu odpowiadającego głosowi bieżącego użytkownika (contextUserId) na ten komentarz. **/
70 myVoteId?: string
71 /** Czy powiadomienia zostały wysłane dla komentujących w związku z tym komentarzem. Aby zapobiec wysyłaniu powiadomień przy imporcie, ustaw to na true. **/
72 notificationSentForParent?: boolean
73 /** Czy powiadomienia zostały wysłane dla użytkowników najemcy (tenant) w związku z tym komentarzem. Aby zapobiec wysyłaniu powiadomień przy imporcie, 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, na który odpowiadamy. **/
78 parentId?: string|null
79 /** Czy komentarz jest oznaczony jako sprawdzony (reviewed). **/
80 reviewed: boolean
81 /** Id tenant-a (najemcy), do którego należy komentarz. **/
82 tenantId: string
83 /** Użytkownik, który napisał komentarz. Tworzony automatycznie przy zapisie komentarza z nazwą/email. **/
84 userId?: string|null
85 /** URL miejsca, w którym widoczny jest ten komentarz, np. wpis na blogu. **/
86 url: string
87 /** „Oczyszczona” wersja urlId, które przesłano. Przy zapisie podajesz to pole, ale po pobraniu komentarza zostanie ono „oczyszczone”, a Twoja oryginalna wartość przeniesiona do urlIdRaw. **/
88 urlId: string
89 /** READONLY: Oryginalne urlId, które nam przesłał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

Niektóre z tych pól są oznaczone jako READONLY — są zwracane przez API, ale nie można ich ustawić.

Struktura tekstu komentarza

Komentarze są pisane w odmianie markdown FastComments, która jest zwykłym markdownem z dodatkowymi, tradycyjnymi tagami w stylu bbcode dla obrazów, np. [img]path[/img].

Tekst jest przechowywany w dwóch polach. Tekst wpisany przez użytkownika jest przechowywany bez zmian w polu comment. Ten tekst jest renderowany i zapisywany w polu commentHTML.

Dozwolone tagi HTML to b, u, i, strike, pre, span, code, img, a, strong, ul, ol, li i br.

Zaleca się renderowanie HTML, ponieważ jest to bardzo mały podzbiór HTML, więc zbudowanie renderera jest dość proste. Istnieje kilka bibliotek, np. dla React Native i Flutter, które w tym pomagają

Możesz wybrać renderowanie nienormalizowanej wartości pola comment. Przykładowy parser znajduje się tutaj..

Przykładowy parser można również dostosować do pracy z HTML i przekształcania tagów HTML w oczekiwane elementy do renderowania na Twojej platformie.

Tagging

Gdy użytkownicy są oznaczani w komentarzu, informacje są przechowywane na liście zwanej mentions. Każdy obiekt na tej liście ma następującą strukturę.

Obiekt wzmianki w komentarzu
Copy CopyRun External Link
1
2interface CommentUserMention {
3 /** Id użytkownika. Dla użytkowników SSO będzie poprzedzone id tenant-a. **/
4 id: string
5 /** Końcowy tekst @wzmianki, łącznie z symbolem @. **/
6 tag: string
7 /** Oryginalny tekst @wzmianki, łącznie z symbolem @. **/
8 rawTag: string
9 /** Jaki typ użytkownika został oznaczony. user = konto FastComments.com. sso = SSOUser. **/
10 type: 'user'|'sso'
11 /** Jeśli użytkownik rezygnuje z powiadomień, to nadal zostanie ustawione na true. **/
12 sent: boolean
13}
14

HashTags

Gdy hashtagi są używane i poprawnie sparsowane, informacje są przechowywane na liście zwanej hashTags. Każdy obiekt na tej liście ma następującą strukturę. Hashtagi można również ręcznie dodać do tablicy hashTags komentarza do celów zapytań, jeśli ustawiono retain.

Obiekt hashtagu komentarza
Copy CopyRun External Link
1
2interface CommentHashTag {
3 /** Id hashtagu. **/
4 id: string
5 /** Końcowy tekst #hashtagu, łącznie ze symbolem #. **/
6 tag: string
7 /** Jeśli hashtag jest powiązany z niestandardowym URL, będzie to zdefiniowane. **/
8 url?: string
9 /** Czy powinniśmy zachować hashtag, nawet jeśli nie istnieje w treści komentarza, gdy komentarz jest aktualizowany. Przydatne do tagowania komentarzy bez zmiany tekstu 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 wpisu w kanale Internal Link

Obiekt FeedPost reprezentuje wpis w feedzie FastComments. Feed to strumień wpisów z własnymi wątkami komentarzy, renderowany przez widżet Feed. Każdy wpis ma autora, opcjonalną treść sformatowaną, media i linki, a może być też otagowany, aby feed mógł być filtrowany.

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

Struktura FeedPost
Copy Copy
1
2interface FeedPost {
3 /** READONLY **/
4 _id: string
5 /** READONLY **/
6 tenantId: string
7 title?: string
8 /** The id of the FastComments or SSO user that authored the post. **/
9 fromUserId?: string
10 /** Filled from the user when not set. **/
11 fromUserDisplayName?: string | null
12 /** READONLY. Filled from the user. **/
13 fromUserAvatar?: string | null
14 /** Used to filter a feed. **/
15 tags?: string[]
16 /** Sort weight within a feed. Higher values sort first. **/
17 weight?: number
18 /** Free-form key/value pairs for your own use. **/
19 meta?: Record<string, string>
20 /** Sanitized 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 /** Where the media item links to when clicked. **/
35 linkUrl?: string
36 /** One entry per rendition. The widget picks the best fit. **/
37 sizes: FeedPostMediaItemAsset[]
38}
39
40interface FeedPostMediaItemAsset {
41 w: number
42 h: number
43 src: string
44}
45
46interface FeedPostLink {
47 /** The link text, like "Sign up now". **/
48 text?: string
49 /** A heading shown with the link. **/
50 title?: string
51 /** A description shown with the link. **/
52 description?: string
53 url?: string
54}
55

Uwagi:

  • Niektóre z tych pól są oznaczone jako READONLY - są zwracane przez API, ale nie można ich ustawiać.
  • Komentarze pod wpisem to zwykłe komentarze, których urlId to post: po którym następuje _id wpisu. Użyj tej wartości z Comment API, aby odczytać lub utworzyć komentarze pod wpisem.

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 ankiety Internal Link

Poll jest dołączony do komentarza, a nie jest samodzielnym obiektem. Jest tworzony razem z komentarzem (zobacz POST /api/v1/comments) lub dodawany do istniejącego komentarza później za pomocą PUT /api/v1/polls/:commentId.

Liczniki głosów są przechowywane bezpośrednio w ankiecie, więc odczyt ankiety daje wyniki bez konieczności czegokolwiek sumowania. Poszczególne głosy stojące za tymi licznikami to obiekty PollVote.

Każda opcja ma id generowane w momencie utworzenia ankiety. Tego id używa się do oddania głosu, zmiany etykiety opcji oraz do zachowania opcji (i jej głosów), gdy wysyłasz PUT ankiety z dodanymi lub usuniętymi opcjami. To jedyny bezpieczny sposób odwoływania się do opcji - nigdy jej pozycja na liście.

Struktura ankiety
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 /** When set and in the past, the poll is closed and no longer accepts votes. **/
13 closesAt?: string | null
14 /** 0 anonymous (the default), 1 admins and moderators, 2 everyone. Absent means anonymous. **/
15 privacy?: 0 | 1 | 2 | null
16 /** When true, the counts are hidden from anyone who has not voted yet. Absent means false. **/
17 requireVoteToSeeResults?: boolean | null
18}
19

Limity

  • Pytanie jest wymagane i ma maksymalnie 200 znaków.
  • Ankieta ma od 2 do 10 opcji.
  • Etykieta opcji jest wymagana, ma maksymalnie 100 znaków i musi być unikalna w obrębie ankiety (bez rozróżniania wielkości liter).
  • closesAt musi być datą w przyszłości w momencie utworzenia ankiety. Aby natychmiast zamknąć ankietę, wykonaj PATCH z datą w przeszłości.

Ustawienia witryny

Ankiety podlegają konfiguracji witryny, którą możesz zmienić w sekcji Customize Widget:

  • Ankiety muszą być włączone, zanim będzie można utworzyć ankietę, w przeciwnym razie API odpowiada błędem polls-disabled.
  • Głosowanie może być ograniczone do zalogowanych użytkowników - w takim przypadku głos wysłany tylko z anonUserId zostanie odrzucony z błędem poll-login-required.

Struktura głosu w ankiecie Internal Link

A PollVote to odpowiedź jednej osoby na ankietę. Liczby wyświetlane na samej ankiecie są synchronizowane z tymi rekordami, więc potrzebujesz ich tylko wtedy, gdy chcesz wiedzieć kto na co zagłosował, a nie sumaryczne wyniki.

Głosujący może mieć maksymalnie jeden głos na ankietę. Ponowne głosowanie przenosi jego istniejący głos na nową opcję zamiast dodawać drugi, a updatedAt rejestruje, kiedy to nastąpiło.

voterId jest userId, gdy głosujący był zalogowany, w przeciwnym razie jest to anonUserId.

Struktura PollVote
Copy Copy
1
2interface PollVote {
3 id: string
4 tenantId: string
5 commentId: string
6 urlId: string
7 /** The userId when the voter was logged in, otherwise the anonUserId. **/
8 voterId: string
9 optionId: string
10 createdAt: string
11 /** When the voter last moved their vote to a different option. **/
12 updatedAt?: string
13}
14

Prywatność

Ustawienie privacy ankiety ma tak samo zastosowanie do tego API, jak ma w widżecie komentarzy:

  • Anonymous (domyślnie): nikt nie może zobaczyć, jak ktoś zagłosował, więc głosy nie mogą być odczytane.
    GET /api/v1/poll-votes i GET /api/v1/poll-votes/:id zwracają poll-anonymous. Liczby ankiety są nadal dostępne pod GET /api/v1/polls/:commentId.
  • Admins and moderators: Twój klucz API należy do administratora Twojej witryny, więc może odczytywać głosy.
  • Everyone: głosy mogą być odczytane.

Prywatność ankiety może być ograniczona, ale nie może być rozszerzona po tym, jak pojawią się głosy.

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 oferuje łatwe w użyciu rozwiązanie SSO. Aktualizacja informacji o użytkowniku w integracji opartej na HMAC jest tak prosta, jak załadowanie przez użytkownika strony ze zaktualizowanym payloadem.

Jednak może być pożądane zarządzanie użytkownikiem poza tym przepływem, aby poprawić spójność Twojej aplikacji.

SSO User API zapewnia sposób wykonywania operacji CRUD na obiektach, które nazywamy SSOUsers. Te obiekty różnią się od zwykłych Users i są przechowywane osobno dla bezpieczeństwa typów.

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

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 SSO Admins (oddzielnie od zwykłych użytkowników SSO)
16 isAdminAdmin?: boolean // Uprawnienie administratora - użytkownicy SSO z tą flagą są rozliczani jako SSO Admins (oddzielnie od zwykłych użytkowników SSO)
17 isCommentModeratorAdmin?: boolean // Uprawnienie moderatora - użytkownicy SSO z tą flagą są rozliczani jako SSO Moderators (oddzielnie od zwykłych użytkowników SSO)
18 /** Jeśli null, Kontrola Dostępu nie będzie stosowana do użytkownika. Jeśli pusta lista, ten użytkownik nie będzie mógł widzieć żadnych stron ani @mentionować innych użytkowników. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Nie pozwól innym użytkownikom widzieć aktywności tego użytkownika, w tym komentarzy, na jego profilu. Domyślnie true, aby zapewnić bezpieczne profile domyślnie. **/
22 isProfileActivityPrivate?: boolean
23 /** Nie pozwól innym użytkownikom zostawiać komentarzy na profilu użytkownika ani widzieć istniejących komentarzy profilu. Domyślnie false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Nie pozwól innym użytkownikom wysyłać wiadomości bezpośrednich 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 do przypisania użytkownikowi. Ograniczone do 30 odznak. Kolejność jest respektowana. To są globalne odznaki widoczne na wszystkich stronach. **/
31 badgeIds: string[]
32 /** Tablica identyfikatorów odznak ograniczonych do bieżącej strony (urlId). Te odznaki są wyświetlane tylko na stronie, na której zostały przypisane. **/
33 pageBadgeIds?: string[]
34 /** Jeśli true, zastępuje wszystkie istniejące wyświetlane odznaki podanymi. Globalne odznaki i odznaki ograniczone do strony są nadpisywane niezależnie. Jeśli false, dodaje do istniejących odznak. **/
35 override?: boolean
36 /** Jeśli true, aktualizuje właściwości wyświetlania odznak z konfiguracji tenanta. **/
37 update?: boolean
38 }
39}
40

Rozliczanie użytkowników SSO

Użytkownicy SSO są rozliczani inaczej w zależności od ich flag uprawnień:

  • Zwykli użytkownicy SSO: Użytkownicy bez uprawnień administratora lub moderatora są rozliczani jako zwykli użytkownicy SSO
  • SSO Admins: Użytkownicy z flagami isAccountOwner lub isAdminAdmin są rozliczani oddzielnie jako SSO Admins (ta sama stawka co zwykli administratorzy tenanta)
  • SSO Moderators: Użytkownicy z flagą isCommentModeratorAdmin są rozliczani oddzielnie jako SSO Moderators (ta sama stawka co zwykli moderatorzy)

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

Kontrola Dostępu

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

@Wzmianki

Domyślnie @mentions będą używać username do wyszukiwania innych użytkowników sso po wpisaniu znaku @. Jeśli używane jest displayName, to wyniki pasujące do username będą ignorowane, gdy istnieje dopasowanie dla displayName, a wyniki wyszukiwania @mention będą używać displayName.

Subskrypcje

W FastComments użytkownicy mogą subskrybować stronę, klikając ikonę dzwonka w widżecie komentarzy, a następnie klikając Subscribe.

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

W przypadku użytkowników SSO dzielimy to ze względu na kompatybilność wsteczną. Użytkownicy otrzymają te dodatkowe e-maile powiadomień o subskrypcji tylko wtedy, gdy ustawisz optedInSubscriptionNotifications na true.

Odznaki

Możesz przypisywać 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 do przypisania użytkownikowi. To są globalne odznaki widoczne na wszystkich stronach. Muszą to być prawidłowe identyfikatory odznak utworzone w Twoim koncie FastComments. Ograniczone do 30 odznak.
  • pageBadgeIds - Opcjonalna tablica identyfikatorów odznak ograniczonych do bieżącej strony (urlId). Te odznaki są wyświetlane tylko na stronie, na której zostały przypisane. Różne strony mogą mieć różne odznaki ograniczone do strony dla tego samego użytkownika.
  • override - Jeśli true, wszystkie istniejące wyświetlane odznaki zostaną zastąpione podanymi. Globalne odznaki i odznaki ograniczone do strony są nadpisywane niezależnie — nadpisanie globalnych odznak nie wpływa na odznaki ograniczone do strony i odwrotnie. Jeśli false lub pominięte, podane odznaki zostaną dodane do istniejących odznak.
  • update - Jeśli true, właściwości wyświetlania odznak będą aktualizowane z konfiguracji tenanta przy każdym logowaniu użytkownika.

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 uż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 to obiekt, który reprezentuje odznakę przypisaną użytkownikowi w systemie FastComments.

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

Struktura 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 przypisana jest ta odznaka */
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 ta odznaka została otrzymana przez użytkownika (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 progu, 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 hex) */
35 backgroundColor?: string
36 /** Kolor obramowania odznaki (kod hex) */
37 borderColor?: string
38 /** Kolor tekstu odznaki (kod hex) */
39 textColor?: string
40 /** Dodatkowa klasa CSS dla stylowania */
41 cssClass?: string
42 /** Dla odznak weterana, próg czasu w milisekundach */
43 veteranUserThresholdMillis?: number
44 /** Czy ta odznaka jest wyświetlana przy komentarzach użytkownika */
45 displayedOnComments: boolean
46 /** Kolejność wyświetlania odznaki */
47 order?: number
48 /** Jeśli ustawione, ta odznaka jest wyświetlana tylko na stronie z pasującym urlId. Null dla odznak globalnych. */
49 urlId?: string | null
50}
51

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.